1** This file is adapted from libcurl and not yet fully rewritten for c-ares! ** 2 3``` 4 ___ __ _ _ __ ___ ___ 5 / __| ___ / _` | '__/ _ \/ __| 6 | (_ |___| (_| | | | __/\__ \ 7 \___| \__,_|_| \___||___/ 8 9 How To Compile 10``` 11 12Installing Binary Packages 13========================== 14 15Lots of people download binary distributions of c-ares. This document 16does not describe how to install c-ares using such a binary package. 17This document describes how to compile, build and install c-ares from 18source code. 19 20Building from Git 21================= 22 23If you get your code off a Git repository rather than an official 24release tarball, see the [GIT-INFO](GIT-INFO) file in the root directory 25for specific instructions on how to proceed. 26 27In particular, if not using CMake you will need to run `./buildconf` (Unix) or 28`buildconf.bat` (Windows) to generate build files, and for the former 29you will need a local installation of Autotools. If using CMake the steps are 30the same for both Git and official release tarballs. 31 32AutoTools Build 33=============== 34 35### General Information, works on most Unix Platforms (Linux, FreeBSD, etc) 36 37A normal Unix installation is made in three or four steps (after you've 38unpacked the source archive): 39 40 ./configure 41 make 42 make install 43 44You probably need to be root when doing the last command. 45 46If you have checked out the sources from the git repository, read the 47[GIT-INFO](GIT_INFO) on how to proceed. 48 49Get a full listing of all available configure options by invoking it like: 50 51 ./configure --help 52 53If you want to install c-ares in a different file hierarchy than /usr/local, 54you need to specify that already when running configure: 55 56 ./configure --prefix=/path/to/c-ares/tree 57 58If you happen to have write permission in that directory, you can do `make 59install` without being root. An example of this would be to make a local 60install in your own home directory: 61 62 ./configure --prefix=$HOME 63 make 64 make install 65 66### More Options 67 68To force configure to use the standard cc compiler if both cc and gcc are 69present, run configure like 70 71 CC=cc ./configure 72 # or 73 env CC=cc ./configure 74 75To force a static library compile, disable the shared library creation 76by running configure like: 77 78 ./configure --disable-shared 79 80If you're a c-ares developer and use gcc, you might want to enable more 81debug options with the `--enable-debug` option. 82 83### Special Cases 84 85Some versions of uClibc require configuring with `CPPFLAGS=-D_GNU_SOURCE=1` 86to get correct large file support. 87 88The Open Watcom C compiler on Linux requires configuring with the variables: 89 90 ./configure CC=owcc AR="$WATCOM/binl/wlib" AR_FLAGS=-q \ 91 RANLIB=/bin/true STRIP="$WATCOM/binl/wstrip" CFLAGS=-Wextra 92 93 94### CROSS COMPILE 95 96(This section was graciously brought to us by Jim Duey, with additions by 97Dan Fandrich) 98 99Download and unpack the c-ares package. 100 101`cd` to the new directory. (e.g. `cd c-ares-1.7.6`) 102 103Set environment variables to point to the cross-compile toolchain and call 104configure with any options you need. Be sure and specify the `--host` and 105`--build` parameters at configuration time. The following script is an 106example of cross-compiling for the IBM 405GP PowerPC processor using the 107toolchain from MonteVista for Hardhat Linux. 108 109```sh 110#! /bin/sh 111 112export PATH=$PATH:/opt/hardhat/devkit/ppc/405/bin 113export CPPFLAGS="-I/opt/hardhat/devkit/ppc/405/target/usr/include" 114export AR=ppc_405-ar 115export AS=ppc_405-as 116export LD=ppc_405-ld 117export RANLIB=ppc_405-ranlib 118export CC=ppc_405-gcc 119export NM=ppc_405-nm 120 121./configure --target=powerpc-hardhat-linux \ 122 --host=powerpc-hardhat-linux \ 123 --build=i586-pc-linux-gnu \ 124 --prefix=/opt/hardhat/devkit/ppc/405/target/usr/local \ 125 --exec-prefix=/usr/local 126``` 127 128You may also need to provide a parameter like `--with-random=/dev/urandom` 129to configure as it cannot detect the presence of a random number 130generating device for a target system. The `--prefix` parameter 131specifies where c-ares will be installed. If `configure` completes 132successfully, do `make` and `make install` as usual. 133 134In some cases, you may be able to simplify the above commands to as 135little as: 136 137 ./configure --host=ARCH-OS 138 139 140### Cygwin (Windows) 141 142Almost identical to the unix installation. Run the configure script in the 143c-ares root with `sh configure`. Make sure you have the sh executable in 144`/bin/` or you'll see the configure fail toward the end. 145 146Run `make` 147 148 149### QNX 150 151(This section was graciously brought to us by David Bentham) 152 153As QNX is targeted for resource constrained environments, the QNX headers 154set conservative limits. This includes the `FD_SETSIZE` macro, set by default 155to 32. Socket descriptors returned within the c-ares library may exceed this, 156resulting in memory faults/SIGSEGV crashes when passed into `select(..)` 157calls using `fd_set` macros. 158 159A good all-round solution to this is to override the default when building 160c-ares, by overriding `CFLAGS` during configure, example: 161 162 # configure CFLAGS='-DFD_SETSIZE=64 -g -O2' 163 164 165### RISC OS 166 167The library can be cross-compiled using gccsdk as follows: 168 169 CC=riscos-gcc AR=riscos-ar RANLIB='riscos-ar -s' ./configure \ 170 --host=arm-riscos-aof --without-random --disable-shared 171 make 172 173where `riscos-gcc` and `riscos-ar` are links to the gccsdk tools. 174You can then link your program with `c-ares/lib/.libs/libcares.a`. 175 176 177### Android 178 179Method using a configure cross-compile (tested with Android NDK r7b): 180 181 - prepare the toolchain of the Android NDK for standalone use; this can 182 be done by invoking the script: 183 184 ./tools/make-standalone-toolchain.sh 185 186 which creates a usual cross-compile toolchain. Lets assume that you put 187 this toolchain below `/opt` then invoke configure with something 188 like: 189 190 ``` 191 export PATH=/opt/arm-linux-androideabi-4.4.3/bin:$PATH 192 ./configure --host=arm-linux-androideabi [more configure options] 193 make 194 ``` 195 - if you want to compile directly from our GIT repo you might run into 196 this issue with older automake stuff: 197 198 ``` 199 checking host system type... 200 Invalid configuration `arm-linux-androideabi': 201 system `androideabi' not recognized 202 configure: error: /bin/sh ./config.sub arm-linux-androideabi failed 203 ``` 204 this issue can be fixed with using more recent versions of `config.sub` 205 and `config.guess` which can be obtained here: 206 http://git.savannah.gnu.org/gitweb/?p=config.git;a=tree 207 you need to replace your system-own versions which usually can be 208 found in your automake folder: 209 `find /usr -name config.sub` 210 211 212CMake builds 213============ 214 215Current releases of c-ares introduce a CMake v3+ build system that has been 216tested on most platforms including Windows, Linux, FreeBSD, MacOS, AIX and 217Solaris. 218 219In the most basic form, building with CMake might look like: 220 221```sh 222cd /path/to/cmake/source 223mkdir build 224cd build 225cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/cares .. 226make 227sudo make install 228``` 229 230Options 231------- 232 233Options to CMake are passed on the command line using "-D${OPTION}=${VALUE}". 234The values defined are all boolean and take values like On, Off, True, False. 235 236* CARES_STATIC - Build the static library (off by default) 237* CARES_SHARED - Build the shared library (on by default) 238* CARES_INSTALL - Hook in installation, useful to disable if chain building 239* CARES_STATIC_PIC - Build the static library as position-independent (off by 240 default) 241 242 243Ninja 244----- 245 246Ninja is the next-generation build system meant for generators like CMake that 247heavily parallize builds. Its use is very similar to the normal build: 248 249```sh 250cd /path/to/cmake/source 251mkdir build 252cd build 253cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local/cares -G "Ninja" .. 254ninja 255sudo ninja install 256``` 257 258Windows MSVC Command Line 259------------------------- 260 261``` 262cd \path\to\cmake\source 263mkdir build 264cd build 265cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:\cares -G "NMake Makefiles" .. 266nmake 267nmake install 268``` 269 270Windows MinGW-w64 Command Line via MSYS 271--------------------------------------- 272``` 273cd \path\to\cmake\source 274mkdir build 275cd build 276cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=C:\cares -G "MSYS Makefiles" .. 277make 278make install 279``` 280 281 282Platform-specific build systems 283=============================== 284 285Win32 286----- 287 288### Building Windows DLLs and C run-time (CRT) linkage issues 289 290As a general rule, building a DLL with static CRT linkage is highly 291discouraged, and intermixing CRTs in the same app is something to 292avoid at any cost. 293 294Reading and comprehension of Microsoft Knowledge Base articles 295KB94248 and KB140584 is a must for any Windows developer. Especially 296important is full understanding if you are not going to follow the 297advice given above. 298 299 - [KB94248](http://support.microsoft.com/kb/94248/en-us) - How To Use the C Run-Time 300 301 - [KB140584](http://support.microsoft.com/kb/140584/en-us) - How to link with the correct C Run-Time (CRT) library 302 303 - [KB190799](http://msdn.microsoft.com/en-us/library/ms235460) - Potential Errors Passing CRT Objects Across DLL Boundaries 304 305If your app is misbehaving in some strange way, or it is suffering 306from memory corruption, before asking for further help, please try 307first to rebuild every single library your app uses as well as your 308app using the debug multithreaded dynamic C runtime. 309 310 311### MingW32 312 313Make sure that MinGW32's bin dir is in the search path, for example: 314 315 set PATH=c:\mingw32\bin;%PATH% 316 317then run 'make -f Makefile.m32' in the root dir. 318 319 320### MSVC 6 caveats 321 322If you use MSVC 6 it is required that you use the February 2003 edition PSDK: 323http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm 324 325 326### MSVC from command line 327 328Run the `vcvars32.bat` file to get a proper environment. The 329`vcvars32.bat` file is part of the Microsoft development environment and 330you may find it in `C:\Program Files\Microsoft Visual Studio\vc98\bin` 331provided that you installed Visual C/C++ 6 in the default directory. 332 333Further details in [README.msvc](README.msvc) 334 335 336### Important static c-ares usage note 337 338When building an application that uses the static c-ares library, you must 339add `-DCARES_STATICLIB` to your `CFLAGS`. Otherwise the linker will look for 340dynamic import symbols. 341 342 343IBM OS/2 344-------- 345 346Building under OS/2 is not much different from building under unix. 347You need: 348 349 - emx 0.9d 350 - GNU make 351 - GNU patch 352 - ksh 353 - GNU bison 354 - GNU file utilities 355 - GNU sed 356 - autoconf 2.13 357 358If during the linking you get an error about `_errno` being an undefined 359symbol referenced from the text segment, you need to add `-D__ST_MT_ERRNO__` 360in your definitions. 361 362If you're getting huge binaries, probably your makefiles have the `-g` in 363`CFLAGS`. 364 365 366NetWare 367------- 368 369To compile `libcares.a` / `libcares.lib` you need: 370 371 - either any gcc / nlmconv, or CodeWarrior 7 PDK 4 or later. 372 - gnu make and awk running on the platform you compile on; 373 native Win32 versions can be downloaded from: 374 http://www.gknw.net/development/prgtools/ 375 - recent Novell LibC SDK available from: 376 http://developer.novell.com/ndk/libc.htm 377 - or recent Novell CLib SDK available from: 378 http://developer.novell.com/ndk/clib.htm 379 380Set a search path to your compiler, linker and tools; on Linux make 381sure that the var `OSTYPE` contains the string 'linux'; set the var 382`NDKBASE` to point to the base of your Novell NDK; and then type 383`make -f Makefile.netware` from the top source directory; 384 385VCPKG 386===== 387 388You can build and install c-ares using [vcpkg](https://github.com/Microsoft/vcpkg/) dependency manager: 389 390```sh or powershell 391 git clone https://github.com/Microsoft/vcpkg.git 392 cd vcpkg 393 ./bootstrap-vcpkg.sh 394 ./vcpkg integrate install 395 ./vcpkg install c-ares 396``` 397 398The c-ares port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. 399 400PORTS 401===== 402 403This is a probably incomplete list of known hardware and operating systems 404that c-ares has been compiled for. If you know a system c-ares compiles and 405runs on, that isn't listed, please let us know! 406 407 - Alpha Tru64 v5.0 5.1 408 - ARM Android 1.5, 2.1, 2.3 409 - MIPS IRIX 6.2, 6.5 410 - Power AIX 3.2.5, 4.2, 4.3.1, 4.3.2, 5.1, 5.2 411 - i386 Linux 1.3, 2.0, 2.2, 2.3, 2.4, 2.6 412 - i386 Novell NetWare 413 - i386 Windows 95, 98, ME, NT, 2000, XP, 2003 414 - x86_64 Linux 415 416 417Useful URLs 418=========== 419 420 - c-ares: https://c-ares.org/ 421 - MingW: http://www.mingw.org/ 422 - MinGW-w64: http://mingw-w64.sourceforge.net/ 423 - OpenWatcom: http://www.openwatcom.org/ 424