| _ _ ____ _ |
| ___| | | | _ \| | |
| / __| | | | |_) | | |
| | (__| |_| | _ <| |___ |
| \___|\___/|_| \_\_____| |
| |
| How To Compile |
| |
| Installing Binary Packages |
| ========================== |
| |
| Lots of people download binary distributions of curl and libcurl. This |
| document does not describe how to install curl or libcurl using such a |
| binary package. This document describes how to compile, build and install |
| curl and libcurl from source code. |
| |
| Building from git |
| ================= |
| |
| If you get your code off a git repository, see the GIT-INFO file in the |
| root directory for specific instructions on how to proceed. |
| |
| UNIX |
| ==== |
| A normal unix installation is made in three or four steps (after you've |
| unpacked the source archive): |
| |
| ./configure |
| make |
| make test (optional) |
| make install |
| |
| You probably need to be root when doing the last command. |
| |
| If you have checked out the sources from the git repository, read the |
| GIT-INFO on how to proceed. |
| |
| Get a full listing of all available configure options by invoking it like: |
| |
| ./configure --help |
| |
| If you want to install curl in a different file hierarchy than /usr/local, |
| you need to specify that already when running configure: |
| |
| ./configure --prefix=/path/to/curl/tree |
| |
| If you happen to have write permission in that directory, you can do 'make |
| install' without being root. An example of this would be to make a local |
| install in your own home directory: |
| |
| ./configure --prefix=$HOME |
| make |
| make install |
| |
| 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. 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) |
| and you have pkg-config installed, set the pkg-config path first, like this: |
| |
| env PKG_CONFIG_PATH=/opt/OpenSSL/lib/pkgconfig ./configure --with-ssl |
| |
| Without pkg-config installed, use this: |
| |
| ./configure --with-ssl=/opt/OpenSSL |
| |
| If you insist on forcing a build without SSL support, even though you may |
| have OpenSSL 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 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 you have shared SSL libs installed in a directory where your run-time |
| linker doesn't find them (which usually causes configure failures), you can |
| provide the -R option to ld on some operating systems to set a hard-coded |
| path to the run-time linker: |
| |
| env LDFLAGS=-R/usr/local/ssl/lib ./configure --with-ssl |
| |
| MORE OPTIONS |
| ------------ |
| |
| 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 |
| |
| If you're a curl developer and use gcc, you might want to enable more |
| debug options with the --enable-debug option. |
| |
| curl can be built to use a whole range of libraries to provide various |
| useful services, and configure will try to auto-detect a decent |
| default. But if you want to alter it, you can select how to deal with |
| each individual library. |
| |
| To build with GnuTLS support instead of OpenSSL for SSL/TLS, note that |
| you need to use both --without-ssl and --with-gnutls. |
| |
| To build with yassl support instead of OpenSSL or GnuTLS, you must build |
| yassl with its OpenSSL emulation enabled and point to that directory root |
| with configure --with-ssl. |
| |
| To build with NSS support instead of OpenSSL for SSL/TLS, note that |
| you need to use both --without-ssl and --with-nss. |
| |
| To build with PolarSSL support instead of OpenSSL for SSL/TLS, note that |
| you need to use both --without-ssl and --with-polarssl. |
| |
| To build with axTLS support instead of OpenSSL for TLS, note that you |
| need to use both --without-ssl and --with-axtls. |
| |
| To get GSSAPI support, build with --with-gssapi and have the MIT or |
| Heimdal Kerberos 5 packages installed. |
| |
| To get support for SCP and SFTP, build with --with-libssh2 and have |
| libssh2 0.16 or later installed. |
| |
| SPECIAL CASES |
| ------------- |
| Some versions of uClibc require configuring with CPPFLAGS=-D_GNU_SOURCE=1 |
| to get correct large file support. |
| |
| The Open Watcom C compiler on Linux requires configuring with the variables: |
| |
| ./configure CC=owcc AR="$WATCOM/binl/wlib" AR_FLAGS=-q \ |
| RANLIB=/bin/true STRIP="$WATCOM/binl/wstrip" CFLAGS=-Wextra |
| |
| |
| Win32 |
| ===== |
| |
| Building Windows DLLs and C run-time (CRT) linkage issues |
| --------------------------------------------------------- |
| |
| As a general rule, building a DLL with static CRT linkage is highly |
| discouraged, and intermixing CRTs in the same app is something to |
| avoid at any cost. |
| |
| Reading and comprehension of Microsoft Knowledge Base articles |
| KB94248 and KB140584 is a must for any Windows developer. Especially |
| important is full understanding if you are not going to follow the |
| advice given above. |
| |
| KB94248 - How To Use the C Run-Time |
| http://support.microsoft.com/kb/94248/en-us |
| |
| KB140584 - How to link with the correct C Run-Time (CRT) library |
| http://support.microsoft.com/kb/140584/en-us |
| |
| KB190799 - Potential Errors Passing CRT Objects Across DLL Boundaries |
| http://msdn.microsoft.com/en-us/library/ms235460 |
| |
| If your app is misbehaving in some strange way, or it is suffering |
| from memory corruption, before asking for further help, please try |
| first to rebuild every single library your app uses as well as your |
| app using the debug multithreaded dynamic C runtime. |
| |
| MingW32 |
| ------- |
| |
| Make sure that MinGW32's bin dir is in the search path, for example: |
| |
| set PATH=c:\mingw32\bin;%PATH% |
| |
| then run 'mingw32-make mingw32' in the root dir. There are other |
| make targets available to build libcurl with more features, use: |
| 'mingw32-make mingw32-zlib' to build with Zlib support; |
| 'mingw32-make mingw32-ssl-zlib' to build with SSL and Zlib enabled; |
| 'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2, SSL, Zlib; |
| 'mingw32-make mingw32-ssh2-ssl-sspi-zlib' to build with SSH2, SSL, Zlib |
| and SSPI support. |
| |
| If you have any problems linking libraries or finding header files, be sure |
| to verify that the provided "Makefile.m32" files use the proper paths, and |
| adjust as necessary. It is also possible to override these paths with |
| environment variables, for example: |
| |
| set ZLIB_PATH=c:\zlib-1.2.5 |
| set OPENSSL_PATH=c:\openssl-0.9.8r |
| set LIBSSH2_PATH=c:\libssh2-1.2.8 |
| |
| ATTENTION: if you want to build with libssh2 support you have to use latest |
| version 0.17 - previous versions will NOT work with 7.17.0 and later! |
| Use 'mingw32-make mingw32-ssh2-ssl-zlib' to build with SSH2 and SSL enabled. |
| |
| It is now also possible to build with other LDAP SDKs than MS LDAP; |
| currently it is possible to build with native Win32 OpenLDAP, or with the |
| Novell CLDAP SDK. If you want to use these you need to set these vars: |
| |
| set LDAP_SDK=c:\openldap |
| set USE_LDAP_OPENLDAP=1 |
| |
| or for using the Novell SDK: |
| |
| set USE_LDAP_NOVELL=1 |
| |
| If you want to enable LDAPS support then set LDAPS=1. |
| |
| - optional MingW32-built OpenLDAP SDK available from: |
| http://www.gknw.net/mirror/openldap/ |
| - optional recent Novell CLDAP SDK available from: |
| http://developer.novell.com/ndk/cldap.htm |
| |
| |
| Cygwin |
| ------ |
| |
| 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 toward the end. |
| |
| Run 'make' |
| |
| Dev-Cpp |
| ------- |
| |
| See the separate INSTALL.devcpp file for details. |
| |
| MSVC 6 caveats |
| -------------- |
| |
| If you use MSVC 6 it is required that you use the February 2003 edition PSDK: |
| http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm |
| |
| Building any software with MSVC 6 without having PSDK installed is just |
| asking for trouble down the road once you have released it, you might notice |
| the problems in the first corner or ten miles ahead, depending mostly on your |
| choice of static vs dynamic runtime and third party libraries. Anyone using |
| software built in such way will at some point regret having done so. |
| |
| When someone uses MSVC 6 without PSDK he is using a compiler back from 1998. |
| |
| If the compiler has been updated with the installation of a service pack as |
| those mentioned in http://support.microsoft.com/kb/194022 the compiler can be |
| safely used to read source code, translate and make it object code. |
| |
| But, even with the service packs mentioned above installed, the resulting |
| software generated in such an environment will be using outdated system |
| header files and libraries with bugs and security issues which have already |
| been addressed and fixed long time ago. |
| |
| In order to make use of the updated system headers and fixed libraries |
| for MSVC 6, it is required that 'Platform SDK', PSDK from now onwards, |
| is installed. The specific PSDK that must be installed for MSVC 6 is the |
| February 2003 edition, which is the latest one supporting the MSVC 6 compiler, |
| this PSDK is also known as 'Windows Server 2003 PSDK' and can be downloaded |
| from http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm |
| |
| So, building curl and libcurl with MSVC 6 without PSDK is absolutely |
| discouraged for the benefit of anyone using software built in such |
| environment. And it will not be supported in any way, as we could just |
| be hunting bugs which have already been fixed way back in 2003. |
| |
| When building with MSVC 6 we attempt to detect if PSDK is not being used, |
| and if this is the case the build process will fail hard with an error |
| message stating that the February 2003 PSDK is required. This is done to |
| protect the unsuspecting and avoid PEBKAC issues. |
| |
| Additionally it might happen that a die hard MSVC hacker still wants to |
| build curl and libcurl with MSVC 6 without PSDK installed, even knowing |
| that this is a highly discouraged and unsupported build environment. In |
| this case the brave of heart will be able to build in such an environment |
| with the requisite of defining preprocessor symbol ALLOW_MSVC6_WITHOUT_PSDK |
| in lib/config-win32.h and knowing that LDAP and IPv6 support will be missing. |
| |
| MSVC from command line |
| ---------------------- |
| |
| Run the 'vcvars32.bat' file to get a proper environment. The |
| vcvars32.bat file is part of the Microsoft development environment and |
| you may find it in 'C:\Program Files\Microsoft Visual Studio\vc98\bin' |
| provided that you installed Visual C/C++ 6 in the default directory. |
| |
| Then run 'nmake vc' in curl's root directory. |
| |
| If you want to compile with zlib support, you will need to build |
| zlib (http://www.gzip.org/zlib/) as well. Please read the zlib |
| documentation on how to compile zlib. Define the ZLIB_PATH environment |
| variable to the location of zlib.h and zlib.lib, for example: |
| |
| set ZLIB_PATH=c:\zlib-1.2.5 |
| |
| Then run 'nmake vc-zlib' in curl's root directory. |
| |
| If you want to compile with SSL support you need the OpenSSL package. |
| Please read the OpenSSL documentation on how to compile and install |
| the OpenSSL libraries. The build process of OpenSSL generates the |
| libeay32.dll and ssleay32.dll files in the out32dll subdirectory in |
| the OpenSSL home directory. OpenSSL static libraries (libeay32.lib, |
| ssleay32.lib, RSAglue.lib) are created in the out32 subdirectory. |
| |
| Before running nmake define the OPENSSL_PATH environment variable with |
| the root/base directory of OpenSSL, for example: |
| |
| set OPENSSL_PATH=c:\openssl-0.9.8q |
| |
| Then run 'nmake vc-ssl' or 'nmake vc-ssl-dll' in curl's root |
| directory. 'nmake vc-ssl' will create a libcurl static and dynamic |
| libraries in the lib subdirectory, as well as a statically linked |
| version of curl.exe in the src subdirectory. This statically linked |
| version is a standalone executable not requiring any DLL at |
| runtime. This make method requires that you have the static OpenSSL |
| libraries available in OpenSSL's out32 subdirectory. |
| 'nmake vc-ssl-dll' creates the libcurl dynamic library and |
| links curl.exe against libcurl and OpenSSL dynamically. |
| This executable requires libcurl.dll and the OpenSSL DLLs |
| at runtime. |
| Run 'nmake vc-ssl-zlib' to build with both ssl and zlib support. |
| |
| MSVC 6 IDE |
| ---------- |
| |
| A minimal VC++ 6.0 reference workspace (vc6curl.dsw) is available with the |
| source distribution archive to allow proper building of the two included |
| projects, the libcurl library and the curl tool. |
| |
| 1) Open the vc6curl.dsw workspace with MSVC6's IDE. |
| 2) Select 'Build' from top menu. |
| 3) Select 'Batch Build' from dropdown menu. |
| 4) Make sure that the eight project configurations are 'checked'. |
| 5) Click on the 'Build' button. |
| 6) Once the eight project configurations are built you are done. |
| |
| Dynamic and static libcurl libraries are built in debug and release flavours, |
| and can be located each one in its own subdirectory, DLL-Debug, DLL-Release, |
| LIB-Debug and LIB-Release, all of them below the 'lib' subdirectory. |
| |
| In the same way four curl executables are created, each using its respective |
| library. The resulting curl executables are located in its own subdirectory, |
| DLL-Debug, DLL-Release, LIB-Debug and LIB-Release, below the 'src' subdir. |
| |
| These reference VC++ 6.0 configurations are generated using the dynamic CRT. |
| |
| Intentionally, these reference VC++ 6.0 projects and configurations don't use |
| third party libraries, such as OpenSSL or Zlib, to allow proper compilation |
| and configuration for all new users without further requirements. |
| |
| If you need something more 'involved' you might adjust them for your own use, |
| or explore the world of makefiles described above 'MSVC from command line'. |
| |
| Borland C++ compiler |
| --------------------- |
| |
| Ensure that your build environment is properly set up to use the compiler |
| and associated tools. PATH environment variable must include the path to |
| bin subdirectory of your compiler installation, eg: c:\Borland\BCC55\bin |
| |
| It is advisable to set environment variable BCCDIR to the base path of |
| the compiler installation. |
| |
| set BCCDIR=c:\Borland\BCC55 |
| |
| In order to build a plain vanilla version of curl and libcurl run the |
| following command from curl's root directory: |
| |
| make borland |
| |
| To build curl and libcurl with zlib and OpenSSL support set environment |
| variables ZLIB_PATH and OPENSSL_PATH to the base subdirectories of the |
| already built zlib and OpenSSL libraries and from curl's root directory |
| run command: |
| |
| make borland-ssl-zlib |
| |
| libcurl library will be built in 'lib' subdirectory while curl tool |
| is built in 'src' subdirectory. In order to use libcurl library it is |
| advisable to modify compiler's configuration file bcc32.cfg located |
| in c:\Borland\BCC55\bin to reflect the location of libraries include |
| paths for example the '-I' line could result in something like: |
| |
| -I"c:\Borland\BCC55\include;c:\curl\include;c:\openssl\inc32" |
| |
| bcc3.cfg '-L' line could also be modified to reflect the location of |
| of libcurl library resulting for example: |
| |
| -L"c:\Borland\BCC55\lib;c:\curl\lib;c:\openssl\out32" |
| |
| In order to build sample program 'simple.c' from the docs\examples |
| subdirectory run following command from mentioned subdirectory: |
| |
| bcc32 simple.c libcurl.lib cw32mt.lib |
| |
| In order to build sample program simplessl.c an SSL enabled libcurl |
| is required, as well as the OpenSSL libeay32.lib and ssleay32.lib |
| libraries. |
| |
| |
| OTHER MSVC IDEs |
| --------------- |
| |
| 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. |
| |
| |
| Disabling Specific Protocols in Win32 builds |
| -------------------------------------------- |
| |
| The configure utility, unfortunately, is not available for the Windows |
| environment, therefore, you cannot use the various disable-protocol |
| options of the configure utility on this platform. |
| |
| However, you can use the following defines to disable specific |
| protocols: |
| |
| HTTP_ONLY disables all protocols except HTTP |
| CURL_DISABLE_FTP disables FTP |
| CURL_DISABLE_LDAP disables LDAP |
| CURL_DISABLE_TELNET disables TELNET |
| CURL_DISABLE_DICT disables DICT |
| CURL_DISABLE_FILE disables FILE |
| CURL_DISABLE_TFTP disables TFTP |
| CURL_DISABLE_HTTP disables HTTP |
| |
| If you want to set any of these defines you have the following |
| possibilities: |
| |
| - Modify lib/config-win32.h |
| - Modify lib/setup.h |
| - Modify lib/Makefile.vc6 |
| - Add defines to Project/Settings/C/C++/General/Preprocessor Definitions |
| in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project. |
| |
| |
| Using BSD-style lwIP instead of Winsock TCP/IP stack in Win32 builds |
| -------------------------------------------------------------------- |
| |
| In order to compile libcurl and curl using BSD-style lwIP TCP/IP stack |
| it is necessary to make definition of preprocessor symbol USE_LWIPSOCK |
| visible to libcurl and curl compilation processes. To set this definition |
| you have the following alternatives: |
| |
| - Modify lib/config-win32.h and src/config-win32.h |
| - Modify lib/Makefile.vc6 |
| - Add definition to Project/Settings/C/C++/General/Preprocessor Definitions |
| in the vc6libcurl.dsw/vc6libcurl.dsp Visual C++ 6 IDE project. |
| |
| Once that libcurl has been built with BSD-style lwIP TCP/IP stack support, |
| in order to use it with your program it is mandatory that your program |
| includes lwIP header file <lwip/opt.h> (or another lwIP header that includes |
| this) before including any libcurl header. Your program does not need the |
| USE_LWIPSOCK preprocessor definition which is for libcurl internals only. |
| |
| Compilation has been verified with lwIP 1.4.0 and contrib-1.4.0 from: |
| |
| http://download.savannah.gnu.org/releases/lwip/lwip-1.4.0.zip |
| http://download.savannah.gnu.org/releases/lwip/contrib-1.4.0.zip |
| |
| This BSD-style lwIP TCP/IP stack support must be considered experimental |
| given that it has been verified that lwIP 1.4.0 still needs some polish, |
| and libcurl might yet need some additional adjustment, caveat emptor. |
| |
| Important static libcurl usage note |
| ----------------------------------- |
| |
| When building an application that uses the static libcurl library, you must |
| add '-DCURL_STATICLIB' to your CFLAGS. Otherwise the linker will look for |
| dynamic import symbols. |
| |
| |
| 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. |
| |
| |
| VMS |
| === |
| (The VMS section is in whole contributed by the friendly Nico Baggus) |
| |
| Curl seems to work with FTP & HTTP other protocols are not tested. (the |
| perl http/ftp testing server supplied as testing too cannot work on VMS |
| because vms has no concept of fork(). [ I tried to give it a whack, but |
| thats of no use. |
| |
| SSL stuff has not been ported. |
| |
| Telnet has about the same issues as for Win32. When the changes for Win32 |
| are clear maybe they'll work for VMS too. The basic problem is that select |
| ONLY works for sockets. |
| |
| Marked instances of fopen/[f]stat that might become a problem, especially |
| for non stream files. In this regard, the files opened for writing will be |
| created stream/lf and will thus be safe. Just keep in mind that non-binary |
| read/wring from/to files will have a records size limit of 32767 bytes |
| imposed. |
| |
| Stat to get the size of the files is again only safe for stream files & |
| fixed record files without implied CC. |
| |
| -- My guess is that only allowing access to stream files is the quickest |
| way to get around the most issues. Therefore all files need to to be |
| checked to be sure they will be stream/lf before processing them. This is |
| the easiest way out, I know. The reason for this is that code that needs to |
| report the filesize will become a pain in the ass otherwise. |
| |
| Exit status.... Well we needed something done here, |
| |
| VMS has a structured exist status: |
| | 3 | 2 | 1 | 0| |
| |1098|765432109876|5432109876543|210| |
| +----+------------+-------------+---+ |
| |Ctrl| Facility | Error code |sev| |
| +----+------------+-------------+---+ |
| |
| With the Ctrl-bits an application can tell if part or the whole message has |
| already been printed from the program, DCL doesn't need to print it again. |
| |
| Facility - basically the program ID. A code assigned to the program |
| the name can be fetched from external or internal message libraries |
| Error code - the err codes assigned by the application |
| Sev. - severity: Even = error, off = non error |
| 0 = Warning |
| 1 = Success |
| 2 = Error |
| 3 = Information |
| 4 = Fatal |
| <5-7> reserved. |
| |
| This all presents itself with: |
| %<FACILITY>-<Sev>-<Errorname>, <Error message> |
| |
| See also the src/curlmsg.msg file, it has the source for the messages In |
| src/main.c a section is devoted to message status values, the globalvalues |
| create symbols with certain values, referenced from a compiled message |
| file. Have all exit function use a exit status derived from a translation |
| table with the compiled message codes. |
| |
| This was all compiled with: |
| |
| Compaq C V6.2-003 on OpenVMS Alpha V7.1-1H2 |
| |
| So far for porting notes as of: |
| 13-jul-2001 |
| N. Baggus |
| |
| |
| QNX |
| === |
| (This section was graciously brought to us by David Bentham) |
| |
| As QNX is targeted for resource constrained environments, the QNX headers |
| set conservative limits. This includes the FD_SETSIZE macro, set by default |
| to 32. Socket descriptors returned within the CURL library may exceed this, |
| resulting in memory faults/SIGSEGV crashes when passed into select(..) |
| calls using fd_set macros. |
| |
| A good all-round solution to this is to override the default when building |
| libcurl, by overriding CFLAGS during configure, example |
| # configure CFLAGS='-DFD_SETSIZE=64 -g -O2' |
| |
| |
| RISC OS |
| ======= |
| The library can be cross-compiled using gccsdk as follows: |
| |
| CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \ |
| --host=arm-riscos-aof --without-random --disable-shared |
| make |
| |
| where riscos-gcc and riscos-ar are links to the gccsdk tools. |
| You can then link your program with curl/lib/.libs/libcurl.a |
| |
| |
| AmigaOS |
| ======= |
| (This section was graciously brought to us by Diego Casorran) |
| |
| To build cURL/libcurl on AmigaOS just type 'make amiga' ... |
| |
| What you need is: (not tested with others versions) |
| |
| GeekGadgets / gcc 2.95.3 (http://www.geekgadgets.org/) |
| |
| AmiTCP SDK v4.3 (http://www.aminet.net/comm/tcp/AmiTCP-SDK-4.3.lha) |
| |
| Native Developer Kit (http://www.amiga.com/3.9/download/NDK3.9.lha) |
| |
| As no ixemul.library is required you will be able to build it for |
| WarpOS/PowerPC (not tested by me), as well a MorphOS version should be |
| possible with no problems. |
| |
| To enable SSL support, you need a OpenSSL native version (without ixemul), |
| you can find a precompiled package at http://amiga.sourceforge.net/OpenSSL/ |
| |
| |
| NetWare |
| ======= |
| To compile curl.nlm / libcurl.nlm you need: |
| - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. |
| - gnu make and awk running on the platform you compile on; |
| native Win32 versions can be downloaded from: |
| http://www.gknw.net/development/prgtools/ |
| - recent Novell LibC SDK available from: |
| http://developer.novell.com/ndk/libc.htm |
| - or recent Novell CLib SDK available from: |
| http://developer.novell.com/ndk/clib.htm |
| - optional recent Novell CLDAP SDK available from: |
| http://developer.novell.com/ndk/cldap.htm |
| - optional zlib sources (static or dynamic linking with zlib.imp); |
| sources with NetWare Makefile can be obtained from: |
| http://www.gknw.net/mirror/zlib/ |
| - optional OpenSSL sources (version 0.9.8 or later build with BSD sockets); |
| you can find precompiled packages at: |
| http://www.gknw.net/development/ossl/netware/ |
| for CLIB-based builds OpenSSL 0.9.8h or later is required - earlier versions |
| dont support buildunf with CLIB BSD sockets. |
| - optional SSH2 sources (version 0.17 or later); |
| |
| Set a search path to your compiler, linker and tools; on Linux make |
| sure that the var OSTYPE contains the string 'linux'; set the var |
| NDKBASE to point to the base of your Novell NDK; and then type |
| 'make netware' from the top source directory; other targets available |
| are 'netware-ssl', 'netware-ssl-zlib', 'netware-zlib' and 'netware-ares'; |
| if you need other combinations you can control the build with the |
| environment variables WITH_SSL, WITH_ZLIB, WITH_ARES, WITH_SSH2, and |
| ENABLE_IPV6; you can set LINK_STATIC=1 to link curl.nlm statically. |
| By default LDAP support is enabled, however currently you will need a patch |
| in order to use the CLDAP NDK with BSD sockets (Novell Bug 300237): |
| http://www.gknw.net/test/curl/cldap_ndk/ldap_ndk.diff |
| I found on some Linux systems (RH9) that OS detection didn't work although |
| a 'set | grep OSTYPE' shows the var present and set; I simply overwrote it |
| with 'OSTYPE=linux-rh9-gnu' and the detection in the Makefile worked... |
| Any help in testing appreciated! |
| Builds automatically created 8 times a day from current git are here: |
| http://www.gknw.net/mirror/curl/autobuilds/ |
| the status of these builds can be viewed at the autobuild table: |
| http://curl.haxx.se/dev/builds.html |
| |
| |
| eCos |
| ==== |
| curl does not use the eCos build system, so you must first build eCos |
| separately, then link curl to the resulting eCos library. Here's a sample |
| configure line to do so on an x86 Linux box targeting x86: |
| |
| GCCLIB=`gcc -print-libgcc-file-name` && \ |
| CFLAGS="-D__ECOS=1 -nostdinc -I$ECOS_INSTALL/include \ |
| -I`dirname $GCCLIB`/include" \ |
| LDFLAGS="-nostdlib -Wl,--gc-sections -Wl,-static \ |
| -L$ECOS_INSTALL/lib -Ttarget.ld -ltarget" \ |
| ./configure --host=i386 --disable-shared \ |
| --without-ssl --without-zlib --disable-manual --disable-ldap |
| |
| In most cases, eCos users will be using libcurl from within a custom |
| embedded application. Using the standard 'curl' executable from |
| within eCos means facing the limitation of the standard eCos C |
| startup code which does not allow passing arguments in main(). To |
| run 'curl' from eCos and have it do something useful, you will need |
| to either modify the eCos startup code to pass in some arguments, or |
| modify the curl application itself to retrieve its arguments from |
| some location set by the bootloader or hard-code them. |
| |
| Something like the following patch could be used to hard-code some |
| arguments. The MTAB_ENTRY line mounts a RAM disk as the root filesystem |
| (without mounting some kind of filesystem, eCos errors out all file |
| operations which curl does not take to well). The next section synthesizes |
| some command-line arguments for curl to use, in this case to direct curl |
| to read further arguments from a file. It then creates that file on the |
| RAM disk and places within it a URL to download: a file: URL that |
| just happens to point to the configuration file itself. The results |
| of running curl in this way is the contents of the configuration file |
| printed to the console. |
| |
| --- src/main.c 19 Jul 2006 19:09:56 -0000 1.363 |
| +++ src/main.c 24 Jul 2006 21:37:23 -0000 |
| @@ -4286,11 +4286,31 @@ |
| } |
| |
| |
| +#ifdef __ECOS |
| +#include <cyg/fileio/fileio.h> |
| +MTAB_ENTRY( testfs_mte1, |
| + "/", |
| + "ramfs", |
| + "", |
| + 0); |
| +#endif |
| |
| int main(int argc, char *argv[]) |
| { |
| int res; |
| struct Configurable config; |
| +#ifdef __ECOS |
| + char *args[] = {"ecos-curl", "-K", "curlconf.txt"}; |
| + FILE *f; |
| + argc = sizeof(args)/sizeof(args[0]); |
| + argv = args; |
| + |
| + f = fopen("curlconf.txt", "w"); |
| + if (f) { |
| + fprintf(f, "--url file:curlconf.txt"); |
| + fclose(f); |
| + } |
| +#endif |
| memset(&config, 0, sizeof(struct Configurable)); |
| |
| config.errors = stderr; /* default errors to stderr */ |
| |
| |
| Minix |
| ===== |
| curl can be compiled on Minix 3 using gcc or ACK (starting with |
| ver. 3.1.3). Ensure that GNU gawk and bash are both installed and |
| available in the PATH. |
| |
| ACK |
| --- |
| Increase the heap sizes of the compiler with the command: |
| |
| binsizes xxl |
| |
| then configure and compile curl with: |
| |
| ./configure CC=cc LD=cc AR=/usr/bin/aal GREP=grep \ |
| CPPFLAGS='-D_POSIX_SOURCE=1 -I/usr/local/include' |
| make |
| chmem =256000 src/curl |
| |
| GCC |
| --- |
| Make sure gcc is in your PATH with the command: |
| |
| export PATH=/usr/gnu/bin:$PATH |
| |
| then configure and compile curl with: |
| |
| ./configure CC=gcc AR=/usr/gnu/bin/gar GREP=grep |
| make |
| chmem =256000 src/curl |
| |
| |
| Symbian OS |
| ========== |
| The Symbian OS port uses the Symbian build system to compile. From the |
| packages/Symbian/group/ directory, run: |
| |
| bldmake bldfiles |
| abld build |
| |
| to compile and install curl and libcurl using SBSv1. If your Symbian |
| SDK doesn't include support for P.I.P.S., you will need to contact |
| your SDK vendor to obtain that first. |
| |
| |
| VxWorks |
| ======== |
| Build for VxWorks is performed using cross compilation. |
| That means you build on Windows machine using VxWorks tools and |
| run the built image on the VxWorks device. |
| |
| To build libcurl for VxWorks you need: |
| |
| - CYGWIN (free, http://cygwin.com/) |
| - Wind River Workbench (commercial) |
| |
| If you have CYGWIN and Workbench installed on you machine |
| follow after next steps: |
| |
| 1. Open the Command Prompt window and change directory ('cd') |
| to the libcurl 'lib' folder. |
| 2. Add CYGWIN 'bin' folder to the PATH environment variable. |
| For example, type 'set PATH=C:/embedded/cygwin/bin;%PATH%'. |
| 3. Adjust environment variables defined in 'Environment' section |
| of the Makefile.vxworks file to point to your software folders. |
| 4. Build the libcurl by typing 'make -f ./Makefile.vxworks' |
| |
| As a result the libcurl.a library should be created in the 'lib' folder. |
| To clean the build results type 'make -f ./Makefile.vxworks clean'. |
| |
| |
| Android |
| ======= |
| See the build notes in the Android.mk file. |
| |
| |
| CROSS COMPILE |
| ============= |
| (This section was graciously brought to us by Jim Duey, with additions by |
| Dan Fandrich) |
| |
| Download and unpack the cURL package. |
| |
| 'cd' to the new directory. (e.g. cd curl-7.12.3) |
| |
| Set environment variables to point to the cross-compile toolchain and call |
| configure with any options you need. Be sure and specify the '--host' and |
| '--build' parameters at configuration time. The following script is an |
| example of cross-compiling for the IBM 405GP PowerPC processor using the |
| toolchain from MonteVista for Hardhat Linux. |
| |
| (begin script) |
| |
| #! /bin/sh |
| |
| export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin |
| export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" |
| export AR=ppc_405-ar |
| export AS=ppc_405-as |
| export LD=ppc_405-ld |
| export RANLIB=ppc_405-ranlib |
| export CC=ppc_405-gcc |
| export NM=ppc_405-nm |
| |
| ./configure --target=powerpc-hardhat-linux \ |
| --host=powerpc-hardhat-linux \ |
| --build=i586-pc-linux-gnu \ |
| --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \ |
| --exec-prefix=/usr/local |
| |
| (end script) |
| |
| You may also need to provide a parameter like '--with-random=/dev/urandom' |
| to configure as it cannot detect the presence of a random number |
| generating device for a target system. The '--prefix' parameter |
| specifies where cURL will be installed. If 'configure' completes |
| successfully, do 'make' and 'make install' as usual. |
| |
| In some cases, you may be able to simplify the above commands to as |
| little as: |
| |
| ./configure --host=ARCH-OS |
| |
| |
| REDUCING SIZE |
| ============= |
| There are a number of configure options that can be used to reduce the |
| size of libcurl for embedded applications where binary size is an |
| important factor. First, be sure to set the CFLAGS variable when |
| configuring with any relevant compiler optimization flags to reduce the |
| size of the binary. For gcc, this would mean at minimum the -Os option, |
| and potentially the -march=X and -mdynamic-no-pic options as well, e.g. |
| |
| ./configure CFLAGS='-Os' ... |
| |
| Note that newer compilers often produce smaller code than older versions |
| due to improved optimization. |
| |
| Be sure to specify as many --disable- and --without- flags on the configure |
| command-line as you can to disable all the libcurl features that you |
| know your application is not going to need. Besides specifying the |
| --disable-PROTOCOL flags for all the types of URLs your application |
| will not use, here are some other flags that can reduce the size of the |
| library: |
| |
| --disable-ares (disables support for the C-ARES DNS library) |
| --disable-cookies (disables support for HTTP cookies) |
| --disable-crypto-auth (disables HTTP cryptographic authentication) |
| --disable-ipv6 (disables support for IPv6) |
| --disable-manual (disables support for the built-in documentation) |
| --disable-proxy (disables support for HTTP and SOCKS proxies) |
| --disable-verbose (eliminates debugging strings and error code strings) |
| --enable-hidden-symbols (eliminates unneeded symbols in the shared library) |
| --without-libidn (disables support for the libidn DNS library) |
| --without-ssl (disables support for SSL/TLS) |
| --without-zlib (disables support for on-the-fly decompression) |
| |
| The GNU compiler and linker have a number of options that can reduce the |
| size of the libcurl dynamic libraries on some platforms even further. |
| Specify them by providing appropriate CFLAGS and LDFLAGS variables on the |
| configure command-line: |
| CFLAGS="-ffunction-sections -fdata-sections" \ |
| LDFLAGS="-Wl,-s -Wl,-Bsymbolic -Wl,--gc-sections" |
| |
| Be sure also to strip debugging symbols from your binaries after |
| compiling using 'strip' (or the appropriate variant if cross-compiling). |
| If space is really tight, you may be able to remove some unneeded |
| sections of the shared library using the -R option to objcopy (e.g. the |
| .comment section). |
| |
| Using these techniques it is possible to create a basic HTTP-only shared |
| libcurl library for i386 Linux platforms that is only 101 KiB in size, and |
| an FTP-only library that is 105 KiB in size (as of libcurl version 7.21.5, |
| using gcc 4.4.3). |
| |
| You may find that statically linking libcurl to your application will |
| result in a lower total size than dynamically linking. |
| |
| Note that the curl test harness can detect the use of some, but not all, of |
| the --disable statements suggested above. Use will cause tests relying on |
| those features to fail. The test harness can be manually forced to skip |
| the relevant tests by specifying certain key words on the runtests.pl |
| command line. Following is a list of appropriate key words: |
| |
| --disable-cookies !cookies |
| --disable-crypto-auth !HTTP\ Digest\ auth !HTTP\ proxy\ Digest\ auth |
| --disable-manual !--manual |
| --disable-proxy !HTTP\ proxy !proxytunnel !SOCKS4 !SOCKS5 |
| |
| |
| PORTS |
| ===== |
| This is a probably incomplete list of known hardware and operating systems |
| that curl has been compiled for. If you know a system curl compiles and |
| runs on, that isn't listed, please let us know! |
| |
| - Alpha DEC OSF 4 |
| - Alpha Digital UNIX v3.2 |
| - Alpha FreeBSD 4.1, 4.5 |
| - Alpha Linux 2.2, 2.4 |
| - Alpha NetBSD 1.5.2 |
| - Alpha OpenBSD 3.0 |
| - Alpha OpenVMS V7.1-1H2 |
| - Alpha Tru64 v5.0 5.1 |
| - AVR32 Linux |
| - ARM Android 1.5, 2.1 |
| - ARM INTEGRITY |
| - ARM iPhone OS |
| - Cell Linux |
| - Cell Cell OS |
| - HP-PA HP-UX 9.X 10.X 11.X |
| - HP-PA Linux |
| - HP3000 MPE/iX |
| - MicroBlaze uClinux |
| - MIPS IRIX 6.2, 6.5 |
| - MIPS Linux |
| - OS/400 |
| - Pocket PC/Win CE 3.0 |
| - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 |
| - PowerPC Darwin 1.0 |
| - PowerPC INTEGRITY |
| - PowerPC Linux |
| - PowerPC Mac OS 9 |
| - PowerPC Mac OS X |
| - SH4 Linux 2.6.X |
| - SH4 OS21 |
| - SINIX-Z v5 |
| - Sparc Linux |
| - Sparc Solaris 2.4, 2.5, 2.5.1, 2.6, 7, 8, 9, 10 |
| - Sparc SunOS 4.1.X |
| - StrongARM (and other ARM) RISC OS 3.1, 4.02 |
| - StrongARM/ARM7/ARM9 Linux 2.4, 2.6 |
| - StrongARM NetBSD 1.4.1 |
| - Symbian OS (P.I.P.S.) 9.x |
| - TPF |
| - Ultrix 4.3a |
| - UNICOS 9.0 |
| - i386 BeOS |
| - i386 DOS |
| - i386 eCos 1.3.1 |
| - i386 Esix 4.1 |
| - i386 FreeBSD |
| - i386 HURD |
| - i386 Haiku OS |
| - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 |
| - i386 MINIX 3.1 |
| - i386 NetBSD |
| - i386 Novell NetWare |
| - i386 OS/2 |
| - i386 OpenBSD |
| - i386 QNX 6 |
| - i386 SCO unix |
| - i386 Solaris 2.7 |
| - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 |
| - i486 ncr-sysv4.3.03 (NCR MP-RAS) |
| - ia64 Linux 2.3.99 |
| - m68k AmigaOS 3 |
| - m68k Linux |
| - m68k uClinux |
| - m68k OpenBSD |
| - m88k dg-dgux5.4R3.00 |
| - s390 Linux |
| - x86_64 Linux |
| - XScale/PXA250 Linux 2.4 |
| - Nios II uClinux |
| |
| Useful URLs |
| =========== |
| |
| axTLS http://axtls.sourceforge.net/ |
| c-ares http://c-ares.haxx.se/ |
| GNU GSS http://www.gnu.org/software/gss/ |
| GnuTLS http://www.gnu.org/software/gnutls/ |
| Heimdal http://www.pdc.kth.se/heimdal/ |
| libidn http://www.gnu.org/software/libidn/ |
| libssh2 http://www.libssh2.org/ |
| MIT Kerberos http://web.mit.edu/kerberos/www/dist/ |
| NSS http://www.mozilla.org/projects/security/pki/nss/ |
| OpenLDAP http://www.openldap.org/ |
| OpenSSL http://www.openssl.org/ |
| PolarSSL http://polarssl.org/ |
| yassl http://www.yassl.com/ |
| Zlib http://www.zlib.net/ |
| |
| MingW http://www.mingw.org/ |
| MinGW-w64 http://mingw-w64.sourceforge.net/ |
| OpenWatcom http://www.openwatcom.org/ |