Building via IDE Project Files
==============================

   This document describes how to compile, build and install curl and libcurl
   from sources using an IDE based development tool such as Visual Studio.

   Project files are currently available for Visual C++ v6.0 to v14.0. The
   following directory structure has been used to cater for this:

   somedirectory\
    |_curl
      |_projects
        |_<platform>
          |_<ide>
            |_lib
            |_src

   This structure allows for side-by-side compilation of curl on the same
   machine using different versions of a given compiler (for example VC8, VC9
   and VC10) and allows for your own application or product to be compiled
   against those variants of libcurl for example.

   Note: Typically this side-by-side compilation is generally only required
   when a library is being compiled against dynamic runtime libraries.

Dependencies
============

   The projects files also support build configurations that require third
   party dependencies such as OpenSSL, wolfSSL and SSH2. If you wish to support
   these, you will also need to download and compile those libraries as well.

   To support compilation of these libraries using different versions of
   compilers, the following directory structure has been used for both the
   output of curl and libcurl as well as these dependencies.

   somedirectory\
    |_curl
    | |_ build
    |    |_<architecture>
    |      |_<ide>
    |        |_<configuration>
    |          |_lib
    |          |_src
    |
    |_openssl
    | |_ build
    |    |_<architecture>
    |      |_VC <version>
    |        |_<configuration>
    |
    |_libssh2
      |_ build
         |_<architecture>
           |_VC <version>
             |_<configuration>

   As OpenSSL and wolfSSL don't support side-by-side compilation when using
   different versions of Visual Studio, build helper batch files have been
   provided to assist with this. Please run "build-openssl -help" and/or
   "build-wolfssl -help" for usage details.

Building with Visual C++
========================

   To build with VC++, you will of course have to first install VC++ which is
   part of Visual Studio.

   If you are building with VC6 then you will also need the February 2003
   Edition of the Windows Platform SDK which can be downloaded from:

    https://www.microsoft.com/en-us/download/details.aspx?id=12261

   If you require support for Internationalized Domain Names via Windows IDN
   then you will need either:

    * Microsoft Internationalized Domain Name (IDN) Mitigation APIs:
      https://www.microsoft.com/en-us/download/details.aspx?id=734

    * Microsoft Windows SDK Update for Windows Vista:
      https://www.microsoft.com/en-us/download/details.aspx?id=23719

    * Microsoft Visual Studio 2010 or above

   Once you have VC++ installed you should launch the application and open one
   of the solution or workspace files.

   Whilst files are provided for both libcurl and the curl command line tool as
   well as a configuration that includes both, it is recommend that you use the
   all-in-one configuration.

Running DLL based configurations
================================

   If you are a developer and plan to run the curl tool from Visual Studio (eg
   you are debugging) with any third-party libraries (such as OpenSSL, wolfSSL
   or LibSSH2) then you will need to add the search path of these DLLs to the
   configuration's PATH environment. To do that:

    * Open the 'curl-all.sln' or 'curl.sln' solutions

    * Right-click on the 'curl' project and select Properties

    * Navigate to 'Configuration Properties > Debugging > Environment'

    * Add PATH='Path to DLL';C:\Windows\system32;C:\Windows;
               C:\Windows\System32\Wbem

   ... where 'Path to DLL` is the configuration specific path. For example the
   following configurations in Visual Studio 2010 might be:
   
   DLL Debug - DLL OpenSSL (Win32):
   PATH=..\..\..\..\..\openssl\build\Win32\VC10\DLL Debug;C:\Windows\system32;
        C:\Windows;C:\Windows\System32\Wbem

   DLL Debug - DLL OpenSSL (x64):
   PATH=..\..\..\..\..\openssl\build\Win64\VC10\DLL Debug;C:\Windows\system32;
        C:\Windows;C:\Windows\System32\Wbem

   DLL Debug - DLL wolfSSL (Win32):
   PATH=..\..\..\..\..\wolfssl\build\Win32\VC10\DLL Debug;C:\Windows\system32;
        C:\Windows;C:\Windows\System32\Wbem

   DLL Debug - DLL wolfSSL (x64):
   PATH=..\..\..\..\..\wolfssl\build\Win64\VC10\DLL Debug;C:\Windows\system32;
        C:\Windows;C:\Windows\System32\Wbem

   If you are using a configuration that uses multiple third-party library DLLs
   (such as DLL Debug - DLL OpenSSL - DLL LibSSH2) then 'Path to DLL' will need
   to contain the path to both of these.

Notes
=====

   The following keywords have been used in the directory hierarchy:
   
   <platform>      - The platform (For example: Windows)
   <ide>           - The IDE (For example: VC6, VC10, BCC5)
   <architecture>  - The platform architecture (For example: Win32, Win64)
   <configuration> - The target configuration (For example: DLL Debug,
                     LIB Release - LIB OpenSSL)

   If you are using the source code from the git repository, rather than a
   release archive or nightly build, you will need to generate the project
   files. Please run "generate -help" for usage details. 

   Should you wish to help out with some of the items on the TODO list, or
   find bugs in the project files that need correcting, and would like to
   submit updated files back then please note that, whilst the solution files
   can be edited directly, the templates for the project files (which are 
   stored in the git repositoty) will need to be modified rather than the
   generated project files that Visual Studio uses.

Legacy Windows and SSL
======================

   Some of the project configurations allow the use of WinSSL (specifically
   SChannel from Windows SSPI), the native SSL library in Windows. However,
   WinSSL in Windows <= XP is unable to connect to servers that no longer
   support the legacy handshakes and algorithms used by those versions. If
   you will be using curl in one of those earlier versions of Windows you
   should choose another SSL backend such as OpenSSL.
