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 \
681 SSL_CTX_set_security_level \
685 dnl Check if OpenSSL has scrypt implementation.
686 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
688 dnl Check if OpenSSL structures are opaque
689 AC_CHECK_MEMBERS([SSL.state], , ,
690 [#include <openssl/ssl.h>
694 LDFLAGS="$save_LDFLAGS"
695 CPPFLAGS="$save_CPPFLAGS"
697 dnl ------------------------------------------------------
698 dnl Where do you live, zlib? And how do we call you?
700 tor_zlib_pkg_redhat="zlib"
701 tor_zlib_pkg_debian="zlib1g"
702 tor_zlib_devpkg_redhat="zlib-devel"
703 tor_zlib_devpkg_debian="zlib1g-dev"
705 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
707 [const char * zlibVersion(void);],
708 [zlibVersion();], [--with-zlib-dir],
711 if test "$enable_static_zlib" = "yes"; then
712 if test "$tor_cv_library_zlib_dir" = "(system)"; then
713 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
714 using --enable-static-zlib")
716 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
721 AC_SUBST(TOR_ZLIB_LIBS)
723 dnl ----------------------------------------------------------------------
724 dnl Check if libcap is available for capabilities.
726 tor_cap_pkg_debian="libcap2"
727 tor_cap_pkg_redhat="libcap"
728 tor_cap_devpkg_debian="libcap-dev"
729 tor_cap_devpkg_redhat="libcap-devel"
731 AC_CHECK_LIB([cap], [cap_init], [],
732 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
734 AC_CHECK_FUNCS(cap_set_proc)
736 dnl ---------------------------------------------------------------------
737 dnl Now that we know about our major libraries, we can check for compiler
738 dnl and linker hardening options. We need to do this with the libraries known,
739 dnl since sometimes the linker will like an option but not be willing to
740 dnl use it with a build of a library.
742 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
743 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"
750 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
751 #if !defined(__clang__)
753 #endif])], have_clang=yes, have_clang=no)
755 if test "x$enable_gcc_hardening" != "xno"; then
756 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
757 if test "x$have_clang" = "xyes"; then
758 TOR_CHECK_CFLAGS(-Qunused-arguments)
760 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
761 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
762 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
763 m4_ifdef([AS_VAR_IF],[
764 AS_VAR_IF(can_compile, [yes],
765 AS_VAR_IF(can_link, [yes],
767 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.)]))
769 AS_VAR_POPDEF([can_link])
770 AS_VAR_POPDEF([can_compile])
771 TOR_CHECK_CFLAGS(-Wstack-protector)
772 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
773 if test "$bwin32" = "false"; then
774 TOR_CHECK_CFLAGS(-fPIE)
775 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
777 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
780 if test "x$enable_expensive_hardening" = "xyes"; then
781 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
782 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
783 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.])
786 if test "$tor_cv_cflags__ftrapv" != "yes"; then
787 AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
790 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
791 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
792 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*])
795 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
796 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
797 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*])
800 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
803 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
804 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
806 mulodi_fixes_ftrapv=no
807 if test "$have_clang" = "yes"; then
808 saved_CFLAGS="$CFLAGS"
809 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
810 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
815 int main(int argc, char **argv)
817 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
818 * (int64_t)atoi(argv[3]);
821 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
822 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
823 if test "$ftrapv_can_link" = "no"; then
824 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
829 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
833 int main(int argc, char **argv)
835 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
836 * (int64_t)atoi(argv[3]);
839 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
840 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
842 CFLAGS="$saved_CFLAGS"
845 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
847 dnl These cflags add bunches of branches, and we haven't been able to
848 dnl persuade ourselves that they're suitable for code that needs to be
850 AC_SUBST(CFLAGS_BUGTRAP)
851 dnl These cflags are variant ones sutable for code that needs to be
853 AC_SUBST(CFLAGS_CONSTTIME)
855 if test "x$enable_linker_hardening" != "xno"; then
856 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
859 # For backtrace support
860 TOR_CHECK_LDFLAGS(-rdynamic)
862 dnl ------------------------------------------------------
863 dnl Now see if we have a -fomit-frame-pointer compiler option.
865 saved_CFLAGS="$CFLAGS"
866 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
867 F_OMIT_FRAME_POINTER=''
868 if test "$saved_CFLAGS" != "$CFLAGS"; then
869 if test "x$enable_expensive_hardening" != "xyes"; then
870 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
873 CFLAGS="$saved_CFLAGS"
874 AC_SUBST(F_OMIT_FRAME_POINTER)
876 dnl ------------------------------------------------------
877 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
878 dnl for us, as GCC 4.6 and later do at many optimization levels), then
879 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
881 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
883 dnl ============================================================
884 dnl Check for libseccomp
886 if test "x$enable_seccomp" != "xno"; then
887 AC_CHECK_HEADERS([seccomp.h])
888 AC_SEARCH_LIBS(seccomp_init, [seccomp])
891 dnl ============================================================
892 dnl Check for libscrypt
894 if test "x$enable_libscrypt" != "xno"; then
895 AC_CHECK_HEADERS([libscrypt.h])
896 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
897 AC_CHECK_FUNCS([libscrypt_scrypt])
900 dnl ============================================================
901 dnl We need an implementation of curve25519.
903 dnl set these defaults.
904 build_curve25519_donna=no
905 build_curve25519_donna_c64=no
906 use_curve25519_donna=no
907 use_curve25519_nacl=no
910 dnl The best choice is using curve25519-donna-c64, but that requires
912 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
913 tor_cv_can_use_curve25519_donna_c64,
915 [AC_LANG_PROGRAM([dnl
917 typedef unsigned uint128_t __attribute__((mode(TI)));
918 int func(uint64_t a, uint64_t b) {
919 uint128_t c = ((uint128_t)a) * b;
920 int ok = ((uint64_t)(c>>96)) == 522859 &&
921 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
922 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
923 (((uint64_t)(c))&0xffffffffL) == 0;
927 int ok = func( ((uint64_t)2000000000) * 1000000000,
928 ((uint64_t)1234567890) << 24);
931 [tor_cv_can_use_curve25519_donna_c64=yes],
932 [tor_cv_can_use_curve25519_donna_c64=no],
934 [AC_LANG_PROGRAM([dnl
936 typedef unsigned uint128_t __attribute__((mode(TI)));
937 int func(uint64_t a, uint64_t b) {
938 uint128_t c = ((uint128_t)a) * b;
939 int ok = ((uint64_t)(c>>96)) == 522859 &&
940 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
941 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
942 (((uint64_t)(c))&0xffffffffL) == 0;
946 int ok = func( ((uint64_t)2000000000) * 1000000000,
947 ((uint64_t)1234567890) << 24);
950 [tor_cv_can_use_curve25519_donna_c64=cross],
951 [tor_cv_can_use_curve25519_donna_c64=no])])])
953 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
954 nacl/crypto_scalarmult_curve25519.h])
956 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
957 tor_cv_can_use_curve25519_nacl,
958 [tor_saved_LIBS="$LIBS"
961 [AC_LANG_PROGRAM([dnl
962 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
963 #include <crypto_scalarmult_curve25519.h>
964 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
965 #include <nacl/crypto_scalarmult_curve25519.h>
967 #ifdef crypto_scalarmult_curve25519_ref_BYTES
968 #error Hey, this is the reference implementation! That's not fast.
971 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
972 ])], [tor_cv_can_use_curve25519_nacl=yes],
973 [tor_cv_can_use_curve25519_nacl=no])
974 LIBS="$tor_saved_LIBS" ])
976 dnl Okay, now we need to figure out which one to actually use. Fall back
977 dnl to curve25519-donna.c
979 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
980 build_curve25519_donna_c64=yes
981 use_curve25519_donna=yes
982 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
983 use_curve25519_nacl=yes
984 CURVE25519_LIBS=-lnacl
986 build_curve25519_donna=yes
987 use_curve25519_donna=yes
990 if test "x$use_curve25519_donna" = "xyes"; then
991 AC_DEFINE(USE_CURVE25519_DONNA, 1,
992 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
994 if test "x$use_curve25519_nacl" = "xyes"; then
995 AC_DEFINE(USE_CURVE25519_NACL, 1,
996 [Defined if we should use a curve25519 from nacl])
998 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
999 test "x$build_curve25519_donna" = "xyes")
1000 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1001 test "x$build_curve25519_donna_c64" = "xyes")
1002 AC_SUBST(CURVE25519_LIBS)
1004 dnl Make sure to enable support for large off_t if available.
1007 AC_CHECK_HEADERS([assert.h \
1022 gnu/libc-version.h \
1061 AC_CHECK_HEADERS(sys/param.h)
1063 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1064 [#ifdef HAVE_SYS_TYPES_H
1065 #include <sys/types.h>
1067 #ifdef HAVE_SYS_SOCKET_H
1068 #include <sys/socket.h>
1070 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1071 [#ifdef HAVE_SYS_TYPES_H
1072 #include <sys/types.h>
1074 #ifdef HAVE_SYS_SOCKET_H
1075 #include <sys/socket.h>
1077 #ifdef HAVE_NET_IF_H
1080 #ifdef HAVE_NETINET_IN_H
1081 #include <netinet/in.h>
1084 AC_CHECK_HEADERS(linux/if.h,[],[],
1086 #ifdef HAVE_SYS_SOCKET_H
1087 #include <sys/socket.h>
1091 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1092 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1093 [#ifdef HAVE_SYS_TYPES_H
1094 #include <sys/types.h>
1096 #ifdef HAVE_SYS_SOCKET_H
1097 #include <sys/socket.h>
1099 #ifdef HAVE_LIMITS_H
1102 #ifdef HAVE_LINUX_TYPES_H
1103 #include <linux/types.h>
1105 #ifdef HAVE_NETINET_IN6_H
1106 #include <netinet/in6.h>
1108 #ifdef HAVE_NETINET_IN_H
1109 #include <netinet/in.h>
1112 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1113 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1114 [#ifdef HAVE_SYS_TYPES_H
1115 #include <sys/types.h>
1117 #ifdef HAVE_SYS_SOCKET_H
1118 #include <sys/socket.h>
1120 #ifdef HAVE_LIMITS_H
1123 #ifdef HAVE_LINUX_TYPES_H
1124 #include <linux/types.h>
1126 #ifdef HAVE_NETINET_IN6_H
1127 #include <netinet/in6.h>
1129 #ifdef HAVE_NETINET_IN_H
1130 #include <netinet/in.h>
1132 #ifdef HAVE_LINUX_IF_H
1133 #include <linux/if.h>
1137 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1140 if test "x$linux_netfilter_ipv4" = "x1"; then
1143 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1146 if test "x$transparent_ok" = "x1"; then
1147 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1149 *-*-openbsd* | *-*-bitrig*)
1150 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1153 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1156 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1157 [#ifdef HAVE_SYS_TYPES_H
1158 #include <sys/types.h>
1160 #ifdef HAVE_SYS_TIME_H
1161 #include <sys/time.h>
1164 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1167 AC_CHECK_SIZEOF(int8_t)
1168 AC_CHECK_SIZEOF(int16_t)
1169 AC_CHECK_SIZEOF(int32_t)
1170 AC_CHECK_SIZEOF(int64_t)
1171 AC_CHECK_SIZEOF(uint8_t)
1172 AC_CHECK_SIZEOF(uint16_t)
1173 AC_CHECK_SIZEOF(uint32_t)
1174 AC_CHECK_SIZEOF(uint64_t)
1175 AC_CHECK_SIZEOF(intptr_t)
1176 AC_CHECK_SIZEOF(uintptr_t)
1178 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1180 AC_CHECK_SIZEOF(char)
1181 AC_CHECK_SIZEOF(short)
1182 AC_CHECK_SIZEOF(int)
1183 AC_CHECK_SIZEOF(long)
1184 AC_CHECK_SIZEOF(long long)
1185 AC_CHECK_SIZEOF(__int64)
1186 AC_CHECK_SIZEOF(void *)
1187 AC_CHECK_SIZEOF(time_t)
1188 AC_CHECK_SIZEOF(size_t)
1189 AC_CHECK_SIZEOF(pid_t)
1191 AC_CHECK_TYPES([uint, u_char, ssize_t])
1193 AC_PC_FROM_UCONTEXT([:])
1195 dnl used to include sockaddr_storage, but everybody has that.
1196 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1197 [#ifdef HAVE_SYS_TYPES_H
1198 #include <sys/types.h>
1200 #ifdef HAVE_NETINET_IN_H
1201 #include <netinet/in.h>
1203 #ifdef HAVE_NETINET_IN6_H
1204 #include <netinet/in6.h>
1206 #ifdef HAVE_SYS_SOCKET_H
1207 #include <sys/socket.h>
1210 #define _WIN32_WINNT 0x0501
1211 #define WIN32_LEAN_AND_MEAN
1212 #include <winsock2.h>
1213 #include <ws2tcpip.h>
1216 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1217 [#ifdef HAVE_SYS_TYPES_H
1218 #include <sys/types.h>
1220 #ifdef HAVE_NETINET_IN_H
1221 #include <netinet/in.h>
1223 #ifdef HAVE_NETINET_IN6_H
1224 #include <netinet/in6.h>
1226 #ifdef HAVE_SYS_SOCKET_H
1227 #include <sys/socket.h>
1230 #define _WIN32_WINNT 0x0501
1231 #define WIN32_LEAN_AND_MEAN
1232 #include <winsock2.h>
1233 #include <ws2tcpip.h>
1237 AC_CHECK_TYPES([rlim_t], , ,
1238 [#ifdef HAVE_SYS_TYPES_H
1239 #include <sys/types.h>
1241 #ifdef HAVE_SYS_TIME_H
1242 #include <sys/time.h>
1244 #ifdef HAVE_SYS_RESOURCE_H
1245 #include <sys/resource.h>
1249 AX_CHECK_SIGN([time_t],
1252 #ifdef HAVE_SYS_TYPES_H
1253 #include <sys/types.h>
1255 #ifdef HAVE_SYS_TIME_H
1256 #include <sys/time.h>
1263 if test "$ax_cv_decl_time_t_signed" = "no"; then
1264 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1267 AX_CHECK_SIGN([size_t],
1268 [ tor_cv_size_t_signed=yes ],
1269 [ tor_cv_size_t_signed=no ], [
1270 #ifdef HAVE_SYS_TYPES_H
1271 #include <sys/types.h>
1275 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1276 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1279 AX_CHECK_SIGN([enum always],
1280 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1282 enum always { AAA, BBB, CCC };
1285 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1286 #ifdef HAVE_SYS_SOCKET_H
1287 #include <sys/socket.h>
1291 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1293 AC_CHECK_SIZEOF(cell_t)
1295 # Now make sure that NULL can be represented as zero bytes.
1296 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1297 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1298 [[#include <stdlib.h>
1301 #ifdef HAVE_STDDEF_H
1304 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1305 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1306 [tor_cv_null_is_zero=yes],
1307 [tor_cv_null_is_zero=no],
1308 [tor_cv_null_is_zero=cross])])
1310 if test "$tor_cv_null_is_zero" = "cross"; then
1311 # Cross-compiling; let's hope that the target isn't raving mad.
1312 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1315 if test "$tor_cv_null_is_zero" != "no"; then
1316 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1317 [Define to 1 iff memset(0) sets pointers to NULL])
1320 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1321 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1322 [[#include <stdlib.h>
1325 #ifdef HAVE_STDDEF_H
1328 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1329 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1330 [tor_cv_dbl0_is_zero=yes],
1331 [tor_cv_dbl0_is_zero=no],
1332 [tor_cv_dbl0_is_zero=cross])])
1334 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1335 # Cross-compiling; let's hope that the target isn't raving mad.
1336 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1339 if test "$tor_cv_dbl0_is_zero" != "no"; then
1340 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1341 [Define to 1 iff memset(0) sets doubles to 0.0])
1344 # And what happens when we malloc zero?
1345 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1346 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1347 [[#include <stdlib.h>
1350 #ifdef HAVE_STDDEF_H
1353 int main () { return malloc(0)?0:1; }]])],
1354 [tor_cv_malloc_zero_works=yes],
1355 [tor_cv_malloc_zero_works=no],
1356 [tor_cv_malloc_zero_works=cross])])
1358 if test "$tor_cv_malloc_zero_works" = "cross"; then
1359 # Cross-compiling; let's hope that the target isn't raving mad.
1360 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1363 if test "$tor_cv_malloc_zero_works" = "yes"; then
1364 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1365 [Define to 1 iff malloc(0) returns a pointer])
1368 # whether we seem to be in a 2s-complement world.
1369 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1370 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1371 [[int main () { int problem = ((-99) != (~99)+1);
1372 return problem ? 1 : 0; }]])],
1373 [tor_cv_twos_complement=yes],
1374 [tor_cv_twos_complement=no],
1375 [tor_cv_twos_complement=cross])])
1377 if test "$tor_cv_twos_complement" = "cross"; then
1378 # Cross-compiling; let's hope that the target isn't raving mad.
1379 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1382 if test "$tor_cv_twos_complement" != "no"; then
1383 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1384 [Define to 1 iff we represent negative integers with
1388 # What does shifting a negative value do?
1389 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1390 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1391 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1392 [tor_cv_sign_extend=yes],
1393 [tor_cv_sign_extend=no],
1394 [tor_cv_sign_extend=cross])])
1396 if test "$tor_cv_sign_extend" = "cross"; then
1397 # Cross-compiling; let's hope that the target isn't raving mad.
1398 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1401 if test "$tor_cv_sign_extend" != "no"; then
1402 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1403 [Define to 1 iff right-shifting a negative value performs sign-extension])
1406 # Whether we should use the dmalloc memory allocation debugging library.
1407 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1408 AC_ARG_WITH(dmalloc,
1409 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1410 [if [[ "$withval" = "yes" ]]; then
1416 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1419 if [[ $dmalloc -eq 1 ]]; then
1420 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1421 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1422 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1423 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1426 AC_ARG_WITH(tcmalloc,
1427 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1428 [ tcmalloc=yes ], [ tcmalloc=no ])
1430 if test "x$tcmalloc" = "xyes"; then
1431 LDFLAGS="-ltcmalloc $LDFLAGS"
1434 using_custom_malloc=no
1435 if test "x$enable_openbsd_malloc" = "xyes"; then
1436 using_custom_malloc=yes
1438 if test "x$tcmalloc" = "xyes"; then
1439 using_custom_malloc=yes
1441 if test "$using_custom_malloc" = "no"; then
1442 AC_CHECK_FUNCS(mallinfo)
1444 if test "$using_custom_malloc" = "yes"; then
1445 # Tell the C compiler not to use the system allocator functions.
1446 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1449 # By default, we're going to assume we don't have mlockall()
1450 # bionic and other platforms have various broken mlockall subsystems.
1451 # Some systems don't have a working mlockall, some aren't linkable,
1452 # and some have it but don't declare it.
1453 AC_CHECK_FUNCS(mlockall)
1454 AC_CHECK_DECLS([mlockall], , , [
1455 #ifdef HAVE_SYS_MMAN_H
1456 #include <sys/mman.h>
1459 # Allow user to specify an alternate syslog facility
1460 AC_ARG_WITH(syslog-facility,
1461 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1462 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1463 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1464 AC_SUBST(LOGFACILITY)
1466 # Check if we have getresuid and getresgid
1467 AC_CHECK_FUNCS(getresuid getresgid)
1469 # Check for gethostbyname_r in all its glorious incompatible versions.
1470 # (This logic is based on that in Python's configure.in)
1471 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1472 [Define this if you have any gethostbyname_r()])
1474 AC_CHECK_FUNC(gethostbyname_r, [
1475 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1477 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1478 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1482 struct hostent *h1, *h2;
1484 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1486 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1487 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1488 [Define this if gethostbyname_r takes 6 arguments])
1497 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1499 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1500 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1501 [Define this if gethostbyname_r takes 5 arguments])
1509 struct hostent_data hd;
1510 (void) gethostbyname_r(cp1,h1,&hd);
1512 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1513 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1514 [Define this if gethostbyname_r takes 3 arguments])
1524 AC_CACHE_CHECK([whether the C compiler supports __func__],
1525 tor_cv_have_func_macro,
1526 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1528 int main(int c, char **v) { puts(__func__); }])],
1529 tor_cv_have_func_macro=yes,
1530 tor_cv_have_func_macro=no))
1532 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1533 tor_cv_have_FUNC_macro,
1534 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1536 int main(int c, char **v) { puts(__FUNC__); }])],
1537 tor_cv_have_FUNC_macro=yes,
1538 tor_cv_have_FUNC_macro=no))
1540 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1541 tor_cv_have_FUNCTION_macro,
1542 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1544 int main(int c, char **v) { puts(__FUNCTION__); }])],
1545 tor_cv_have_FUNCTION_macro=yes,
1546 tor_cv_have_FUNCTION_macro=no))
1548 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1549 tor_cv_have_environ_declared,
1550 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1551 #ifdef HAVE_UNISTD_H
1555 int main(int c, char **v) { char **t = environ; }])],
1556 tor_cv_have_environ_declared=yes,
1557 tor_cv_have_environ_declared=no))
1559 if test "$tor_cv_have_func_macro" = "yes"; then
1560 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1563 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1564 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1567 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1568 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1569 [Defined if the compiler supports __FUNCTION__])
1572 if test "$tor_cv_have_environ_declared" = "yes"; then
1573 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1574 [Defined if we have extern char **environ already declared])
1577 # $prefix stores the value of the --prefix command line option, or
1578 # NONE if the option wasn't set. In the case that it wasn't set, make
1579 # it be the default, so that we can use it to expand directories now.
1580 if test "x$prefix" = "xNONE"; then
1581 prefix=$ac_default_prefix
1584 # and similarly for $exec_prefix
1585 if test "x$exec_prefix" = "xNONE"; then
1589 if test "x$BUILDDIR" = "x"; then
1593 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1594 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1596 if test "x$CONFDIR" = "x"; then
1597 CONFDIR=`eval echo $sysconfdir/tor`
1600 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1601 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1603 BINDIR=`eval echo $bindir`
1605 LOCALSTATEDIR=`eval echo $localstatedir`
1606 AC_SUBST(LOCALSTATEDIR)
1608 if test "$bwin32" = "true"; then
1609 # Test if the linker supports the --nxcompat and --dynamicbase options
1611 save_LDFLAGS="$LDFLAGS"
1612 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1613 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1614 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1615 [AC_MSG_RESULT([yes])]
1616 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1617 [AC_MSG_RESULT([no])]
1619 LDFLAGS="$save_LDFLAGS"
1622 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1623 # than autoconf's macros like.
1624 if test "$GCC" = "yes"; then
1625 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1626 # accident waiting to happen.
1627 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1629 # Override optimization level for non-gcc compilers
1631 enable_gcc_warnings=no
1632 enable_gcc_warnings_advisory=no
1635 # Warnings implies advisory-warnings and -Werror.
1636 if test "$enable_gcc_warnings" = "yes"; then
1637 enable_gcc_warnings_advisory=yes
1638 enable_fatal_warnings=yes
1641 # OS X Lion started deprecating the system openssl. Let's just disable
1642 # all deprecation warnings on OS X. Also, to potentially make the binary
1643 # a little smaller, let's enable dead_strip.
1647 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1648 LDFLAGS="$LDFLAGS -dead_strip" ;;
1651 # Add some more warnings which we use in development but not in the
1652 # released versions. (Some relevant gcc versions can't handle these.)
1654 # Note that we have to do this near the end of the autoconf process, or
1655 # else we may run into problems when these warnings hit on the testing C
1656 # programs that autoconf wants to build.
1657 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1660 *-*-openbsd* | *-*-bitrig*)
1661 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1662 # That's fine, except that the headers don't pass -Wredundant-decls.
1663 # Therefore, let's disable -Wsystem-headers when we're building
1664 # with maximal warnings on OpenBSD.
1665 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1668 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1669 # have it work better.
1670 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1672 # This warning was added in gcc 4.3, but it appears to generate
1673 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1674 #CFLAGS="$CFLAGS -Wlogical-op"
1676 m4_foreach_w([warning_flag], [
1678 -Waddress-of-array-temporary
1679 -Waddress-of-temporary
1681 -Wanonymous-pack-parens
1684 -Warc-bridge-casts-disallowed-in-nonarc
1685 -Warc-maybe-repeated-use-of-weak
1686 -Warc-performSelector-leaks
1687 -Warc-repeated-use-of-weak
1689 -Warray-bounds-pointer-arithmetic
1691 -Wasm-operand-widths
1693 -Watomic-property-with-user-defined-accessor
1695 -Wauto-storage-class
1698 -Wbackslash-newline-escape
1699 -Wbad-array-new-length
1700 -Wbind-to-temporary-copy
1701 -Wbitfield-constant-conversion
1704 -Wbuiltin-requires-header
1706 -Wcompare-distinct-pointer-types
1707 -Wcomplex-component-init
1708 -Wconditional-type-mismatch
1710 -Wconstant-conversion
1711 -Wconstant-logical-operand
1712 -Wconstexpr-not-const
1713 -Wcustom-atomic-properties
1715 -Wdangling-initializer-list
1717 -Wdelegating-ctor-cycles
1718 -Wdeprecated-implementations
1719 -Wdeprecated-register
1720 -Wdirect-ivar-access
1722 -Wdistributed-object-modifiers
1724 -Wdollar-in-identifier-extension
1726 -Wduplicate-decl-specifier
1728 -Wduplicate-method-arg
1729 -Wduplicate-method-match
1731 -Wdynamic-class-memaccess
1732 -Wembedded-directive
1733 -Wempty-translation-unit
1735 -Wexit-time-destructors
1736 -Wexplicit-ownership-type
1737 -Wextern-initializer
1741 -Wflexible-array-extensions
1744 -Wfour-char-constants
1746 -Wglobal-constructors
1747 -Wgnu-array-member-paren-init
1749 -Wgnu-static-float-init
1752 -Widiomatic-parentheses
1753 -Wignored-attributes
1754 -Wimplicit-atomic-properties
1755 -Wimplicit-conversion-floating-point-to-bool
1756 -Wimplicit-exception-spec-mismatch
1757 -Wimplicit-fallthrough
1758 -Wimplicit-fallthrough-per-function
1759 -Wimplicit-retain-self
1760 -Wimport-preprocessor-directive-pedantic
1761 -Wincompatible-library-redeclaration
1762 -Wincompatible-pointer-types-discards-qualifiers
1763 -Wincomplete-implementation
1765 -Wincomplete-umbrella
1768 -Wint-to-void-pointer-cast
1774 -Winvalid-source-encoding
1775 -Winvalid-token-paste
1776 -Wknr-promoted-parameter
1777 -Wlanguage-extension-token
1778 -Wlarge-by-value-copy
1779 -Wliteral-conversion
1781 -Wlocal-type-template-args
1785 -Wmalformed-warning-check
1789 -Wmismatched-parameter-types
1790 -Wmismatched-return-types
1791 -Wmissing-field-initializers
1792 -Wmissing-format-attribute
1794 -Wmissing-selector-name
1796 -Wmissing-variable-declarations
1800 -Wnon-literal-null-conversion
1802 -Wnonportable-cfstrings
1808 -Wout-of-line-declaration
1810 -Woverlength-strings
1812 -Woverriding-method-mismatch
1813 -Wpointer-type-mismatch
1814 -Wpredefined-identifier-outside-function
1815 -Wprotocol-property-synthesis-ambiguity
1816 -Wreadonly-iboutlet-property
1817 -Wreadonly-setter-attrs
1819 -Wreceiver-forward-class
1821 -Wreinterpret-base-class
1822 -Wrequires-super-attribute
1823 -Wreserved-user-defined-literal
1824 -Wreturn-stack-address
1826 -Wselector-type-mismatch
1828 -Wserialized-diagnostics
1830 -Wshift-count-negative
1831 -Wshift-count-overflow
1832 -Wshift-negative-value
1834 -Wshift-sign-overflow
1836 -Wsizeof-array-argument
1837 -Wsource-uses-openmp
1840 -Wstatic-local-in-inline
1844 -Wstrlcpy-strlcat-size
1846 -Wsuggest-attribute=format
1847 -Wsuggest-attribute=noreturn
1848 -Wsuper-class-method-mismatch
1851 -Wtautological-constant-out-of-range-compare
1852 -Wtentative-definition-incomplete-type
1855 -Wtypedef-redefinition
1858 -Wundefined-internal
1859 -Wundefined-reinterpret-cast
1861 -Wunicode-whitespace
1862 -Wunknown-warning-option
1863 -Wunnamed-type-template-args
1864 -Wunneeded-member-function
1866 -Wunsupported-visibility
1867 -Wunused-but-set-parameter
1868 -Wunused-but-set-variable
1869 -Wunused-command-line-argument
1870 -Wunused-const-variable=2
1871 -Wunused-exception-parameter
1872 -Wunused-local-typedefs
1873 -Wunused-member-function
1874 -Wunused-sanitize-argument
1875 -Wunused-volatile-lvalue
1876 -Wuser-defined-literals
1879 -Wvector-conversions
1884 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1886 dnl We should re-enable this in some later version. Clang doesn't
1887 dnl mind, but it causes trouble with GCC.
1888 dnl -Wstrict-overflow=2
1890 dnl These seem to require annotations that we don't currently use,
1891 dnl and they give false positives in our pthreads wrappers. (Clang 4)
1893 dnl -Wthread-safety-analysis
1894 dnl -Wthread-safety-attributes
1895 dnl -Wthread-safety-beta
1896 dnl -Wthread-safety-precise
1898 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1899 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1900 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1901 CFLAGS="$CFLAGS -Wwrite-strings"
1902 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1903 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1904 CFLAGS="$CFLAGS -Wunused-parameter "
1905 # These interfere with building main() { return 0; }, which autoconf
1906 # likes to use as its default program.
1907 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1909 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1910 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1912 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1913 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1916 if test "x$enable_fatal_warnings" = "xyes"; then
1917 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1918 # default autoconf programs are full of errors.
1919 CFLAGS="$CFLAGS -Werror"
1924 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1927 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.])
1931 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1936 contrib/dist/suse/tor.sh
1937 contrib/operator-tools/tor.logrotate
1940 contrib/dist/tor.service
1941 src/config/torrc.sample
1942 src/config/torrc.minimal
1943 scripts/maint/checkOptionDocs.pl
1944 scripts/maint/updateVersions.pl
1947 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1948 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1949 for file in $regular_mans ; do
1950 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1951 echo "==================================";
1953 echo "Building Tor has failed since manpages cannot be built.";
1955 echo "You need asciidoc installed to be able to build the manpages.";
1956 echo "To build without manpages, use the --disable-asciidoc argument";
1957 echo "when calling configure.";
1959 echo "==================================";