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 v12.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 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 doesn't support side-by-side compilation when using different
   versions of Visual Studio a build helper batch file has been provided to
   assist with this. Please run "build-openssl -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:

    http://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:
      http://www.microsoft.com/en-us/download/details.aspx?id=734

    * Microsoft Windows SDK Update for Windows Vista:
      http://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.

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.

TODO
====

   These project files are a recent addition to the curl source code and as such
   are not 100% complete. This is a list of things that are still todo:

   * Support zlib
   * Use of static runtime libraries
   * Generate *.vcxproj.filters files for VC10, VC11 and VC12
   * Add the Test Suite components
   * Support for other development IDEs

   Any additional help would be appreciated ;-)