blob: 1a5af2b1b4b88a5987b17b6236982892c85b9fc9 [file] [log] [blame]
Willy Tarreau7f332732018-12-16 22:27:15 +01001Installation instructions for HAProxy
2=====================================
3
Willy Tarreau3b068c42021-11-23 15:48:35 +01004This is a development version, so it is expected to break from time to time,
5to add and remove features without prior notification and it should not be used
6in production. If you are not used to build from sources or if you are not used
7to follow updates then it is recommended that instead you use the packages
8provided by your software vendor or Linux distribution. Most of them are taking
9this task seriously and are doing a good job at backporting important fixes. If
10for any reason you'd prefer to use a different version than the one packaged
11for your system, you want to be certain to have all the fixes or to get some
12commercial support, other choices are available at http://www.haproxy.com/.
Willy Tarreau7f332732018-12-16 22:27:15 +010013
14
15Areas covered in this document
16==============================
17
181) Quick build & install
192) Basic principles
203) Build environment
214) Dependencies
225) Advanced build options
236) How to install HAProxy
24
25
261) Quick build & install
27========================
28
29If you've already built HAProxy and are just looking for a quick reminder, here
30are a few build examples :
31
32 - recent Linux system with all options, make and install :
33 $ make clean
Willy Tarreaud254aa82019-06-14 18:40:48 +020034 $ make -j $(nproc) TARGET=linux-glibc \
Willy Tarreau12840be2021-04-22 14:14:22 +020035 USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1 USE_SYSTEMD=1
Willy Tarreau7f332732018-12-16 22:27:15 +010036 $ sudo make install
37
38 - FreeBSD and OpenBSD, build with all options :
Willy Tarreau12840be2021-04-22 14:14:22 +020039 $ gmake -j 4 TARGET=freebsd USE_OPENSSL=1 USE_LUA=1 USE_PCRE=1
Willy Tarreau7f332732018-12-16 22:27:15 +010040
41 - embedded Linux, build using a cross-compiler :
Willy Tarreau12840be2021-04-22 14:14:22 +020042 $ make -j $(nproc) TARGET=linux-glibc USE_OPENSSL=1 USE_PCRE=1 \
Willy Tarreaud254aa82019-06-14 18:40:48 +020043 CC=/opt/cross/gcc730-arm/bin/gcc ADDLIB=-latomic
Willy Tarreau7f332732018-12-16 22:27:15 +010044
45 - Build with static PCRE on Solaris / UltraSPARC :
46 $ make TARGET=solaris CPU=ultrasparc USE_STATIC_PCRE=1
47
48For more advanced build options or if a command above reports an error, please
49read the following sections.
50
51
522) Basic principles
53===================
54
55HAProxy uses a single GNU Makefile which supports options on the command line,
56so that there is no need to hack a "configure" file to work on your system. The
57makefile totally supports parallel build using "make -j <jobs>" where <jobs>
58matches the number of usable processors, which on some platforms is returned by
59the "nproc" utility. The explanations below may occasionally refer to some
60options, usually in the form "name=value", which have to be passed to the
61command line. This means that the option has to be passed after the "make"
62command. For example :
63
64 $ make -j $(nproc) TARGET=generic USE_GZIP=1
65
66One required option is TARGET, it must be set to a target platform name, which
67provides a number of presets. The list of known platforms is displayed when no
68target is specified. It is not strictly required to use the exact target, you
69can use a relatively similar one and adjust specific variables by hand.
70
71Most configuration variables are in fact booleans. Some options are detected and
72enabled by default if available on the target platform. This is the case for all
73those named "USE_<feature>". These booleans are enabled by "USE_<feature>=1"
Willy Tarreau1efe6892021-04-02 15:53:34 +020074and are disabled by "USE_<feature>=" (with no value). An exhaustive list of the
75supported USE_* features is located at the top of the main Makefile. The last
76occurrence of such an option on the command line overrides any previous one.
77Example :
Willy Tarreau7f332732018-12-16 22:27:15 +010078
79 $ make TARGET=generic USE_THREAD=
80
81In case of error or missing TARGET, a help screen is displayed. It is also
82possible to display a list of all known options using "make help".
83
Willy Tarreau1efe6892021-04-02 15:53:34 +020084Some optional components which may depend on third-party libraries, are used
85with popular tools which are not necessarily standard implementations, or are
86maintained at slower pace than the core of the project, are located in the
87"addons/" directory. These ones may disappear in a future version if the
88product they depend on disappears or if their maintainers do not assign enough
89resources to maintain them any more. For this reason they are not built by
90default, but some USE_* options are usually provided for them, and their build
91is routinely tested anyway.
92
Willy Tarreau7f332732018-12-16 22:27:15 +010093
943) Build environment
95====================
96
97HAProxy requires a working GCC or Clang toolchain and GNU make :
98
99 - GNU make >= 3.80. Note that neither Solaris nor OpenBSD's make work with
100 the GNU Makefile. If you get many syntax errors when running "make", you
101 may want to retry with "gmake" which is the name commonly used for GNU make
102 on BSD systems.
103
Willy Tarreauc5aa0602021-05-14 08:03:00 +0200104 - GCC >= 3.4 (up to 11 tested). Older versions can be made to work with a
Willy Tarreau7f332732018-12-16 22:27:15 +0100105 few minor adaptations if really needed. Newer versions may sometimes break
106 due to compiler regressions or behaviour changes. The version shipped with
107 your operating system is very likely to work with no trouble. Clang >= 3.0
108 is also known to work as an alternative solution. Recent versions may emit
Willy Tarreau4ced4bd2020-07-07 16:17:00 +0200109 a bit more warnings that are worth reporting as they may reveal real bugs.
Willy Tarreauc22747d2020-11-05 16:56:37 +0100110 TCC (https://repo.or.cz/tinycc.git) is also usable for developers but will
111 not support threading and was found at least once to produce bad code in
112 some rare corner cases (since fixed). But it builds extremely quickly
113 (typically half a second for the whole project) and is very convenient to
114 run quick tests during API changes or code refactoring.
Willy Tarreau7f332732018-12-16 22:27:15 +0100115
116 - GNU ld (binutils package), with no particular version. Other linkers might
117 work but were not tested.
118
119On debian or Ubuntu systems and their derivatives, you may get all these tools
120at once by issuing the two following commands :
121
122 $ sudo apt-get update
123 $ sudo apt-get install build-essential
124
125On Fedora, CentOS, RHEL and derivatives, you may get the equivalent packages
126with the following command :
127
128 $ sudo yum groupinstall "Development Tools"
129
130Please refer to your operating system's documentation for other systems.
131
132It is also possible to build HAProxy for another system or platform using a
133cross-compiler but in this case you probably already have installed these
134tools.
135
Willy Tarreauc5aa0602021-05-14 08:03:00 +0200136Building HAProxy may require between 60 and 80 MB of free space in the
Willy Tarreau7f332732018-12-16 22:27:15 +0100137directory where the sources have been extracted, depending on the debugging
138options involved.
139
140
1414) Dependencies
142===============
143
144HAProxy in its basic form does not depend on anything beyond a working libc.
145However a number of options are enabled by default, or are highly recommended,
146and these options will typically involve some external components or libraries,
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500147depending on the targeted platform.
Willy Tarreau7f332732018-12-16 22:27:15 +0100148
149Optional dependencies may be split into several categories :
150
151 - memory allocation
152 - regular expressions
153 - multi-threading
154 - password encryption
155 - cryptography
156 - compression
157 - lua
158 - device detection
159 - miscellaneous
160
161
1624.1) Memory allocation
163----------------------
164By default, HAProxy uses the standard malloc() call provided by the libc. It
Willy Tarreauc3643512019-03-27 14:20:43 +0100165may also be built to use jemalloc, which is fast and thread-safe. In order to
166use it, please add "-ljemalloc" to the ADDLIB variable. You may possibly also
167need to append "-lpthread" and/or "-ldl" depending on the operating system.
Willy Tarreau7f332732018-12-16 22:27:15 +0100168
169
1704.2) Regular expressions
171------------------------
172HAProxy may make use regular expressions (regex) to match certain patterns. The
173regex engine is provided by default in the libc. On some operating systems, it
174might happen that the original regex library provided by the libc is too slow,
175too limited or even bogus. For example, on older Solaris versions up to 8, the
176default regex used not to properly extract group references, without reporting
177compilation errors. Also, some early versions of the GNU libc used to include a
178regex engine which could be slow or even crash on certain patterns.
179
180If you plan on importing a particularly heavy configuration involving a lot of
Ilya Shipitsin01881082021-08-07 14:41:56 +0500181regex, you may benefit from using some alternative regex implementations such as
Willy Tarreau7f332732018-12-16 22:27:15 +0100182PCRE. HAProxy natively supports PCRE and PCRE2, both in standard and JIT
183flavors (Just In Time). The following options are available depending on the
184library version provided on your system :
185
186 - "USE_PCRE=1" : enable PCRE version 1, dynamic linking
187 - "USE_STATIC_PCRE=1" : enable PCRE version 1, static linking
188 - "USE_PCRE_JIT=1" : enable PCRE version 1 in JIT mode
189 - "USE_PCRE2=1" : enable PCRE version 2, dynamic linking
190 - "USE_STATIC_PCRE2=1" : enable PCRE version 2, static linking
191 - "USE_PCRE2_JIT=1" : enable PCRE version 2 in JIT mode
192
193Both of these libraries may be downloaded from https://www.pcre.org/.
194
195By default, the include and library paths are figured from the "pcre-config"
196and "pcre2-config" utilities. If these ones are not installed or inaccurate
197(for example when cross-compiling), it is possible to force the path to include
198files using "PCRE_INC" and "PCRE2_INC" respectively, and the path to library
199files using "PCRE_LIB" and "PCRE2_LIB" respectively. For example :
200
201 $ make TARGET=generic \
202 USE_PCRE2_JIT=1 PCRE2_INC=/opt/cross/include PCRE2_LIB=/opt/cross/lib
203
204
2054.3) Multi-threading
206--------------------
207On some systems for which positive feedback was reported, multi-threading will
208be enabled by default. When multi-threading is used, the libpthread library
209(POSIX threading) will be used. If the target system doesn't contain such a
210library, it is possible to forcefully disable multi-threading by adding
211"USE_THREAD=" on the command line.
212
213
2144.4) Password encryption
215------------------------
216Many systems provide password encryption functions used for authentication. On
217some systems these functions are part of the libc. On others, they're part of a
218separate library called "libcrypt". The default targets are pre-configured
219based on which system needs the library. It is possible to forcefully disable
220the linkage against libcrypt by adding "USE_LIBCRYPT=" on the command line, or
221to forcefully enable it using "USE_LIBCRYPT=1".
222
223
2244.5) Cryptography
225-----------------
226For SSL/TLS, it is necessary to use a cryptography library. HAProxy currently
227supports the OpenSSL library, and is known to build ant work with branches
2280.9.8, 1.0.0, 1.0.1, 1.0.2, 1.1.0 and 1.1.1. OpenSSL follows a long-term
229support cycle similar to HAProxy's, and each of the branches above receives its
230own fixes, without forcing you to upgrade to another branch. There is no excuse
231for staying vulnerable by not applying a fix available for your version. There
232is always a small risk of regression when jumping from one branch to another
233one, especially when it's very new, so it's preferable to observe for a while
234if you use a different version than your system's defaults.
235
Amaury Denoyellead3683b2021-11-03 18:14:44 +0100236Three OpenSSL derivatives called LibreSSL, BoringSSL and QUICTLS are reported
237to work as well. While there are some efforts from the community to ensure they
238work well, OpenSSL remains the primary target and this means that in case of
239conflicting choices, OpenSSL support will be favored over other options. Note
240that OpenSSL is not compatible when building haproxy with QUIC support. In this
241case, QUICTLS is the preferred alternative. See the section about QUIC in this
242document.
Willy Tarreau7f332732018-12-16 22:27:15 +0100243
244In order to enable SSL/TLS support, simply pass "USE_OPENSSL=1" on the command
245line and the default library present on your system will be used :
246
247 $ make TARGET=generic USE_OPENSSL=1
248
249If you want to use a different version from the one provided by your system
250(which is not recommended due to the risk of missing security fixes), it is
251possible to indicate the path to the SSL include files using SSL_INC, and the
252SSL library files using SSL_LIB. Example :
253
254 $ make TARGET=generic \
255 USE_OPENSSL=1 SSL_INC=/opt/ssl-1.1.1/include SSL_LIB=/opt/ssl-1.1.1/lib
256
257In order to link OpenSSL statically against HAProxy, first download OpenSSL
258from https://www.openssl.org/ then build it with the "no-shared" keyword and
259install it to a local directory, so your system is not affected :
260
261 $ export STATICLIBSSL=/tmp/staticlibssl
262 $ ./config --prefix=$STATICLIBSSL no-shared
263 $ make && make install_sw
264
265Then when building haproxy, pass that path via SSL_INC and SSL_LIB :
266
267 $ make TARGET=generic \
268 USE_OPENSSL=1 SSL_INC=$STATICLIBSSL/include SSL_LIB=$STATICLIBSSL/lib
269
270When building with OpenSSL on some systems, you may also need to enable support
271for the "libz" library, which is visible if the linker complains about function
272"deflateInit()" not being found. In this case, simply append "ADDLIB=-lz" to
273the command line.
274
275It is worth mentioning that asynchronous cryptography engines are supported on
276OpenSSL 1.1.0 and above. Such engines are used to access hardware cryptography
277acceleration that might be present on your system.
278
279
2804.6) Compression
281----------------
282HAProxy can compress HTTP responses before delivering them to clients, in order
283to save network bandwidth. Two compression options are available. The first one
Willy Tarreau12840be2021-04-22 14:14:22 +0200284relies on the libslz library (http://libslz.org) that is embedded in haproxy.
285It is enabled by default as it is very fast and does not keep a copy of the
286contents in memory. It is possible to disable it, for example for very small
287systems, by passing "USE_SLZ=" to the "make" command.
288
289Please note that SLZ will benefit from some CPU-specific instructions like the
290availability of the CRC32 extension on some ARM processors. Thus it can further
Willy Tarreau40a871f2021-05-12 09:47:30 +0200291improve its performance to build with "CPU=native" on the target system, or
292"CPU=armv81" (modern systems such as Graviton2 or A55/A75 and beyond),
293"CPU=a72" (e.g. for RPi4, or AWS Graviton), "CPU=a53" (e.g. for RPi3), or
294"CPU=armv8-auto" (automatic detection with minor runtime penalty).
Willy Tarreau12840be2021-04-22 14:14:22 +0200295
296A second option involves the widely known zlib library, which is very likely
297installed on your system. In order to use zlib, simply pass "USE_ZLIB=1" to the
298"make" command line, which will also automatically disable SLZ. If the library
299is not installed in your default system's path, it is possible to specify the
300path to the include files using ZLIB_INC, and the path to the library files
301using ZLIB_LIB :
Willy Tarreau7f332732018-12-16 22:27:15 +0100302
303 $ make TARGET=generic \
304 USE_ZLIB=1 ZLIB_INC=/opt/zlib-1.2.11/include ZLIB_LIB=/opt/zlib-1.2.11/lib
305
Willy Tarreau7f332732018-12-16 22:27:15 +0100306Zlib is commonly found on most systems, otherwise updates can be retrieved from
307http://www.zlib.net/. It is easy and fast to build, and new versions sometimes
Willy Tarreau12840be2021-04-22 14:14:22 +0200308provide better performance so it might be worth using an up-to-date one.
Willy Tarreau7f332732018-12-16 22:27:15 +0100309
Willy Tarreau12840be2021-04-22 14:14:22 +0200310Zlib compresses a bit better than libslz but at the expense of more CPU usage
311(about 3.5 times more minimum), and a huge memory usage (~260 kB per compressed
312stream). The only valid reason for uzing Zlib instead of SLZ here usually is to
313deal with a very limited internet bandwidth while CPU and RAM are abundant so
314that the last few percent of compression ratio are worth the invested hardware.
315
Willy Tarreau7f332732018-12-16 22:27:15 +0100316
3174.7) Lua
318--------
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500319Lua is an embedded programming language supported by HAProxy to provide more
Willy Tarreau7f332732018-12-16 22:27:15 +0100320advanced scripting capabilities. Only versions 5.3 and above are supported.
321In order to enable Lua support, please specify "USE_LUA=1" on the command line.
322Some systems provide this library under various names to avoid conflicts with
323previous versions. By default, HAProxy looks for "lua5.3", "lua53", "lua". If
324your system uses a different naming, you may need to set the library name in
325the "LUA_LIB_NAME" variable.
326
327If Lua is not provided on your system, it can be very simply built locally. It
328can be downloaded from https://www.lua.org/, extracted and built, for example :
329
330 $ cd /opt/lua-5.3.5
331 $ make linux
332
333The path to the include files and library files may be set using "LUA_INC" and
334"LUA_LIB" respectively. For example :
335
336 $ make TARGET=generic \
337 USE_LUA=1 LUA_INC=/opt/lua-5.3.5/src LUA_LIB=/opt/lua-5.3.5/src
338
339
3404.8) Device detection
341---------------------
342HAProxy supports several device detection modules relying on third party
343products. Some of them may provide free code, others free libs, others free
344evaluation licenses. Please read about their respective details in the
345following files :
346
347 doc/DeviceAtlas-device-detection.txt for DeviceAtlas
348 doc/51Degrees-device-detection.txt for 51Degrees
Willy Tarreaub3cc9f22019-04-19 16:03:32 +0200349 doc/WURFL-device-detection.txt for Scientiamobile WURFL
Willy Tarreau7f332732018-12-16 22:27:15 +0100350
351
3524.9) Miscellaneous
353------------------
354Some systems have specificities. Usually these specificities are known and/or
355detected and properly set for you. If you need to adjust the behaviour, here
356are the extra libraries that may be referenced at build time :
357
358 - USE_RT=1 build with librt, which is sometimes needed on some systems
359 when using threads. It is set by default on Linux platforms,
360 and may be disabled using "USE_RT=" if your system doesn't
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200361 have one. You may have to set it as well if you face an error
362 indicating that clock_gettime() was not found.
Willy Tarreau7f332732018-12-16 22:27:15 +0100363
364 - USE_DL=1 build with libdl, which is usually needed for Lua and OpenSSL
365 on Linux. It is automatically detected and may be disabled
366 using "USE_DL=", though it should never harm.
367
368 - USE_SYSTEMD=1 enables support for the sdnotify features of systemd,
369 allowing better integration with systemd on Linux systems
370 which come with it. It is never enabled by default so there
371 is no need to disable it.
372
Willy Tarreau4ced4bd2020-07-07 16:17:00 +0200373
Willy Tarreau4703fdd2019-06-16 19:39:44 +02003744.10) Common errors
375-------------------
376Some build errors may happen depending on the options combinations or the
377selected target. When facing build errors, if you know that your system is a
378bit special or particularly old, start from TARGET=generic, it is easier to
379start from there and fix the remaining issues than trying to degrade another
380target. Common issues may include:
381
382 - clock_gettime() not found
383 => your system needs USE_RT=1
384
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200385 - many __sync_<something> errors in many files
Willy Tarreau6fd04502021-06-15 16:11:33 +0200386 => your gcc is too old, build without threads.
Willy Tarreau4703fdd2019-06-16 19:39:44 +0200387
388 - many openssl errors
389 => your OpenSSL version really is too old, do not enable OpenSSL
390
Willy Tarreau7f332732018-12-16 22:27:15 +0100391
Amaury Denoyellead3683b2021-11-03 18:14:44 +01003924.11) QUIC
393----------
394QUIC is the new transport layer protocol and is required for HTTP/3. This
395protocol stack is currently supported as an experimental feature in haproxy on
396the frontend side. In order to enable it, use "USE_QUIC=1 USE_OPENSSL=1".
397
398Note that the OpenSSL library is not compatible with QUIC. The preferred option
399is to use QUICTLS. This is a fork of OpenSSL with a QUIC-compatible API. Its
400repository is available at https://github.com/quictls/openssl. You can use the
401following instruction to build a functional QUICTLS.
402
403 $ ./config enable-tls1_3 [--prefix=/opt/quictls]
404 $ make
405 $ make install
406
407On a development environment, use SSL_INC and SSL_LIB when building haproxy to
408point to the correct cryptographic library. It may be useful to specify QUICTLS
409location via rpath for haproxy execution. Example :
410
411 $ make TARGET=generic \
412 USE_QUIC=1 \
413 USE_OPENSSL=1 SSL_INC=/opt/quictls/include SSL_LIB=/opt/quictls/lib \
414 LDFLAGS="-Wl,-rpath,/opt/quictls/lib"
415
Willy Tarreau7f332732018-12-16 22:27:15 +01004165) How to build HAProxy
417=======================
418
419This section assumes that you have already read section 2 (basic principles)
420and section 3 (build environment). It often refers to section 4 (dependencies).
421
422To build haproxy, you have to choose your target OS amongst the following ones
423and assign it to the TARGET variable :
424
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200425 - linux-glibc for Linux kernel 2.6.28 and above
426 - linux-glibc-legacy for Linux kernel 2.6.28 and above without new features
Willy Tarreau39b2fda2020-04-16 15:14:17 +0200427 - linux-musl for Linux kernel 2.6.28 and above with musl libc
Brad Smith7c503bb2020-09-30 15:46:16 -0400428 - solaris for Solaris 10 and above
Brad Smith3f1977c2020-10-02 18:36:58 -0400429 - freebsd for FreeBSD 10 and above
Brad Smith382001b2020-10-08 01:15:06 -0400430 - dragonfly for DragonFlyBSD 4.3 and above
Brad Smith0fdfe412020-10-08 16:24:52 -0400431 - netbsd for NetBSD 8 and above
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200432 - osx for Mac OS/X
Brad Smith3f1977c2020-10-02 18:36:58 -0400433 - openbsd for OpenBSD 6.3 and above
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200434 - aix51 for AIX 5.1
435 - aix52 for AIX 5.2
Christian Lachnerc1322302020-02-10 10:29:13 +0100436 - aix72-gcc for AIX 7.2 (using gcc)
Lukas Tribuscc1eb162019-09-01 16:48:36 +0200437 - cygwin for Cygwin
438 - haiku for Haiku
439 - generic for any other OS or version.
440 - custom to manually adjust every setting
Willy Tarreau7f332732018-12-16 22:27:15 +0100441
442You may also choose your CPU to benefit from some optimizations. This is
443particularly important on UltraSparc machines. For this, you can assign
444one of the following choices to the CPU variable :
445
446 - i686 for intel PentiumPro, Pentium 2 and above, AMD Athlon (32 bits)
447 - i586 for intel Pentium, AMD K6, VIA C3.
448 - ultrasparc : Sun UltraSparc I/II/III/IV processor
Christian Lachnerc1322302020-02-10 10:29:13 +0100449 - power8 : IBM POWER8 processor
450 - power9 : IBM POWER9 processor
Willy Tarreau40a871f2021-05-12 09:47:30 +0200451 - armv81 : modern ARM cores (Cortex A55/A75/A76/A78/X1, Neoverse, Graviton2)
452 - a72 : ARM Cortex-A72 or A73 (e.g. RPi4, Odroid N2, AWS Graviton)
453 - a53 : ARM Cortex-A53 or any of its successors in 64-bit mode (e.g. RPi3)
454 - armv8-auto : support both older and newer armv8 cores with a minor penalty,
455 thanks to gcc 10's outline atomics (default with gcc 10.2).
Willy Tarreau7f332732018-12-16 22:27:15 +0100456 - native : use the build machine's specific processor optimizations. Use with
457 extreme care, and never in virtualized environments (known to break).
458 - generic : any other processor or no CPU-specific optimization. (default)
459
460Alternatively, you may just set the CPU_CFLAGS value to the optimal GCC options
461for your platform. A second variable named SMALL_OPTS also supports passing a
462number of defines and compiler options usually for small systems. For better
463clarity it's recommended to pass the options which result in a smaller binary
464(like memory limits or -Os) into this variable.
465
466If you are building for a different system than the one you're building on,
467this is called "cross-compiling". HAProxy supports cross-compilation pretty
468well and tries to ease it by letting you adjust paths to all libraries (please
469read section 4 on dependencies for more details). When cross-compiling, you
470just need to pass the path to your compiler in the "CC" variable, and the path
471to the linker in the "LD" variable. Most of the time, setting the CC variable
472is enough since LD points to it by default.
473
474By default the build process runs in quiet mode and hide the details of the
475commands that are executed. This allows to more easily catch build warnings
476and see what is happening. However it is not convenient at all to observe what
477flags are passed to the compiler nor what compiler is involved. Simply append
478"V=1" to the "make" command line to switch to verbose mode and display the
479details again. It is recommended to use this option when cross-compiling to
480verify that the paths are correct and that /usr/include is never invovled.
481
482You may want to build specific target binaries which do not match your native
483compiler's target. This is particularly true on 64-bit systems when you want
484to build a 32-bit binary. Use the ARCH variable for this purpose. Right now
485it only knows about a few x86 variants (i386,i486,i586,i686,x86_64), two
486generic ones (32,64) and sets -m32/-m64 as well as -march=<arch> accordingly.
487This variable is only used to set ARCH_FLAGS to preset values, so if you know
488the arch-specific flags that your system needs, you may prefer to set
489ARCH_FLAGS instead. Note that these flags are passed both to the compiler and
490to the linker. For example, in order to build a 32-bit binary on an x86_64
491Linux system with SSL support without support for compression but when OpenSSL
492requires ZLIB anyway :
493
Willy Tarreaud254aa82019-06-14 18:40:48 +0200494 $ make TARGET=linux-glibc ARCH=i386 USE_OPENSSL=1 ADDLIB=-lz
Willy Tarreau7f332732018-12-16 22:27:15 +0100495
496Recent systems can resolve IPv6 host names using getaddrinfo(). This primitive
497is not present in all libcs and does not work in all of them either. Support in
498glibc was broken before 2.3. Some embedded libs may not properly work either,
499thus, support is disabled by default, meaning that some host names which only
500resolve as IPv6 addresses will not resolve and configs might emit an error
501during parsing. If you know that your OS libc has reliable support for
502getaddrinfo(), you can add USE_GETADDRINFO=1 on the make command line to enable
503it. This is the recommended option for most Linux distro packagers since it's
504working fine on all recent mainstream distros. It is automatically enabled on
505Solaris 8 and above, as it's known to work.
506
507If your system supports PCRE (Perl Compatible Regular Expressions), then you
508really should build with libpcre which is between 2 and 10 times faster than
509other libc implementations. Regex are used for header processing (deletion,
510rewriting, allow, deny). Please see section 4 about dependencies to figure
511how to build with PCRE support.
512
513It is possible to add native support for SSL, by passing "USE_OPENSSL=1" on the
514make command line. The libssl and libcrypto will automatically be linked with
515HAProxy. Some systems also require libz, so if the build fails due to missing
516symbols such as deflateInit(), then try again with "ADDLIB=-lz". Please check
517section 4 about dependencies for more information on how to build with OpenSSL.
518
519HAProxy can compress HTTP responses to save bandwidth. Please see section 4
520about dependencies to see the available libraries and associated options.
521
522By default, the DEBUG variable is set to '-g' to enable debug symbols. It is
523not wise to disable it on uncommon systems, because it's often the only way to
524get a usable core when you need one. Otherwise, you can set DEBUG to '-s' to
525strip the binary.
526
527If the ERR variable is set to any non-empty value, then -Werror will be added
528to the compiler so that any build warning will trigger an error. This is the
529recommended way to build when developing, and it is expected that contributed
530patches were tested with ERR=1.
531
Willy Tarreau7f332732018-12-16 22:27:15 +0100532If you need to pass other defines, includes, libraries, etc... then please
533check the Makefile to see which ones will be available in your case, and
534use/override the USE_* variables from the Makefile.
535
536AIX 5.3 is known to work with the generic target. However, for the binary to
537also run on 5.2 or earlier, you need to build with DEFINE="-D_MSGQSUPPORT",
538otherwise __fd_select() will be used while not being present in the libc, but
539this is easily addressed using the "aix52" target. If you get build errors
540because of strange symbols or section mismatches, simply remove -g from
541DEBUG_CFLAGS.
542
Christian Lachnerc1322302020-02-10 10:29:13 +0100543Building on AIX 7.2 works fine using the "aix72-gcc" TARGET. It adds two
Thayne McCombscdbcca92021-01-07 21:24:41 -0700544special CFLAGS to prevent the loading of AIX's xmem.h and var.h. This is done
Christian Lachnerc1322302020-02-10 10:29:13 +0100545by defining the corresponding include-guards _H_XMEM and _H_VAR. Without
546excluding those header-files the build fails because of redefinition errors.
Ilya Shipitsin2a950d02020-03-06 13:07:38 +0500547Furthermore, the atomic library is added to the LDFLAGS to allow for
Christian Lachnerc1322302020-02-10 10:29:13 +0100548multithreading via USE_THREAD.
549
Willy Tarreau7f332732018-12-16 22:27:15 +0100550You can easily define your own target with the GNU Makefile. Unknown targets
551are processed with no default option except USE_POLL=default. So you can very
Willy Tarreau12840be2021-04-22 14:14:22 +0200552well use that property to define your own set of options. USE_POLL and USE_SLZ
553can even be disabled by setting them to an empty string. For example :
Willy Tarreau7f332732018-12-16 22:27:15 +0100554
Willy Tarreau12840be2021-04-22 14:14:22 +0200555 $ gmake TARGET=tiny USE_POLL="" USE_SLZ="" TARGET_CFLAGS=-fomit-frame-pointer
Willy Tarreau7f332732018-12-16 22:27:15 +0100556
557If you need to pass some defines to the preprocessor or compiler, you may pass
558them all in the DEFINE variable. Example:
559
560 $ make TARGET=generic DEFINE="-DDEBUG_DONT_SHARE_POOLS -DDEBUG_MEMORY_POOLS"
561
562The ADDINC variable may be used to add some extra include paths; this is
563sometimes needed when cross-compiling. Similarly the ADDLIB variable may be
564used to specifify extra paths to library files. Example :
565
566 $ make TARGET=generic ADDINC=-I/opt/cross/include ADDLIB=-L/opt/cross/lib64
567
568
5696) How to install HAProxy
570=========================
571
572To install haproxy, you can either copy the single resulting binary to the
573place you want, or run :
574
575 $ sudo make install
576
577If you're packaging it for another system, you can specify its root directory
578in the usual DESTDIR variable.
579
580-- end