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.1-alpha])
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(bufferevents,
165 AS_HELP_STRING(--enable-bufferevents, [use Libevent's buffered IO]))
167 AC_ARG_ENABLE(tool-name-check,
168 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
170 AC_ARG_ENABLE(seccomp,
171 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
173 AC_ARG_ENABLE(libscrypt,
174 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
176 dnl check for the correct "ar" when cross-compiling
177 AN_MAKEVAR([AR], [AC_PROG_AR])
178 AN_PROGRAM([ar], [AC_PROG_AR])
179 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
182 dnl Check whether the above macro has settled for a simply named tool even
183 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
184 dnl because that will find any cc on the system, not only the cross-compiler,
185 dnl and then verify that a binary built with this compiler runs on the
186 dnl build system. It will then come to the false conclusion that we're not
188 if test "x$enable_tool_name_check" != "xno"; then
189 if test "x$ac_tool_warned" = "xyes"; then
190 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.)])
191 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
192 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.)])
201 AC_PATH_PROG([PERL], [perl])
203 dnl autoconf 2.59 appears not to support AC_PROG_SED
204 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
206 dnl check for asciidoc and a2x
207 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
208 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
210 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
212 AM_CONDITIONAL(USE_FW_HELPER, test "x$natpmp" = "xtrue" || test "x$upnp" = "xtrue")
213 AM_CONDITIONAL(NAT_PMP, test "x$natpmp" = "xtrue")
214 AM_CONDITIONAL(MINIUPNPC, test "x$upnp" = "xtrue")
218 AC_ARG_VAR([PYTHON], [path to Python binary])
219 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
220 if test "x$PYTHON" = "x"; then
221 AC_MSG_WARN([Python unavailable; some tests will not be run.])
223 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
225 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
226 AC_C_FLEXIBLE_ARRAY_MEMBER
228 dnl Maybe we've got an old autoconf...
229 AC_CACHE_CHECK([for flexible array members],
233 struct abc { int a; char b[]; };
235 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
238 [tor_cv_c_flexarray=yes],
239 [tor_cv_c_flexarray=no])])
240 if test "$tor_cv_flexarray" = "yes"; then
241 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
243 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
247 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
250 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
251 [tor_cv_c_c99_decl=yes],
252 [tor_cv_c_c99_decl=no] )])
253 if test "$tor_cv_c_c99_decl" != "yes"; then
254 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
257 AC_CACHE_CHECK([for working C99 designated initializers],
258 tor_cv_c_c99_designated_init,
260 [AC_LANG_PROGRAM([struct s { int a; int b; };],
261 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
262 [tor_cv_c_c99_designated_init=yes],
263 [tor_cv_c_c99_designated_init=no] )])
265 if test "$tor_cv_c_c99_designated_init" != "yes"; then
266 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
270 AC_ARG_WITH(tor-user,
271 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
279 AC_ARG_WITH(tor-group,
280 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
288 dnl If _WIN32 is defined and non-zero, we are building for win32
289 AC_MSG_CHECKING([for win32])
290 AC_RUN_IFELSE([AC_LANG_SOURCE([
291 int main(int c, char **v) {
302 bwin32=true; AC_MSG_RESULT([yes]),
303 bwin32=false; AC_MSG_RESULT([no]),
304 bwin32=cross; AC_MSG_RESULT([cross])
307 if test "$bwin32" = "cross"; then
308 AC_MSG_CHECKING([for win32 (cross)])
309 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
311 int main(int c, char **v) {return 0;}
314 int main(int c, char **v) {return x(y);}
317 bwin32=true; AC_MSG_RESULT([yes]),
318 bwin32=false; AC_MSG_RESULT([no]))
323 /* Defined to access windows functions and definitions for >=WinXP */
325 # define WINVER 0x0501
328 /* Defined to access _other_ windows functions and definitions for >=WinXP */
329 # ifndef _WIN32_WINNT
330 # define _WIN32_WINNT 0x0501
333 /* Defined to avoid including some windows headers as part of Windows.h */
334 # ifndef WIN32_LEAN_AND_MEAN
335 # define WIN32_LEAN_AND_MEAN 1
341 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
343 dnl Enable C99 when compiling with MIPSpro
344 AC_MSG_CHECKING([for MIPSpro compiler])
345 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
346 #if (defined(__sgi) && defined(_COMPILER_VERSION))
351 bmipspro=false; AC_MSG_RESULT(no),
352 bmipspro=true; AC_MSG_RESULT(yes))
354 if test "$bmipspro" = "true"; then
355 CFLAGS="$CFLAGS -c99"
360 AC_SEARCH_LIBS(socket, [socket network])
361 AC_SEARCH_LIBS(gethostbyname, [nsl])
362 AC_SEARCH_LIBS(dlopen, [dl])
363 AC_SEARCH_LIBS(inet_aton, [resolv])
364 AC_SEARCH_LIBS(backtrace, [execinfo])
366 AC_SEARCH_LIBS([clock_gettime], [rt])
367 if test "$LIBS" != "$saved_LIBS"; then
368 # Looks like we need -lrt for clock_gettime().
372 AC_SEARCH_LIBS(pthread_create, [pthread])
373 AC_SEARCH_LIBS(pthread_detach, [pthread])
375 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
376 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
380 RtlSecureZeroMemory \
384 backtrace_symbols_fd \
430 if test "$bwin32" != "true"; then
431 AC_CHECK_HEADERS(pthread.h)
432 AC_CHECK_FUNCS(pthread_create)
433 AC_CHECK_FUNCS(pthread_condattr_setclock)
436 if test "$bwin32" = "true"; then
437 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
444 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
445 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
447 dnl ------------------------------------------------------
448 dnl Where do you live, libevent? And how do we call you?
450 if test "$bwin32" = "true"; then
451 TOR_LIB_WS32=-lws2_32
452 TOR_LIB_IPHLPAPI=-liphlpapi
453 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
454 # think it's actually necessary.
460 AC_SUBST(TOR_LIB_WS32)
461 AC_SUBST(TOR_LIB_GDI)
462 AC_SUBST(TOR_LIB_IPHLPAPI)
464 tor_libevent_pkg_redhat="libevent"
465 tor_libevent_pkg_debian="libevent-dev"
466 tor_libevent_devpkg_redhat="libevent-devel"
467 tor_libevent_devpkg_debian="libevent-dev"
469 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
470 dnl linking for static builds.
471 STATIC_LIBEVENT_FLAGS=""
472 if test "$enable_static_libevent" = "yes"; then
473 if test "$have_rt" = "yes"; then
474 STATIC_LIBEVENT_FLAGS=" -lrt "
478 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
480 #include <winsock2.h>
482 #include <sys/time.h>
483 #include <sys/types.h>
484 #include <event2/event.h>], [
486 #include <winsock2.h>
488 void *event_init(void);],
491 {WSADATA d; WSAStartup(0x101,&d); }
494 ], [--with-libevent-dir], [/opt/libevent])
496 dnl Now check for particular libevent functions.
498 save_LDFLAGS="$LDFLAGS"
499 save_CPPFLAGS="$CPPFLAGS"
500 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
501 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
502 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
503 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file])
505 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
507 if test "$enable_static_libevent" = "yes"; then
508 if test "$tor_cv_library_libevent_dir" = "(system)"; then
509 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
511 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
514 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
515 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
516 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"))
518 if test "$ac_cv_search_event_new" != "none required"; then
519 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
521 if test "$ac_cv_search_evdns_base_new" != "none required"; then
522 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
525 TOR_LIBEVENT_LIBS="-levent"
530 LDFLAGS="$save_LDFLAGS"
531 CPPFLAGS="$save_CPPFLAGS"
533 dnl Check that libevent is at least at version 2.0.10, the first stable
534 dnl release of its series
535 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
536 AC_MSG_CHECKING([whether Libevent is new enough])
537 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
538 #include <event2/event.h>
539 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
545 ])], [ AC_MSG_RESULT([yes]) ],
546 [ AC_MSG_RESULT([no])
547 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
550 LDFLAGS="$save_LDFLAGS"
551 CPPFLAGS="$save_CPPFLAGS"
553 dnl bufferents require version 2.0.13
554 if test "$enable_bufferevents" = "yes"; then
555 AC_CHECK_HEADERS(event2/bufferevent_ssl.h)
557 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
559 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
560 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
561 #include <event2/event.h>
562 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
568 ])], [ AC_MSG_RESULT([yes]) ],
569 [ AC_MSG_RESULT([no])
570 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
574 LDFLAGS="$save_LDFLAGS"
575 CPPFLAGS="$save_CPPFLAGS"
577 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
578 if test "$enable_bufferevents" = "yes"; then
579 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
580 if test "$enable_static_libevent" = "yes"; then
581 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
583 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
586 AC_SUBST(TOR_LIBEVENT_LIBS)
588 dnl ------------------------------------------------------
589 dnl Where do you live, libm?
591 dnl On some platforms (Haiku/BeOS) the math library is
592 dnl part of libroot. In which case don't link against lm
595 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
596 if test "$ac_cv_search_pow" != "none required"; then
597 TOR_LIB_MATH="$ac_cv_search_pow"
600 AC_SUBST(TOR_LIB_MATH)
602 dnl ------------------------------------------------------
603 dnl Where do you live, openssl? And how do we call you?
605 tor_openssl_pkg_redhat="openssl"
606 tor_openssl_pkg_debian="libssl-dev"
607 tor_openssl_devpkg_redhat="openssl-devel"
608 tor_openssl_devpkg_debian="libssl-dev"
610 ALT_openssl_WITHVAL=""
612 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
614 if test "x$withval" != "xno" && test "x$withval" != "x"; then
615 ALT_openssl_WITHVAL="$withval"
619 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
620 [#include <openssl/rand.h>],
621 [void RAND_add(const void *buf, int num, double entropy);],
622 [RAND_add((void*)0,0,0);], [],
623 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
625 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
627 if test "$enable_static_openssl" = "yes"; then
628 if test "$tor_cv_library_openssl_dir" = "(system)"; then
629 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
631 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
634 TOR_OPENSSL_LIBS="-lssl -lcrypto"
636 AC_SUBST(TOR_OPENSSL_LIBS)
638 dnl Now check for particular openssl functions.
640 save_LDFLAGS="$LDFLAGS"
641 save_CPPFLAGS="$CPPFLAGS"
642 LIBS="$TOR_OPENSSL_LIBS $LIBS"
643 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
644 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
647 #include <openssl/opensslv.h>
648 #if OPENSSL_VERSION_NUMBER < 0x1000000fL
653 [ AC_ERROR([OpenSSL is too old. We require 1.0.0 or later. You can specify a path to a newer one with --with-openssl-dir.]) ])
656 #include <openssl/opensslv.h>
657 #include <openssl/evp.h>
658 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
661 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
662 #error "curves unavailable"
666 [ 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.]) ])
668 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
669 [#include <openssl/ssl.h>
673 SSL_SESSION_get_master_key \
674 SSL_get_server_random \
675 SSL_get_client_ciphers \
676 SSL_get_client_random \
681 dnl Check if OpenSSL has scrypt implementation.
682 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
685 LDFLAGS="$save_LDFLAGS"
686 CPPFLAGS="$save_CPPFLAGS"
688 dnl ------------------------------------------------------
689 dnl Where do you live, zlib? And how do we call you?
691 tor_zlib_pkg_redhat="zlib"
692 tor_zlib_pkg_debian="zlib1g"
693 tor_zlib_devpkg_redhat="zlib-devel"
694 tor_zlib_devpkg_debian="zlib1g-dev"
696 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
698 [const char * zlibVersion(void);],
699 [zlibVersion();], [--with-zlib-dir],
702 if test "$enable_static_zlib" = "yes"; then
703 if test "$tor_cv_library_zlib_dir" = "(system)"; then
704 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
705 using --enable-static-zlib")
707 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
712 AC_SUBST(TOR_ZLIB_LIBS)
714 dnl ----------------------------------------------------------------------
715 dnl Check if libcap is available for capabilities.
717 tor_cap_pkg_debian="libcap2"
718 tor_cap_pkg_redhat="libcap"
719 tor_cap_devpkg_debian="libcap-dev"
720 tor_cap_devpkg_redhat="libcap-devel"
722 AC_CHECK_LIB([cap], [cap_init], [],
723 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
725 AC_CHECK_FUNCS(cap_set_proc)
727 dnl ---------------------------------------------------------------------
728 dnl Now that we know about our major libraries, we can check for compiler
729 dnl and linker hardening options. We need to do this with the libraries known,
730 dnl since sometimes the linker will like an option but not be willing to
731 dnl use it with a build of a library.
733 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
734 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"
741 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
742 #if !defined(__clang__)
744 #endif])], have_clang=yes, have_clang=no)
746 if test "x$enable_gcc_hardening" != "xno"; then
747 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
748 if test "x$have_clang" = "xyes"; then
749 TOR_CHECK_CFLAGS(-Qunused-arguments)
751 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
752 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
753 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
754 m4_ifdef([AS_VAR_IF],[
755 AS_VAR_IF(can_compile, [yes],
756 AS_VAR_IF(can_link, [yes],
758 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.)]))
760 AS_VAR_POPDEF([can_link])
761 AS_VAR_POPDEF([can_compile])
762 TOR_CHECK_CFLAGS(-Wstack-protector)
763 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
764 if test "$bwin32" = "false"; then
765 TOR_CHECK_CFLAGS(-fPIE)
766 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
768 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
769 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
770 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
771 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.])
775 if test "x$enable_expensive_hardening" = "xyes"; then
776 if test "$tor_cv_cflags__ftrapv" != "yes"; then
777 AC_MSG_ERROR([You requested expensive hardening, but the compiler does not seem to support -ftrapv.])
780 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
781 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
782 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*])
785 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
786 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
787 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*])
790 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
793 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
794 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
796 mulodi_fixes_ftrapv=no
797 if test "$have_clang" = "yes"; then
798 saved_CFLAGS="$CFLAGS"
799 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
800 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
805 int main(int argc, char **argv)
807 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
808 * (int64_t)atoi(argv[3]);
811 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
812 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
813 if test "$ftrapv_can_link" = "no"; then
814 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
819 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
823 int main(int argc, char **argv)
825 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
826 * (int64_t)atoi(argv[3]);
829 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
830 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
832 CFLAGS="$saved_CFLAGS"
835 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
837 dnl These cflags add bunches of branches, and we haven't been able to
838 dnl persuade ourselves that they're suitable for code that needs to be
840 AC_SUBST(CFLAGS_BUGTRAP)
841 dnl These cflags are variant ones sutable for code that needs to be
843 AC_SUBST(CFLAGS_CONSTTIME)
845 if test "x$enable_linker_hardening" != "xno"; then
846 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
849 # For backtrace support
850 TOR_CHECK_LDFLAGS(-rdynamic)
852 dnl ------------------------------------------------------
853 dnl Now see if we have a -fomit-frame-pointer compiler option.
855 saved_CFLAGS="$CFLAGS"
856 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
857 F_OMIT_FRAME_POINTER=''
858 if test "$saved_CFLAGS" != "$CFLAGS"; then
859 if test "x$enable_expensive_hardening" != "xyes"; then
860 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
863 CFLAGS="$saved_CFLAGS"
864 AC_SUBST(F_OMIT_FRAME_POINTER)
866 dnl ------------------------------------------------------
867 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
868 dnl for us, as GCC 4.6 and later do at many optimization levels), then
869 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
871 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
873 dnl ============================================================
874 dnl Check for libseccomp
876 if test "x$enable_seccomp" != "xno"; then
877 AC_CHECK_HEADERS([seccomp.h])
878 AC_SEARCH_LIBS(seccomp_init, [seccomp])
881 dnl ============================================================
882 dnl Check for libscrypt
884 if test "x$enable_libscrypt" != "xno"; then
885 AC_CHECK_HEADERS([libscrypt.h])
886 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
887 AC_CHECK_FUNCS([libscrypt_scrypt])
890 dnl ============================================================
891 dnl We need an implementation of curve25519.
893 dnl set these defaults.
894 build_curve25519_donna=no
895 build_curve25519_donna_c64=no
896 use_curve25519_donna=no
897 use_curve25519_nacl=no
900 dnl The best choice is using curve25519-donna-c64, but that requires
902 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
903 tor_cv_can_use_curve25519_donna_c64,
905 [AC_LANG_PROGRAM([dnl
907 typedef unsigned uint128_t __attribute__((mode(TI)));
908 int func(uint64_t a, uint64_t b) {
909 uint128_t c = ((uint128_t)a) * b;
910 int ok = ((uint64_t)(c>>96)) == 522859 &&
911 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
912 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
913 (((uint64_t)(c))&0xffffffffL) == 0;
917 int ok = func( ((uint64_t)2000000000) * 1000000000,
918 ((uint64_t)1234567890) << 24);
921 [tor_cv_can_use_curve25519_donna_c64=yes],
922 [tor_cv_can_use_curve25519_donna_c64=no],
924 [AC_LANG_PROGRAM([dnl
926 typedef unsigned uint128_t __attribute__((mode(TI)));
927 int func(uint64_t a, uint64_t b) {
928 uint128_t c = ((uint128_t)a) * b;
929 int ok = ((uint64_t)(c>>96)) == 522859 &&
930 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
931 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
932 (((uint64_t)(c))&0xffffffffL) == 0;
936 int ok = func( ((uint64_t)2000000000) * 1000000000,
937 ((uint64_t)1234567890) << 24);
940 [tor_cv_can_use_curve25519_donna_c64=cross],
941 [tor_cv_can_use_curve25519_donna_c64=no])])])
943 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
944 nacl/crypto_scalarmult_curve25519.h])
946 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
947 tor_cv_can_use_curve25519_nacl,
948 [tor_saved_LIBS="$LIBS"
951 [AC_LANG_PROGRAM([dnl
952 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
953 #include <crypto_scalarmult_curve25519.h>
954 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
955 #include <nacl/crypto_scalarmult_curve25519.h>
957 #ifdef crypto_scalarmult_curve25519_ref_BYTES
958 #error Hey, this is the reference implementation! That's not fast.
961 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
962 ])], [tor_cv_can_use_curve25519_nacl=yes],
963 [tor_cv_can_use_curve25519_nacl=no])
964 LIBS="$tor_saved_LIBS" ])
966 dnl Okay, now we need to figure out which one to actually use. Fall back
967 dnl to curve25519-donna.c
969 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
970 build_curve25519_donna_c64=yes
971 use_curve25519_donna=yes
972 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
973 use_curve25519_nacl=yes
974 CURVE25519_LIBS=-lnacl
976 build_curve25519_donna=yes
977 use_curve25519_donna=yes
980 if test "x$use_curve25519_donna" = "xyes"; then
981 AC_DEFINE(USE_CURVE25519_DONNA, 1,
982 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
984 if test "x$use_curve25519_nacl" = "xyes"; then
985 AC_DEFINE(USE_CURVE25519_NACL, 1,
986 [Defined if we should use a curve25519 from nacl])
988 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
989 test "x$build_curve25519_donna" = "xyes")
990 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
991 test "x$build_curve25519_donna_c64" = "xyes")
992 AC_SUBST(CURVE25519_LIBS)
994 dnl Make sure to enable support for large off_t if available.
997 AC_CHECK_HEADERS([assert.h \
1049 AC_CHECK_HEADERS(sys/param.h)
1051 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1052 [#ifdef HAVE_SYS_TYPES_H
1053 #include <sys/types.h>
1055 #ifdef HAVE_SYS_SOCKET_H
1056 #include <sys/socket.h>
1058 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1059 [#ifdef HAVE_SYS_TYPES_H
1060 #include <sys/types.h>
1062 #ifdef HAVE_SYS_SOCKET_H
1063 #include <sys/socket.h>
1065 #ifdef HAVE_NET_IF_H
1068 #ifdef HAVE_NETINET_IN_H
1069 #include <netinet/in.h>
1072 AC_CHECK_HEADERS(linux/if.h,[],[],
1074 #ifdef HAVE_SYS_SOCKET_H
1075 #include <sys/socket.h>
1079 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1080 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1081 [#ifdef HAVE_SYS_TYPES_H
1082 #include <sys/types.h>
1084 #ifdef HAVE_SYS_SOCKET_H
1085 #include <sys/socket.h>
1087 #ifdef HAVE_LIMITS_H
1090 #ifdef HAVE_LINUX_TYPES_H
1091 #include <linux/types.h>
1093 #ifdef HAVE_NETINET_IN6_H
1094 #include <netinet/in6.h>
1096 #ifdef HAVE_NETINET_IN_H
1097 #include <netinet/in.h>
1100 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1101 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1102 [#ifdef HAVE_SYS_TYPES_H
1103 #include <sys/types.h>
1105 #ifdef HAVE_SYS_SOCKET_H
1106 #include <sys/socket.h>
1108 #ifdef HAVE_LIMITS_H
1111 #ifdef HAVE_LINUX_TYPES_H
1112 #include <linux/types.h>
1114 #ifdef HAVE_NETINET_IN6_H
1115 #include <netinet/in6.h>
1117 #ifdef HAVE_NETINET_IN_H
1118 #include <netinet/in.h>
1120 #ifdef HAVE_LINUX_IF_H
1121 #include <linux/if.h>
1125 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1128 if test "x$linux_netfilter_ipv4" = "x1"; then
1131 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1134 if test "x$transparent_ok" = "x1"; then
1135 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1137 *-*-openbsd* | *-*-bitrig*)
1138 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1141 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1144 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1145 [#ifdef HAVE_SYS_TYPES_H
1146 #include <sys/types.h>
1148 #ifdef HAVE_SYS_TIME_H
1149 #include <sys/time.h>
1152 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1155 AC_CHECK_SIZEOF(int8_t)
1156 AC_CHECK_SIZEOF(int16_t)
1157 AC_CHECK_SIZEOF(int32_t)
1158 AC_CHECK_SIZEOF(int64_t)
1159 AC_CHECK_SIZEOF(uint8_t)
1160 AC_CHECK_SIZEOF(uint16_t)
1161 AC_CHECK_SIZEOF(uint32_t)
1162 AC_CHECK_SIZEOF(uint64_t)
1163 AC_CHECK_SIZEOF(intptr_t)
1164 AC_CHECK_SIZEOF(uintptr_t)
1166 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1168 AC_CHECK_SIZEOF(char)
1169 AC_CHECK_SIZEOF(short)
1170 AC_CHECK_SIZEOF(int)
1171 AC_CHECK_SIZEOF(long)
1172 AC_CHECK_SIZEOF(long long)
1173 AC_CHECK_SIZEOF(__int64)
1174 AC_CHECK_SIZEOF(void *)
1175 AC_CHECK_SIZEOF(time_t)
1176 AC_CHECK_SIZEOF(size_t)
1177 AC_CHECK_SIZEOF(pid_t)
1179 AC_CHECK_TYPES([uint, u_char, ssize_t])
1181 AC_PC_FROM_UCONTEXT([:])
1183 dnl used to include sockaddr_storage, but everybody has that.
1184 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1185 [#ifdef HAVE_SYS_TYPES_H
1186 #include <sys/types.h>
1188 #ifdef HAVE_NETINET_IN_H
1189 #include <netinet/in.h>
1191 #ifdef HAVE_NETINET_IN6_H
1192 #include <netinet/in6.h>
1194 #ifdef HAVE_SYS_SOCKET_H
1195 #include <sys/socket.h>
1198 #define _WIN32_WINNT 0x0501
1199 #define WIN32_LEAN_AND_MEAN
1200 #include <winsock2.h>
1201 #include <ws2tcpip.h>
1204 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1205 [#ifdef HAVE_SYS_TYPES_H
1206 #include <sys/types.h>
1208 #ifdef HAVE_NETINET_IN_H
1209 #include <netinet/in.h>
1211 #ifdef HAVE_NETINET_IN6_H
1212 #include <netinet/in6.h>
1214 #ifdef HAVE_SYS_SOCKET_H
1215 #include <sys/socket.h>
1218 #define _WIN32_WINNT 0x0501
1219 #define WIN32_LEAN_AND_MEAN
1220 #include <winsock2.h>
1221 #include <ws2tcpip.h>
1225 AC_CHECK_TYPES([rlim_t], , ,
1226 [#ifdef HAVE_SYS_TYPES_H
1227 #include <sys/types.h>
1229 #ifdef HAVE_SYS_TIME_H
1230 #include <sys/time.h>
1232 #ifdef HAVE_SYS_RESOURCE_H
1233 #include <sys/resource.h>
1237 AX_CHECK_SIGN([time_t],
1240 #ifdef HAVE_SYS_TYPES_H
1241 #include <sys/types.h>
1243 #ifdef HAVE_SYS_TIME_H
1244 #include <sys/time.h>
1251 if test "$ax_cv_decl_time_t_signed" = "no"; then
1252 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1255 AX_CHECK_SIGN([size_t],
1256 [ tor_cv_size_t_signed=yes ],
1257 [ tor_cv_size_t_signed=no ], [
1258 #ifdef HAVE_SYS_TYPES_H
1259 #include <sys/types.h>
1263 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1264 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1267 AX_CHECK_SIGN([enum always],
1268 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1270 enum always { AAA, BBB, CCC };
1273 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1274 #ifdef HAVE_SYS_SOCKET_H
1275 #include <sys/socket.h>
1279 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1281 AC_CHECK_SIZEOF(cell_t)
1283 # Now make sure that NULL can be represented as zero bytes.
1284 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1285 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1286 [[#include <stdlib.h>
1289 #ifdef HAVE_STDDEF_H
1292 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1293 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1294 [tor_cv_null_is_zero=yes],
1295 [tor_cv_null_is_zero=no],
1296 [tor_cv_null_is_zero=cross])])
1298 if test "$tor_cv_null_is_zero" = "cross"; then
1299 # Cross-compiling; let's hope that the target isn't raving mad.
1300 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1303 if test "$tor_cv_null_is_zero" != "no"; then
1304 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1305 [Define to 1 iff memset(0) sets pointers to NULL])
1308 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1309 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1310 [[#include <stdlib.h>
1313 #ifdef HAVE_STDDEF_H
1316 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1317 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1318 [tor_cv_dbl0_is_zero=yes],
1319 [tor_cv_dbl0_is_zero=no],
1320 [tor_cv_dbl0_is_zero=cross])])
1322 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1323 # Cross-compiling; let's hope that the target isn't raving mad.
1324 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1327 if test "$tor_cv_dbl0_is_zero" != "no"; then
1328 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1329 [Define to 1 iff memset(0) sets doubles to 0.0])
1332 # And what happens when we malloc zero?
1333 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1334 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1335 [[#include <stdlib.h>
1338 #ifdef HAVE_STDDEF_H
1341 int main () { return malloc(0)?0:1; }]])],
1342 [tor_cv_malloc_zero_works=yes],
1343 [tor_cv_malloc_zero_works=no],
1344 [tor_cv_malloc_zero_works=cross])])
1346 if test "$tor_cv_malloc_zero_works" = "cross"; then
1347 # Cross-compiling; let's hope that the target isn't raving mad.
1348 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1351 if test "$tor_cv_malloc_zero_works" = "yes"; then
1352 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1353 [Define to 1 iff malloc(0) returns a pointer])
1356 # whether we seem to be in a 2s-complement world.
1357 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1358 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1359 [[int main () { int problem = ((-99) != (~99)+1);
1360 return problem ? 1 : 0; }]])],
1361 [tor_cv_twos_complement=yes],
1362 [tor_cv_twos_complement=no],
1363 [tor_cv_twos_complement=cross])])
1365 if test "$tor_cv_twos_complement" = "cross"; then
1366 # Cross-compiling; let's hope that the target isn't raving mad.
1367 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1370 if test "$tor_cv_twos_complement" != "no"; then
1371 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1372 [Define to 1 iff we represent negative integers with
1376 # What does shifting a negative value do?
1377 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1378 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1379 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1380 [tor_cv_sign_extend=yes],
1381 [tor_cv_sign_extend=no],
1382 [tor_cv_sign_extend=cross])])
1384 if test "$tor_cv_sign_extend" = "cross"; then
1385 # Cross-compiling; let's hope that the target isn't raving mad.
1386 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1389 if test "$tor_cv_sign_extend" != "no"; then
1390 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1391 [Define to 1 iff right-shifting a negative value performs sign-extension])
1394 # Whether we should use the dmalloc memory allocation debugging library.
1395 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1396 AC_ARG_WITH(dmalloc,
1397 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1398 [if [[ "$withval" = "yes" ]]; then
1404 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1407 if [[ $dmalloc -eq 1 ]]; then
1408 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1409 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1410 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1411 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1414 AC_ARG_WITH(tcmalloc,
1415 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1416 [ tcmalloc=yes ], [ tcmalloc=no ])
1418 if test "x$tcmalloc" = "xyes"; then
1419 LDFLAGS="-ltcmalloc $LDFLAGS"
1422 using_custom_malloc=no
1423 if test "x$enable_openbsd_malloc" = "xyes"; then
1424 using_custom_malloc=yes
1426 if test "x$tcmalloc" = "xyes"; then
1427 using_custom_malloc=yes
1429 if test "$using_custom_malloc" = "no"; then
1430 AC_CHECK_FUNCS(mallinfo)
1433 # By default, we're going to assume we don't have mlockall()
1434 # bionic and other platforms have various broken mlockall subsystems.
1435 # Some systems don't have a working mlockall, some aren't linkable,
1436 # and some have it but don't declare it.
1437 AC_CHECK_FUNCS(mlockall)
1438 AC_CHECK_DECLS([mlockall], , , [
1439 #ifdef HAVE_SYS_MMAN_H
1440 #include <sys/mman.h>
1443 # Allow user to specify an alternate syslog facility
1444 AC_ARG_WITH(syslog-facility,
1445 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1446 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1447 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1448 AC_SUBST(LOGFACILITY)
1450 # Check if we have getresuid and getresgid
1451 AC_CHECK_FUNCS(getresuid getresgid)
1453 # Check for gethostbyname_r in all its glorious incompatible versions.
1454 # (This logic is based on that in Python's configure.in)
1455 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1456 [Define this if you have any gethostbyname_r()])
1458 AC_CHECK_FUNC(gethostbyname_r, [
1459 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1461 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1462 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1466 struct hostent *h1, *h2;
1468 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1470 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1471 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1472 [Define this if gethostbyname_r takes 6 arguments])
1481 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1483 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1484 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1485 [Define this if gethostbyname_r takes 5 arguments])
1493 struct hostent_data hd;
1494 (void) gethostbyname_r(cp1,h1,&hd);
1496 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1497 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1498 [Define this if gethostbyname_r takes 3 arguments])
1508 AC_CACHE_CHECK([whether the C compiler supports __func__],
1509 tor_cv_have_func_macro,
1510 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1512 int main(int c, char **v) { puts(__func__); }])],
1513 tor_cv_have_func_macro=yes,
1514 tor_cv_have_func_macro=no))
1516 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1517 tor_cv_have_FUNC_macro,
1518 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1520 int main(int c, char **v) { puts(__FUNC__); }])],
1521 tor_cv_have_FUNC_macro=yes,
1522 tor_cv_have_FUNC_macro=no))
1524 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1525 tor_cv_have_FUNCTION_macro,
1526 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1528 int main(int c, char **v) { puts(__FUNCTION__); }])],
1529 tor_cv_have_FUNCTION_macro=yes,
1530 tor_cv_have_FUNCTION_macro=no))
1532 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1533 tor_cv_have_environ_declared,
1534 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1535 #ifdef HAVE_UNISTD_H
1539 int main(int c, char **v) { char **t = environ; }])],
1540 tor_cv_have_environ_declared=yes,
1541 tor_cv_have_environ_declared=no))
1543 if test "$tor_cv_have_func_macro" = "yes"; then
1544 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1547 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1548 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1551 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1552 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1553 [Defined if the compiler supports __FUNCTION__])
1556 if test "$tor_cv_have_environ_declared" = "yes"; then
1557 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1558 [Defined if we have extern char **environ already declared])
1561 # $prefix stores the value of the --prefix command line option, or
1562 # NONE if the option wasn't set. In the case that it wasn't set, make
1563 # it be the default, so that we can use it to expand directories now.
1564 if test "x$prefix" = "xNONE"; then
1565 prefix=$ac_default_prefix
1568 # and similarly for $exec_prefix
1569 if test "x$exec_prefix" = "xNONE"; then
1573 if test "x$BUILDDIR" = "x"; then
1577 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1578 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1580 if test "x$CONFDIR" = "x"; then
1581 CONFDIR=`eval echo $sysconfdir/tor`
1584 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1585 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1587 BINDIR=`eval echo $bindir`
1589 LOCALSTATEDIR=`eval echo $localstatedir`
1590 AC_SUBST(LOCALSTATEDIR)
1592 if test "$bwin32" = "true"; then
1593 # Test if the linker supports the --nxcompat and --dynamicbase options
1595 save_LDFLAGS="$LDFLAGS"
1596 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1597 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1598 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1599 [AC_MSG_RESULT([yes])]
1600 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1601 [AC_MSG_RESULT([no])]
1603 LDFLAGS="$save_LDFLAGS"
1606 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1607 # than autoconf's macros like.
1608 if test "$GCC" = "yes"; then
1609 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1610 # accident waiting to happen.
1611 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1613 # Override optimization level for non-gcc compilers
1615 enable_gcc_warnings=no
1616 enable_gcc_warnings_advisory=no
1619 # Warnings implies advisory-warnings and -Werror.
1620 if test "$enable_gcc_warnings" = "yes"; then
1621 enable_gcc_warnings_advisory=yes
1622 enable_fatal_warnings=yes
1625 # OS X Lion started deprecating the system openssl. Let's just disable
1626 # all deprecation warnings on OS X. Also, to potentially make the binary
1627 # a little smaller, let's enable dead_strip.
1631 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1632 LDFLAGS="$LDFLAGS -dead_strip" ;;
1635 # Add some more warnings which we use in development but not in the
1636 # released versions. (Some relevant gcc versions can't handle these.)
1638 # Note that we have to do this near the end of the autoconf process, or
1639 # else we may run into problems when these warnings hit on the testing C
1640 # programs that autoconf wants to build.
1641 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1644 *-*-openbsd* | *-*-bitrig*)
1645 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1646 # That's fine, except that the headers don't pass -Wredundant-decls.
1647 # Therefore, let's disable -Wsystem-headers when we're building
1648 # with maximal warnings on OpenBSD.
1649 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1652 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1653 # have it work better.
1654 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1656 # This warning was added in gcc 4.3, but it appears to generate
1657 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1658 #CFLAGS="$CFLAGS -Wlogical-op"
1660 m4_foreach_w([warning_flag], [
1662 -Waddress-of-array-temporary
1663 -Waddress-of-temporary
1665 -Wanonymous-pack-parens
1668 -Warc-bridge-casts-disallowed-in-nonarc
1669 -Warc-maybe-repeated-use-of-weak
1670 -Warc-performSelector-leaks
1671 -Warc-repeated-use-of-weak
1673 -Warray-bounds-pointer-arithmetic
1675 -Wasm-operand-widths
1677 -Watomic-property-with-user-defined-accessor
1679 -Wauto-storage-class
1682 -Wbackslash-newline-escape
1683 -Wbad-array-new-length
1684 -Wbind-to-temporary-copy
1685 -Wbitfield-constant-conversion
1688 -Wbuiltin-requires-header
1690 -Wcompare-distinct-pointer-types
1691 -Wcomplex-component-init
1692 -Wconditional-type-mismatch
1694 -Wconstant-conversion
1695 -Wconstant-logical-operand
1696 -Wconstexpr-not-const
1697 -Wcustom-atomic-properties
1699 -Wdangling-initializer-list
1701 -Wdelegating-ctor-cycles
1702 -Wdeprecated-implementations
1703 -Wdeprecated-register
1704 -Wdirect-ivar-access
1706 -Wdistributed-object-modifiers
1708 -Wdollar-in-identifier-extension
1710 -Wduplicate-decl-specifier
1712 -Wduplicate-method-arg
1713 -Wduplicate-method-match
1715 -Wdynamic-class-memaccess
1716 -Wembedded-directive
1717 -Wempty-translation-unit
1719 -Wexit-time-destructors
1720 -Wexplicit-ownership-type
1721 -Wextern-initializer
1725 -Wflexible-array-extensions
1728 -Wfour-char-constants
1730 -Wglobal-constructors
1731 -Wgnu-array-member-paren-init
1733 -Wgnu-static-float-init
1736 -Widiomatic-parentheses
1737 -Wignored-attributes
1738 -Wimplicit-atomic-properties
1739 -Wimplicit-conversion-floating-point-to-bool
1740 -Wimplicit-exception-spec-mismatch
1741 -Wimplicit-fallthrough
1742 -Wimplicit-fallthrough-per-function
1743 -Wimplicit-retain-self
1744 -Wimport-preprocessor-directive-pedantic
1745 -Wincompatible-library-redeclaration
1746 -Wincompatible-pointer-types-discards-qualifiers
1747 -Wincomplete-implementation
1749 -Wincomplete-umbrella
1752 -Wint-to-void-pointer-cast
1758 -Winvalid-source-encoding
1759 -Winvalid-token-paste
1760 -Wknr-promoted-parameter
1761 -Wlanguage-extension-token
1762 -Wlarge-by-value-copy
1763 -Wliteral-conversion
1765 -Wlocal-type-template-args
1769 -Wmalformed-warning-check
1773 -Wmismatched-parameter-types
1774 -Wmismatched-return-types
1775 -Wmissing-field-initializers
1776 -Wmissing-format-attribute
1778 -Wmissing-selector-name
1780 -Wmissing-variable-declarations
1784 -Wnon-literal-null-conversion
1786 -Wnonportable-cfstrings
1792 -Wout-of-line-declaration
1794 -Woverlength-strings
1796 -Woverriding-method-mismatch
1797 -Wpointer-type-mismatch
1798 -Wpredefined-identifier-outside-function
1799 -Wprotocol-property-synthesis-ambiguity
1800 -Wreadonly-iboutlet-property
1801 -Wreadonly-setter-attrs
1803 -Wreceiver-forward-class
1805 -Wreinterpret-base-class
1806 -Wrequires-super-attribute
1807 -Wreserved-user-defined-literal
1808 -Wreturn-stack-address
1810 -Wselector-type-mismatch
1812 -Wserialized-diagnostics
1814 -Wshift-count-negative
1815 -Wshift-count-overflow
1816 -Wshift-negative-value
1818 -Wshift-sign-overflow
1820 -Wsizeof-array-argument
1821 -Wsource-uses-openmp
1824 -Wstatic-local-in-inline
1828 -Wstrlcpy-strlcat-size
1830 -Wsuggest-attribute=format
1831 -Wsuggest-attribute=noreturn
1832 -Wsuper-class-method-mismatch
1835 -Wtautological-constant-out-of-range-compare
1836 -Wtentative-definition-incomplete-type
1838 -Wthread-safety-analysis
1839 -Wthread-safety-attributes
1840 -Wthread-safety-beta
1841 -Wthread-safety-precise
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 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1876 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1877 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1878 CFLAGS="$CFLAGS -Wwrite-strings"
1879 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1880 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
1881 CFLAGS="$CFLAGS -Wunused-parameter "
1882 # These interfere with building main() { return 0; }, which autoconf
1883 # likes to use as its default program.
1884 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
1886 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
1887 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
1889 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
1890 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
1893 if test "x$enable_fatal_warnings" = "xyes"; then
1894 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
1895 # default autoconf programs are full of errors.
1896 CFLAGS="$CFLAGS -Werror"
1901 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
1904 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.])
1908 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1913 contrib/dist/suse/tor.sh
1914 contrib/operator-tools/tor.logrotate
1917 contrib/dist/tor.service
1918 src/config/torrc.sample
1919 src/config/torrc.minimal
1920 scripts/maint/checkOptionDocs.pl
1921 scripts/maint/updateVersions.pl
1924 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
1925 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1926 for file in $regular_mans ; do
1927 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1928 echo "==================================";
1930 echo "Building Tor has failed since manpages cannot be built.";
1932 echo "You need asciidoc installed to be able to build the manpages.";
1933 echo "To build without manpages, use the --disable-asciidoc argument";
1934 echo "when calling configure.";
1936 echo "==================================";