• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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