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.14-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, [python python2 python2.7 python3 python3.3])
217 if test "x$PYTHON" = "x"; then
218 AC_MSG_WARN([Python unavailable; some tests will not be run.])
220 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
222 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
223 AC_C_FLEXIBLE_ARRAY_MEMBER
225 dnl Maybe we've got an old autoconf...
226 AC_CACHE_CHECK([for flexible array members],
230 struct abc { int a; char b[]; };
232 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
235 [tor_cv_c_flexarray=yes],
236 [tor_cv_c_flexarray=no])])
237 if test "$tor_cv_flexarray" = "yes"; then
238 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
240 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
244 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
247 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
248 [tor_cv_c_c99_decl=yes],
249 [tor_cv_c_c99_decl=no] )])
250 if test "$tor_cv_c_c99_decl" != "yes"; then
251 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
254 AC_CACHE_CHECK([for working C99 designated initializers],
255 tor_cv_c_c99_designated_init,
257 [AC_LANG_PROGRAM([struct s { int a; int b; };],
258 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
259 [tor_cv_c_c99_designated_init=yes],
260 [tor_cv_c_c99_designated_init=no] )])
262 if test "$tor_cv_c_c99_designated_init" != "yes"; then
263 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
267 AC_ARG_WITH(tor-user,
268 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
276 AC_ARG_WITH(tor-group,
277 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
285 dnl If _WIN32 is defined and non-zero, we are building for win32
286 AC_MSG_CHECKING([for win32])
287 AC_RUN_IFELSE([AC_LANG_SOURCE([
288 int main(int c, char **v) {
299 bwin32=true; AC_MSG_RESULT([yes]),
300 bwin32=false; AC_MSG_RESULT([no]),
301 bwin32=cross; AC_MSG_RESULT([cross])
304 if test "$bwin32" = "cross"; then
305 AC_MSG_CHECKING([for win32 (cross)])
306 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
308 int main(int c, char **v) {return 0;}
311 int main(int c, char **v) {return x(y);}
314 bwin32=true; AC_MSG_RESULT([yes]),
315 bwin32=false; AC_MSG_RESULT([no]))
320 /* Defined to access windows functions and definitions for >=WinXP */
322 # define WINVER 0x0501
325 /* Defined to access _other_ windows functions and definitions for >=WinXP */
326 # ifndef _WIN32_WINNT
327 # define _WIN32_WINNT 0x0501
330 /* Defined to avoid including some windows headers as part of Windows.h */
331 # ifndef WIN32_LEAN_AND_MEAN
332 # define WIN32_LEAN_AND_MEAN 1
338 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
340 dnl Enable C99 when compiling with MIPSpro
341 AC_MSG_CHECKING([for MIPSpro compiler])
342 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
343 #if (defined(__sgi) && defined(_COMPILER_VERSION))
348 bmipspro=false; AC_MSG_RESULT(no),
349 bmipspro=true; AC_MSG_RESULT(yes))
351 if test "$bmipspro" = "true"; then
352 CFLAGS="$CFLAGS -c99"
357 AC_SEARCH_LIBS(socket, [socket network])
358 AC_SEARCH_LIBS(gethostbyname, [nsl])
359 AC_SEARCH_LIBS(dlopen, [dl])
360 AC_SEARCH_LIBS(inet_aton, [resolv])
361 AC_SEARCH_LIBS(backtrace, [execinfo])
363 AC_SEARCH_LIBS([clock_gettime], [rt])
364 if test "$LIBS" != "$saved_LIBS"; then
365 # Looks like we need -lrt for clock_gettime().
369 AC_SEARCH_LIBS(pthread_create, [pthread])
370 AC_SEARCH_LIBS(pthread_detach, [pthread])
372 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
373 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
377 RtlSecureZeroMemory \
381 backtrace_symbols_fd \
393 gnu_get_libc_version \
426 # Apple messed up when they added two functions functions in Sierra: they
427 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
428 # checks. So we should only probe for those functions if we are sure that we
429 # are not targetting OSX 10.11 or earlier.
430 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
433 # include <AvailabilityMacros.h>
434 # ifndef MAC_OS_X_VERSION_10_12
435 # define MAC_OS_X_VERSION_10_12 101200
437 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
438 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
439 # error "Running on Mac OSX 10.11 or earlier"
444 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
445 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
447 if test "$on_macos_pre_10_12" = "no"; then
454 if test "$bwin32" != "true"; then
455 AC_CHECK_HEADERS(pthread.h)
456 AC_CHECK_FUNCS(pthread_create)
457 AC_CHECK_FUNCS(pthread_condattr_setclock)
460 if test "$bwin32" = "true"; then
461 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
468 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
469 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
471 dnl ------------------------------------------------------
472 dnl Where do you live, libevent? And how do we call you?
474 if test "$bwin32" = "true"; then
475 TOR_LIB_WS32=-lws2_32
476 TOR_LIB_IPHLPAPI=-liphlpapi
477 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
478 # think it's actually necessary.
484 AC_SUBST(TOR_LIB_WS32)
485 AC_SUBST(TOR_LIB_GDI)
486 AC_SUBST(TOR_LIB_IPHLPAPI)
488 tor_libevent_pkg_redhat="libevent"
489 tor_libevent_pkg_debian="libevent-dev"
490 tor_libevent_devpkg_redhat="libevent-devel"
491 tor_libevent_devpkg_debian="libevent-dev"
493 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
494 dnl linking for static builds.
495 STATIC_LIBEVENT_FLAGS=""
496 if test "$enable_static_libevent" = "yes"; then
497 if test "$have_rt" = "yes"; then
498 STATIC_LIBEVENT_FLAGS=" -lrt "
502 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
504 #include <winsock2.h>
506 #include <sys/time.h>
507 #include <sys/types.h>
508 #include <event2/event.h>], [
510 #include <winsock2.h>
513 struct event_base *event_base_new(void);],
516 {WSADATA d; WSAStartup(0x101,&d); }
519 ], [--with-libevent-dir], [/opt/libevent])
521 dnl Determine the incantation needed to link libevent.
523 save_LDFLAGS="$LDFLAGS"
524 save_CPPFLAGS="$CPPFLAGS"
526 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
527 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
528 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
530 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
532 if test "$enable_static_libevent" = "yes"; then
533 if test "$tor_cv_library_libevent_dir" = "(system)"; then
534 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
536 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
539 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
540 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
541 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"))
543 if test "$ac_cv_search_event_new" != "none required"; then
544 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
546 if test "$ac_cv_search_evdns_base_new" != "none required"; then
547 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
550 AC_MSG_ERROR("libevent2 is required but the headers could not be found")
554 dnl Now check for particular libevent functions.
555 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
556 evutil_secure_rng_add_bytes \
560 LDFLAGS="$save_LDFLAGS"
561 CPPFLAGS="$save_CPPFLAGS"
563 dnl Check that libevent is at least at version 2.0.10, the first stable
564 dnl release of its series
565 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
566 AC_MSG_CHECKING([whether Libevent is new enough])
567 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
568 #include <event2/event.h>
569 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
575 ])], [ AC_MSG_RESULT([yes]) ],
576 [ AC_MSG_RESULT([no])
577 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
580 LDFLAGS="$save_LDFLAGS"
581 CPPFLAGS="$save_CPPFLAGS"
583 AC_SUBST(TOR_LIBEVENT_LIBS)
585 dnl ------------------------------------------------------
586 dnl Where do you live, libm?
588 dnl On some platforms (Haiku/BeOS) the math library is
589 dnl part of libroot. In which case don't link against lm
592 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
593 if test "$ac_cv_search_pow" != "none required"; then
594 TOR_LIB_MATH="$ac_cv_search_pow"
597 AC_SUBST(TOR_LIB_MATH)
599 dnl ------------------------------------------------------
600 dnl Where do you live, openssl? And how do we call you?
602 tor_openssl_pkg_redhat="openssl"
603 tor_openssl_pkg_debian="libssl-dev"
604 tor_openssl_devpkg_redhat="openssl-devel"
605 tor_openssl_devpkg_debian="libssl-dev"
607 ALT_openssl_WITHVAL=""
609 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
611 if test "x$withval" != "xno" && test "x$withval" != "x"; then
612 ALT_openssl_WITHVAL="$withval"
616 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
617 [#include <openssl/rand.h>],
618 [void RAND_add(const void *buf, int num, double entropy);],
619 [RAND_add((void*)0,0,0);], [],
620 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
622 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
624 if test "$enable_static_openssl" = "yes"; then
625 if test "$tor_cv_library_openssl_dir" = "(system)"; then
626 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
628 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
631 TOR_OPENSSL_LIBS="-lssl -lcrypto"
633 AC_SUBST(TOR_OPENSSL_LIBS)
635 dnl Now check for particular openssl functions.
637 save_LDFLAGS="$LDFLAGS"
638 save_CPPFLAGS="$CPPFLAGS"
639 LIBS="$TOR_OPENSSL_LIBS $LIBS"
640 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
641 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
644 #include <openssl/opensslv.h>
645 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
650 [ 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.]) ])
653 #include <openssl/opensslv.h>
654 #include <openssl/evp.h>
655 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
658 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
659 #error "curves unavailable"
663 [ 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.]) ])
665 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
666 [#include <openssl/ssl.h>
670 SSL_SESSION_get_master_key \
671 SSL_get_server_random \
672 SSL_get_client_ciphers \
673 SSL_get_client_random \
678 dnl Check if OpenSSL has scrypt implementation.
679 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
681 dnl Check if OpenSSL structures are opaque
682 AC_CHECK_MEMBERS([SSL.state], , ,
683 [#include <openssl/ssl.h>
687 LDFLAGS="$save_LDFLAGS"
688 CPPFLAGS="$save_CPPFLAGS"
690 dnl ------------------------------------------------------
691 dnl Where do you live, zlib? And how do we call you?
693 tor_zlib_pkg_redhat="zlib"
694 tor_zlib_pkg_debian="zlib1g"
695 tor_zlib_devpkg_redhat="zlib-devel"
696 tor_zlib_devpkg_debian="zlib1g-dev"
698 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
700 [const char * zlibVersion(void);],
701 [zlibVersion();], [--with-zlib-dir],
704 if test "$enable_static_zlib" = "yes"; then
705 if test "$tor_cv_library_zlib_dir" = "(system)"; then
706 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
707 using --enable-static-zlib")
709 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
714 AC_SUBST(TOR_ZLIB_LIBS)
716 dnl ----------------------------------------------------------------------
717 dnl Check if libcap is available for capabilities.
719 tor_cap_pkg_debian="libcap2"
720 tor_cap_pkg_redhat="libcap"
721 tor_cap_devpkg_debian="libcap-dev"
722 tor_cap_devpkg_redhat="libcap-devel"
724 AC_CHECK_LIB([cap], [cap_init], [],
725 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
727 AC_CHECK_FUNCS(cap_set_proc)
729 dnl ---------------------------------------------------------------------
730 dnl Now that we know about our major libraries, we can check for compiler
731 dnl and linker hardening options. We need to do this with the libraries known,
732 dnl since sometimes the linker will like an option but not be willing to
733 dnl use it with a build of a library.
735 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
736 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"
743 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
744 #if !defined(__clang__)
746 #endif])], have_clang=yes, have_clang=no)
748 if test "x$enable_gcc_hardening" != "xno"; then
749 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
750 if test "x$have_clang" = "xyes"; then
751 TOR_CHECK_CFLAGS(-Qunused-arguments)
753 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
754 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
755 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
756 m4_ifdef([AS_VAR_IF],[
757 AS_VAR_IF(can_compile, [yes],
758 AS_VAR_IF(can_link, [yes],
760 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.)]))
762 AS_VAR_POPDEF([can_link])
763 AS_VAR_POPDEF([can_compile])
764 TOR_CHECK_CFLAGS(-Wstack-protector)
765 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
766 if test "$bwin32" = "false"; then
767 TOR_CHECK_CFLAGS(-fPIE)
768 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
770 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
773 if test "x$enable_expensive_hardening" = "xyes"; then
774 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
775 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
776 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.])
779 if test "$tor_cv_cflags__ftrapv" != "yes"; then
780 AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
783 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
784 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
785 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*])
788 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
789 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
790 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*])
793 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
796 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
797 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
799 mulodi_fixes_ftrapv=no
800 if test "$have_clang" = "yes"; then
801 saved_CFLAGS="$CFLAGS"
802 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
803 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
808 int main(int argc, char **argv)
810 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
811 * (int64_t)atoi(argv[3]);
814 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
815 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
816 if test "$ftrapv_can_link" = "no"; then
817 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
822 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
826 int main(int argc, char **argv)
828 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
829 * (int64_t)atoi(argv[3]);
832 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
833 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
835 CFLAGS="$saved_CFLAGS"
838 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
840 dnl These cflags add bunches of branches, and we haven't been able to
841 dnl persuade ourselves that they're suitable for code that needs to be
843 AC_SUBST(CFLAGS_BUGTRAP)
844 dnl These cflags are variant ones sutable for code that needs to be
846 AC_SUBST(CFLAGS_CONSTTIME)
848 if test "x$enable_linker_hardening" != "xno"; then
849 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
852 # For backtrace support
853 TOR_CHECK_LDFLAGS(-rdynamic)
855 dnl ------------------------------------------------------
856 dnl Now see if we have a -fomit-frame-pointer compiler option.
858 saved_CFLAGS="$CFLAGS"
859 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
860 F_OMIT_FRAME_POINTER=''
861 if test "$saved_CFLAGS" != "$CFLAGS"; then
862 if test "x$enable_expensive_hardening" != "xyes"; then
863 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
866 CFLAGS="$saved_CFLAGS"
867 AC_SUBST(F_OMIT_FRAME_POINTER)
869 dnl ------------------------------------------------------
870 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
871 dnl for us, as GCC 4.6 and later do at many optimization levels), then
872 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
874 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
876 dnl ============================================================
877 dnl Check for libseccomp
879 if test "x$enable_seccomp" != "xno"; then
880 AC_CHECK_HEADERS([seccomp.h])
881 AC_SEARCH_LIBS(seccomp_init, [seccomp])
884 dnl ============================================================
885 dnl Check for libscrypt
887 if test "x$enable_libscrypt" != "xno"; then
888 AC_CHECK_HEADERS([libscrypt.h])
889 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
890 AC_CHECK_FUNCS([libscrypt_scrypt])
893 dnl ============================================================
894 dnl We need an implementation of curve25519.
896 dnl set these defaults.
897 build_curve25519_donna=no
898 build_curve25519_donna_c64=no
899 use_curve25519_donna=no
900 use_curve25519_nacl=no
903 dnl The best choice is using curve25519-donna-c64, but that requires
905 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
906 tor_cv_can_use_curve25519_donna_c64,
908 [AC_LANG_PROGRAM([dnl
910 typedef unsigned uint128_t __attribute__((mode(TI)));
911 int func(uint64_t a, uint64_t b) {
912 uint128_t c = ((uint128_t)a) * b;
913 int ok = ((uint64_t)(c>>96)) == 522859 &&
914 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
915 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
916 (((uint64_t)(c))&0xffffffffL) == 0;
920 int ok = func( ((uint64_t)2000000000) * 1000000000,
921 ((uint64_t)1234567890) << 24);
924 [tor_cv_can_use_curve25519_donna_c64=yes],
925 [tor_cv_can_use_curve25519_donna_c64=no],
927 [AC_LANG_PROGRAM([dnl
929 typedef unsigned uint128_t __attribute__((mode(TI)));
930 int func(uint64_t a, uint64_t b) {
931 uint128_t c = ((uint128_t)a) * b;
932 int ok = ((uint64_t)(c>>96)) == 522859 &&
933 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
934 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
935 (((uint64_t)(c))&0xffffffffL) == 0;
939 int ok = func( ((uint64_t)2000000000) * 1000000000,
940 ((uint64_t)1234567890) << 24);
943 [tor_cv_can_use_curve25519_donna_c64=cross],
944 [tor_cv_can_use_curve25519_donna_c64=no])])])
946 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
947 nacl/crypto_scalarmult_curve25519.h])
949 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
950 tor_cv_can_use_curve25519_nacl,
951 [tor_saved_LIBS="$LIBS"
954 [AC_LANG_PROGRAM([dnl
955 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
956 #include <crypto_scalarmult_curve25519.h>
957 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
958 #include <nacl/crypto_scalarmult_curve25519.h>
960 #ifdef crypto_scalarmult_curve25519_ref_BYTES
961 #error Hey, this is the reference implementation! That's not fast.
964 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
965 ])], [tor_cv_can_use_curve25519_nacl=yes],
966 [tor_cv_can_use_curve25519_nacl=no])
967 LIBS="$tor_saved_LIBS" ])
969 dnl Okay, now we need to figure out which one to actually use. Fall back
970 dnl to curve25519-donna.c
972 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
973 build_curve25519_donna_c64=yes
974 use_curve25519_donna=yes
975 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
976 use_curve25519_nacl=yes
977 CURVE25519_LIBS=-lnacl
979 build_curve25519_donna=yes
980 use_curve25519_donna=yes
983 if test "x$use_curve25519_donna" = "xyes"; then
984 AC_DEFINE(USE_CURVE25519_DONNA, 1,
985 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
987 if test "x$use_curve25519_nacl" = "xyes"; then
988 AC_DEFINE(USE_CURVE25519_NACL, 1,
989 [Defined if we should use a curve25519 from nacl])
991 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
992 test "x$build_curve25519_donna" = "xyes")
993 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
994 test "x$build_curve25519_donna_c64" = "xyes")
995 AC_SUBST(CURVE25519_LIBS)
997 dnl Make sure to enable support for large off_t if available.
1000 AC_CHECK_HEADERS([assert.h \
1015 gnu/libc-version.h \
1054 AC_CHECK_HEADERS(sys/param.h)
1056 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1057 [#ifdef HAVE_SYS_TYPES_H
1058 #include <sys/types.h>
1060 #ifdef HAVE_SYS_SOCKET_H
1061 #include <sys/socket.h>
1063 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_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 #ifdef HAVE_NET_IF_H
1073 #ifdef HAVE_NETINET_IN_H
1074 #include <netinet/in.h>
1077 AC_CHECK_HEADERS(linux/if.h,[],[],
1079 #ifdef HAVE_SYS_SOCKET_H
1080 #include <sys/socket.h>
1084 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1085 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1086 [#ifdef HAVE_SYS_TYPES_H
1087 #include <sys/types.h>
1089 #ifdef HAVE_SYS_SOCKET_H
1090 #include <sys/socket.h>
1092 #ifdef HAVE_LIMITS_H
1095 #ifdef HAVE_LINUX_TYPES_H
1096 #include <linux/types.h>
1098 #ifdef HAVE_NETINET_IN6_H
1099 #include <netinet/in6.h>
1101 #ifdef HAVE_NETINET_IN_H
1102 #include <netinet/in.h>
1105 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1106 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1107 [#ifdef HAVE_SYS_TYPES_H
1108 #include <sys/types.h>
1110 #ifdef HAVE_SYS_SOCKET_H
1111 #include <sys/socket.h>
1113 #ifdef HAVE_LIMITS_H
1116 #ifdef HAVE_LINUX_TYPES_H
1117 #include <linux/types.h>
1119 #ifdef HAVE_NETINET_IN6_H
1120 #include <netinet/in6.h>
1122 #ifdef HAVE_NETINET_IN_H
1123 #include <netinet/in.h>
1125 #ifdef HAVE_LINUX_IF_H
1126 #include <linux/if.h>
1130 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1133 if test "x$linux_netfilter_ipv4" = "x1"; then
1136 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1139 if test "x$transparent_ok" = "x1"; then
1140 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1142 *-*-openbsd* | *-*-bitrig*)
1143 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1146 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1149 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1150 [#ifdef HAVE_SYS_TYPES_H
1151 #include <sys/types.h>
1153 #ifdef HAVE_SYS_TIME_H
1154 #include <sys/time.h>
1157 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1160 AC_CHECK_SIZEOF(int8_t)
1161 AC_CHECK_SIZEOF(int16_t)
1162 AC_CHECK_SIZEOF(int32_t)
1163 AC_CHECK_SIZEOF(int64_t)
1164 AC_CHECK_SIZEOF(uint8_t)
1165 AC_CHECK_SIZEOF(uint16_t)
1166 AC_CHECK_SIZEOF(uint32_t)
1167 AC_CHECK_SIZEOF(uint64_t)
1168 AC_CHECK_SIZEOF(intptr_t)
1169 AC_CHECK_SIZEOF(uintptr_t)
1171 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1173 AC_CHECK_SIZEOF(char)
1174 AC_CHECK_SIZEOF(short)
1175 AC_CHECK_SIZEOF(int)
1176 AC_CHECK_SIZEOF(long)
1177 AC_CHECK_SIZEOF(long long)
1178 AC_CHECK_SIZEOF(__int64)
1179 AC_CHECK_SIZEOF(void *)
1180 AC_CHECK_SIZEOF(time_t)
1181 AC_CHECK_SIZEOF(size_t)
1182 AC_CHECK_SIZEOF(pid_t)
1184 AC_CHECK_TYPES([uint, u_char, ssize_t])
1186 AC_PC_FROM_UCONTEXT([:])
1188 dnl used to include sockaddr_storage, but everybody has that.
1189 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1190 [#ifdef HAVE_SYS_TYPES_H
1191 #include <sys/types.h>
1193 #ifdef HAVE_NETINET_IN_H
1194 #include <netinet/in.h>
1196 #ifdef HAVE_NETINET_IN6_H
1197 #include <netinet/in6.h>
1199 #ifdef HAVE_SYS_SOCKET_H
1200 #include <sys/socket.h>
1203 #define _WIN32_WINNT 0x0501
1204 #define WIN32_LEAN_AND_MEAN
1205 #include <winsock2.h>
1206 #include <ws2tcpip.h>
1209 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1210 [#ifdef HAVE_SYS_TYPES_H
1211 #include <sys/types.h>
1213 #ifdef HAVE_NETINET_IN_H
1214 #include <netinet/in.h>
1216 #ifdef HAVE_NETINET_IN6_H
1217 #include <netinet/in6.h>
1219 #ifdef HAVE_SYS_SOCKET_H
1220 #include <sys/socket.h>
1223 #define _WIN32_WINNT 0x0501
1224 #define WIN32_LEAN_AND_MEAN
1225 #include <winsock2.h>
1226 #include <ws2tcpip.h>
1230 AC_CHECK_TYPES([rlim_t], , ,
1231 [#ifdef HAVE_SYS_TYPES_H
1232 #include <sys/types.h>
1234 #ifdef HAVE_SYS_TIME_H
1235 #include <sys/time.h>
1237 #ifdef HAVE_SYS_RESOURCE_H
1238 #include <sys/resource.h>
1242 AX_CHECK_SIGN([time_t],
1245 #ifdef HAVE_SYS_TYPES_H
1246 #include <sys/types.h>
1248 #ifdef HAVE_SYS_TIME_H
1249 #include <sys/time.h>
1256 if test "$ax_cv_decl_time_t_signed" = "no"; then
1257 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1260 AX_CHECK_SIGN([size_t],
1261 [ tor_cv_size_t_signed=yes ],
1262 [ tor_cv_size_t_signed=no ], [
1263 #ifdef HAVE_SYS_TYPES_H
1264 #include <sys/types.h>
1268 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1269 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1272 AX_CHECK_SIGN([enum always],
1273 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1275 enum always { AAA, BBB, CCC };
1278 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1279 #ifdef HAVE_SYS_SOCKET_H
1280 #include <sys/socket.h>
1284 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1286 AC_CHECK_SIZEOF(cell_t)
1288 # Now make sure that NULL can be represented as zero bytes.
1289 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1290 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1291 [[#include <stdlib.h>
1294 #ifdef HAVE_STDDEF_H
1297 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1298 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1299 [tor_cv_null_is_zero=yes],
1300 [tor_cv_null_is_zero=no],
1301 [tor_cv_null_is_zero=cross])])
1303 if test "$tor_cv_null_is_zero" = "cross"; then
1304 # Cross-compiling; let's hope that the target isn't raving mad.
1305 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1308 if test "$tor_cv_null_is_zero" != "no"; then
1309 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1310 [Define to 1 iff memset(0) sets pointers to NULL])
1313 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1314 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1315 [[#include <stdlib.h>
1318 #ifdef HAVE_STDDEF_H
1321 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1322 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1323 [tor_cv_dbl0_is_zero=yes],
1324 [tor_cv_dbl0_is_zero=no],
1325 [tor_cv_dbl0_is_zero=cross])])
1327 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1328 # Cross-compiling; let's hope that the target isn't raving mad.
1329 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1332 if test "$tor_cv_dbl0_is_zero" != "no"; then
1333 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1334 [Define to 1 iff memset(0) sets doubles to 0.0])
1337 # And what happens when we malloc zero?
1338 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1339 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1340 [[#include <stdlib.h>
1343 #ifdef HAVE_STDDEF_H
1346 int main () { return malloc(0)?0:1; }]])],
1347 [tor_cv_malloc_zero_works=yes],
1348 [tor_cv_malloc_zero_works=no],
1349 [tor_cv_malloc_zero_works=cross])])
1351 if test "$tor_cv_malloc_zero_works" = "cross"; then
1352 # Cross-compiling; let's hope that the target isn't raving mad.
1353 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1356 if test "$tor_cv_malloc_zero_works" = "yes"; then
1357 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1358 [Define to 1 iff malloc(0) returns a pointer])
1361 # whether we seem to be in a 2s-complement world.
1362 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1363 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1364 [[int main () { int problem = ((-99) != (~99)+1);
1365 return problem ? 1 : 0; }]])],
1366 [tor_cv_twos_complement=yes],
1367 [tor_cv_twos_complement=no],
1368 [tor_cv_twos_complement=cross])])
1370 if test "$tor_cv_twos_complement" = "cross"; then
1371 # Cross-compiling; let's hope that the target isn't raving mad.
1372 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1375 if test "$tor_cv_twos_complement" != "no"; then
1376 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1377 [Define to 1 iff we represent negative integers with
1381 # What does shifting a negative value do?
1382 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1383 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1384 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1385 [tor_cv_sign_extend=yes],
1386 [tor_cv_sign_extend=no],
1387 [tor_cv_sign_extend=cross])])
1389 if test "$tor_cv_sign_extend" = "cross"; then
1390 # Cross-compiling; let's hope that the target isn't raving mad.
1391 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1394 if test "$tor_cv_sign_extend" != "no"; then
1395 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1396 [Define to 1 iff right-shifting a negative value performs sign-extension])
1399 # Whether we should use the dmalloc memory allocation debugging library.
1400 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1401 AC_ARG_WITH(dmalloc,
1402 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1403 [if [[ "$withval" = "yes" ]]; then
1409 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1412 if [[ $dmalloc -eq 1 ]]; then
1413 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1414 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1415 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1416 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1419 AC_ARG_WITH(tcmalloc,
1420 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1421 [ tcmalloc=yes ], [ tcmalloc=no ])
1423 if test "x$tcmalloc" = "xyes"; then
1424 LDFLAGS="-ltcmalloc $LDFLAGS"
1427 using_custom_malloc=no
1428 if test "x$enable_openbsd_malloc" = "xyes"; then
1429 using_custom_malloc=yes
1431 if test "x$tcmalloc" = "xyes"; then
1432 using_custom_malloc=yes
1434 if test "$using_custom_malloc" = "no"; then
1435 AC_CHECK_FUNCS(mallinfo)
1438 # By default, we're going to assume we don't have mlockall()
1439 # bionic and other platforms have various broken mlockall subsystems.
1440 # Some systems don't have a working mlockall, some aren't linkable,
1441 # and some have it but don't declare it.
1442 AC_CHECK_FUNCS(mlockall)
1443 AC_CHECK_DECLS([mlockall], , , [
1444 #ifdef HAVE_SYS_MMAN_H
1445 #include <sys/mman.h>
1448 # Allow user to specify an alternate syslog facility
1449 AC_ARG_WITH(syslog-facility,
1450 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1451 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1452 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1453 AC_SUBST(LOGFACILITY)
1455 # Check if we have getresuid and getresgid
1456 AC_CHECK_FUNCS(getresuid getresgid)
1458 # Check for gethostbyname_r in all its glorious incompatible versions.
1459 # (This logic is based on that in Python's configure.in)
1460 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1461 [Define this if you have any gethostbyname_r()])
1463 AC_CHECK_FUNC(gethostbyname_r, [
1464 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1466 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1467 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1471 struct hostent *h1, *h2;
1473 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1475 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1476 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1477 [Define this if gethostbyname_r takes 6 arguments])
1486 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1488 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1489 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1490 [Define this if gethostbyname_r takes 5 arguments])
1498 struct hostent_data hd;
1499 (void) gethostbyname_r(cp1,h1,&hd);
1501 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1502 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1503 [Define this if gethostbyname_r takes 3 arguments])
1513 AC_CACHE_CHECK([whether the C compiler supports __func__],
1514 tor_cv_have_func_macro,
1515 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1517 int main(int c, char **v) { puts(__func__); }])],
1518 tor_cv_have_func_macro=yes,
1519 tor_cv_have_func_macro=no))
1521 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1522 tor_cv_have_FUNC_macro,
1523 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1525 int main(int c, char **v) { puts(__FUNC__); }])],
1526 tor_cv_have_FUNC_macro=yes,
1527 tor_cv_have_FUNC_macro=no))
1529 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1530 tor_cv_have_FUNCTION_macro,
1531 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1533 int main(int c, char **v) { puts(__FUNCTION__); }])],
1534 tor_cv_have_FUNCTION_macro=yes,
1535 tor_cv_have_FUNCTION_macro=no))
1537 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1538 tor_cv_have_environ_declared,
1539 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1540 #ifdef HAVE_UNISTD_H
1544 int main(int c, char **v) { char **t = environ; }])],
1545 tor_cv_have_environ_declared=yes,
1546 tor_cv_have_environ_declared=no))
1548 if test "$tor_cv_have_func_macro" = "yes"; then
1549 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1552 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1553 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1556 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1557 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1558 [Defined if the compiler supports __FUNCTION__])
1561 if test "$tor_cv_have_environ_declared" = "yes"; then
1562 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1563 [Defined if we have extern char **environ already declared])
1566 # $prefix stores the value of the --prefix command line option, or
1567 # NONE if the option wasn't set. In the case that it wasn't set, make
1568 # it be the default, so that we can use it to expand directories now.
1569 if test "x$prefix" = "xNONE"; then
1570 prefix=$ac_default_prefix
1573 # and similarly for $exec_prefix
1574 if test "x$exec_prefix" = "xNONE"; then
1578 if test "x$BUILDDIR" = "x"; then
1582 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1583 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1585 if test "x$CONFDIR" = "x"; then
1586 CONFDIR=`eval echo $sysconfdir/tor`
1589 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1590 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1592 BINDIR=`eval echo $bindir`
1594 LOCALSTATEDIR=`eval echo $localstatedir`
1595 AC_SUBST(LOCALSTATEDIR)
1597 if test "$bwin32" = "true"; then
1598 # Test if the linker supports the --nxcompat and --dynamicbase options
1600 save_LDFLAGS="$LDFLAGS"
1601 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1602 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1603 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1604 [AC_MSG_RESULT([yes])]
1605 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1606 [AC_MSG_RESULT([no])]
1608 LDFLAGS="$save_LDFLAGS"
1611 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1612 # than autoconf's macros like.
1613 if test "$GCC" = "yes"; then
1614 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1615 # accident waiting to happen.
1616 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1618 # Override optimization level for non-gcc compilers
1620 enable_gcc_warnings=no
1621 enable_gcc_warnings_advisory=no
1624 # Warnings implies advisory-warnings and -Werror.
1625 if test "$enable_gcc_warnings" = "yes"; then
1626 enable_gcc_warnings_advisory=yes
1627 enable_fatal_warnings=yes
1630 # OS X Lion started deprecating the system openssl. Let's just disable
1631 # all deprecation warnings on OS X. Also, to potentially make the binary
1632 # a little smaller, let's enable dead_strip.
1636 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1637 LDFLAGS="$LDFLAGS -dead_strip" ;;
1640 # Add some more warnings which we use in development but not in the
1641 # released versions. (Some relevant gcc versions can't handle these.)
1643 # Note that we have to do this near the end of the autoconf process, or
1644 # else we may run into problems when these warnings hit on the testing C
1645 # programs that autoconf wants to build.
1646 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1649 *-*-openbsd* | *-*-bitrig*)
1650 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1651 # That's fine, except that the headers don't pass -Wredundant-decls.
1652 # Therefore, let's disable -Wsystem-headers when we're building
1653 # with maximal warnings on OpenBSD.
1654 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1657 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1658 # have it work better.
1659 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1661 # This warning was added in gcc 4.3, but it appears to generate
1662 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1663 #CFLAGS="$CFLAGS -Wlogical-op"
1665 m4_foreach_w([warning_flag], [
1667 -Waddress-of-array-temporary
1668 -Waddress-of-temporary
1670 -Wanonymous-pack-parens
1673 -Warc-bridge-casts-disallowed-in-nonarc
1674 -Warc-maybe-repeated-use-of-weak
1675 -Warc-performSelector-leaks
1676 -Warc-repeated-use-of-weak
1678 -Warray-bounds-pointer-arithmetic
1680 -Wasm-operand-widths
1682 -Watomic-property-with-user-defined-accessor
1684 -Wauto-storage-class
1687 -Wbackslash-newline-escape
1688 -Wbad-array-new-length
1689 -Wbind-to-temporary-copy
1690 -Wbitfield-constant-conversion
1693 -Wbuiltin-requires-header
1695 -Wcompare-distinct-pointer-types
1696 -Wcomplex-component-init
1697 -Wconditional-type-mismatch
1699 -Wconstant-conversion
1700 -Wconstant-logical-operand
1701 -Wconstexpr-not-const
1702 -Wcustom-atomic-properties
1704 -Wdangling-initializer-list
1706 -Wdelegating-ctor-cycles
1707 -Wdeprecated-implementations
1708 -Wdeprecated-register
1709 -Wdirect-ivar-access
1711 -Wdistributed-object-modifiers
1713 -Wdollar-in-identifier-extension
1715 -Wduplicate-decl-specifier
1717 -Wduplicate-method-arg
1718 -Wduplicate-method-match
1720 -Wdynamic-class-memaccess
1721 -Wembedded-directive
1722 -Wempty-translation-unit
1724 -Wexit-time-destructors
1725 -Wexplicit-ownership-type
1726 -Wextern-initializer
1730 -Wflexible-array-extensions
1733 -Wfour-char-constants
1735 -Wglobal-constructors
1736 -Wgnu-array-member-paren-init
1738 -Wgnu-static-float-init
1741 -Widiomatic-parentheses
1742 -Wignored-attributes
1743 -Wimplicit-atomic-properties
1744 -Wimplicit-conversion-floating-point-to-bool
1745 -Wimplicit-exception-spec-mismatch
1746 -Wimplicit-fallthrough
1747 -Wimplicit-fallthrough-per-function
1748 -Wimplicit-retain-self
1749 -Wimport-preprocessor-directive-pedantic
1750 -Wincompatible-library-redeclaration
1751 -Wincompatible-pointer-types-discards-qualifiers
1752 -Wincomplete-implementation
1754 -Wincomplete-umbrella
1757 -Wint-to-void-pointer-cast
1763 -Winvalid-source-encoding
1764 -Winvalid-token-paste
1765 -Wknr-promoted-parameter
1766 -Wlanguage-extension-token
1767 -Wlarge-by-value-copy
1768 -Wliteral-conversion
1770 -Wlocal-type-template-args
1774 -Wmalformed-warning-check
1778 -Wmismatched-parameter-types
1779 -Wmismatched-return-types
1780 -Wmissing-field-initializers
1781 -Wmissing-format-attribute
1783 -Wmissing-selector-name
1785 -Wmissing-variable-declarations
1789 -Wnon-literal-null-conversion
1791 -Wnonportable-cfstrings
1797 -Wout-of-line-declaration
1799 -Woverlength-strings
1801 -Woverriding-method-mismatch
1802 -Wpointer-type-mismatch
1803 -Wpredefined-identifier-outside-function
1804 -Wprotocol-property-synthesis-ambiguity
1805 -Wreadonly-iboutlet-property
1806 -Wreadonly-setter-attrs
1808 -Wreceiver-forward-class
1810 -Wreinterpret-base-class
1811 -Wrequires-super-attribute
1812 -Wreserved-user-defined-literal
1813 -Wreturn-stack-address
1815 -Wselector-type-mismatch
1817 -Wserialized-diagnostics
1819 -Wshift-count-negative
1820 -Wshift-count-overflow
1821 -Wshift-negative-value
1823 -Wshift-sign-overflow
1825 -Wsizeof-array-argument
1826 -Wsource-uses-openmp
1829 -Wstatic-local-in-inline
1833 -Wstrlcpy-strlcat-size
1835 -Wsuggest-attribute=format
1836 -Wsuggest-attribute=noreturn
1837 -Wsuper-class-method-mismatch
1840 -Wtautological-constant-out-of-range-compare
1841 -Wtentative-definition-incomplete-type
1844 -Wtypedef-redefinition
1847 -Wundefined-internal
1848 -Wundefined-reinterpret-cast
1850 -Wunicode-whitespace
1851 -Wunknown-warning-option
1852 -Wunnamed-type-template-args
1853 -Wunneeded-member-function
1855 -Wunsupported-visibility
1856 -Wunused-but-set-parameter
1857 -Wunused-but-set-variable
1858 -Wunused-command-line-argument
1859 -Wunused-const-variable=2
1860 -Wunused-exception-parameter
1861 -Wunused-local-typedefs
1862 -Wunused-member-function
1863 -Wunused-sanitize-argument
1864 -Wunused-volatile-lvalue
1865 -Wuser-defined-literals
1868 -Wvector-conversions
1873 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
1875 dnl We should re-enable this in some later version. Clang doesn't
1876 dnl mind, but it causes trouble with GCC.
1877 dnl -Wstrict-overflow=2
1879 dnl These seem to require annotations that we don't currently use,
1880 dnl and they give false positives in our pthreads wrappers. (Clang 4)
1882 dnl -Wthread-safety-analysis
1883 dnl -Wthread-safety-attributes
1884 dnl -Wthread-safety-beta
1885 dnl -Wthread-safety-precise
1887 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1888 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1889 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1890 CFLAGS="$CFLAGS -Wwrite-strings"
1891 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1892 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1893 CFLAGS="$CFLAGS -Wunused-parameter "
1894 # These interfere with building main() { return 0; }, which autoconf
1895 # likes to use as its default program.
1896 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1898 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1899 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1901 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1902 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1905 if test "x$enable_fatal_warnings" = "xyes"; then
1906 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1907 # default autoconf programs are full of errors.
1908 CFLAGS="$CFLAGS -Werror"
1913 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1916 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.])
1920 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1925 contrib/dist/suse/tor.sh
1926 contrib/operator-tools/tor.logrotate
1929 contrib/dist/tor.service
1930 src/config/torrc.sample
1931 src/config/torrc.minimal
1932 scripts/maint/checkOptionDocs.pl
1933 scripts/maint/updateVersions.pl
1936 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1937 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1938 for file in $regular_mans ; do
1939 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1940 echo "==================================";
1942 echo "Building Tor has failed since manpages cannot be built.";
1944 echo "You need asciidoc installed to be able to build the manpages.";
1945 echo "To build without manpages, use the --disable-asciidoc argument";
1946 echo "when calling configure.";
1948 echo "==================================";