1#                                               -*- Autoconf -*-
2# Process this file with autoconf to produce a configure script.
3AC_PREREQ(2.61)
4#
5# The 0MQ version number is extracted from include/zmq.h using
6# the version.sh script. Hence, it should be updated there.
7# The version in git should reflect the *next* version planned.
8#
9AC_INIT([zeromq],[m4_esyscmd([./version.sh])],[zeromq-dev@lists.zeromq.org])
10
11AC_CONFIG_AUX_DIR(config)
12AC_CONFIG_MACRO_DIR(config)
13AC_CONFIG_HEADERS([src/platform.hpp])
14AM_INIT_AUTOMAKE(foreign subdir-objects tar-ustar dist-zip)
15# Allow "configure --disable-maintainer-mode" to disable timestamp checking
16AM_MAINTAINER_MODE([enable])
17
18m4_pattern_allow([AC_PROG_CC_C99])
19m4_include([m4/ax_check_compile_flag.m4])
20m4_include([m4/ax_cxx_compile_stdcxx_11.m4])
21m4_include([m4/ax_code_coverage.m4])
22m4_include([m4/ax_valgrind_check.m4])
23m4_include([m4/ax_check_vscript.m4])
24m4_include([m4/ax_func_posix_memalign.m4])
25m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
26
27# This lets us use PACKAGE_VERSION in Makefiles
28AC_SUBST(PACKAGE_VERSION)
29
30# Libtool -version-info (ABI version)
31#
32# Don't change this unless you know exactly what you're doing and have read and
33# understand:
34# http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
35#
36# Changes:
37#
38# ZeroMQ versions prior to 2.1.0 use 0:0:0 (undefined)
39# ZeroMQ versions 2.1.x: 1:0:0 (ABI version 1)
40# ZeroMQ version 3.0: 2:0:0 (ABI version 2)
41# ZeroMQ version 3.1: 3:0:0 (ABI version 3)
42# ZeroMQ version 4.0: 4:0:0 (ABI version 4)
43# ZeroMQ version 4.1: 5:0:0 (ABI version 5)
44# ZeroMQ version 4.2.0: 6:0:1 (ABI version 5)
45# ZeroMQ version 4.2.1: 6:1:1 (ABI version 5)
46# ZeroMQ version 4.2.2: 6:2:1 (ABI version 5)
47# ZeroMQ version 4.2.3: 6:3:1 (ABI version 5)
48# ZeroMQ version 4.2.4: 6:4:1 (ABI version 5)
49# ZeroMQ version 4.2.5: 6:5:1 (ABI version 5)
50# ZeroMQ version 4.3.0: 7:0:2 (ABI version 5)
51# ZeroMQ version 4.3.1: 7:1:2 (ABI version 5)
52# ZeroMQ version 4.3.2: 7:2:2 (ABI version 5)
53# ZeroMQ version 4.3.3: 7:3:2 (ABI version 5)
54# ZeroMQ version 4.3.4: 7:4:2 (ABI version 5)
55#
56# libzmq -version-info current:revision:age
57LTVER="7:4:2"
58AC_SUBST(LTVER)
59
60# Take a copy of original flags
61ZMQ_ORIG_CFLAGS="${CFLAGS:-none}"
62ZMQ_ORIG_CPPFLAGS="${CPPFLAGS:-none}"
63ZMQ_ORIG_CXXFLAGS="${CXXFLAGS:-none}"
64
65# Checks for programs.
66AC_PROG_CC
67AX_CHECK_COMPILE_FLAG([-std=gnu11], [CFLAGS+=" -std=gnu11"], [AC_PROG_CC_C99])
68AC_PROG_CXX
69AX_CODE_COVERAGE
70AM_PROG_CC_C_O
71AC_PROG_SED
72AC_PROG_AWK
73PKG_PROG_PKG_CONFIG
74m4_pattern_forbid([^PKG_[A-Z_]+$], [missing some pkg-config macros (pkg-config package)])
75
76# Libtool configuration for different targets. See acinclude.m4
77AC_ARG_VAR([XMLTO], [path to xmlto command])
78AC_PATH_PROG([XMLTO], [xmlto])
79AC_ARG_VAR([ASCIIDOC], [path to asciidoc command])
80AC_PATH_PROG([ASCIIDOC], [asciidoc])
81LIBZMQ_CONFIG_LIBTOOL
82AC_LIBTOOL_WIN32_DLL
83AC_PROG_LIBTOOL
84AX_VALGRIND_CHECK
85AX_CHECK_VSCRIPT
86AX_FUNC_POSIX_MEMALIGN
87
88AC_ARG_ENABLE([force-CXX98-compat],
89    [AS_HELP_STRING([--enable-force-CXX98-compat], [force C++98 build [default=disabled]])])
90if test "x$enable_force_CXX98_compat" = "xyes"; then
91    AC_LANG_PUSH([C++])
92    AX_CHECK_COMPILE_FLAG([-std=gnu++98], [CXXFLAGS+=" -std=gnu++98"], [])
93    AX_CHECK_COMPILE_FLAG([-Wc++98-compat -Wc++98-compat-pedantic], [CXXFLAGS+=" -Wc++98-compat"], [])
94    AC_LANG_POP([C++])
95else
96    AX_CXX_COMPILE_STDCXX_11([ext], [optional])
97fi
98
99# Check whether to build a with debug symbols
100LIBZMQ_CHECK_ENABLE_DEBUG
101
102# Check whether to enable code coverage
103LIBZMQ_WITH_GCOV
104
105AC_MSG_CHECKING([if TIPC is available and supports nonblocking connect])
106
107AC_RUN_IFELSE(
108    [AC_LANG_PROGRAM([[
109            #include <stdlib.h>
110            #include <string.h>
111            #include <fcntl.h>
112            #include <errno.h>
113            #include <sys/socket.h>
114            #include <linux/tipc.h>
115        ]],[[
116            struct sockaddr_tipc topsrv;
117            int sd = socket(AF_TIPC, SOCK_SEQPACKET, 0);
118            memset(&topsrv, 0, sizeof(topsrv));
119            topsrv.family = AF_TIPC;
120            topsrv.addrtype = TIPC_ADDR_NAME;
121            topsrv.addr.name.domain = tipc_addr (10, 10, 10);
122            topsrv.addr.name.name.type = TIPC_TOP_SRV;
123            topsrv.addr.name.name.instance = TIPC_TOP_SRV;
124            fcntl(sd, F_SETFL, O_NONBLOCK);
125        ]])
126    ],
127    [libzmq_tipc_support=yes],
128    [libzmq_tipc_support=no],
129    [libzmq_tipc_support=no])
130
131AC_MSG_RESULT([$libzmq_tipc_support])
132
133AC_ARG_ENABLE([pedantic],
134    [AS_HELP_STRING([--disable-pedantic], [disable pedantic compiler checks [default=enabled]])],
135    [libzmq_pedantic=$enableval], [libzmq_pedantic=yes])
136
137AC_ARG_WITH([militant],
138    [AS_HELP_STRING([--with-militant],
139        [enable militant API assertions])],
140    [zmq_militant="yes"],
141    [])
142
143if test "x$zmq_militant" = "xyes"; then
144    AC_DEFINE(ZMQ_ACT_MILITANT, 1, [Enable militant API assertions])
145fi
146
147# Disable IPC on unsupported platforms.
148case "${host_os}" in
149    *vxworks*|*openvms*|*mingw*)
150        ;;
151    *)
152        AC_DEFINE(ZMQ_HAVE_IPC, 1, [Have AF_UNIX sockets for ipc transport])
153        ;;
154esac
155
156# Data race/deadlock detection
157# NOTE: Running libzmq under TSAN doesn't make much sense -- synchronization in libzmq is to some extent
158# handled by the code "knowing" what threads are allowed to do, rather than by enforcing those
159# restrictions, so TSAN generates a lot of (presumably) false positives from libzmq.
160# The settings below are intended to enable libzmq to be built with minimal support for TSAN
161# such that it can be used along with other code that is also built with TSAN.
162AC_MSG_CHECKING([whether to enable TSan])
163AC_ARG_ENABLE(thread-sanitizer, [AS_HELP_STRING([--enable-thread-sanitizer=yes/no],
164                  [Build with clang Thread Sanitizer instrumentation])],
165                  [ZMQ_TSAN="$enableval"])
166
167if test "x${ZMQ_TSAN}" = "xyes"; then
168    TSAN_FLAGS="-fno-omit-frame-pointer -fsanitize=thread"
169    TSAN_CCFLAGS="${TSAN_CCFLAGS} -mllvm -tsan-instrument-memory-accesses=0"
170    TSAN_CCFLAGS="${TSAN_CCFLAGS} -mllvm -tsan-instrument-atomics=0"
171    TSAN_CCFLAGS="${TSAN_CCFLAGS} -mllvm -tsan-instrument-func-entry-exit=1"
172    CFLAGS="${CFLAGS} ${TSAN_FLAGS} ${TSAN_CCFLAGS}"
173    CXXFLAGS="${CXXFLAGS} ${TSAN_FLAGS} ${TSAN_CCFLAGS}"
174    LDFLAGS="${LDFLAGS} ${TSAN_FLAGS} -pie"
175
176    AM_CONDITIONAL(ENABLE_TSAN, true)
177    AC_MSG_RESULT([yes])
178else
179    AM_CONDITIONAL(ENABLE_TSAN, false)
180    AC_MSG_RESULT([no])
181fi
182
183# Memory mis-use detection
184AC_MSG_CHECKING([whether to enable ASan])
185AC_ARG_ENABLE(address-sanitizer, [AS_HELP_STRING([--enable-address-sanitizer=yes/no],
186                  [Build with GCC Address Sanitizer instrumentation])],
187                  [ZMQ_ASAN="$enableval"])
188
189if test "x${ZMQ_ASAN}" = "xyes"; then
190    CFLAGS="${CFLAGS} -fsanitize=address -fsanitize=undefined -fsanitize=leak -fno-sanitize-recover=all"
191    CXXFLAGS="${CXXFLAGS} -fsanitize=address -fsanitize=undefined -fsanitize=leak -fno-sanitize-recover=all"
192
193    AM_CONDITIONAL(ENABLE_ASAN, true)
194    AC_MSG_RESULT([yes])
195else
196    AM_CONDITIONAL(ENABLE_ASAN, false)
197    AC_MSG_RESULT([no])
198fi
199
200# By default compiling with -Werror except on OSX and Solaris when building
201# with libsodium.
202AC_ARG_ENABLE([Werror],
203    [AS_HELP_STRING([--disable-Werror], [disable Werror compiler flag [default=enabled]])],
204    [libzmq_werror=$enableval], [libzmq_werror=yes])
205
206# By default use DSO visibility
207libzmq_dso_visibility="yes"
208
209# Platform specific checks
210libzmq_on_mingw="no"
211libzmq_on_cygwin="no"
212libzmq_on_android="no"
213libzmq_on_linux="no"
214libzmq_on_gnu="no"
215
216# Set some default features required by ZeroMQ code
217CPPFLAGS="-D_REENTRANT -D_THREAD_SAFE $CPPFLAGS"
218CXXFLAGS="-Wno-long-long $CXXFLAGS"
219
220# Will be used to add flags to pkg-config useful when apps want to statically link
221PKGCFG_LIBS_PRIVATE=""
222PKGCFG_NAMES_PRIVATE=""
223
224# For host type checks
225AC_CANONICAL_HOST
226
227# OS-specific tests
228case "${host_os}" in
229    *linux*)
230        # Define on Linux to enable all library features. Define if using a gnu compiler
231        if test "x$GXX" = "xyes"; then
232            CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS"
233        fi
234        AC_DEFINE(ZMQ_HAVE_LINUX, 1, [Have Linux OS])
235        libzmq_on_linux="yes"
236
237        if test "x$libzmq_tipc_support" = "xyes"; then
238            AC_DEFINE(ZMQ_HAVE_TIPC, 1, [Have TIPC support])
239        fi
240        case "${host_os}" in
241            *android*)
242                AC_DEFINE(ZMQ_HAVE_ANDROID, 1, [Have Android OS])
243                libzmq_on_android="yes"
244            ;;
245        esac
246        ;;
247    *solaris*)
248        # Define on Solaris to enable all library features
249        CPPFLAGS="-D_PTHREADS $CPPFLAGS"
250        CXXFLAGS="-Wno-sign-compare $CXXFLAGS"
251        AC_DEFINE(ZMQ_HAVE_SOLARIS, 1, [Have Solaris OS])
252        AC_CHECK_LIB(socket, socket)
253        AC_CHECK_LIB(nsl, gethostbyname)
254        AC_MSG_CHECKING([whether atomic operations can be used])
255        AC_COMPILE_IFELSE([AC_LANG_PROGRAM(
256            [[#include <atomic.h>]],
257            [[uint32_t value;
258              atomic_cas_32 (&value, 0, 0);
259              return 0;]])],
260            [solaris_has_atomic=yes],
261            [solaris_has_atomic=no])
262        AC_MSG_RESULT([$solaris_has_atomic])
263        # Solaris 8 does not have atomic operations exported to user space.
264        if test "x$solaris_has_atomic" = "xno"; then
265            AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes])
266        fi
267        ;;
268    *freebsd*)
269        # Define on FreeBSD to enable all library features
270        CPPFLAGS="-D__BSD_VISIBLE $CPPFLAGS"
271        AC_DEFINE(ZMQ_HAVE_FREEBSD, 1, [Have FreeBSD OS])
272        ;;
273    *dragonfly*)
274        CPPFLAGS="-D__BSD_VISIBLE $CPPFLAGS"
275        AC_DEFINE(ZMQ_HAVE_FREEBSD, 1, [Have DragonFly OS])
276        AC_DEFINE(ZMQ_HAVE_DRAGONFLY, 1, [Have DragonFly OS])
277        ;;
278    *darwin*)
279        # Define on Darwin to enable all library features
280        CPPFLAGS="-D_DARWIN_C_SOURCE $CPPFLAGS"
281        libzmq_pedantic="no"
282        AC_DEFINE(ZMQ_HAVE_OSX, 1, [Have DarwinOSX OS])
283        ;;
284    *haiku*)
285        AC_DEFINE(ZMQ_HAVE_HAIKU, 1, [Have Haiku OS])
286        AC_CHECK_LIB(network, socket)
287        ;;
288    *netbsd*)
289        # Define on NetBSD to enable all library features
290        CPPFLAGS="-D_NETBSD_SOURCE $CPPFLAGS"
291        AC_DEFINE(ZMQ_HAVE_NETBSD, 1, [Have NetBSD OS])
292        # NetBSD 5.0 and newer provides atomic operations but we can
293        # only use these on systems where PR #42842 has been fixed so
294        # we must try and link a test program using C++.
295        libzmq_netbsd_has_atomic=no
296        AC_MSG_CHECKING([whether atomic operations can be used])
297        AC_LANG_PUSH([C++])
298        AC_LINK_IFELSE([AC_LANG_PROGRAM(
299            [[#include <atomic.h>]],
300            [[uint32_t value;
301              atomic_cas_32 (&value, 0, 0);
302              return 0;]])],
303            [libzmq_netbsd_has_atomic=yes],
304            [libzmq_netbsd_has_atomic=no])
305        AC_LANG_POP([C++])
306        AC_MSG_RESULT([$libzmq_netbsd_has_atomic])
307        if test "x$libzmq_netbsd_has_atomic" = "xno"; then
308            AC_DEFINE(ZMQ_FORCE_MUTEXES, 1, [Force to use mutexes])
309        fi
310        ;;
311    *openbsd*|*bitrig*)
312        # Define on OpenBSD to enable all library features
313        CPPFLAGS="-D_BSD_SOURCE $CPPFLAGS"
314        AC_DEFINE(ZMQ_HAVE_OPENBSD, 1, [Have OpenBSD OS])
315        ;;
316    *nto-qnx*)
317        libzmq_pedantic="no"
318        AC_DEFINE(ZMQ_HAVE_QNXNTO, 1, [Have QNX Neutrino OS])
319        AC_CHECK_LIB(socket, socket)
320        ;;
321    *aix*|*os400*)
322        AC_DEFINE(ZMQ_HAVE_AIX, 1, [Have AIX OS])
323        ;;
324    *hpux*)
325        # Define on HP-UX to enable all library features
326        CPPFLAGS="-D_POSIX_C_SOURCE=200112L $CPPFLAGS"
327        AC_DEFINE(ZMQ_HAVE_HPUX, 1, [Have HPUX OS])
328        LIBZMQ_CHECK_LANG_FLAG_PREPEND([-Ae])
329        AC_CHECK_FUNCS(gethrtime)
330        ;;
331    *mingw*|*msys*)
332        AC_DEFINE(ZMQ_HAVE_WINDOWS, 1, [Have Windows OS])
333        AC_DEFINE(ZMQ_HAVE_MINGW, 1, [Have MinGW])
334        AC_CHECK_HEADERS(windows.h)
335        AC_CHECK_LIB(ws2_32, main, ,
336            [AC_MSG_ERROR([cannot link with ws2_32.dll.])])
337        AC_CHECK_LIB(rpcrt4, main, ,
338            [AC_MSG_ERROR([cannot link with rpcrt4.dll.])])
339        AC_CHECK_LIB(iphlpapi, main, ,
340            [AC_MSG_ERROR([cannot link with iphlpapi.dll.])])
341        libzmq_on_mingw="yes"
342        libzmq_dso_visibility="no"
343
344        if test "x$enable_static" = "xyes"; then
345            CPPFLAGS="-DZMQ_STATIC $CPPFLAGS"
346            PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -liphlpapi"
347        fi
348	# Set FD_SETSIZE to 16384
349	CPPFLAGS=" -DFD_SETSIZE=16384 $CPPFLAGS"
350        ;;
351    *cygwin*)
352        # Define on Cygwin to enable all library features
353        CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS"
354        AC_DEFINE(ZMQ_HAVE_CYGWIN, 1, [Have Cygwin])
355        libzmq_on_cygwin="yes"
356        libzmq_dso_visibility="no"
357        if test "x$enable_static" = "xyes"; then
358            AC_MSG_ERROR([Building static libraries is not supported under Cygwin])
359        fi
360        ;;
361    gnu*)
362        # Define on GNU/Hurd to enable all library features. Define if using a gnu compiler
363        if test "x$GXX" = "xyes"; then
364            CPPFLAGS="-D_GNU_SOURCE $CPPFLAGS"
365        fi
366        AC_DEFINE(ZMQ_HAVE_GNU, 1, [Have GNU/Hurd OS])
367        libzmq_on_gnu="yes"
368	AC_CHECK_LIB(rt, sem_init)
369        ;;
370    *)
371        AC_MSG_ERROR([unsupported system: ${host_os}.])
372        ;;
373esac
374
375# Sun Studio does not like anonymous structures in unions and does not have weak attribute
376if test "x$libzmq_cv_[]_AC_LANG_ABBREV[]_sun_studio_compiler" = "xyes"; then
377    CXXFLAGS="${CXXFLAGS} -features=extensions"
378    CFLAGS="${CFLAGS} -features=extensions"
379    CPPFLAGS="${CPPFLAGS} -DUNITY_WEAK_PRAGMA"
380fi
381
382# Checks for libraries
383AC_CHECK_LIB([pthread], [pthread_create])
384if test "x$ac_cv_lib_pthread_pthread_create" = "xyes"; then
385    PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -lpthread"
386fi
387AC_CHECK_LIB([rt], [clock_gettime])
388if test "x$ac_cv_lib_rt_clock_gettime" = "xyes"; then
389    PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -lrt"
390fi
391
392#
393# Check if the compiler supports -fvisibility=hidden flag. MinGW uses __declspec
394#
395if test "x$libzmq_dso_visibility" = "xyes"; then
396    AC_LANG_PUSH([C++])
397    LIBZMQ_CHECK_LANG_VISIBILITY([LIBZMQ_EXTRA_CXXFLAGS="$libzmq_cv_[]_AC_LANG_ABBREV[]_visibility_flag ${LIBZMQ_EXTRA_CXXFLAGS}"])
398    AC_LANG_POP([C++])
399fi
400
401# CPU-specific optimizations
402case "${host_cpu}" in
403    *sparc64*)
404        AC_LANG_PUSH([C++])
405        LIBZMQ_CHECK_LANG_FLAG_PREPEND([-mcpu=v9])
406        AC_LANG_POP([C++])
407    ;;
408    *)
409    ;;
410esac
411
412# Check whether to build docs / install man pages
413LIBZMQ_CHECK_DOC_BUILD
414
415# Check polling system, set appropriate macro in src/platform.hpp
416LIBZMQ_CHECK_POLLER
417
418# Check cacheline size, set appropriate macro in src/platform.hpp
419LIBZMQ_CHECK_CACHELINE
420
421# Check condition variable implementation, set appropriate macro in src/platform.hpp
422LIBZMQ_CHECK_CV_IMPL
423
424# Checks for header files.
425AC_HEADER_STDC
426AC_CHECK_HEADERS(\
427    errno.h \
428    time.h \
429    unistd.h \
430    limits.h \
431    stddef.h \
432    stdlib.h \
433    string.h \
434    arpa/inet.h \
435    netinet/tcp.h \
436    netinet/in.h \
437    sys/socket.h \
438    sys/time.h)
439
440# Check if we have ifaddrs.h header file.
441AC_CHECK_HEADERS(ifaddrs.h, [AC_DEFINE(ZMQ_HAVE_IFADDRS, 1, [Have ifaddrs.h header.])])
442
443# Check if we have sys/uio.h header file.
444AC_CHECK_HEADERS(sys/uio.h, [AC_DEFINE(ZMQ_HAVE_UIO, 1, [Have uio.h header.])])
445
446# Force not to use eventfd
447AC_ARG_ENABLE([eventfd],
448    [AS_HELP_STRING([--disable-eventfd], [disable eventfd [default=enabled]])],
449    [zmq_enable_eventfd=$enableval],
450    [zmq_enable_eventfd=yes])
451
452if test "x$zmq_enable_eventfd" = "xyes"; then
453    # Check if we have eventfd.h header file.
454    AC_CHECK_HEADERS(sys/eventfd.h, [
455        AC_DEFINE(ZMQ_HAVE_EVENTFD, 1, [Have eventfd extension])
456        LIBZMQ_CHECK_EVENTFD_CLOEXEC([
457            AC_DEFINE([ZMQ_HAVE_EVENTFD_CLOEXEC],
458               [1],
459               [Whether EFD_CLOEXEC is defined and functioning.])
460            ])
461    ])
462fi
463
464# Conditionally build performance measurement tools
465AC_ARG_ENABLE([perf],
466    [AS_HELP_STRING([--disable-perf], [don't build performance measurement tools [default=build]])],
467    [zmq_enable_perf=$enableval],
468    [zmq_enable_perf=yes])
469
470AM_CONDITIONAL(ENABLE_PERF, test "x$zmq_enable_perf" = "xyes")
471
472# Conditionally build curve key generation tool
473AC_ARG_ENABLE([curve-keygen],
474    [AS_HELP_STRING([--disable-curve-keygen], [don't build curve-keygen tool [default=build]])],
475    [zmq_enable_curve_keygen=$enableval],
476    [zmq_enable_curve_keygen=yes])
477
478# Use c++ in subsequent tests
479AC_LANG_PUSH(C++)
480
481AC_CHECK_DECLS([SO_PEERCRED],
482    [AC_DEFINE(ZMQ_HAVE_SO_PEERCRED, 1, [Have SO_PEERCRED socket option])],
483    [],
484    [#include <sys/socket.h>])
485
486AC_CHECK_DECLS([LOCAL_PEERCRED],
487    [AC_DEFINE(ZMQ_HAVE_LOCAL_PEERCRED, 1, [Have LOCAL_PEERCRED socket option])],
488    [],
489    [#include <sys/socket.h>])
490
491AM_CONDITIONAL(HAVE_IPC_PEERCRED, test "x$ac_cv_have_decl_SO_PEERCRED" = "xyes" || test "x$ac_cv_have_decl_LOCAL_PEERCRED" = "xyes")
492
493AC_HEADER_STDBOOL
494AC_C_CONST
495AC_C_INLINE
496
497# Checks for typedefs, structures, and compiler characteristics.
498if test "x$libzmq_cv_[]_AC_LANG_ABBREV[]_intel_compiler" = "xyes"; then
499    dnl 279: controlling expression is constant
500    dnl Fixes build with ICC 12.x
501    LIBZMQ_CHECK_WITH_FLAG([-wd279], [AC_TYPE_SIZE_T])
502    LIBZMQ_CHECK_WITH_FLAG([-wd279], [AC_TYPE_SSIZE_T])
503else
504    AC_TYPE_SIZE_T
505    AC_TYPE_SSIZE_T
506fi
507
508AC_HEADER_TIME
509AC_TYPE_UINT32_T
510AC_C_VOLATILE
511
512# build using libgssapi_krb5
513AC_ARG_WITH([libgssapi_krb5], [AS_HELP_STRING([--with-libgssapi_krb5],
514    [require libzmq build with libgssapi_krb5 [default=no]])],
515    [require_libgssapi_krb5_ext=$withval],
516    [require_libgssapi_krb5_ext=no])
517
518# conditionally require libgssapi_krb5
519if test "x$require_libgssapi_krb5_ext" != "xno"; then
520    PKG_CHECK_MODULES([gssapi_krb5], [krb5-gssapi], [
521        have_gssapi_library="yes"
522        PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE krb5-gssapi"
523    ], [
524        AC_CHECK_HEADERS(gssapi/gssapi_generic.h)
525        AC_SEARCH_LIBS([gss_init_sec_context], [gssapi_krb5 gssapi],
526            have_gssapi_library="yes",
527            AC_MSG_ERROR(libgssapi_krb5 is needed for GSSAPI security))
528        PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -lgssapi_krb5"
529    ])
530fi
531if test "x$have_gssapi_library" = "xyes"; then
532    AC_DEFINE(HAVE_LIBGSSAPI_KRB5, [1], [Enabled GSSAPI security])
533fi
534AM_CONDITIONAL(BUILD_GSSAPI, test "x$have_gssapi_library" = "xyes")
535
536# Select curve encryption library, defaults to tweetnacl
537# To use libsodium instead, use --with-libsodium (must be installed)
538# To disable curve, use --disable-curve
539
540AC_ARG_WITH([libsodium],
541    [AS_HELP_STRING([--with-libsodium], [use libsodium instead of built-in tweetnacl [default=no]])])
542
543AS_IF([test "x$with_libsodium" = "xyes"], [
544    PKG_CHECK_MODULES([sodium], [libsodium], [libsodium_found=yes], [
545        AC_MSG_ERROR(libsodium is not installed. Install it, then run configure again)
546    ])
547])
548
549AC_ARG_ENABLE([curve],
550    [AS_HELP_STRING([--disable-curve], [disable CURVE security [default=no]])])
551
552if test "x$enable_curve" = "xno"; then
553    curve_library=""
554    AC_MSG_NOTICE([CURVE security is disabled])
555
556elif test "x$with_libsodium" = "xyes"; then
557    AC_MSG_NOTICE([Using libsodium for CURVE security])
558    AC_DEFINE(ZMQ_HAVE_CURVE, [1], [Using curve encryption])
559    AC_DEFINE(ZMQ_USE_LIBSODIUM, [1], [Using libsodium for curve encryption])
560    curve_library="libsodium"
561    enable_curve="yes"
562
563    case "${host_os}" in
564        *solaris*)
565            dnl On Solaris, libsodium depends on libssp
566            LDFLAGS="-lssp $LDFLAGS"
567            libzmq_pedantic="no"
568            libzmq_werror="no"
569        ;;
570        *darwin*)
571            dnl On Darwin, building with libsodium causes
572            dnl macro redefinition warnings
573            libzmq_werror="no"
574        ;;
575    esac
576
577    PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE libsodium"
578else
579    AC_MSG_NOTICE([Using tweetnacl for CURVE security])
580    AC_DEFINE(ZMQ_HAVE_CURVE, [1], [Using curve encryption])
581    AC_DEFINE(ZMQ_USE_TWEETNACL, [1], [Using tweetnacl for curve encryption])
582    curve_library="tweetnacl"
583    enable_curve="yes"
584fi
585
586AM_CONDITIONAL(ENABLE_CURVE_KEYGEN, test "x$enable_curve" = "xyes" -a "x$zmq_enable_curve_keygen" = "xyes")
587
588AM_CONDITIONAL(USE_LIBSODIUM, test "$curve_library" = "libsodium")
589AM_CONDITIONAL(USE_TWEETNACL, test "$curve_library" = "tweetnacl")
590AM_CONDITIONAL(HAVE_CURVE, test "x$curve_library" != "x")
591AM_CONDITIONAL(USE_WEPOLL, test "$poller" = "wepoll")
592
593# Check requiring packages for WebSocket
594ws_crypto_library=""
595
596AC_ARG_ENABLE([ws],
597    [AS_HELP_STRING([--enable-ws], [Enable WebSocket transport [default=state of DRAFT]])],
598    [enable_ws=$enableval],
599    [enable_ws=$enable_drafts])
600
601AC_ARG_WITH([nss],
602    [AS_HELP_STRING([--with-nss], [use nss instead of built-in sha1 [default=no]])])
603
604AC_ARG_WITH([tls],
605    [AS_HELP_STRING([--with-tls], [Enable TLS (WSS transport) [default=no]])])
606
607if test "x$enable_ws" != "xno"; then
608    if test "x$with_tls" = "xyes"; then
609        PKG_CHECK_MODULES([GNUTLS], [gnutls >= 3.1.4], [
610            PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE gnutls >= 3.1.4"
611            ws_crypto_library="gnutls"
612            AC_DEFINE(ZMQ_USE_GNUTLS, [1], [Use GNUTLS for TLS])
613            AC_DEFINE(ZMQ_HAVE_WS, [1], [Using websocket])
614            AC_DEFINE(ZMQ_HAVE_WSS, [1], [WSS enabled])
615            AC_MSG_NOTICE(Using gnutls)
616        ],[
617          AC_MSG_ERROR([GnuTLS is not installed. Install it, then run configure again])
618        ])
619    elif test "x$with_nss" = "xyes"; then
620        PKG_CHECK_MODULES([NSS3], [nss], [
621            PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE nss"
622            AC_DEFINE(ZMQ_USE_NSS, [1], [Using NSS])
623            AC_DEFINE(ZMQ_HAVE_WS, [1], [Using websocket])
624            ws_crypto_library="nss"
625            AC_MSG_NOTICE(Using NSS)
626        ], [
627            AC_MSG_ERROR([nss is not installed. Install it, then run configure again])
628        ])
629    else
630        AC_DEFINE(ZMQ_HAVE_WS, [1], [Using websocket])
631        AC_DEFINE(ZMQ_USE_BUILTIN_SHA1, [1], [Using built-in sha1])
632        AC_MSG_NOTICE(Using builting SHA1)
633        ws_crypto_library="builtin"
634    fi
635fi
636
637AM_CONDITIONAL(HAVE_WS, test "x$ws_crypto_library" != "x")
638AM_CONDITIONAL(USE_NSS, test "x$ws_crypto_library" = "xnss")
639AM_CONDITIONAL(USE_BUILTIN_SHA1, test "x$ws_crypto_library" = "xbuiltin")
640AM_CONDITIONAL(USE_GNUTLS, test "x$ws_crypto_library" = "xgnutls")
641AM_CONDITIONAL(HAVE_WSS, test "x$ws_crypto_library" = "xgnutls")
642
643# build using pgm
644have_pgm_library="no"
645
646AC_ARG_WITH([pgm], [AS_HELP_STRING([--with-pgm],
647    [build libzmq with PGM extension. Requires pkg-config [default=no]])],
648    [with_pgm_ext=$withval],
649    [with_pgm_ext=no])
650
651# conditionally require pgm package
652if test "x$with_pgm_ext" != "xno"; then
653    PKG_CHECK_MODULES([pgm], [openpgm-5.3 >= 5.3], [
654        have_pgm_library="yes"
655        PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE openpgm-5.3 >= 5.3"
656    ], [
657        PKG_CHECK_MODULES([pgm], [openpgm-5.2 >= 5.2], [
658            have_pgm_library="yes"
659            PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE openpgm-5.2 >= 5.2"
660        ], [
661            PKG_CHECK_MODULES([pgm], [openpgm-5.1 >= 5.1], [
662                have_pgm_library="yes"
663                PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE openpgm-5.1 >= 5.1"
664            ])
665        ])
666    ])
667fi
668
669if test "x$have_pgm_library" = "xyes"; then
670    AC_DEFINE(ZMQ_HAVE_OPENPGM, [1], [Have OpenPGM extension])
671fi
672
673AM_CONDITIONAL(HAVE_PGM, test "x$have_pgm_library" = "xyes")
674
675
676# This uses "--with-norm" to point to the "norm" directory
677# for "norm/include" and "norm/lib"
678#(if "--with-norm=yes" is given, then assume installed on system)
679AC_ARG_WITH([norm],
680    [AS_HELP_STRING([--with-norm],
681        [build libzmq with NORM protocol extension, optionally specifying norm path [default=no]])],
682    [with_norm_ext=$withval],
683    [with_norm_ext=no])
684
685AC_MSG_CHECKING("with_norm_ext = ${with_norm_ext}")
686
687if test "x$with_norm_ext" != "xno"; then
688    PKG_CHECK_MODULES([norm], [norm], [
689        have_norm_library="yes"
690        PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE norm"
691    ], [
692        AC_MSG_RESULT([yes])
693
694        norm_LIBS=""
695        norm_CFLAGS=""
696        if test "x$with_norm_ext" != "xyes"; then
697            norm_path="${with_norm_ext}"
698            norm_CFLAGS="${norm_CFLAGS} -I${norm_path}/include"
699            norm_LIBS="${norm_LIBS} -L${norm_path}/lib"
700        fi
701        norm_LIBS="${norm_LIBS} -lnorm"
702        have_norm_library="yes"
703        PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE $norm_LIBS"
704        AC_SUBST(norm_LIBS)
705        AC_SUBST(norm_CFLAGS)
706    ])
707else
708    AC_MSG_RESULT([no])
709fi
710if test "x$have_norm_library" = "xyes"; then
711    AC_DEFINE(ZMQ_HAVE_NORM, [1], [Have NORM protocol extension])
712fi
713AM_CONDITIONAL(HAVE_NORM, test "x$have_norm_library" = "xyes")
714
715# build using vmci
716have_vmci_library="no"
717
718AC_ARG_WITH([vmci], [AS_HELP_STRING([--with-vmci],
719    [build libzmq with VMCI transport [default=no]])],
720    [have_vmci_ext=$withval],
721    [have_vmci_ext=no])
722
723if test "x$have_vmci_ext" != "xno"; then
724    AC_DEFINE(ZMQ_HAVE_VMCI, 1, [Have VMCI transport])
725
726    if test "x$have_vmci_ext" != "xyes"; then
727        vmci_path="${have_vmci_ext}"
728        LIBZMQ_VMCI_CXXFLAGS="-I${vmci_path}"
729        LIBZMQ_VMCI_LDFLAGS="-I${vmci_path}"
730        LIBZMQ_EXTRA_CXXFLAGS="${LIBZMQ_VMCI_CXXFLAGS} ${LIBZMQ_EXTRA_CXXFLAGS}"
731        LIBZMQ_EXTRA_LDFLAGS="${LIBZMQ_VMCI_LDFLAGS} ${LIBZMQ_EXTRA_LDFLAGS}"
732    fi
733fi
734
735AM_CONDITIONAL(HAVE_VMCI, test "x$have_vmci_ext" != "xno")
736
737# Set -Wall, -Werror and -pedantic
738AC_LANG_PUSH([C++])
739
740# Check how to enable -Wall
741LIBZMQ_LANG_WALL([CXXFLAGS="$libzmq_cv_[]_AC_LANG_ABBREV[]_wall_flag $CXXFLAGS"])
742
743if test "x$libzmq_werror" = "xyes" -a "x$libzmq_cv_[]_AC_LANG_ABBREV[]_sun_studio_compiler" != "xyes"; then
744    LIBZMQ_LANG_WERROR([CXXFLAGS="$libzmq_cv_[]_AC_LANG_ABBREV[]_werror_flag $CXXFLAGS"])
745fi
746
747if test "x$libzmq_pedantic" = "xyes"; then
748    LIBZMQ_LANG_STRICT([CXXFLAGS="$libzmq_cv_[]_AC_LANG_ABBREV[]_strict_flag $CXXFLAGS"])
749fi
750AC_LANG_POP([C++])
751
752AM_CONDITIONAL(BUILD_TIPC, test "x$libzmq_tipc_support" = "xyes")
753AM_CONDITIONAL(ON_MINGW, test "x$libzmq_on_mingw" = "xyes")
754AM_CONDITIONAL(ON_CYGWIN, test "x$libzmq_on_cygwin" = "xyes")
755AM_CONDITIONAL(ON_ANDROID, test "x$libzmq_on_android" = "xyes")
756AM_CONDITIONAL(ON_LINUX, test "x$libzmq_on_linux" = "xyes")
757AM_CONDITIONAL(ON_GNU, test "x$libzmq_on_gnu" = "xyes")
758
759# Check for __atomic_Xxx compiler intrinsics
760AC_LANG_PUSH([C++])
761AX_CHECK_COMPILE_FLAG([-Watomic-alignment],
762    [CXXFLAGS+=" -Wno-atomic-alignment"],
763    [],
764    [-Werror])
765LIBZMQ_CHECK_ATOMIC_INTRINSICS([
766    AC_DEFINE([ZMQ_HAVE_ATOMIC_INTRINSICS],
767              [1],
768              [Whether compiler has __atomic_Xxx intrinsics.])
769    ])
770AC_LANG_POP([C++])
771
772# Checks for library functions.
773AC_TYPE_SIGNAL
774AC_CHECK_FUNCS(perror gettimeofday clock_gettime memset socket getifaddrs freeifaddrs fork mkdtemp accept4)
775AC_CHECK_HEADERS([alloca.h])
776
777# string.h doesn't seem to be included by default in Fedora 30
778AC_MSG_CHECKING([whether strnlen is available])
779AC_COMPILE_IFELSE(
780	[AC_LANG_PROGRAM(
781		[[#include <string.h>]],
782		[[size_t bar = strnlen ("foo", 1); (void)bar; return 0;]])
783	],[
784		AC_MSG_RESULT([yes])
785		AC_DEFINE(HAVE_STRNLEN, [1],
786		    [strnlen is available])
787	],[
788		AC_MSG_RESULT([no])
789])
790
791AC_MSG_CHECKING([whether if_nametoindex is available])
792AC_COMPILE_IFELSE(
793    [AC_LANG_PROGRAM([[
794        #ifdef _WIN32
795        #include <iphlpapi.h>
796        #else
797        #include <sys/types.h>
798        #include <sys/socket.h>
799        #include <net/if.h>
800        #endif]], [[
801        if_nametoindex("");
802    ]])],[
803        AC_MSG_RESULT([yes])
804        AC_DEFINE(HAVE_IF_NAMETOINDEX, [1],
805        [if_nametoindex is available])
806    ],[
807        AC_MSG_RESULT([no])
808])
809
810AC_ARG_ENABLE([libbsd],
811    [AS_HELP_STRING([--enable-libbsd],
812        [enable libbsd [default=auto]])],
813    [enable_libbsd=$enableval],
814    [enable_libbsd="auto"])
815
816if test "x$enable_libbsd" != "xno"; then
817    PKG_CHECK_MODULES(LIBBSD, [libbsd],
818        [
819            AC_DEFINE(ZMQ_HAVE_LIBBSD, 1, [The libbsd library is to be used])
820            AC_SUBST([LIBBSD_CFLAGS])
821            AC_SUBST([LIBBSD_LIBS])
822            PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE libbsd"
823            found_libbsd="yes"
824        ],
825        [
826            found_libbsd="no"
827            if test "x$enable_libbsd" = "xyes"; then
828                AC_MSG_ERROR([Cannot find libbsd])
829            else
830                AC_MSG_WARN([Cannot find libbsd])
831            fi
832        ])
833fi
834AC_MSG_CHECKING([whether strlcpy is available])
835AC_COMPILE_IFELSE(
836    [AC_LANG_PROGRAM(
837        [[#include <string.h>]],
838        [[char buf [100]; size_t bar = strlcpy (buf, "foo", 100); (void)bar; return 0;]])
839    ],[
840        AC_MSG_RESULT([yes])
841        AC_DEFINE(ZMQ_HAVE_STRLCPY, [1],
842            [strlcpy is available])
843    ],[
844        AC_MSG_RESULT([no])
845])
846
847# pthread_setname is non-posix, and there are at least 4 different implementations
848AC_MSG_CHECKING([whether signature of pthread_setname_np() has 1 argument])
849AC_COMPILE_IFELSE(
850	[AC_LANG_PROGRAM(
851		[[#include <pthread.h>]],
852		[[pthread_setname_np ("foo"); return 0;]])
853	],[
854		AC_MSG_RESULT([yes])
855		AC_DEFINE(ZMQ_HAVE_PTHREAD_SETNAME_1, [1],
856		    [Whether pthread_setname_np() has 1 argument])
857	],[
858		AC_MSG_RESULT([no])
859])
860AC_MSG_CHECKING([whether signature of pthread_setname_np() has 2 arguments])
861AC_COMPILE_IFELSE(
862	[AC_LANG_PROGRAM(
863		[[#include <pthread.h>]],
864		[[pthread_setname_np (pthread_self (), "foo"); return 0;]])
865	],[
866		AC_MSG_RESULT([yes])
867		AC_DEFINE(ZMQ_HAVE_PTHREAD_SETNAME_2, [1],
868		    [Whether pthread_setname_np() has 2 arguments])
869	],[
870		AC_MSG_RESULT([no])
871])
872AC_MSG_CHECKING([whether signature of pthread_setname_np() has 3 arguments])
873AC_COMPILE_IFELSE(
874	[AC_LANG_PROGRAM(
875		[[#include <pthread.h>]],
876		[[pthread_setname_np (pthread_self(), "foo", (void *)0); return 0;]])
877	],[
878		AC_MSG_RESULT([yes])
879		AC_DEFINE(ZMQ_HAVE_PTHREAD_SETNAME_3, [1],
880		    [Whether pthread_setname_np() has 3 arguments])
881	],[
882		AC_MSG_RESULT([no])
883])
884AC_MSG_CHECKING([whether pthread_set_name_np() exists])
885AC_COMPILE_IFELSE(
886	[AC_LANG_PROGRAM(
887		[[#include <pthread.h>]],
888		[[pthread_set_name_np (pthread_self(), "foo"); return 0;]])
889	],[
890		AC_MSG_RESULT([yes])
891		AC_DEFINE(ZMQ_HAVE_PTHREAD_SET_NAME, [1],
892		    [Whether pthread_set_name_np() exists])
893	],[
894		AC_MSG_RESULT([no])
895])
896
897
898# pthread_setaffinity_np is non-posix:
899AC_MSG_CHECKING([whether pthread_setaffinity_np() exists])
900AC_COMPILE_IFELSE(
901	[AC_LANG_PROGRAM(
902		[[#include <pthread.h>]],
903		[[cpu_set_t test; pthread_setaffinity_np (pthread_self(), sizeof(cpu_set_t), &test); return 0;]])
904	],[
905		AC_MSG_RESULT([yes])
906		AC_DEFINE(ZMQ_HAVE_PTHREAD_SET_AFFINITY, [1],
907		    [Whether pthread_setaffinity_np() exists])
908	],[
909		AC_MSG_RESULT([no])
910])
911
912
913LIBZMQ_CHECK_SOCK_CLOEXEC([
914    AC_DEFINE([ZMQ_HAVE_SOCK_CLOEXEC],
915        [1],
916        [Whether SOCK_CLOEXEC is defined and functioning.])
917    ])
918
919LIBZMQ_CHECK_O_CLOEXEC([
920    AC_DEFINE([ZMQ_HAVE_O_CLOEXEC],
921        [1],
922        [Whether O_CLOEXEC is defined and functioning.])
923    ])
924
925LIBZMQ_CHECK_SO_BINDTODEVICE([
926    AC_DEFINE([ZMQ_HAVE_SO_BINDTODEVICE],
927        [1],
928        [Whether SO_BINDTODEVICE is supported.])
929    ])
930
931# TCP keep-alives Checks.
932LIBZMQ_CHECK_SO_KEEPALIVE([
933    AC_DEFINE([ZMQ_HAVE_SO_KEEPALIVE],
934        [1],
935        [Whether SO_KEEPALIVE is supported.])
936    ])
937
938LIBZMQ_CHECK_TCP_KEEPCNT([
939    AC_DEFINE([ZMQ_HAVE_TCP_KEEPCNT],
940        [1],
941        [Whether TCP_KEEPCNT is supported.])
942    ])
943
944LIBZMQ_CHECK_TCP_KEEPIDLE([
945    AC_DEFINE([ZMQ_HAVE_TCP_KEEPIDLE],
946        [1],
947        [Whether TCP_KEEPIDLE is supported.])
948    ])
949
950LIBZMQ_CHECK_TCP_KEEPINTVL([
951    AC_DEFINE([ZMQ_HAVE_TCP_KEEPINTVL],
952        [1],
953        [Whether TCP_KEEPINTVL is supported.])
954    ])
955
956LIBZMQ_CHECK_TCP_KEEPALIVE([
957    AC_DEFINE([ZMQ_HAVE_TCP_KEEPALIVE],
958        [1],
959        [Whether TCP_KEEPALIVE is supported.])
960    ])
961
962LIBZMQ_CHECK_SO_PRIORITY([
963    AC_DEFINE([ZMQ_HAVE_SO_PRIORITY],
964        [1],
965        [Whether SO_PRIORITY is supported.])
966    ])
967
968LIBZMQ_CHECK_GETRANDOM([
969    AC_DEFINE([ZMQ_HAVE_GETRANDOM],
970        [1],
971        [Whether getrandom is supported.])
972    ])
973
974AM_CONDITIONAL(HAVE_FORK, test "x$ac_cv_func_fork" = "xyes")
975
976if test "x$cross_compiling" = "xyes"; then
977    #   Enable draft by default when cross-compiling
978    defaultval=yes
979else
980    # enable draft API by default if we're in a git repository
981    # else disable it by default; then allow --enable-drafts=yes/no override
982    AC_CHECK_FILE($srcdir/.git, [defaultval=yes], [defaultval=no])
983fi
984
985AC_ARG_ENABLE([drafts],
986    AS_HELP_STRING([--enable-drafts],
987        [Build and install draft classes and methods [default=yes]]),
988    [enable_drafts=$enableval],
989    [enable_drafts=$defaultval])
990
991AM_CONDITIONAL([ENABLE_DRAFTS], [test x$enable_drafts != xno])
992
993if test "x$enable_drafts" = "xyes"; then
994    AC_MSG_NOTICE([Building stable and legacy API + draft API])
995    AC_DEFINE(ZMQ_BUILD_DRAFT_API, 1, [Provide draft classes and methods])
996    AC_SUBST(pkg_config_defines, "-DZMQ_BUILD_DRAFT_API=1")
997else
998    AC_MSG_NOTICE([Building stable and legacy API (no draft API)])
999    AC_SUBST(pkg_config_defines, "")
1000fi
1001
1002AC_ARG_ENABLE([libunwind],
1003    [AS_HELP_STRING([--enable-libunwind],
1004        [enable libunwind [default=auto]])],
1005    [enable_libunwind=$enableval],
1006    [enable_libunwind="auto"])
1007
1008if test "x$enable_libunwind" != "xno"; then
1009    PKG_CHECK_MODULES(LIBUNWIND, [libunwind],
1010        [
1011            AC_DEFINE(HAVE_LIBUNWIND, 1, [The libunwind library is to be used])
1012            AC_SUBST([LIBUNWIND_CFLAGS])
1013            AC_SUBST([LIBUNWIND_LIBS])
1014            AC_CHECK_LIB([dl], [dladdr], [
1015                PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -ldl"
1016                LIBS="-ldl $LIBS"
1017            ], [
1018                AC_CHECK_LIB([dld], [dladdr], [
1019                    PKGCFG_LIBS_PRIVATE="$PKGCFG_LIBS_PRIVATE -ldld"
1020                    LIBS="-ldld $LIBS"
1021                ])
1022            ])
1023            PKGCFG_NAMES_PRIVATE="$PKGCFG_NAMES_PRIVATE libunwind"
1024        ],
1025        [
1026            if test "x$enable_libunwind" = "xyes"; then
1027                AC_MSG_ERROR([Cannot find libunwind])
1028            else
1029                AC_MSG_WARN([Cannot find libunwind])
1030            fi
1031        ])
1032fi
1033
1034AC_ARG_ENABLE([radix-tree],
1035    AS_HELP_STRING([--enable-radix-tree],
1036        [Use radix tree implementation to manage subscriptions [default=DRAFT]]),
1037    [radix_tree=$enableval],
1038    [radix_tree=$enable_drafts])
1039
1040AM_CONDITIONAL([ENABLE_RADIX_TREE], [test x$radix_tree != xno])
1041
1042if test "x$radix_tree" = "xyes"; then
1043    AC_MSG_NOTICE([Using radix tree implementation to manage subscriptions])
1044    AC_DEFINE(ZMQ_USE_RADIX_TREE, 1, [Use radix tree implementation to manage subscriptions])
1045else
1046    AC_MSG_NOTICE([Using mtree implementation to manage subscriptions])
1047fi
1048
1049# See if clang-format is in PATH; the result unblocks the relevant recipes
1050WITH_CLANG_FORMAT=""
1051AS_IF([test x"$CLANG_FORMAT" = x],
1052    [AC_PATH_PROG([CLANG_FORMAT], [clang-format], [])],
1053    [AC_CHECK_PROG([WITH_CLANG_FORMAT], [$CLANG_FORMAT], [true], [fail])])
1054AS_IF([test x"$CLANG_FORMAT" != x && test x"$WITH_CLANG_FORMAT" = x],
1055    [AS_IF([test -x "$CLANG_FORMAT"],
1056        [WITH_CLANG_FORMAT=true],
1057        [AC_CHECK_PROG([WITH_CLANG_FORMAT], [$CLANG_FORMAT], [true], [false])])])
1058AS_IF([test "$WITH_CLANG_FORMAT" = fail],
1059    [AC_MSG_ERROR([Caller explicitly referenced CLANG_FORMAT=$CLANG_FORMAT which was not found])])
1060AM_CONDITIONAL([WITH_CLANG_FORMAT], [$WITH_CLANG_FORMAT])
1061
1062# unittests will not build without the static libzmq.a
1063AM_CONDITIONAL(ENABLE_STATIC, test "x$enable_static" = "xyes")
1064
1065# build using a fuzzing engine - fuzzers will be built separately and statically
1066AC_ARG_WITH([fuzzing-engine], [AS_HELP_STRING([--with-fuzzing-engine],
1067    [build libzmq with an exernal fuzzing engine [default=no]])],
1068    [have_fuzzing_engine_ext=$withval],
1069    [have_fuzzing_engine_ext=no])
1070AC_ARG_WITH([fuzzing-installdir],
1071    AS_HELP_STRING([--with-fuzzing-installdir=PATH],
1072        [Path where to install fuzzer binaries]),
1073    [fuzzing_installdir="$withval"])
1074
1075if test "x$have_fuzzing_engine_ext" != "xno" && test "x$fuzzing_installdir" != "x" && test "x$enable_static" = "xyes"; then
1076    FUZZING_ENGINE_LIB="${have_fuzzing_engine_ext}"
1077    FUZZING_INSTALLDIR="${fuzzing_installdir}"
1078    AC_SUBST(FUZZING_ENGINE_LIB)
1079    AC_SUBST(FUZZING_INSTALLDIR)
1080    AC_DEFINE(ZMQ_USE_FUZZING_ENGINE, 1, [fuzz tests will be built with fuzzing engine])
1081fi
1082AM_CONDITIONAL(FUZZING_ENGINE_LIB, test "x$FUZZING_ENGINE_LIB" != "x")
1083
1084# clang 6 has a warning that does not make sense on multi-platform code
1085AC_LANG_PUSH([C])
1086AX_CHECK_COMPILE_FLAG([-Wtautological-constant-compare],
1087    [CFLAGS+=" -Wno-tautological-constant-compare"],
1088    [],
1089    [-Werror])
1090AC_LANG_POP([C])
1091AX_CHECK_COMPILE_FLAG([-Wtautological-constant-compare],
1092    [CXXFLAGS+=" -Wno-tautological-constant-compare"],
1093    [],
1094    [-Werror])
1095
1096# LTO is enabled by default on SUSE Tumbleweed and RPM lint generates an error if
1097# the flag is not used to compile archives:
1098# E: lto-no-text-in-archive
1099AC_LANG_PUSH([C])
1100AX_CHECK_COMPILE_FLAG([-ffat-lto-objects],
1101    [CFLAGS+=" -ffat-lto-objects"],
1102    [],
1103    [-Werror])
1104AC_LANG_POP([C])
1105AX_CHECK_COMPILE_FLAG([-ffat-lto-objects],
1106    [CXXFLAGS+=" -ffat-lto-objects"],
1107    [],
1108    [-Werror])
1109
1110# Subst LIBZMQ_EXTRA_CFLAGS & CXXFLAGS & LDFLAGS
1111AC_SUBST(LIBZMQ_EXTRA_CFLAGS)
1112AC_SUBST(LIBZMQ_EXTRA_CXXFLAGS)
1113AC_SUBST(LIBZMQ_EXTRA_LDFLAGS)
1114
1115AC_SUBST(LIBZMQ_VMCI_CXXFLAGS)
1116AC_SUBST(LIBZMQ_VMCI_LDFLAGS)
1117
1118AC_SUBST(pkg_config_libs_private, $PKGCFG_LIBS_PRIVATE)
1119AC_SUBST(pkg_config_names_private, $PKGCFG_NAMES_PRIVATE)
1120
1121# set pkgconfigdir, allow override
1122AC_ARG_WITH([pkgconfigdir],
1123    AS_HELP_STRING([--with-pkgconfigdir=PATH],
1124        [Path to the pkgconfig directory [[LIBDIR/pkgconfig]]]),
1125    [pkgconfigdir="$withval"],
1126    [pkgconfigdir='${libdir}/pkgconfig'])
1127AC_SUBST([pkgconfigdir])
1128
1129AC_CONFIG_FILES([ \
1130    Makefile \
1131    src/libzmq.pc \
1132    doc/Makefile \
1133    builds/Makefile \
1134    builds/deprecated-msvc/Makefile])
1135
1136AC_OUTPUT
1137