1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2015, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
7 AC_INIT([tor],[0.2.9.17-dev])
8 AC_CONFIG_SRCDIR([src/or/main.c])
9 AC_CONFIG_MACRO_DIR([m4])
11 # "foreign" means we don't follow GNU package layout standards
12 # "1.11" means we require automake version 1.11 or newer
13 # "subdir-objects" means put .o files in the same directory as the .c files
14 AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects])
16 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
17 AC_CONFIG_HEADERS([orconfig.h])
19 AC_USE_SYSTEM_EXTENSIONS
24 if test -f "/etc/redhat-release"; then
25 if test -f "/usr/kerberos/include"; then
26 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
30 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
31 # the += operator on it in src/or/Makefile.am
32 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
34 AC_ARG_ENABLE(openbsd-malloc,
35 AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD. Linux only]))
36 AC_ARG_ENABLE(static-openssl,
37 AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
38 AC_ARG_ENABLE(static-libevent,
39 AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
40 AC_ARG_ENABLE(static-zlib,
41 AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
42 AC_ARG_ENABLE(static-tor,
43 AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
44 AC_ARG_ENABLE(unittests,
45 AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
46 AC_ARG_ENABLE(coverage,
47 AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
48 AC_ARG_ENABLE(asserts-in-tests,
49 AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
50 AC_ARG_ENABLE(system-torrc,
51 AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
53 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
54 AC_MSG_ERROR([Can't disable assertions outside of coverage build])
57 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
58 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
59 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
61 if test "$enable_static_tor" = "yes"; then
62 enable_static_libevent="yes";
63 enable_static_openssl="yes";
64 enable_static_zlib="yes";
65 CFLAGS="$CFLAGS -static"
68 if test "$enable_system_torrc" = "no"; then
69 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
70 [Defined if we're not going to look for a torrc in SYSCONF])
73 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
75 AC_ARG_ENABLE(asciidoc,
76 AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
77 [case "${enableval}" in
78 "yes") asciidoc=true ;;
79 "no") asciidoc=false ;;
80 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
81 esac], [asciidoc=true])
83 # systemd notify support
84 AC_ARG_ENABLE(systemd,
85 AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
86 [case "${enableval}" in
87 "yes") systemd=true ;;
88 "no") systemd=false ;;
89 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
90 esac], [systemd=auto])
95 if test "x$enable_systemd" = "xno"; then
98 PKG_CHECK_MODULES(SYSTEMD,
102 if test "x$have_systemd" = "xno"; then
103 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
104 PKG_CHECK_MODULES(SYSTEMD,
111 if test "x$have_systemd" = "xyes"; then
112 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
113 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
114 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
115 PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
116 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
118 AC_SUBST(TOR_SYSTEMD_CFLAGS)
119 AC_SUBST(TOR_SYSTEMD_LIBS)
121 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
122 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
127 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
131 AC_ARG_ENABLE(gcc-warnings,
132 AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
133 AC_ARG_ENABLE(fatal-warnings,
134 AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
135 AC_ARG_ENABLE(gcc-warnings-advisory,
136 AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
138 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
139 AC_ARG_ENABLE(gcc-hardening,
140 AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
142 AC_ARG_ENABLE(expensive-hardening,
143 AS_HELP_STRING(--enable-expensive-hardening, [enable more expensive compiler hardening; makes Tor slower]))
145 dnl Linker hardening options
146 dnl Currently these options are ELF specific - you can't use this with MacOSX
147 AC_ARG_ENABLE(linker-hardening,
148 AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
150 AC_ARG_ENABLE(local-appdata,
151 AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
152 if test "$enable_local_appdata" = "yes"; then
153 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
154 [Defined if we default to host local appdata paths on Windows])
158 AC_ARG_ENABLE(tor2web-mode,
159 AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
160 [if test "x$enableval" = "xyes"; then
161 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
164 AC_ARG_ENABLE(tool-name-check,
165 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
167 AC_ARG_ENABLE(seccomp,
168 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
170 AC_ARG_ENABLE(libscrypt,
171 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
173 dnl check for the correct "ar" when cross-compiling
174 AN_MAKEVAR([AR], [AC_PROG_AR])
175 AN_PROGRAM([ar], [AC_PROG_AR])
176 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
179 dnl Check whether the above macro has settled for a simply named tool even
180 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
181 dnl because that will find any cc on the system, not only the cross-compiler,
182 dnl and then verify that a binary built with this compiler runs on the
183 dnl build system. It will then come to the false conclusion that we're not
185 if test "x$enable_tool_name_check" != "xno"; then
186 if test "x$ac_tool_warned" = "xyes"; then
187 AC_MSG_ERROR([We are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
188 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
189 AC_MSG_ERROR([We think we are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
198 AC_PATH_PROG([PERL], [perl])
200 dnl autoconf 2.59 appears not to support AC_PROG_SED
201 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
203 dnl check for asciidoc and a2x
204 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
205 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
207 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
209 AM_CONDITIONAL(USE_FW_HELPER, test "x$natpmp" = "xtrue" || test "x$upnp" = "xtrue")
210 AM_CONDITIONAL(NAT_PMP, test "x$natpmp" = "xtrue")
211 AM_CONDITIONAL(MINIUPNPC, test "x$upnp" = "xtrue")
215 AC_ARG_VAR([PYTHON], [path to Python binary])
216 AC_CHECK_PROGS(PYTHON, [ \
218 python3.8 python3.7 python3.6 python3.5 python3.4 \
221 if test "x$PYTHON" = "x"; then
222 AC_MSG_WARN([Python unavailable; some tests will not be run.])
224 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
226 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
227 AC_C_FLEXIBLE_ARRAY_MEMBER
229 dnl Maybe we've got an old autoconf...
230 AC_CACHE_CHECK([for flexible array members],
234 struct abc { int a; char b[]; };
236 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
239 [tor_cv_c_flexarray=yes],
240 [tor_cv_c_flexarray=no])])
241 if test "$tor_cv_flexarray" = "yes"; then
242 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
244 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
248 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
251 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
252 [tor_cv_c_c99_decl=yes],
253 [tor_cv_c_c99_decl=no] )])
254 if test "$tor_cv_c_c99_decl" != "yes"; then
255 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
258 AC_CACHE_CHECK([for working C99 designated initializers],
259 tor_cv_c_c99_designated_init,
261 [AC_LANG_PROGRAM([struct s { int a; int b; };],
262 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
263 [tor_cv_c_c99_designated_init=yes],
264 [tor_cv_c_c99_designated_init=no] )])
266 if test "$tor_cv_c_c99_designated_init" != "yes"; then
267 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
271 AC_ARG_WITH(tor-user,
272 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
280 AC_ARG_WITH(tor-group,
281 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
289 dnl If _WIN32 is defined and non-zero, we are building for win32
290 AC_MSG_CHECKING([for win32])
291 AC_RUN_IFELSE([AC_LANG_SOURCE([
292 int main(int c, char **v) {
303 bwin32=true; AC_MSG_RESULT([yes]),
304 bwin32=false; AC_MSG_RESULT([no]),
305 bwin32=cross; AC_MSG_RESULT([cross])
308 if test "$bwin32" = "cross"; then
309 AC_MSG_CHECKING([for win32 (cross)])
310 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
312 int main(int c, char **v) {return 0;}
315 int main(int c, char **v) {return x(y);}
318 bwin32=true; AC_MSG_RESULT([yes]),
319 bwin32=false; AC_MSG_RESULT([no]))
324 /* Defined to access windows functions and definitions for >=WinXP */
326 # define WINVER 0x0501
329 /* Defined to access _other_ windows functions and definitions for >=WinXP */
330 # ifndef _WIN32_WINNT
331 # define _WIN32_WINNT 0x0501
334 /* Defined to avoid including some windows headers as part of Windows.h */
335 # ifndef WIN32_LEAN_AND_MEAN
336 # define WIN32_LEAN_AND_MEAN 1
342 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
344 dnl Enable C99 when compiling with MIPSpro
345 AC_MSG_CHECKING([for MIPSpro compiler])
346 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
347 #if (defined(__sgi) && defined(_COMPILER_VERSION))
352 bmipspro=false; AC_MSG_RESULT(no),
353 bmipspro=true; AC_MSG_RESULT(yes))
355 if test "$bmipspro" = "true"; then
356 CFLAGS="$CFLAGS -c99"
361 AC_SEARCH_LIBS(socket, [socket network])
362 AC_SEARCH_LIBS(gethostbyname, [nsl])
363 AC_SEARCH_LIBS(dlopen, [dl])
364 AC_SEARCH_LIBS(inet_aton, [resolv])
365 AC_SEARCH_LIBS(backtrace, [execinfo])
367 AC_SEARCH_LIBS([clock_gettime], [rt])
368 if test "$LIBS" != "$saved_LIBS"; then
369 # Looks like we need -lrt for clock_gettime().
373 if test "$bwin32" = "false"; then
374 AC_SEARCH_LIBS(pthread_create, [pthread])
375 AC_SEARCH_LIBS(pthread_detach, [pthread])
378 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
379 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
383 RtlSecureZeroMemory \
387 backtrace_symbols_fd \
399 gnu_get_libc_version \
432 # Apple messed up when they added two functions functions in Sierra: they
433 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
434 # checks. So we should only probe for those functions if we are sure that we
435 # are not targetting OSX 10.11 or earlier.
436 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
439 # include <AvailabilityMacros.h>
440 # ifndef MAC_OS_X_VERSION_10_12
441 # define MAC_OS_X_VERSION_10_12 101200
443 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
444 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
445 # error "Running on Mac OSX 10.11 or earlier"
450 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
451 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
453 if test "$on_macos_pre_10_12" = "no"; then
460 if test "$bwin32" != "true"; then
461 AC_CHECK_HEADERS(pthread.h)
462 AC_CHECK_FUNCS(pthread_create)
463 AC_CHECK_FUNCS(pthread_condattr_setclock)
466 if test "$bwin32" = "true"; then
467 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
474 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
475 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
477 dnl ------------------------------------------------------
478 dnl Where do you live, libevent? And how do we call you?
480 if test "$bwin32" = "true"; then
481 TOR_LIB_WS32=-lws2_32
482 TOR_LIB_IPHLPAPI=-liphlpapi
483 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
484 # think it's actually necessary.
490 AC_SUBST(TOR_LIB_WS32)
491 AC_SUBST(TOR_LIB_GDI)
492 AC_SUBST(TOR_LIB_IPHLPAPI)
494 tor_libevent_pkg_redhat="libevent"
495 tor_libevent_pkg_debian="libevent-dev"
496 tor_libevent_devpkg_redhat="libevent-devel"
497 tor_libevent_devpkg_debian="libevent-dev"
499 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
500 dnl linking for static builds.
501 STATIC_LIBEVENT_FLAGS=""
502 if test "$enable_static_libevent" = "yes"; then
503 if test "$have_rt" = "yes"; then
504 STATIC_LIBEVENT_FLAGS=" -lrt "
508 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
510 #include <winsock2.h>
512 #include <sys/time.h>
513 #include <sys/types.h>
514 #include <event2/event.h>], [
516 #include <winsock2.h>
519 struct event_base *event_base_new(void);],
522 {WSADATA d; WSAStartup(0x101,&d); }
525 ], [--with-libevent-dir], [/opt/libevent])
527 dnl Determine the incantation needed to link libevent.
529 save_LDFLAGS="$LDFLAGS"
530 save_CPPFLAGS="$CPPFLAGS"
532 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
533 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
534 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
536 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
538 if test "$enable_static_libevent" = "yes"; then
539 if test "$tor_cv_library_libevent_dir" = "(system)"; then
540 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
542 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
545 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
546 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
547 AC_SEARCH_LIBS(evdns_base_new, [event event_extra], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for evdns_base_new"))
549 if test "$ac_cv_search_event_new" != "none required"; then
550 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
552 if test "$ac_cv_search_evdns_base_new" != "none required"; then
553 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
556 AC_MSG_ERROR("libevent2 is required but the headers could not be found")
560 dnl Now check for particular libevent functions.
561 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
562 evutil_secure_rng_add_bytes \
566 LDFLAGS="$save_LDFLAGS"
567 CPPFLAGS="$save_CPPFLAGS"
569 dnl Check that libevent is at least at version 2.0.10, the first stable
570 dnl release of its series
571 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
572 AC_MSG_CHECKING([whether Libevent is new enough])
573 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
574 #include <event2/event.h>
575 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
581 ])], [ AC_MSG_RESULT([yes]) ],
582 [ AC_MSG_RESULT([no])
583 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
586 LDFLAGS="$save_LDFLAGS"
587 CPPFLAGS="$save_CPPFLAGS"
589 AC_SUBST(TOR_LIBEVENT_LIBS)
591 dnl ------------------------------------------------------
592 dnl Where do you live, libm?
594 dnl On some platforms (Haiku/BeOS) the math library is
595 dnl part of libroot. In which case don't link against lm
598 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
599 if test "$ac_cv_search_pow" != "none required"; then
600 TOR_LIB_MATH="$ac_cv_search_pow"
603 AC_SUBST(TOR_LIB_MATH)
605 dnl ------------------------------------------------------
606 dnl Where do you live, openssl? And how do we call you?
608 tor_openssl_pkg_redhat="openssl"
609 tor_openssl_pkg_debian="libssl-dev"
610 tor_openssl_devpkg_redhat="openssl-devel"
611 tor_openssl_devpkg_debian="libssl-dev"
613 ALT_openssl_WITHVAL=""
615 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
617 if test "x$withval" != "xno" && test "x$withval" != "x"; then
618 ALT_openssl_WITHVAL="$withval"
622 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
623 [#include <openssl/rand.h>],
624 [void RAND_add(const void *buf, int num, double entropy);],
625 [RAND_add((void*)0,0,0);], [],
626 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
628 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
630 if test "$enable_static_openssl" = "yes"; then
631 if test "$tor_cv_library_openssl_dir" = "(system)"; then
632 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
634 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
637 TOR_OPENSSL_LIBS="-lssl -lcrypto"
639 AC_SUBST(TOR_OPENSSL_LIBS)
641 dnl Now check for particular openssl functions.
643 save_LDFLAGS="$LDFLAGS"
644 save_CPPFLAGS="$CPPFLAGS"
645 LIBS="$TOR_OPENSSL_LIBS $LIBS"
646 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
647 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
650 #include <openssl/opensslv.h>
651 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
656 [ AC_ERROR([OpenSSL is too old. We require 1.0.1 or later. You can specify a path to a newer one with --with-openssl-dir.]) ])
659 #include <openssl/opensslv.h>
660 #include <openssl/evp.h>
661 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
664 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
665 #error "curves unavailable"
669 [ AC_ERROR([OpenSSL is built without full ECC support, including curves P256 and P224. You can specify a path to one with ECC support with --with-openssl-dir.]) ])
671 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
672 [#include <openssl/ssl.h>
676 SSL_SESSION_get_master_key \
677 SSL_get_server_random \
678 SSL_get_client_ciphers \
679 SSL_get_client_random \
680 SSL_CTX_set1_groups_list \
682 SSL_CTX_set_security_level \
686 dnl Check if OpenSSL has scrypt implementation.
687 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
689 dnl Check if OpenSSL structures are opaque
690 AC_CHECK_MEMBERS([SSL.state], , ,
691 [#include <openssl/ssl.h>
695 LDFLAGS="$save_LDFLAGS"
696 CPPFLAGS="$save_CPPFLAGS"
698 dnl ------------------------------------------------------
699 dnl Where do you live, zlib? And how do we call you?
701 tor_zlib_pkg_redhat="zlib"
702 tor_zlib_pkg_debian="zlib1g"
703 tor_zlib_devpkg_redhat="zlib-devel"
704 tor_zlib_devpkg_debian="zlib1g-dev"
706 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
708 [const char * zlibVersion(void);],
709 [zlibVersion();], [--with-zlib-dir],
712 if test "$enable_static_zlib" = "yes"; then
713 if test "$tor_cv_library_zlib_dir" = "(system)"; then
714 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
715 using --enable-static-zlib")
717 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
722 AC_SUBST(TOR_ZLIB_LIBS)
724 dnl ----------------------------------------------------------------------
725 dnl Check if libcap is available for capabilities.
727 tor_cap_pkg_debian="libcap2"
728 tor_cap_pkg_redhat="libcap"
729 tor_cap_devpkg_debian="libcap-dev"
730 tor_cap_devpkg_redhat="libcap-devel"
732 AC_CHECK_LIB([cap], [cap_init], [],
733 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
735 AC_CHECK_FUNCS(cap_set_proc)
737 dnl ---------------------------------------------------------------------
738 dnl Now that we know about our major libraries, we can check for compiler
739 dnl and linker hardening options. We need to do this with the libraries known,
740 dnl since sometimes the linker will like an option but not be willing to
741 dnl use it with a build of a library.
743 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
744 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_CAP_LIBS"
751 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
752 #if !defined(__clang__)
754 #endif])], have_clang=yes, have_clang=no)
756 if test "x$enable_gcc_hardening" != "xno"; then
757 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
758 if test "x$have_clang" = "xyes"; then
759 TOR_CHECK_CFLAGS(-Qunused-arguments)
761 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
762 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
763 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
764 m4_ifdef([AS_VAR_IF],[
765 AS_VAR_IF(can_compile, [yes],
766 AS_VAR_IF(can_link, [yes],
768 AC_MSG_ERROR([We tried to build with stack protection; it looks like your compiler supports it but your libc does not provide it. Are you missing libssp? (You can --disable-gcc-hardening to ignore this error.)]))
770 AS_VAR_POPDEF([can_link])
771 AS_VAR_POPDEF([can_compile])
772 TOR_CHECK_CFLAGS(-Wstack-protector)
773 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
774 if test "$bwin32" = "false"; then
775 TOR_CHECK_CFLAGS(-fPIE)
776 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
778 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
781 if test "x$enable_expensive_hardening" = "xyes"; then
782 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
783 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
784 AC_MSG_WARN([The compiler supports -ftrapv, but for some reason I was not able to link with -ftrapv. Are you missing run-time support? Run-time hardening will not work as well as it should.])
787 if test "$tor_cv_cflags__ftrapv" != "yes"; then
788 AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
791 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
792 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
793 AC_MSG_ERROR([The compiler supports -fsanitize=address, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libubsan.so, and with Clang you need libclang_rt.ubsan*])
796 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
797 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
798 AC_MSG_ERROR([The compiler supports -fsanitize=undefined, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libasan.so, and with Clang you need libclang_rt.ubsan*])
801 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
804 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
805 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
807 mulodi_fixes_ftrapv=no
808 if test "$have_clang" = "yes"; then
809 saved_CFLAGS="$CFLAGS"
810 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
811 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
816 int main(int argc, char **argv)
818 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
819 * (int64_t)atoi(argv[3]);
822 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
823 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
824 if test "$ftrapv_can_link" = "no"; then
825 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
830 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
834 int main(int argc, char **argv)
836 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
837 * (int64_t)atoi(argv[3]);
840 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
841 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
843 CFLAGS="$saved_CFLAGS"
846 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
848 dnl These cflags add bunches of branches, and we haven't been able to
849 dnl persuade ourselves that they're suitable for code that needs to be
851 AC_SUBST(CFLAGS_BUGTRAP)
852 dnl These cflags are variant ones sutable for code that needs to be
854 AC_SUBST(CFLAGS_CONSTTIME)
856 if test "x$enable_linker_hardening" != "xno"; then
857 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
860 # For backtrace support
861 TOR_CHECK_LDFLAGS(-rdynamic)
863 dnl ------------------------------------------------------
864 dnl Now see if we have a -fomit-frame-pointer compiler option.
866 saved_CFLAGS="$CFLAGS"
867 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
868 F_OMIT_FRAME_POINTER=''
869 if test "$saved_CFLAGS" != "$CFLAGS"; then
870 if test "x$enable_expensive_hardening" != "xyes"; then
871 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
874 CFLAGS="$saved_CFLAGS"
875 AC_SUBST(F_OMIT_FRAME_POINTER)
877 dnl ------------------------------------------------------
878 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
879 dnl for us, as GCC 4.6 and later do at many optimization levels), then
880 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
882 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
884 dnl ============================================================
885 dnl Check for libseccomp
887 if test "x$enable_seccomp" != "xno"; then
888 AC_CHECK_HEADERS([seccomp.h])
889 AC_SEARCH_LIBS(seccomp_init, [seccomp])
892 dnl ============================================================
893 dnl Check for libscrypt
895 if test "x$enable_libscrypt" != "xno"; then
896 AC_CHECK_HEADERS([libscrypt.h])
897 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
898 AC_CHECK_FUNCS([libscrypt_scrypt])
901 dnl ============================================================
902 dnl We need an implementation of curve25519.
904 dnl set these defaults.
905 build_curve25519_donna=no
906 build_curve25519_donna_c64=no
907 use_curve25519_donna=no
908 use_curve25519_nacl=no
911 dnl The best choice is using curve25519-donna-c64, but that requires
913 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
914 tor_cv_can_use_curve25519_donna_c64,
916 [AC_LANG_PROGRAM([dnl
918 typedef unsigned uint128_t __attribute__((mode(TI)));
919 int func(uint64_t a, uint64_t b) {
920 uint128_t c = ((uint128_t)a) * b;
921 int ok = ((uint64_t)(c>>96)) == 522859 &&
922 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
923 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
924 (((uint64_t)(c))&0xffffffffL) == 0;
928 int ok = func( ((uint64_t)2000000000) * 1000000000,
929 ((uint64_t)1234567890) << 24);
932 [tor_cv_can_use_curve25519_donna_c64=yes],
933 [tor_cv_can_use_curve25519_donna_c64=no],
935 [AC_LANG_PROGRAM([dnl
937 typedef unsigned uint128_t __attribute__((mode(TI)));
938 int func(uint64_t a, uint64_t b) {
939 uint128_t c = ((uint128_t)a) * b;
940 int ok = ((uint64_t)(c>>96)) == 522859 &&
941 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
942 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
943 (((uint64_t)(c))&0xffffffffL) == 0;
947 int ok = func( ((uint64_t)2000000000) * 1000000000,
948 ((uint64_t)1234567890) << 24);
951 [tor_cv_can_use_curve25519_donna_c64=cross],
952 [tor_cv_can_use_curve25519_donna_c64=no])])])
954 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
955 nacl/crypto_scalarmult_curve25519.h])
957 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
958 tor_cv_can_use_curve25519_nacl,
959 [tor_saved_LIBS="$LIBS"
962 [AC_LANG_PROGRAM([dnl
963 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
964 #include <crypto_scalarmult_curve25519.h>
965 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
966 #include <nacl/crypto_scalarmult_curve25519.h>
968 #ifdef crypto_scalarmult_curve25519_ref_BYTES
969 #error Hey, this is the reference implementation! That's not fast.
972 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
973 ])], [tor_cv_can_use_curve25519_nacl=yes],
974 [tor_cv_can_use_curve25519_nacl=no])
975 LIBS="$tor_saved_LIBS" ])
977 dnl Okay, now we need to figure out which one to actually use. Fall back
978 dnl to curve25519-donna.c
980 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
981 build_curve25519_donna_c64=yes
982 use_curve25519_donna=yes
983 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
984 use_curve25519_nacl=yes
985 CURVE25519_LIBS=-lnacl
987 build_curve25519_donna=yes
988 use_curve25519_donna=yes
991 if test "x$use_curve25519_donna" = "xyes"; then
992 AC_DEFINE(USE_CURVE25519_DONNA, 1,
993 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
995 if test "x$use_curve25519_nacl" = "xyes"; then
996 AC_DEFINE(USE_CURVE25519_NACL, 1,
997 [Defined if we should use a curve25519 from nacl])
999 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1000 test "x$build_curve25519_donna" = "xyes")
1001 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1002 test "x$build_curve25519_donna_c64" = "xyes")
1003 AC_SUBST(CURVE25519_LIBS)
1005 dnl Make sure to enable support for large off_t if available.
1008 AC_CHECK_HEADERS([assert.h \
1023 gnu/libc-version.h \
1062 AC_CHECK_HEADERS(sys/param.h)
1064 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1065 [#ifdef HAVE_SYS_TYPES_H
1066 #include <sys/types.h>
1068 #ifdef HAVE_SYS_SOCKET_H
1069 #include <sys/socket.h>
1071 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1072 [#ifdef HAVE_SYS_TYPES_H
1073 #include <sys/types.h>
1075 #ifdef HAVE_SYS_SOCKET_H
1076 #include <sys/socket.h>
1078 #ifdef HAVE_NET_IF_H
1081 #ifdef HAVE_NETINET_IN_H
1082 #include <netinet/in.h>
1085 AC_CHECK_HEADERS(linux/if.h,[],[],
1087 #ifdef HAVE_SYS_SOCKET_H
1088 #include <sys/socket.h>
1092 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1093 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1094 [#ifdef HAVE_SYS_TYPES_H
1095 #include <sys/types.h>
1097 #ifdef HAVE_SYS_SOCKET_H
1098 #include <sys/socket.h>
1100 #ifdef HAVE_LIMITS_H
1103 #ifdef HAVE_LINUX_TYPES_H
1104 #include <linux/types.h>
1106 #ifdef HAVE_NETINET_IN6_H
1107 #include <netinet/in6.h>
1109 #ifdef HAVE_NETINET_IN_H
1110 #include <netinet/in.h>
1113 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1114 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1115 [#ifdef HAVE_SYS_TYPES_H
1116 #include <sys/types.h>
1118 #ifdef HAVE_SYS_SOCKET_H
1119 #include <sys/socket.h>
1121 #ifdef HAVE_LIMITS_H
1124 #ifdef HAVE_LINUX_TYPES_H
1125 #include <linux/types.h>
1127 #ifdef HAVE_NETINET_IN6_H
1128 #include <netinet/in6.h>
1130 #ifdef HAVE_NETINET_IN_H
1131 #include <netinet/in.h>
1133 #ifdef HAVE_LINUX_IF_H
1134 #include <linux/if.h>
1138 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1141 if test "x$linux_netfilter_ipv4" = "x1"; then
1144 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1147 if test "x$transparent_ok" = "x1"; then
1148 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1150 *-*-openbsd* | *-*-bitrig*)
1151 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1154 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1157 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1158 [#ifdef HAVE_SYS_TYPES_H
1159 #include <sys/types.h>
1161 #ifdef HAVE_SYS_TIME_H
1162 #include <sys/time.h>
1165 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1168 AC_CHECK_SIZEOF(int8_t)
1169 AC_CHECK_SIZEOF(int16_t)
1170 AC_CHECK_SIZEOF(int32_t)
1171 AC_CHECK_SIZEOF(int64_t)
1172 AC_CHECK_SIZEOF(uint8_t)
1173 AC_CHECK_SIZEOF(uint16_t)
1174 AC_CHECK_SIZEOF(uint32_t)
1175 AC_CHECK_SIZEOF(uint64_t)
1176 AC_CHECK_SIZEOF(intptr_t)
1177 AC_CHECK_SIZEOF(uintptr_t)
1179 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1181 AC_CHECK_SIZEOF(char)
1182 AC_CHECK_SIZEOF(short)
1183 AC_CHECK_SIZEOF(int)
1184 AC_CHECK_SIZEOF(long)
1185 AC_CHECK_SIZEOF(long long)
1186 AC_CHECK_SIZEOF(__int64)
1187 AC_CHECK_SIZEOF(void *)
1188 AC_CHECK_SIZEOF(time_t)
1189 AC_CHECK_SIZEOF(size_t)
1190 AC_CHECK_SIZEOF(pid_t)
1192 AC_CHECK_TYPES([uint, u_char, ssize_t])
1194 AC_PC_FROM_UCONTEXT([:])
1196 dnl used to include sockaddr_storage, but everybody has that.
1197 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1198 [#ifdef HAVE_SYS_TYPES_H
1199 #include <sys/types.h>
1201 #ifdef HAVE_NETINET_IN_H
1202 #include <netinet/in.h>
1204 #ifdef HAVE_NETINET_IN6_H
1205 #include <netinet/in6.h>
1207 #ifdef HAVE_SYS_SOCKET_H
1208 #include <sys/socket.h>
1211 #define _WIN32_WINNT 0x0501
1212 #define WIN32_LEAN_AND_MEAN
1213 #include <winsock2.h>
1214 #include <ws2tcpip.h>
1217 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1218 [#ifdef HAVE_SYS_TYPES_H
1219 #include <sys/types.h>
1221 #ifdef HAVE_NETINET_IN_H
1222 #include <netinet/in.h>
1224 #ifdef HAVE_NETINET_IN6_H
1225 #include <netinet/in6.h>
1227 #ifdef HAVE_SYS_SOCKET_H
1228 #include <sys/socket.h>
1231 #define _WIN32_WINNT 0x0501
1232 #define WIN32_LEAN_AND_MEAN
1233 #include <winsock2.h>
1234 #include <ws2tcpip.h>
1238 AC_CHECK_TYPES([rlim_t], , ,
1239 [#ifdef HAVE_SYS_TYPES_H
1240 #include <sys/types.h>
1242 #ifdef HAVE_SYS_TIME_H
1243 #include <sys/time.h>
1245 #ifdef HAVE_SYS_RESOURCE_H
1246 #include <sys/resource.h>
1250 AX_CHECK_SIGN([time_t],
1253 #ifdef HAVE_SYS_TYPES_H
1254 #include <sys/types.h>
1256 #ifdef HAVE_SYS_TIME_H
1257 #include <sys/time.h>
1264 if test "$ax_cv_decl_time_t_signed" = "no"; then
1265 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1268 AX_CHECK_SIGN([size_t],
1269 [ tor_cv_size_t_signed=yes ],
1270 [ tor_cv_size_t_signed=no ], [
1271 #ifdef HAVE_SYS_TYPES_H
1272 #include <sys/types.h>
1276 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1277 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1280 AX_CHECK_SIGN([enum always],
1281 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1283 enum always { AAA, BBB, CCC };
1286 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1287 #ifdef HAVE_SYS_SOCKET_H
1288 #include <sys/socket.h>
1292 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1294 AC_CHECK_SIZEOF(cell_t)
1296 # Now make sure that NULL can be represented as zero bytes.
1297 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1298 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1299 [[#include <stdlib.h>
1302 #ifdef HAVE_STDDEF_H
1305 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1306 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1307 [tor_cv_null_is_zero=yes],
1308 [tor_cv_null_is_zero=no],
1309 [tor_cv_null_is_zero=cross])])
1311 if test "$tor_cv_null_is_zero" = "cross"; then
1312 # Cross-compiling; let's hope that the target isn't raving mad.
1313 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1316 if test "$tor_cv_null_is_zero" != "no"; then
1317 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1318 [Define to 1 iff memset(0) sets pointers to NULL])
1321 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1322 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1323 [[#include <stdlib.h>
1326 #ifdef HAVE_STDDEF_H
1329 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1330 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1331 [tor_cv_dbl0_is_zero=yes],
1332 [tor_cv_dbl0_is_zero=no],
1333 [tor_cv_dbl0_is_zero=cross])])
1335 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1336 # Cross-compiling; let's hope that the target isn't raving mad.
1337 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1340 if test "$tor_cv_dbl0_is_zero" != "no"; then
1341 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1342 [Define to 1 iff memset(0) sets doubles to 0.0])
1345 # And what happens when we malloc zero?
1346 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1347 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1348 [[#include <stdlib.h>
1351 #ifdef HAVE_STDDEF_H
1354 int main () { return malloc(0)?0:1; }]])],
1355 [tor_cv_malloc_zero_works=yes],
1356 [tor_cv_malloc_zero_works=no],
1357 [tor_cv_malloc_zero_works=cross])])
1359 if test "$tor_cv_malloc_zero_works" = "cross"; then
1360 # Cross-compiling; let's hope that the target isn't raving mad.
1361 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1364 if test "$tor_cv_malloc_zero_works" = "yes"; then
1365 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1366 [Define to 1 iff malloc(0) returns a pointer])
1369 # whether we seem to be in a 2s-complement world.
1370 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1371 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1372 [[int main () { int problem = ((-99) != (~99)+1);
1373 return problem ? 1 : 0; }]])],
1374 [tor_cv_twos_complement=yes],
1375 [tor_cv_twos_complement=no],
1376 [tor_cv_twos_complement=cross])])
1378 if test "$tor_cv_twos_complement" = "cross"; then
1379 # Cross-compiling; let's hope that the target isn't raving mad.
1380 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1383 if test "$tor_cv_twos_complement" != "no"; then
1384 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1385 [Define to 1 iff we represent negative integers with
1389 # What does shifting a negative value do?
1390 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1391 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1392 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1393 [tor_cv_sign_extend=yes],
1394 [tor_cv_sign_extend=no],
1395 [tor_cv_sign_extend=cross])])
1397 if test "$tor_cv_sign_extend" = "cross"; then
1398 # Cross-compiling; let's hope that the target isn't raving mad.
1399 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1402 if test "$tor_cv_sign_extend" != "no"; then
1403 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1404 [Define to 1 iff right-shifting a negative value performs sign-extension])
1407 # Whether we should use the dmalloc memory allocation debugging library.
1408 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1409 AC_ARG_WITH(dmalloc,
1410 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1411 [if [[ "$withval" = "yes" ]]; then
1417 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1420 if [[ $dmalloc -eq 1 ]]; then
1421 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1422 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1423 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1424 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1427 AC_ARG_WITH(tcmalloc,
1428 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1429 [ tcmalloc=yes ], [ tcmalloc=no ])
1431 if test "x$tcmalloc" = "xyes"; then
1432 LDFLAGS="-ltcmalloc $LDFLAGS"
1435 using_custom_malloc=no
1436 if test "x$enable_openbsd_malloc" = "xyes"; then
1437 using_custom_malloc=yes
1439 if test "x$tcmalloc" = "xyes"; then
1440 using_custom_malloc=yes
1442 if test "$using_custom_malloc" = "no"; then
1443 AC_CHECK_FUNCS(mallinfo)
1445 if test "$using_custom_malloc" = "yes"; then
1446 # Tell the C compiler not to use the system allocator functions.
1447 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1450 # By default, we're going to assume we don't have mlockall()
1451 # bionic and other platforms have various broken mlockall subsystems.
1452 # Some systems don't have a working mlockall, some aren't linkable,
1453 # and some have it but don't declare it.
1454 AC_CHECK_FUNCS(mlockall)
1455 AC_CHECK_DECLS([mlockall], , , [
1456 #ifdef HAVE_SYS_MMAN_H
1457 #include <sys/mman.h>
1460 # Allow user to specify an alternate syslog facility
1461 AC_ARG_WITH(syslog-facility,
1462 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1463 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1464 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1465 AC_SUBST(LOGFACILITY)
1467 # Check if we have getresuid and getresgid
1468 AC_CHECK_FUNCS(getresuid getresgid)
1470 # Check for gethostbyname_r in all its glorious incompatible versions.
1471 # (This logic is based on that in Python's configure.in)
1472 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1473 [Define this if you have any gethostbyname_r()])
1475 AC_CHECK_FUNC(gethostbyname_r, [
1476 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1478 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1479 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1483 struct hostent *h1, *h2;
1485 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1487 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1488 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1489 [Define this if gethostbyname_r takes 6 arguments])
1498 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1500 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1501 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1502 [Define this if gethostbyname_r takes 5 arguments])
1510 struct hostent_data hd;
1511 (void) gethostbyname_r(cp1,h1,&hd);
1513 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1514 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1515 [Define this if gethostbyname_r takes 3 arguments])
1525 AC_CACHE_CHECK([whether the C compiler supports __func__],
1526 tor_cv_have_func_macro,
1527 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1529 int main(int c, char **v) { puts(__func__); }])],
1530 tor_cv_have_func_macro=yes,
1531 tor_cv_have_func_macro=no))
1533 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1534 tor_cv_have_FUNC_macro,
1535 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1537 int main(int c, char **v) { puts(__FUNC__); }])],
1538 tor_cv_have_FUNC_macro=yes,
1539 tor_cv_have_FUNC_macro=no))
1541 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1542 tor_cv_have_FUNCTION_macro,
1543 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1545 int main(int c, char **v) { puts(__FUNCTION__); }])],
1546 tor_cv_have_FUNCTION_macro=yes,
1547 tor_cv_have_FUNCTION_macro=no))
1549 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1550 tor_cv_have_environ_declared,
1551 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1552 #ifdef HAVE_UNISTD_H
1556 int main(int c, char **v) { char **t = environ; }])],
1557 tor_cv_have_environ_declared=yes,
1558 tor_cv_have_environ_declared=no))
1560 if test "$tor_cv_have_func_macro" = "yes"; then
1561 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1564 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1565 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1568 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1569 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1570 [Defined if the compiler supports __FUNCTION__])
1573 if test "$tor_cv_have_environ_declared" = "yes"; then
1574 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1575 [Defined if we have extern char **environ already declared])
1578 # $prefix stores the value of the --prefix command line option, or
1579 # NONE if the option wasn't set. In the case that it wasn't set, make
1580 # it be the default, so that we can use it to expand directories now.
1581 if test "x$prefix" = "xNONE"; then
1582 prefix=$ac_default_prefix
1585 # and similarly for $exec_prefix
1586 if test "x$exec_prefix" = "xNONE"; then
1590 if test "x$BUILDDIR" = "x"; then
1594 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1595 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1597 if test "x$CONFDIR" = "x"; then
1598 CONFDIR=`eval echo $sysconfdir/tor`
1601 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1602 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1604 BINDIR=`eval echo $bindir`
1606 LOCALSTATEDIR=`eval echo $localstatedir`
1607 AC_SUBST(LOCALSTATEDIR)
1609 if test "$bwin32" = "true"; then
1610 # Test if the linker supports the --nxcompat and --dynamicbase options
1612 save_LDFLAGS="$LDFLAGS"
1613 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1614 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1615 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1616 [AC_MSG_RESULT([yes])]
1617 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1618 [AC_MSG_RESULT([no])]
1620 LDFLAGS="$save_LDFLAGS"
1623 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1624 # than autoconf's macros like.
1625 if test "$GCC" = "yes"; then
1626 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1627 # accident waiting to happen.
1628 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1630 # Override optimization level for non-gcc compilers
1632 enable_gcc_warnings=no
1633 enable_gcc_warnings_advisory=no
1636 # Warnings implies advisory-warnings and -Werror.
1637 if test "$enable_gcc_warnings" = "yes"; then
1638 enable_gcc_warnings_advisory=yes
1639 enable_fatal_warnings=yes
1642 # OS X Lion started deprecating the system openssl. Let's just disable
1643 # all deprecation warnings on OS X. Also, to potentially make the binary
1644 # a little smaller, let's enable dead_strip.
1648 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1649 LDFLAGS="$LDFLAGS -dead_strip" ;;
1652 # Add some more warnings which we use in development but not in the
1653 # released versions. (Some relevant gcc versions can't handle these.)
1655 # Note that we have to do this near the end of the autoconf process, or
1656 # else we may run into problems when these warnings hit on the testing C
1657 # programs that autoconf wants to build.
1658 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1661 *-*-openbsd* | *-*-bitrig*)
1662 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1663 # That's fine, except that the headers don't pass -Wredundant-decls.
1664 # Therefore, let's disable -Wsystem-headers when we're building
1665 # with maximal warnings on OpenBSD.
1666 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1669 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1670 # have it work better.
1671 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1673 # This warning was added in gcc 4.3, but it appears to generate
1674 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1675 #CFLAGS="$CFLAGS -Wlogical-op"
1677 m4_foreach_w([warning_flag], [
1679 -Waddress-of-array-temporary
1680 -Waddress-of-temporary
1682 -Wanonymous-pack-parens
1685 -Warc-bridge-casts-disallowed-in-nonarc
1686 -Warc-maybe-repeated-use-of-weak
1687 -Warc-performSelector-leaks
1688 -Warc-repeated-use-of-weak
1690 -Warray-bounds-pointer-arithmetic
1692 -Wasm-operand-widths
1694 -Watomic-property-with-user-defined-accessor
1696 -Wauto-storage-class
1699 -Wbackslash-newline-escape
1700 -Wbad-array-new-length
1701 -Wbind-to-temporary-copy
1702 -Wbitfield-constant-conversion
1705 -Wbuiltin-requires-header
1707 -Wcompare-distinct-pointer-types
1708 -Wcomplex-component-init
1709 -Wconditional-type-mismatch
1711 -Wconstant-conversion
1712 -Wconstant-logical-operand
1713 -Wconstexpr-not-const
1714 -Wcustom-atomic-properties
1716 -Wdangling-initializer-list
1718 -Wdelegating-ctor-cycles
1719 -Wdeprecated-implementations
1720 -Wdeprecated-register
1721 -Wdirect-ivar-access
1723 -Wdistributed-object-modifiers
1725 -Wdollar-in-identifier-extension
1727 -Wduplicate-decl-specifier
1729 -Wduplicate-method-arg
1730 -Wduplicate-method-match
1732 -Wdynamic-class-memaccess
1733 -Wembedded-directive
1734 -Wempty-translation-unit
1736 -Wexit-time-destructors
1737 -Wexplicit-ownership-type
1738 -Wextern-initializer
1742 -Wflexible-array-extensions
1745 -Wfour-char-constants
1747 -Wglobal-constructors
1748 -Wgnu-array-member-paren-init
1750 -Wgnu-static-float-init
1753 -Widiomatic-parentheses
1754 -Wignored-attributes
1755 -Wimplicit-atomic-properties
1756 -Wimplicit-conversion-floating-point-to-bool
1757 -Wimplicit-exception-spec-mismatch
1758 -Wimplicit-fallthrough
1759 -Wimplicit-fallthrough-per-function
1760 -Wimplicit-retain-self
1761 -Wimport-preprocessor-directive-pedantic
1762 -Wincompatible-library-redeclaration
1763 -Wincompatible-pointer-types-discards-qualifiers
1764 -Wincomplete-implementation
1766 -Wincomplete-umbrella
1769 -Wint-to-void-pointer-cast
1775 -Winvalid-source-encoding
1776 -Winvalid-token-paste
1777 -Wknr-promoted-parameter
1778 -Wlanguage-extension-token
1779 -Wlarge-by-value-copy
1780 -Wliteral-conversion
1782 -Wlocal-type-template-args
1786 -Wmalformed-warning-check
1790 -Wmismatched-parameter-types
1791 -Wmismatched-return-types
1792 -Wmissing-field-initializers
1793 -Wmissing-format-attribute
1795 -Wmissing-selector-name
1797 -Wmissing-variable-declarations
1801 -Wnon-literal-null-conversion
1803 -Wnonportable-cfstrings
1809 -Wout-of-line-declaration
1811 -Woverlength-strings
1813 -Woverriding-method-mismatch
1814 -Wpointer-type-mismatch
1815 -Wpredefined-identifier-outside-function
1816 -Wprotocol-property-synthesis-ambiguity
1817 -Wreadonly-iboutlet-property
1818 -Wreadonly-setter-attrs
1820 -Wreceiver-forward-class
1822 -Wreinterpret-base-class
1823 -Wrequires-super-attribute
1824 -Wreserved-user-defined-literal
1825 -Wreturn-stack-address
1827 -Wselector-type-mismatch
1829 -Wserialized-diagnostics
1831 -Wshift-count-negative
1832 -Wshift-count-overflow
1833 -Wshift-negative-value
1835 -Wshift-sign-overflow
1837 -Wsizeof-array-argument
1838 -Wsource-uses-openmp
1841 -Wstatic-local-in-inline
1845 -Wstrlcpy-strlcat-size
1847 -Wsuggest-attribute=format
1848 -Wsuggest-attribute=noreturn
1849 -Wsuper-class-method-mismatch
1852 -Wtautological-constant-out-of-range-compare
1853 -Wtentative-definition-incomplete-type
1856 -Wtypedef-redefinition
1859 -Wundefined-internal
1860 -Wundefined-reinterpret-cast
1862 -Wunicode-whitespace
1863 -Wunknown-warning-option
1864 -Wunnamed-type-template-args
1865 -Wunneeded-member-function
1867 -Wunsupported-visibility
1868 -Wunused-but-set-parameter
1869 -Wunused-but-set-variable
1870 -Wunused-command-line-argument
1871 -Wunused-const-variable=2
1872 -Wunused-exception-parameter
1873 -Wunused-local-typedefs
1874 -Wunused-member-function
1875 -Wunused-sanitize-argument
1876 -Wunused-volatile-lvalue
1877 -Wuser-defined-literals
1880 -Wvector-conversions
1885 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1887 dnl We should re-enable this in some later version. Clang doesn't
1888 dnl mind, but it causes trouble with GCC.
1889 dnl -Wstrict-overflow=2
1891 dnl These seem to require annotations that we don't currently use,
1892 dnl and they give false positives in our pthreads wrappers. (Clang 4)
1894 dnl -Wthread-safety-analysis
1895 dnl -Wthread-safety-attributes
1896 dnl -Wthread-safety-beta
1897 dnl -Wthread-safety-precise
1899 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1900 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1901 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1902 CFLAGS="$CFLAGS -Wwrite-strings"
1903 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1904 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1905 CFLAGS="$CFLAGS -Wunused-parameter "
1906 # These interfere with building main() { return 0; }, which autoconf
1907 # likes to use as its default program.
1908 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1910 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1911 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1913 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1914 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1917 if test "x$enable_fatal_warnings" = "xyes"; then
1918 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1919 # default autoconf programs are full of errors.
1920 CFLAGS="$CFLAGS -Werror"
1925 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1928 AC_MSG_WARN([Tried to enable coverage on OSX without using the clang compiler. This might not work! If coverage fails, use CC=clang when configuring with --enable-coverage.])
1932 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1937 contrib/dist/suse/tor.sh
1938 contrib/operator-tools/tor.logrotate
1941 contrib/dist/tor.service
1942 src/config/torrc.sample
1943 src/config/torrc.minimal
1944 scripts/maint/checkOptionDocs.pl
1945 scripts/maint/updateVersions.pl
1948 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1949 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1950 for file in $regular_mans ; do
1951 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1952 echo "==================================";
1954 echo "Building Tor has failed since manpages cannot be built.";
1956 echo "You need asciidoc installed to be able to build the manpages.";
1957 echo "To build without manpages, use the --disable-asciidoc argument";
1958 echo "when calling configure.";
1960 echo "==================================";