1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2017, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
7 AC_INIT([tor],[0.3.3.10-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 -Wall -Werror])
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]))
52 AC_ARG_ENABLE(libfuzzer,
53 AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer']))
54 AC_ARG_ENABLE(oss-fuzz,
55 AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment]))
56 AC_ARG_ENABLE(memory-sentinels,
57 AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.]))
59 AS_HELP_STRING(--enable-rust, [enable rust integration]))
60 AC_ARG_ENABLE(cargo-online-mode,
61 AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.]))
62 AC_ARG_ENABLE(restart-debugging,
63 AS_HELP_STRING(--enable-restart-debugging, [Build Tor with support for debugging in-process restart. Developers only.]))
65 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
66 AC_MSG_ERROR([Can't disable assertions outside of coverage build])
69 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
70 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
71 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
72 AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
73 AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
74 AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
76 if test "$enable_static_tor" = "yes"; then
77 enable_static_libevent="yes";
78 enable_static_openssl="yes";
79 enable_static_zlib="yes";
80 CFLAGS="$CFLAGS -static"
83 if test "$enable_system_torrc" = "no"; then
84 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
85 [Defined if we're not going to look for a torrc in SYSCONF])
88 if test "$enable_memory_sentinels" = "no"; then
89 AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
90 [Defined if we're turning off memory safety code to look for bugs])
93 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
95 AC_ARG_ENABLE(asciidoc,
96 AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
97 [case "${enableval}" in
98 "yes") asciidoc=true ;;
99 "no") asciidoc=false ;;
100 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
101 esac], [asciidoc=true])
103 # systemd notify support
104 AC_ARG_ENABLE(systemd,
105 AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
106 [case "${enableval}" in
107 "yes") systemd=true ;;
108 "no") systemd=false ;;
109 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
110 esac], [systemd=auto])
112 if test "$enable_restart_debugging" = "yes"; then
113 AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
114 [Defined if we're building with support for in-process restart debugging.])
119 if test "x$enable_systemd" = "xno"; then
122 PKG_CHECK_MODULES(SYSTEMD,
126 if test "x$have_systemd" = "xno"; then
127 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
128 PKG_CHECK_MODULES(SYSTEMD,
135 if test "x$have_systemd" = "xyes"; then
136 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
137 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
138 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
139 PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
140 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
142 AC_SUBST(TOR_SYSTEMD_CFLAGS)
143 AC_SUBST(TOR_SYSTEMD_LIBS)
145 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
146 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
151 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
155 AC_ARG_ENABLE(gcc-warnings,
156 AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
157 AC_ARG_ENABLE(fatal-warnings,
158 AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
159 AC_ARG_ENABLE(gcc-warnings-advisory,
160 AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
162 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
163 AC_ARG_ENABLE(gcc-hardening,
164 AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
166 dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
167 AC_ARG_ENABLE(expensive-hardening,
168 AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
169 AC_ARG_ENABLE(fragile-hardening,
170 AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
171 if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
172 fragile_hardening="yes"
175 dnl Linker hardening options
176 dnl Currently these options are ELF specific - you can't use this with MacOSX
177 AC_ARG_ENABLE(linker-hardening,
178 AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
180 AC_ARG_ENABLE(local-appdata,
181 AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
182 if test "$enable_local_appdata" = "yes"; then
183 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
184 [Defined if we default to host local appdata paths on Windows])
188 AC_ARG_ENABLE(tor2web-mode,
189 AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
190 [if test "x$enableval" = "xyes"; then
191 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
194 AC_ARG_ENABLE(tool-name-check,
195 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
197 AC_ARG_ENABLE(seccomp,
198 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
200 AC_ARG_ENABLE(libscrypt,
201 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
203 dnl Enable event tracing which are transformed to debug log statement.
204 AC_ARG_ENABLE(event-tracing-debug,
205 AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log]))
206 AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"])
208 if test x$enable_event_tracing_debug = xyes; then
209 AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug])
210 AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation])
213 dnl Enable Android only features.
214 AC_ARG_ENABLE(android,
215 AS_HELP_STRING(--enable-android, [build with Android features enabled]))
216 AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])
218 if test "x$enable_android" = "xyes"; then
219 AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])
221 dnl Check if the Android log library is available.
222 AC_CHECK_HEADERS([android/log.h])
223 AC_SEARCH_LIBS(__android_log_write, [log])
227 dnl check for the correct "ar" when cross-compiling.
228 dnl (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
229 dnl so kludge up a replacement for the case where it isn't there yet.)
230 m4_ifdef([AM_PROG_AR],
232 [AN_MAKEVAR([AR], [AC_PROG_AR])
233 AN_PROGRAM([ar], [AC_PROG_AR])
234 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
237 dnl Check whether the above macro has settled for a simply named tool even
238 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
239 dnl because that will find any cc on the system, not only the cross-compiler,
240 dnl and then verify that a binary built with this compiler runs on the
241 dnl build system. It will then come to the false conclusion that we're not
243 if test "x$enable_tool_name_check" != "xno"; then
244 if test "x$ac_tool_warned" = "xyes"; then
245 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.)])
246 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
247 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.)])
257 AC_ARG_VAR([PERL], [path to Perl binary])
258 AC_CHECK_PROGS([PERL], [perl])
259 AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
261 dnl check for asciidoc and a2x
262 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
263 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
265 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
270 AC_ARG_VAR([PYTHON], [path to Python binary])
271 AC_CHECK_PROGS(PYTHON, [ \
273 python3.8 python3.7 python3.6 python3.5 python3.4 \
276 if test "x$PYTHON" = "x"; then
277 AC_MSG_WARN([Python unavailable; some tests will not be run.])
279 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
281 dnl List all external rust crates we depend on here. Include the version
282 rust_crates="libc-0.2.39"
283 AC_SUBST(rust_crates)
285 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
286 AC_C_FLEXIBLE_ARRAY_MEMBER
288 dnl Maybe we've got an old autoconf...
289 AC_CACHE_CHECK([for flexible array members],
293 struct abc { int a; char b[]; };
295 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
298 [tor_cv_c_flexarray=yes],
299 [tor_cv_c_flexarray=no])])
300 if test "$tor_cv_flexarray" = "yes"; then
301 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
303 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
307 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
310 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
311 [tor_cv_c_c99_decl=yes],
312 [tor_cv_c_c99_decl=no] )])
313 if test "$tor_cv_c_c99_decl" != "yes"; then
314 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
317 AC_CACHE_CHECK([for working C99 designated initializers],
318 tor_cv_c_c99_designated_init,
320 [AC_LANG_PROGRAM([struct s { int a; int b; };],
321 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
322 [tor_cv_c_c99_designated_init=yes],
323 [tor_cv_c_c99_designated_init=no] )])
325 if test "$tor_cv_c_c99_designated_init" != "yes"; then
326 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
330 AC_ARG_WITH(tor-user,
331 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
339 AC_ARG_WITH(tor-group,
340 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
348 dnl If _WIN32 is defined and non-zero, we are building for win32
349 AC_MSG_CHECKING([for win32])
350 AC_RUN_IFELSE([AC_LANG_SOURCE([
351 int main(int c, char **v) {
362 bwin32=true; AC_MSG_RESULT([yes]),
363 bwin32=false; AC_MSG_RESULT([no]),
364 bwin32=cross; AC_MSG_RESULT([cross])
367 if test "$bwin32" = "cross"; then
368 AC_MSG_CHECKING([for win32 (cross)])
369 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
371 int main(int c, char **v) {return 0;}
374 int main(int c, char **v) {return x(y);}
377 bwin32=true; AC_MSG_RESULT([yes]),
378 bwin32=false; AC_MSG_RESULT([no]))
383 /* Defined to access windows functions and definitions for >=WinXP */
385 # define WINVER 0x0501
388 /* Defined to access _other_ windows functions and definitions for >=WinXP */
389 # ifndef _WIN32_WINNT
390 # define _WIN32_WINNT 0x0501
393 /* Defined to avoid including some windows headers as part of Windows.h */
394 # ifndef WIN32_LEAN_AND_MEAN
395 # define WIN32_LEAN_AND_MEAN 1
401 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
402 AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
404 dnl Enable C99 when compiling with MIPSpro
405 AC_MSG_CHECKING([for MIPSpro compiler])
406 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
407 #if (defined(__sgi) && defined(_COMPILER_VERSION))
412 bmipspro=false; AC_MSG_RESULT(no),
413 bmipspro=true; AC_MSG_RESULT(yes))
415 if test "$bmipspro" = "true"; then
416 CFLAGS="$CFLAGS -c99"
421 if test "x$enable_rust" = "xyes"; then
422 AC_ARG_VAR([RUSTC], [path to the rustc binary])
423 AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
424 if test "x$RUSTC" = "xno"; then
425 AC_MSG_ERROR([rustc unavailable but rust integration requested.])
428 AC_ARG_VAR([CARGO], [path to the cargo binary])
429 AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
430 if test "x$CARGO" = "xno"; then
431 AC_MSG_ERROR([cargo unavailable but rust integration requested.])
434 AC_DEFINE([HAVE_RUST], 1, [have Rust])
435 if test "x$enable_cargo_online_mode" = "xyes"; then
439 CARGO_ONLINE=--frozen
442 dnl When we're not allowed to touch the network, we need crate dependencies
443 dnl locally available.
444 AC_MSG_CHECKING([rust crate dependencies])
445 AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
446 if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
447 TOR_RUST_DEPENDENCIES="${srcdir}/src/ext/rust/crates"
449 dnl Check whether the path exists before we try to cd into it.
450 if test ! -d "$TOR_RUST_DEPENDENCIES"; then
451 AC_MSG_ERROR([Rust dependency directory $TOR_RUST_DEPENDENCIES does not exist. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
454 dnl Make the path absolute, since we'll be using it from within a
456 TOR_RUST_DEPENDENCIES=$(cd "$TOR_RUST_DEPENDENCIES" ; pwd)
458 for dep in $rust_crates; do
459 if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
460 AC_MSG_ERROR([Failure to find rust dependency $TOR_RUST_DEPENDENCIES/$dep. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
464 if test "x$ERRORED" = "x"; then
469 dnl This is a workaround for #46797
470 dnl (a.k.a https://github.com/rust-lang/rust/issues/46797 ). Once the
471 dnl upstream bug is fixed, we can remove this workaround.
474 TOR_RUST_EXTRA_LIBS="-lresolv"
478 dnl For now both MSVC and MinGW rust libraries will output static libs with
479 dnl the MSVC naming convention.
480 if test "$bwin32" = "true"; then
481 TOR_RUST_STATIC_NAME=tor_rust.lib
483 TOR_RUST_STATIC_NAME=libtor_rust.a
486 AC_SUBST(TOR_RUST_STATIC_NAME)
487 AC_SUBST(CARGO_ONLINE)
490 dnl Let's check the rustc version, too
491 AC_MSG_CHECKING([rust version])
492 RUSTC_VERSION=`$RUSTC --version`
493 RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
494 RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
495 if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
496 AC_MSG_ERROR([rustc version couldn't be identified])
498 if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 14; then
499 AC_MSG_ERROR([rustc must be at least version 1.14])
501 AC_MSG_RESULT([$RUSTC_VERSION])
504 AC_SUBST(TOR_RUST_EXTRA_LIBS)
506 AC_SEARCH_LIBS(socket, [socket network])
507 AC_SEARCH_LIBS(gethostbyname, [nsl])
508 AC_SEARCH_LIBS(dlopen, [dl])
509 AC_SEARCH_LIBS(inet_aton, [resolv])
510 AC_SEARCH_LIBS(backtrace, [execinfo])
512 AC_SEARCH_LIBS([clock_gettime], [rt])
513 if test "$LIBS" != "$saved_LIBS"; then
514 # Looks like we need -lrt for clock_gettime().
518 if test "$bwin32" = "false"; then
519 AC_SEARCH_LIBS(pthread_create, [pthread])
520 AC_SEARCH_LIBS(pthread_detach, [pthread])
523 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
524 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
528 RtlSecureZeroMemory \
532 backtrace_symbols_fd \
538 get_current_dir_name \
545 gnu_get_libc_version \
578 # Apple messed up when they added some functions: they
579 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
582 # We should only probe for these functions if we are sure that we
583 # are not targeting OS X 10.9 or earlier.
584 AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
585 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
587 # include <AvailabilityMacros.h>
588 # ifndef MAC_OS_X_VERSION_10_10
589 # define MAC_OS_X_VERSION_10_10 101000
591 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
592 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
593 # error "Running on Mac OS X 10.9 or earlier"
598 [on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
599 [on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])
601 if test "$on_macos_pre_10_10" = "no"; then
603 mach_approximate_time \
607 # We should only probe for these functions if we are sure that we
608 # are not targeting OSX 10.11 or earlier.
609 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
610 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
612 # include <AvailabilityMacros.h>
613 # ifndef MAC_OS_X_VERSION_10_12
614 # define MAC_OS_X_VERSION_10_12 101200
616 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
617 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
618 # error "Running on Mac OSX 10.11 or earlier"
623 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
624 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
626 if test "$on_macos_pre_10_12" = "no"; then
633 if test "$bwin32" != "true"; then
634 AC_CHECK_HEADERS(pthread.h)
635 AC_CHECK_FUNCS(pthread_create)
636 AC_CHECK_FUNCS(pthread_condattr_setclock)
639 if test "$bwin32" = "true"; then
640 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
647 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
648 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
650 dnl ------------------------------------------------------
651 dnl Where do you live, libevent? And how do we call you?
653 if test "$bwin32" = "true"; then
654 TOR_LIB_WS32=-lws2_32
655 TOR_LIB_IPHLPAPI=-liphlpapi
656 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
657 # think it's actually necessary.
659 TOR_LIB_USERENV=-luserenv
665 AC_SUBST(TOR_LIB_WS32)
666 AC_SUBST(TOR_LIB_GDI)
667 AC_SUBST(TOR_LIB_IPHLPAPI)
668 AC_SUBST(TOR_LIB_USERENV)
670 tor_libevent_pkg_redhat="libevent"
671 tor_libevent_pkg_debian="libevent-dev"
672 tor_libevent_devpkg_redhat="libevent-devel"
673 tor_libevent_devpkg_debian="libevent-dev"
675 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
676 dnl linking for static builds.
677 STATIC_LIBEVENT_FLAGS=""
678 if test "$enable_static_libevent" = "yes"; then
679 if test "$have_rt" = "yes"; then
680 STATIC_LIBEVENT_FLAGS=" -lrt "
684 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
686 #include <winsock2.h>
688 #include <sys/time.h>
689 #include <sys/types.h>
690 #include <event2/event.h>], [
692 #include <winsock2.h>
695 struct event_base *event_base_new(void);
696 void event_base_free(struct event_base *);],
699 {WSADATA d; WSAStartup(0x101,&d); }
701 event_base_free(event_base_new());
702 ], [--with-libevent-dir], [/opt/libevent])
704 dnl Determine the incantation needed to link libevent.
706 save_LDFLAGS="$LDFLAGS"
707 save_CPPFLAGS="$CPPFLAGS"
709 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
710 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
711 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
713 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
715 if test "$enable_static_libevent" = "yes"; then
716 if test "$tor_cv_library_libevent_dir" = "(system)"; then
717 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
719 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
722 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
723 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
724 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"))
726 if test "$ac_cv_search_event_new" != "none required"; then
727 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
729 if test "$ac_cv_search_evdns_base_new" != "none required"; then
730 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
733 AC_MSG_ERROR("libevent2 is required but the headers could not be found")
737 dnl Now check for particular libevent functions.
738 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
739 evutil_secure_rng_add_bytes \
743 LDFLAGS="$save_LDFLAGS"
744 CPPFLAGS="$save_CPPFLAGS"
746 dnl Check that libevent is at least at version 2.0.10, the first stable
747 dnl release of its series
748 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
749 AC_MSG_CHECKING([whether Libevent is new enough])
750 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
751 #include <event2/event.h>
752 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
758 ])], [ AC_MSG_RESULT([yes]) ],
759 [ AC_MSG_RESULT([no])
760 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
763 LDFLAGS="$save_LDFLAGS"
764 CPPFLAGS="$save_CPPFLAGS"
766 AC_SUBST(TOR_LIBEVENT_LIBS)
768 dnl ------------------------------------------------------
769 dnl Where do you live, libm?
771 dnl On some platforms (Haiku/BeOS) the math library is
772 dnl part of libroot. In which case don't link against lm
775 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
776 if test "$ac_cv_search_pow" != "none required"; then
777 TOR_LIB_MATH="$ac_cv_search_pow"
780 AC_SUBST(TOR_LIB_MATH)
782 dnl ------------------------------------------------------
783 dnl Where do you live, openssl? And how do we call you?
785 tor_openssl_pkg_redhat="openssl"
786 tor_openssl_pkg_debian="libssl-dev"
787 tor_openssl_devpkg_redhat="openssl-devel"
788 tor_openssl_devpkg_debian="libssl-dev"
790 ALT_openssl_WITHVAL=""
792 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
794 if test "x$withval" != "xno" && test "x$withval" != "x"; then
795 ALT_openssl_WITHVAL="$withval"
799 AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
800 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
801 [#include <openssl/ssl.h>],
802 [struct ssl_method_st; const struct ssl_method_st *TLSv1_1_method(void);],
803 [TLSv1_1_method();], [],
804 [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
806 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
808 if test "$enable_static_openssl" = "yes"; then
809 if test "$tor_cv_library_openssl_dir" = "(system)"; then
810 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
812 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
815 TOR_OPENSSL_LIBS="-lssl -lcrypto"
817 AC_SUBST(TOR_OPENSSL_LIBS)
819 dnl Now check for particular openssl functions.
821 save_LDFLAGS="$LDFLAGS"
822 save_CPPFLAGS="$CPPFLAGS"
823 LIBS="$TOR_OPENSSL_LIBS $LIBS"
824 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
825 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
827 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
828 #include <openssl/opensslv.h>
829 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
834 [ AC_MSG_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.]) ])
836 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
837 #include <openssl/opensslv.h>
838 #include <openssl/evp.h>
839 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
842 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
843 #error "curves unavailable"
847 [ AC_MSG_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.]) ])
849 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
850 [#include <openssl/ssl.h>
854 SSL_SESSION_get_master_key \
855 SSL_get_server_random \
856 SSL_get_client_ciphers \
857 SSL_get_client_random \
859 SSL_CTX_set_security_level \
863 dnl Check if OpenSSL has scrypt implementation.
864 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
866 dnl Check if OpenSSL structures are opaque
867 AC_CHECK_MEMBERS([SSL.state], , ,
868 [#include <openssl/ssl.h>
871 dnl Define the set of checks for KIST scheduler support.
872 AC_DEFUN([CHECK_KIST_SUPPORT],[
873 dnl KIST needs struct tcp_info and for certain members to exist.
875 [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
876 , ,[[#include <netinet/tcp.h>]])
877 dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
878 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
879 #include <linux/sockios.h>
883 ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
884 if test "x$have_siocoutqnsd" = "xyes"; then
885 if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
886 if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
887 have_kist_support=yes
892 dnl Now, trigger the check.
894 AS_IF([test "x$have_kist_support" = "xyes"],
895 [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
897 [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
900 LDFLAGS="$save_LDFLAGS"
901 CPPFLAGS="$save_CPPFLAGS"
903 dnl ------------------------------------------------------
904 dnl Where do you live, zlib? And how do we call you?
906 tor_zlib_pkg_redhat="zlib"
907 tor_zlib_pkg_debian="zlib1g"
908 tor_zlib_devpkg_redhat="zlib-devel"
909 tor_zlib_devpkg_debian="zlib1g-dev"
911 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
913 [const char * zlibVersion(void);],
914 [zlibVersion();], [--with-zlib-dir],
917 if test "$enable_static_zlib" = "yes"; then
918 if test "$tor_cv_library_zlib_dir" = "(system)"; then
919 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
920 using --enable-static-zlib")
922 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
927 AC_SUBST(TOR_ZLIB_LIBS)
929 dnl ------------------------------------------------------
930 dnl Where we do we find lzma?
933 AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
934 [case "${enableval}" in
937 * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
940 if test "x$enable_lzma" = "xno"; then
943 PKG_CHECK_MODULES([LZMA],
948 if test "x$have_lzma" = "xno" ; then
949 AC_MSG_WARN([Unable to find liblzma.])
953 if test "x$have_lzma" = "xyes"; then
954 AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
955 TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
956 TOR_LZMA_LIBS="${LZMA_LIBS}"
958 AC_SUBST(TOR_LZMA_CFLAGS)
959 AC_SUBST(TOR_LZMA_LIBS)
961 dnl ------------------------------------------------------
962 dnl Where we do we find zstd?
965 AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
966 [case "${enableval}" in
969 * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
972 if test "x$enable_zstd" = "xno"; then
975 PKG_CHECK_MODULES([ZSTD],
980 if test "x$have_zstd" = "xno" ; then
981 AC_MSG_WARN([Unable to find libzstd.])
985 if test "x$have_zstd" = "xyes"; then
986 AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
987 TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
988 TOR_ZSTD_LIBS="${ZSTD_LIBS}"
990 AC_SUBST(TOR_ZSTD_CFLAGS)
991 AC_SUBST(TOR_ZSTD_LIBS)
993 dnl ----------------------------------------------------------------------
994 dnl Check if libcap is available for capabilities.
996 tor_cap_pkg_debian="libcap2"
997 tor_cap_pkg_redhat="libcap"
998 tor_cap_devpkg_debian="libcap-dev"
999 tor_cap_devpkg_redhat="libcap-devel"
1001 AC_CHECK_LIB([cap], [cap_init], [],
1002 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
1004 AC_CHECK_FUNCS(cap_set_proc)
1006 dnl ---------------------------------------------------------------------
1007 dnl Now that we know about our major libraries, we can check for compiler
1008 dnl and linker hardening options. We need to do this with the libraries known,
1009 dnl since sometimes the linker will like an option but not be willing to
1010 dnl use it with a build of a library.
1012 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1013 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_LIB_USERENV $TOR_CAP_LIBS"
1021 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1022 #if !defined(__clang__)
1024 #endif])], have_clang=yes, have_clang=no)
1026 if test "x$enable_gcc_hardening" != "xno"; then
1027 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1028 if test "x$have_clang" = "xyes"; then
1029 TOR_CHECK_CFLAGS(-Qunused-arguments)
1031 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1032 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1033 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1034 m4_ifdef([AS_VAR_IF],[
1035 AS_VAR_IF(can_compile, [yes],
1036 AS_VAR_IF(can_link, [yes],
1038 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.)]))
1040 AS_VAR_POPDEF([can_link])
1041 AS_VAR_POPDEF([can_compile])
1042 TOR_CHECK_CFLAGS(-Wstack-protector)
1043 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1044 if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1045 TOR_CHECK_CFLAGS(-fPIE)
1046 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1048 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1051 if test "$fragile_hardening" = "yes"; then
1052 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1053 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1054 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.])
1057 if test "$tor_cv_cflags__ftrapv" != "yes"; then
1058 AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1061 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1062 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1063 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.*, and with Clang you need libclang_rt.ubsan*])
1066 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1067 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1068 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.*, and with Clang you need libclang_rt.ubsan*])
1071 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1074 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1075 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1077 mulodi_fixes_ftrapv=no
1078 if test "$have_clang" = "yes"; then
1079 saved_CFLAGS="$CFLAGS"
1080 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1081 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1086 int main(int argc, char **argv)
1088 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1089 * (int64_t)atoi(argv[3]);
1092 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1093 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1094 if test "$ftrapv_can_link" = "no"; then
1095 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1100 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1104 int main(int argc, char **argv)
1106 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1107 * (int64_t)atoi(argv[3]);
1110 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1111 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1113 CFLAGS="$saved_CFLAGS"
1116 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1118 dnl These cflags add bunches of branches, and we haven't been able to
1119 dnl persuade ourselves that they're suitable for code that needs to be
1121 AC_SUBST(CFLAGS_BUGTRAP)
1122 dnl These cflags are variant ones sutable for code that needs to be
1124 AC_SUBST(CFLAGS_CONSTTIME)
1126 if test "x$enable_linker_hardening" != "xno"; then
1127 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1130 # For backtrace support
1131 TOR_CHECK_LDFLAGS(-rdynamic)
1133 dnl ------------------------------------------------------
1134 dnl Now see if we have a -fomit-frame-pointer compiler option.
1136 saved_CFLAGS="$CFLAGS"
1137 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1138 F_OMIT_FRAME_POINTER=''
1139 if test "$saved_CFLAGS" != "$CFLAGS"; then
1140 if test "$fragile_hardening" = "yes"; then
1141 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1144 CFLAGS="$saved_CFLAGS"
1145 AC_SUBST(F_OMIT_FRAME_POINTER)
1147 dnl ------------------------------------------------------
1148 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1149 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1150 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1152 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1154 dnl ============================================================
1155 dnl Check for libseccomp
1157 if test "x$enable_seccomp" != "xno"; then
1158 AC_CHECK_HEADERS([seccomp.h])
1159 AC_SEARCH_LIBS(seccomp_init, [seccomp])
1162 dnl ============================================================
1163 dnl Check for libscrypt
1165 if test "x$enable_libscrypt" != "xno"; then
1166 AC_CHECK_HEADERS([libscrypt.h])
1167 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1168 AC_CHECK_FUNCS([libscrypt_scrypt])
1171 dnl ============================================================
1172 dnl We need an implementation of curve25519.
1174 dnl set these defaults.
1175 build_curve25519_donna=no
1176 build_curve25519_donna_c64=no
1177 use_curve25519_donna=no
1178 use_curve25519_nacl=no
1181 dnl The best choice is using curve25519-donna-c64, but that requires
1183 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1184 tor_cv_can_use_curve25519_donna_c64,
1186 [AC_LANG_PROGRAM([dnl
1188 typedef unsigned uint128_t __attribute__((mode(TI)));
1189 int func(uint64_t a, uint64_t b) {
1190 uint128_t c = ((uint128_t)a) * b;
1191 int ok = ((uint64_t)(c>>96)) == 522859 &&
1192 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1193 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1194 (((uint64_t)(c))&0xffffffffL) == 0;
1198 int ok = func( ((uint64_t)2000000000) * 1000000000,
1199 ((uint64_t)1234567890) << 24);
1202 [tor_cv_can_use_curve25519_donna_c64=yes],
1203 [tor_cv_can_use_curve25519_donna_c64=no],
1205 [AC_LANG_PROGRAM([dnl
1207 typedef unsigned uint128_t __attribute__((mode(TI)));
1208 int func(uint64_t a, uint64_t b) {
1209 uint128_t c = ((uint128_t)a) * b;
1210 int ok = ((uint64_t)(c>>96)) == 522859 &&
1211 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1212 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1213 (((uint64_t)(c))&0xffffffffL) == 0;
1217 int ok = func( ((uint64_t)2000000000) * 1000000000,
1218 ((uint64_t)1234567890) << 24);
1221 [tor_cv_can_use_curve25519_donna_c64=cross],
1222 [tor_cv_can_use_curve25519_donna_c64=no])])])
1224 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1225 nacl/crypto_scalarmult_curve25519.h])
1227 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1228 tor_cv_can_use_curve25519_nacl,
1229 [tor_saved_LIBS="$LIBS"
1232 [AC_LANG_PROGRAM([dnl
1233 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1234 #include <crypto_scalarmult_curve25519.h>
1235 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1236 #include <nacl/crypto_scalarmult_curve25519.h>
1238 #ifdef crypto_scalarmult_curve25519_ref_BYTES
1239 #error Hey, this is the reference implementation! That's not fast.
1242 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1243 ])], [tor_cv_can_use_curve25519_nacl=yes],
1244 [tor_cv_can_use_curve25519_nacl=no])
1245 LIBS="$tor_saved_LIBS" ])
1247 dnl Okay, now we need to figure out which one to actually use. Fall back
1248 dnl to curve25519-donna.c
1250 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1251 build_curve25519_donna_c64=yes
1252 use_curve25519_donna=yes
1253 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1254 use_curve25519_nacl=yes
1255 CURVE25519_LIBS=-lnacl
1257 build_curve25519_donna=yes
1258 use_curve25519_donna=yes
1261 if test "x$use_curve25519_donna" = "xyes"; then
1262 AC_DEFINE(USE_CURVE25519_DONNA, 1,
1263 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1265 if test "x$use_curve25519_nacl" = "xyes"; then
1266 AC_DEFINE(USE_CURVE25519_NACL, 1,
1267 [Defined if we should use a curve25519 from nacl])
1269 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1270 test "x$build_curve25519_donna" = "xyes")
1271 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1272 test "x$build_curve25519_donna_c64" = "xyes")
1273 AC_SUBST(CURVE25519_LIBS)
1275 dnl Make sure to enable support for large off_t if available.
1278 AC_CHECK_HEADERS([assert.h \
1293 gnu/libc-version.h \
1333 AC_CHECK_HEADERS(sys/param.h)
1335 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1336 [#ifdef HAVE_SYS_TYPES_H
1337 #include <sys/types.h>
1339 #ifdef HAVE_SYS_SOCKET_H
1340 #include <sys/socket.h>
1342 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1343 [#ifdef HAVE_SYS_TYPES_H
1344 #include <sys/types.h>
1346 #ifdef HAVE_SYS_SOCKET_H
1347 #include <sys/socket.h>
1349 #ifdef HAVE_NET_IF_H
1352 #ifdef HAVE_NETINET_IN_H
1353 #include <netinet/in.h>
1356 AC_CHECK_HEADERS(linux/if.h,[],[],
1358 #ifdef HAVE_SYS_SOCKET_H
1359 #include <sys/socket.h>
1363 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1364 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1365 [#ifdef HAVE_SYS_TYPES_H
1366 #include <sys/types.h>
1368 #ifdef HAVE_SYS_SOCKET_H
1369 #include <sys/socket.h>
1371 #ifdef HAVE_LIMITS_H
1374 #ifdef HAVE_LINUX_TYPES_H
1375 #include <linux/types.h>
1377 #ifdef HAVE_NETINET_IN6_H
1378 #include <netinet/in6.h>
1380 #ifdef HAVE_NETINET_IN_H
1381 #include <netinet/in.h>
1384 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1385 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1386 [#ifdef HAVE_SYS_TYPES_H
1387 #include <sys/types.h>
1389 #ifdef HAVE_SYS_SOCKET_H
1390 #include <sys/socket.h>
1392 #ifdef HAVE_LIMITS_H
1395 #ifdef HAVE_LINUX_TYPES_H
1396 #include <linux/types.h>
1398 #ifdef HAVE_NETINET_IN6_H
1399 #include <netinet/in6.h>
1401 #ifdef HAVE_NETINET_IN_H
1402 #include <netinet/in.h>
1404 #ifdef HAVE_LINUX_IF_H
1405 #include <linux/if.h>
1409 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1412 if test "x$linux_netfilter_ipv4" = "x1"; then
1415 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1418 if test "x$transparent_ok" = "x1"; then
1419 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1421 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1424 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1425 [#ifdef HAVE_SYS_TYPES_H
1426 #include <sys/types.h>
1428 #ifdef HAVE_SYS_TIME_H
1429 #include <sys/time.h>
1432 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1435 AC_CHECK_SIZEOF(int8_t)
1436 AC_CHECK_SIZEOF(int16_t)
1437 AC_CHECK_SIZEOF(int32_t)
1438 AC_CHECK_SIZEOF(int64_t)
1439 AC_CHECK_SIZEOF(uint8_t)
1440 AC_CHECK_SIZEOF(uint16_t)
1441 AC_CHECK_SIZEOF(uint32_t)
1442 AC_CHECK_SIZEOF(uint64_t)
1443 AC_CHECK_SIZEOF(intptr_t)
1444 AC_CHECK_SIZEOF(uintptr_t)
1446 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1448 AC_CHECK_SIZEOF(char)
1449 AC_CHECK_SIZEOF(short)
1450 AC_CHECK_SIZEOF(int)
1451 AC_CHECK_SIZEOF(long)
1452 AC_CHECK_SIZEOF(long long)
1453 AC_CHECK_SIZEOF(__int64)
1454 AC_CHECK_SIZEOF(void *)
1455 AC_CHECK_SIZEOF(time_t)
1456 AC_CHECK_SIZEOF(size_t)
1457 AC_CHECK_SIZEOF(pid_t)
1459 AC_CHECK_TYPES([uint, u_char, ssize_t])
1461 AC_PC_FROM_UCONTEXT([:])
1463 dnl used to include sockaddr_storage, but everybody has that.
1464 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1465 [#ifdef HAVE_SYS_TYPES_H
1466 #include <sys/types.h>
1468 #ifdef HAVE_NETINET_IN_H
1469 #include <netinet/in.h>
1471 #ifdef HAVE_NETINET_IN6_H
1472 #include <netinet/in6.h>
1474 #ifdef HAVE_SYS_SOCKET_H
1475 #include <sys/socket.h>
1478 #define _WIN32_WINNT 0x0501
1479 #define WIN32_LEAN_AND_MEAN
1480 #include <winsock2.h>
1481 #include <ws2tcpip.h>
1484 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1485 [#ifdef HAVE_SYS_TYPES_H
1486 #include <sys/types.h>
1488 #ifdef HAVE_NETINET_IN_H
1489 #include <netinet/in.h>
1491 #ifdef HAVE_NETINET_IN6_H
1492 #include <netinet/in6.h>
1494 #ifdef HAVE_SYS_SOCKET_H
1495 #include <sys/socket.h>
1498 #define _WIN32_WINNT 0x0501
1499 #define WIN32_LEAN_AND_MEAN
1500 #include <winsock2.h>
1501 #include <ws2tcpip.h>
1505 AC_CHECK_TYPES([rlim_t], , ,
1506 [#ifdef HAVE_SYS_TYPES_H
1507 #include <sys/types.h>
1509 #ifdef HAVE_SYS_TIME_H
1510 #include <sys/time.h>
1512 #ifdef HAVE_SYS_RESOURCE_H
1513 #include <sys/resource.h>
1517 AX_CHECK_SIGN([time_t],
1520 #ifdef HAVE_SYS_TYPES_H
1521 #include <sys/types.h>
1523 #ifdef HAVE_SYS_TIME_H
1524 #include <sys/time.h>
1531 if test "$ax_cv_decl_time_t_signed" = "no"; then
1532 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1535 AX_CHECK_SIGN([size_t],
1536 [ tor_cv_size_t_signed=yes ],
1537 [ tor_cv_size_t_signed=no ], [
1538 #ifdef HAVE_SYS_TYPES_H
1539 #include <sys/types.h>
1543 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1544 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1547 AX_CHECK_SIGN([enum always],
1548 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1550 enum always { AAA, BBB, CCC };
1553 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1554 #ifdef HAVE_SYS_SOCKET_H
1555 #include <sys/socket.h>
1559 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1561 AC_CHECK_SIZEOF(cell_t)
1563 # Let's see if stdatomic works. (There are some debian clangs that screw it
1564 # up; see Tor bug #26779 and debian bug 903709.)
1565 AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
1566 tor_cv_stdatomic_works,
1567 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1568 #include <stdatomic.h>
1569 struct x { atomic_size_t y; };
1570 void try_atomic_init(struct x *xx)
1572 atomic_init(&xx->y, 99);
1573 atomic_fetch_add(&xx->y, 1);
1575 ]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
1577 if test "$tor_cv_stdatomic_works" = "yes"; then
1578 AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
1579 elif test "$ac_cv_header_stdatomic_h" = "yes"; then
1580 AC_MSG_WARN([Your compiler provides the stdatomic.h header, but it doesn't seem to work. I'll pretend it isn't there. If you are using Clang on Debian, maybe this is because of https://bugs.debian.org/903709 ])
1583 # Now make sure that NULL can be represented as zero bytes.
1584 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1585 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1586 [[#include <stdlib.h>
1589 #ifdef HAVE_STDDEF_H
1592 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1593 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1594 [tor_cv_null_is_zero=yes],
1595 [tor_cv_null_is_zero=no],
1596 [tor_cv_null_is_zero=cross])])
1598 if test "$tor_cv_null_is_zero" = "cross"; then
1599 # Cross-compiling; let's hope that the target isn't raving mad.
1600 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1603 if test "$tor_cv_null_is_zero" != "no"; then
1604 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1605 [Define to 1 iff memset(0) sets pointers to NULL])
1608 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1609 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1610 [[#include <stdlib.h>
1613 #ifdef HAVE_STDDEF_H
1616 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1617 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1618 [tor_cv_dbl0_is_zero=yes],
1619 [tor_cv_dbl0_is_zero=no],
1620 [tor_cv_dbl0_is_zero=cross])])
1622 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1623 # Cross-compiling; let's hope that the target isn't raving mad.
1624 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1627 if test "$tor_cv_dbl0_is_zero" != "no"; then
1628 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1629 [Define to 1 iff memset(0) sets doubles to 0.0])
1632 # And what happens when we malloc zero?
1633 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1634 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1635 [[#include <stdlib.h>
1638 #ifdef HAVE_STDDEF_H
1641 int main () { return malloc(0)?0:1; }]])],
1642 [tor_cv_malloc_zero_works=yes],
1643 [tor_cv_malloc_zero_works=no],
1644 [tor_cv_malloc_zero_works=cross])])
1646 if test "$tor_cv_malloc_zero_works" = "cross"; then
1647 # Cross-compiling; let's hope that the target isn't raving mad.
1648 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1651 if test "$tor_cv_malloc_zero_works" = "yes"; then
1652 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1653 [Define to 1 iff malloc(0) returns a pointer])
1656 # whether we seem to be in a 2s-complement world.
1657 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1658 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1659 [[int main () { int problem = ((-99) != (~99)+1);
1660 return problem ? 1 : 0; }]])],
1661 [tor_cv_twos_complement=yes],
1662 [tor_cv_twos_complement=no],
1663 [tor_cv_twos_complement=cross])])
1665 if test "$tor_cv_twos_complement" = "cross"; then
1666 # Cross-compiling; let's hope that the target isn't raving mad.
1667 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1670 if test "$tor_cv_twos_complement" != "no"; then
1671 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1672 [Define to 1 iff we represent negative integers with
1676 # What does shifting a negative value do?
1677 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1678 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1679 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1680 [tor_cv_sign_extend=yes],
1681 [tor_cv_sign_extend=no],
1682 [tor_cv_sign_extend=cross])])
1684 if test "$tor_cv_sign_extend" = "cross"; then
1685 # Cross-compiling; let's hope that the target isn't raving mad.
1686 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1689 if test "$tor_cv_sign_extend" != "no"; then
1690 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1691 [Define to 1 iff right-shifting a negative value performs sign-extension])
1694 # Is uint8_t the same type as unsigned char?
1695 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
1696 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1699 unsigned char c;]])],
1700 [tor_cv_uint8_uchar=yes],
1701 [tor_cv_uint8_uchar=no],
1702 [tor_cv_uint8_uchar=cross])])
1704 if test "$tor_cv_uint8_uchar" = "cross"; then
1705 AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
1708 if test "$tor_cv_uint8_uchar" = "no"; then
1709 AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
1712 # Whether we should use the dmalloc memory allocation debugging library.
1713 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1714 AC_ARG_WITH(dmalloc,
1715 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1716 [if [[ "$withval" = "yes" ]]; then
1722 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1725 if [[ $dmalloc -eq 1 ]]; then
1726 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1727 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1728 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1729 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1732 AC_ARG_WITH(tcmalloc,
1733 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1734 [ tcmalloc=yes ], [ tcmalloc=no ])
1736 if test "x$tcmalloc" = "xyes"; then
1737 LDFLAGS="-ltcmalloc $LDFLAGS"
1740 using_custom_malloc=no
1741 if test "x$enable_openbsd_malloc" = "xyes"; then
1742 using_custom_malloc=yes
1744 if test "x$tcmalloc" = "xyes"; then
1745 using_custom_malloc=yes
1747 if test "$using_custom_malloc" = "no"; then
1748 AC_CHECK_FUNCS(mallinfo)
1750 if test "$using_custom_malloc" = "yes"; then
1751 # Tell the C compiler not to use the system allocator functions.
1752 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1755 # By default, we're going to assume we don't have mlockall()
1756 # bionic and other platforms have various broken mlockall subsystems.
1757 # Some systems don't have a working mlockall, some aren't linkable,
1758 # and some have it but don't declare it.
1759 AC_CHECK_FUNCS(mlockall)
1760 AC_CHECK_DECLS([mlockall], , , [
1761 #ifdef HAVE_SYS_MMAN_H
1762 #include <sys/mman.h>
1765 # Some MinGW environments don't have getpagesize in unistd.h. We don't use
1766 # AC_CHECK_FUNCS(getpagesize), because other environments rename getpagesize
1768 AC_CHECK_DECLS([getpagesize], , , [
1769 #ifdef HAVE_UNISTD_H
1773 # Allow user to specify an alternate syslog facility
1774 AC_ARG_WITH(syslog-facility,
1775 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1776 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1777 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1778 AC_SUBST(LOGFACILITY)
1780 # Check if we have getresuid and getresgid
1781 AC_CHECK_FUNCS(getresuid getresgid)
1783 # Check for gethostbyname_r in all its glorious incompatible versions.
1784 # (This logic is based on that in Python's configure.in)
1785 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1786 [Define this if you have any gethostbyname_r()])
1788 AC_CHECK_FUNC(gethostbyname_r, [
1789 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1791 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1792 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1796 struct hostent *h1, *h2;
1798 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1800 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1801 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1802 [Define this if gethostbyname_r takes 6 arguments])
1805 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1811 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1813 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1814 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1815 [Define this if gethostbyname_r takes 5 arguments])
1818 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1823 struct hostent_data hd;
1824 (void) gethostbyname_r(cp1,h1,&hd);
1826 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1827 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1828 [Define this if gethostbyname_r takes 3 arguments])
1838 AC_CACHE_CHECK([whether the C compiler supports __func__],
1839 tor_cv_have_func_macro,
1840 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1842 int main(int c, char **v) { puts(__func__); }])],
1843 tor_cv_have_func_macro=yes,
1844 tor_cv_have_func_macro=no))
1846 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1847 tor_cv_have_FUNC_macro,
1848 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1850 int main(int c, char **v) { puts(__FUNC__); }])],
1851 tor_cv_have_FUNC_macro=yes,
1852 tor_cv_have_FUNC_macro=no))
1854 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1855 tor_cv_have_FUNCTION_macro,
1856 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1858 int main(int c, char **v) { puts(__FUNCTION__); }])],
1859 tor_cv_have_FUNCTION_macro=yes,
1860 tor_cv_have_FUNCTION_macro=no))
1862 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1863 tor_cv_have_environ_declared,
1864 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1865 #ifdef HAVE_UNISTD_H
1869 int main(int c, char **v) { char **t = environ; }])],
1870 tor_cv_have_environ_declared=yes,
1871 tor_cv_have_environ_declared=no))
1873 if test "$tor_cv_have_func_macro" = "yes"; then
1874 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1877 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1878 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1881 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1882 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1883 [Defined if the compiler supports __FUNCTION__])
1886 if test "$tor_cv_have_environ_declared" = "yes"; then
1887 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1888 [Defined if we have extern char **environ already declared])
1891 # $prefix stores the value of the --prefix command line option, or
1892 # NONE if the option wasn't set. In the case that it wasn't set, make
1893 # it be the default, so that we can use it to expand directories now.
1894 if test "x$prefix" = "xNONE"; then
1895 prefix=$ac_default_prefix
1898 # and similarly for $exec_prefix
1899 if test "x$exec_prefix" = "xNONE"; then
1903 if test "x$BUILDDIR" = "x"; then
1907 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1908 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1910 if test "x$CONFDIR" = "x"; then
1911 CONFDIR=`eval echo $sysconfdir/tor`
1914 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1915 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1917 BINDIR=`eval echo $bindir`
1919 LOCALSTATEDIR=`eval echo $localstatedir`
1920 AC_SUBST(LOCALSTATEDIR)
1922 if test "$bwin32" = "true"; then
1923 # Test if the linker supports the --nxcompat and --dynamicbase options
1925 save_LDFLAGS="$LDFLAGS"
1926 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1927 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1928 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1929 [AC_MSG_RESULT([yes])]
1930 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1931 [AC_MSG_RESULT([no])]
1933 LDFLAGS="$save_LDFLAGS"
1936 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1937 # than autoconf's macros like.
1938 if test "$GCC" = "yes"; then
1939 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1940 # accident waiting to happen.
1941 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1943 # Override optimization level for non-gcc compilers
1945 enable_gcc_warnings=no
1946 enable_gcc_warnings_advisory=no
1949 # Warnings implies advisory-warnings and -Werror.
1950 if test "$enable_gcc_warnings" = "yes"; then
1951 enable_gcc_warnings_advisory=yes
1952 enable_fatal_warnings=yes
1955 # OS X Lion started deprecating the system openssl. Let's just disable
1956 # all deprecation warnings on OS X. Also, to potentially make the binary
1957 # a little smaller, let's enable dead_strip.
1961 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1962 LDFLAGS="$LDFLAGS -dead_strip" ;;
1965 # Add some more warnings which we use in development but not in the
1966 # released versions. (Some relevant gcc versions can't handle these.)
1968 # Note that we have to do this near the end of the autoconf process, or
1969 # else we may run into problems when these warnings hit on the testing C
1970 # programs that autoconf wants to build.
1971 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1974 *-*-openbsd* | *-*-bitrig*)
1975 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1976 # That's fine, except that the headers don't pass -Wredundant-decls.
1977 # Therefore, let's disable -Wsystem-headers when we're building
1978 # with maximal warnings on OpenBSD.
1979 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1982 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1983 # have it work better.
1984 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1986 # This warning was added in gcc 4.3, but it appears to generate
1987 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1988 #CFLAGS="$CFLAGS -Wlogical-op"
1990 m4_foreach_w([warning_flag], [
1992 -Waddress-of-array-temporary
1993 -Waddress-of-temporary
1995 -Wanonymous-pack-parens
1998 -Warc-bridge-casts-disallowed-in-nonarc
1999 -Warc-maybe-repeated-use-of-weak
2000 -Warc-performSelector-leaks
2001 -Warc-repeated-use-of-weak
2003 -Warray-bounds-pointer-arithmetic
2005 -Wasm-operand-widths
2007 -Watomic-property-with-user-defined-accessor
2009 -Wauto-storage-class
2012 -Wbackslash-newline-escape
2013 -Wbad-array-new-length
2014 -Wbind-to-temporary-copy
2015 -Wbitfield-constant-conversion
2018 -Wbuiltin-requires-header
2020 -Wcompare-distinct-pointer-types
2021 -Wcomplex-component-init
2022 -Wconditional-type-mismatch
2024 -Wconstant-conversion
2025 -Wconstant-logical-operand
2026 -Wconstexpr-not-const
2027 -Wcustom-atomic-properties
2029 -Wdangling-initializer-list
2031 -Wdelegating-ctor-cycles
2032 -Wdeprecated-implementations
2033 -Wdeprecated-register
2034 -Wdirect-ivar-access
2036 -Wdistributed-object-modifiers
2038 -Wdollar-in-identifier-extension
2040 -Wduplicate-decl-specifier
2042 -Wduplicate-method-arg
2043 -Wduplicate-method-match
2045 -Wdynamic-class-memaccess
2046 -Wembedded-directive
2047 -Wempty-translation-unit
2049 -Wexit-time-destructors
2050 -Wexplicit-ownership-type
2051 -Wextern-initializer
2055 -Wflexible-array-extensions
2058 -Wfour-char-constants
2060 -Wglobal-constructors
2061 -Wgnu-array-member-paren-init
2063 -Wgnu-static-float-init
2066 -Widiomatic-parentheses
2067 -Wignored-attributes
2068 -Wimplicit-atomic-properties
2069 -Wimplicit-conversion-floating-point-to-bool
2070 -Wimplicit-exception-spec-mismatch
2071 -Wimplicit-fallthrough
2072 -Wimplicit-fallthrough-per-function
2073 -Wimplicit-retain-self
2074 -Wimport-preprocessor-directive-pedantic
2075 -Wincompatible-library-redeclaration
2076 -Wincompatible-pointer-types-discards-qualifiers
2077 -Wincomplete-implementation
2079 -Wincomplete-umbrella
2082 -Wint-to-void-pointer-cast
2088 -Winvalid-source-encoding
2089 -Winvalid-token-paste
2090 -Wknr-promoted-parameter
2091 -Wlarge-by-value-copy
2092 -Wliteral-conversion
2094 -Wlocal-type-template-args
2098 -Wmalformed-warning-check
2102 -Wmismatched-parameter-types
2103 -Wmismatched-return-types
2104 -Wmissing-field-initializers
2105 -Wmissing-format-attribute
2107 -Wmissing-selector-name
2109 -Wmissing-variable-declarations
2113 -Wnon-literal-null-conversion
2115 -Wnonportable-cfstrings
2121 -Wout-of-line-declaration
2123 -Woverlength-strings
2125 -Woverriding-method-mismatch
2126 -Wpointer-type-mismatch
2127 -Wpredefined-identifier-outside-function
2128 -Wprotocol-property-synthesis-ambiguity
2129 -Wreadonly-iboutlet-property
2130 -Wreadonly-setter-attrs
2132 -Wreceiver-forward-class
2134 -Wreinterpret-base-class
2135 -Wrequires-super-attribute
2136 -Wreserved-user-defined-literal
2137 -Wreturn-stack-address
2139 -Wselector-type-mismatch
2141 -Wserialized-diagnostics
2143 -Wshift-count-negative
2144 -Wshift-count-overflow
2145 -Wshift-negative-value
2147 -Wshift-sign-overflow
2149 -Wsizeof-array-argument
2150 -Wsource-uses-openmp
2153 -Wstatic-local-in-inline
2157 -Wstrlcpy-strlcat-size
2159 -Wsuggest-attribute=format
2160 -Wsuggest-attribute=noreturn
2161 -Wsuper-class-method-mismatch
2164 -Wtautological-constant-out-of-range-compare
2165 -Wtentative-definition-incomplete-type
2168 -Wtypedef-redefinition
2171 -Wundefined-internal
2172 -Wundefined-reinterpret-cast
2174 -Wunicode-whitespace
2175 -Wunknown-warning-option
2176 -Wunnamed-type-template-args
2177 -Wunneeded-member-function
2179 -Wunsupported-visibility
2180 -Wunused-but-set-parameter
2181 -Wunused-but-set-variable
2182 -Wunused-command-line-argument
2183 -Wunused-const-variable=2
2184 -Wunused-exception-parameter
2185 -Wunused-local-typedefs
2186 -Wunused-member-function
2187 -Wunused-sanitize-argument
2188 -Wunused-volatile-lvalue
2189 -Wuser-defined-literals
2192 -Wvector-conversions
2197 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
2199 dnl We should re-enable this in some later version. Clang doesn't
2200 dnl mind, but it causes trouble with GCC.
2201 dnl -Wstrict-overflow=2
2203 dnl These seem to require annotations that we don't currently use,
2204 dnl and they give false positives in our pthreads wrappers. (Clang 4)
2206 dnl -Wthread-safety-analysis
2207 dnl -Wthread-safety-attributes
2208 dnl -Wthread-safety-beta
2209 dnl -Wthread-safety-precise
2211 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2212 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2213 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2214 CFLAGS="$CFLAGS -Wwrite-strings"
2215 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2216 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
2217 CFLAGS="$CFLAGS -Wunused-parameter "
2218 # These interfere with building main() { return 0; }, which autoconf
2219 # likes to use as its default program.
2220 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
2222 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2223 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2225 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2226 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2228 if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2229 AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2232 if test "x$enable_fatal_warnings" = "xyes"; then
2233 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2234 # default autoconf programs are full of errors.
2235 CFLAGS="$CFLAGS -Werror"
2240 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2243 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.])
2247 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2252 contrib/dist/suse/tor.sh
2253 contrib/operator-tools/tor.logrotate
2256 contrib/dist/tor.service
2257 src/config/torrc.sample
2258 src/config/torrc.minimal
2259 src/rust/.cargo/config
2260 scripts/maint/checkOptionDocs.pl
2261 scripts/maint/updateVersions.pl
2264 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2265 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
2266 for file in $regular_mans ; do
2267 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2268 echo "==================================";
2270 echo "Building Tor has failed since manpages cannot be built.";
2272 echo "You need asciidoc installed to be able to build the manpages.";
2273 echo "To build without manpages, use the --disable-asciidoc argument";
2274 echo "when calling configure.";
2276 echo "==================================";
2282 if test "$fragile_hardening" = "yes"; then
2286 Warning! Building Tor with --enable-fragile-hardening (also known as
2287 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2288 other kinds of attacks easier. A Tor instance build with this option will be
2289 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2290 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2291 denial of service attacks. For more information, see
2292 https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening