                                  _   _ ____  _     
                              ___| | | |  _ \| |    
                             / __| | | | |_) | |    
                            | (__| |_| |  _ <| |___ 
                             \___|\___/|_| \_\_____|

                                How To Compile

Curl has been compiled and built on numerous different operating systems. The
way to proceed is mainly divided in two different ways: the unix way or the
windows way.

If you're using Windows (95, 98, NT) or OS/2, you should continue reading from
the Win32 or OS/2 headers further down. All other systems should be capable of
being installed as described below.

UNIX
====

   The configure script *always* tries to find a working SSL library unless
   explicitly told not to.  If you have OpenSSL installed in the default
   search path for your compiler/linker, you don't need to do anything
   special:

        ./configure

   If you have OpenSSL installed in /usr/local/ssl, you can run configure
   like:

	./configure --with-ssl

   If you have OpenSSL installed somewhere else (for example, /opt/OpenSSL,)
   you can run configure like this:

	./configure --with-ssl=/opt/OpenSSL

   If you insist on forcing a build *without* SSL support, even though you may
   have it installed in your system, you can run configure like this:

        ./configure --without-ssl

   If you have OpenSSL installed, but with the libraries in one place and the
   header files somewhere else, you'll have to set the LDFLAGS and CPPFLAGS
   environment variables prior to running configure.  Something like this
   should work:

     (with the Bourne shell and its clones):

       CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
           ./configure

     (with csh, tcsh and their clones):
     
       env CPPFLAGS="-I/path/to/ssl/include" LDFLAGS="-L/path/to/ssl/lib" \
       ./configure

   If your SSL library was compiled with rsaref (usually for use in
   the United States), you may also need to set:

     LIBS=-lRSAglue -lrsaref
     (from Doug Kaufman <dkaufman@rahul.net>)

   Without SSL support, just run:

     ./configure

   Then run:

     make

   Use the executable `curl` in src/ directory.

   To install curl on your system, run

     make install

   This will copy curl to /usr/local/bin/ (or $prefix/bin if you used the
   --prefix option to configure) and it copies the man pages, the lib and the
   include files to suitable places.

   To make sure everything runs as supposed, run the test suite:

     make test

   KNOWN PROBLEMS

     If you happen to have autoconf installed, but a version older than
     2.12 you will get into trouble. Then you can still build curl by
     issuing these commands: (from Ralph Beckmann)

       ./configure [...]
       cd lib; make; cd ..
       cd src; make; cd ..
       cp src/curl elsewhere/bin/

     As suggested by David West, you can make a faked version of autoconf and
     autoheader:

       ----start of autoconf----
       #!/bin/bash
       #fake autoconf for building curl
       if [ "$1" = "--version" ] then
         echo "Autoconf version 2.13"
       fi
       ----end of autoconf----

     Then make autoheader a symbolic link to the same script and make sure
     they're executable and set to appear in the path *BEFORE* the actual (but
     obsolete) autoconf and autoheader scripts.

   OPTIONS

     Remember, to force configure to use the standard cc compiler if both
     cc and gcc are present, run configure like

       CC=cc ./configure
         or
       env Cc=cc ./configure

     To force a static library compile, disable the shared library creation
     by running configure like:

       ./configure --disable-shared

     To tell the configure script to skip searching for thread-safe functions,
     add an option like:

       ./configure --disable-thread

     To build curl with kerberos4 support enabled, curl requires the krb4 libs
     and headers installed. You can then use a set of options to tell
     configure where those are:

          --with-krb4-includes[=DIR]   Specify location of kerberos4 headers
          --with-krb4-libs[=DIR]       Specify location of kerberos4 libs
          --with-krb4[=DIR]            where to look for Kerberos4

     In most cases, /usr/athena is the install prefix and then it works with

       ./configure --with-krb4=/usr/athena

Win32
=====
 
   Without SSL:

      MingW32 (GCC-2.95) style
      ------------------------
        Run the 'mingw32.bat' file to get the proper environment variables
        set, then run 'make -f Makefile.m32' in the lib/ dir and then
        'make -f Makefile.m32' in the src/ dir.

        If you have any problems linking libraries or finding header files,
        be sure to look at the provided "Makefile.m32" files for the proper
        paths, and adjust as necessary.

      Cygwin style
      ------------
        Almost identical to the unix installation. Run the configure script
        in the curl root with 'sh configure'. Make sure you have the sh
        executable in /bin/ or you'll see the configure fail towards the
        end.

        Run 'make'

      Microsoft command line style
      ----------------------------
        Run the 'vcvars32.bat' file to get the proper environment variables
        set, then run 'nmake -f Makefile.vc6' in the lib/ dir and then
        'nmake -f Makefile.vc6' in the src/ dir.

        The vcvars32.bat file is part of the Microsoft development environment.

      IDE-style
      -------------------------
        If you use VC++, Borland or similar compilers. Include all lib source
        files in a static lib "project" (all .c and .h files that is).
        (you should name it libcurl or similar)

        Make the sources in the src/ drawer be a "win32 console application"
        project. Name it curl.

        With VC++, add 'wsock32.lib' to the link libs when you build curl!
        Borland seems to do that itself magically. Of course you have to
        make sure it links with the libcurl too!

        For VC++ 6, there's an included Makefile.vc6 that should be possible
        to use out-of-the-box.

        Microsoft note: add /Zm200 to the compiler options, as the hugehelp.c
        won't compile otherwise due to "too long puts string" or something
        like that!


   With SSL:

      MingW32 (GCC-2.95) style
      ------------------------
        Run the 'mingw32.bat' file to get the proper environment variables
        set, then run 'make -f Makefile.m32 SSL=1' in the lib/ dir and then
        'make -f Makefile.m32 SSL=1' in the src/ dir.

        If you have any problems linking libraries or finding header files,
        be sure to look at the provided "Makefile.m32" files for the proper
        paths, and adjust as necessary.

      Cygwin style
      ------------

        Haven't done, nor got any reports on how to do. It should although be
        identical to the unix setup for the same purpose. See above.

      Microsoft command line style
      ----------------------------
        Run the 'vcvars32.bat' file to get the proper environment variables
        set, then run 'nmake -f Makefile.vc6 release-ssl' in the lib/ dir and
        then 'nmake -f Makefile.vc6' in the src/ dir.

        The vcvars32.bat file is part of the Microsoft development environment.

      Microsoft / Borland style
      -------------------------
        If you have OpenSSL, and want curl to take advantage of it, edit your
        project properties to use the SSL include path, link with the SSL libs
        and define the USE_SSLEAY symbol.


IBM OS/2
========

   Building under OS/2 is not much different from building under unix.
   You need:

      - emx 0.9d
      - GNU make
      - GNU patch
      - ksh
      - GNU bison
      - GNU file utilities
      - GNU sed
      - autoconf 2.13

   If you want to build with OpenSSL or OpenLDAP support, you'll need to
   download those libraries, too. Dirk Ohme has done some work to port SSL
   libraries under OS/2, but it looks like he doesn't care about emx.  You'll
   find his patches on: http://come.to/Dirk.Ohme

   If during the linking you get an error about _errno being an undefined
   symbol referenced from the text segment, you need to add -D__ST_MT_ERRNO__
   in your definitions.

   If everything seems to work fine but there's no curl.exe, you need to add
   -Zexe to your linker flags.

   If you're getting huge binaries, probably your makefiles have the -g in
   CFLAGS.

PORTS
=====
   Just to show off, this is a probably incomplete list of known hardware and
   operating systems that curl has been compiled for:

        - Ultrix
        - SINIX-Z v5
        - Alpha DEC OSF 4
        - Alpha Digital UNIX v3.2
        - Alpha FreeBSD 4.1
        - Alpha Linux 2.2.16
        - Alpha Tru64 v5.0 5.1
        - HP-PA HP-UX 9.X 10.X 11.X
        - MIPS IRIX 6.2, 6.5
        - Power AIX 4.2, 4.3.1, 4.3.2
        - PowerPC Darwin 1.0
        - PowerPC Linux
        - PowerPC Mac OS X
        - Sparc Linux
        - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8
        - Sparc SunOS 4.1.X
        - i386 BeOS
        - i386 FreeBSD
        - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4
        - i386 NetBSD
        - i386 OS/2
        - i386 OpenBSD
        - i386 SCO unix
        - i386 Solaris 2.7
        - i386 Windows 95, 98, ME, NT, 2000
        - ia64 Linux 2.3.99
        - m68k AmigaOS 3
        - m68k OpenBSD
        - StrongARM NetBSD 1.4.1

OpenSSL
=======

   You'll find OpenSSL information at:

      http://www.openssl.org


MingW32/Cygwin
==============

   You'll find MingW32 and Cygwin information at:

      http://www.mingw.org

OpenLDAP
========

   You'll find OpenLDAP information at:

      http://www.openldap.org

   You need to install it with shared libraries, which is enabled when running
   the ldap configure script with "--enable-shared". With my linux 2.0.36
   kernel I also had to disable using threads (with --without-threads),
   because the configure script couldn't figure out my system.
