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 v15.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 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 Schannel, the native
   SSL library in Windows which forms part of Windows SSPI. However, Schannel
   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.
