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.12])
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 \
858 SSL_CTX_set1_groups_list \
860 SSL_CTX_set_security_level \
864 dnl Check if OpenSSL has scrypt implementation.
865 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
867 dnl Check if OpenSSL structures are opaque
868 AC_CHECK_MEMBERS([SSL.state], , ,
869 [#include <openssl/ssl.h>
872 dnl Define the set of checks for KIST scheduler support.
873 AC_DEFUN([CHECK_KIST_SUPPORT],[
874 dnl KIST needs struct tcp_info and for certain members to exist.
876 [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
877 , ,[[#include <netinet/tcp.h>]])
878 dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
879 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
880 #include <linux/sockios.h>
884 ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
885 if test "x$have_siocoutqnsd" = "xyes"; then
886 if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
887 if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
888 have_kist_support=yes
893 dnl Now, trigger the check.
895 AS_IF([test "x$have_kist_support" = "xyes"],
896 [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
898 [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
901 LDFLAGS="$save_LDFLAGS"
902 CPPFLAGS="$save_CPPFLAGS"
904 dnl ------------------------------------------------------
905 dnl Where do you live, zlib? And how do we call you?
907 tor_zlib_pkg_redhat="zlib"
908 tor_zlib_pkg_debian="zlib1g"
909 tor_zlib_devpkg_redhat="zlib-devel"
910 tor_zlib_devpkg_debian="zlib1g-dev"
912 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
914 [const char * zlibVersion(void);],
915 [zlibVersion();], [--with-zlib-dir],
918 if test "$enable_static_zlib" = "yes"; then
919 if test "$tor_cv_library_zlib_dir" = "(system)"; then
920 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
921 using --enable-static-zlib")
923 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
928 AC_SUBST(TOR_ZLIB_LIBS)
930 dnl ------------------------------------------------------
931 dnl Where we do we find lzma?
934 AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
935 [case "${enableval}" in
938 * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
941 if test "x$enable_lzma" = "xno"; then
944 PKG_CHECK_MODULES([LZMA],
949 if test "x$have_lzma" = "xno" ; then
950 AC_MSG_WARN([Unable to find liblzma.])
954 if test "x$have_lzma" = "xyes"; then
955 AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
956 TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
957 TOR_LZMA_LIBS="${LZMA_LIBS}"
959 AC_SUBST(TOR_LZMA_CFLAGS)
960 AC_SUBST(TOR_LZMA_LIBS)
962 dnl ------------------------------------------------------
963 dnl Where we do we find zstd?
966 AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
967 [case "${enableval}" in
970 * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
973 if test "x$enable_zstd" = "xno"; then
976 PKG_CHECK_MODULES([ZSTD],
981 if test "x$have_zstd" = "xno" ; then
982 AC_MSG_WARN([Unable to find libzstd.])
986 if test "x$have_zstd" = "xyes"; then
987 AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
988 TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
989 TOR_ZSTD_LIBS="${ZSTD_LIBS}"
991 AC_SUBST(TOR_ZSTD_CFLAGS)
992 AC_SUBST(TOR_ZSTD_LIBS)
994 dnl ----------------------------------------------------------------------
995 dnl Check if libcap is available for capabilities.
997 tor_cap_pkg_debian="libcap2"
998 tor_cap_pkg_redhat="libcap"
999 tor_cap_devpkg_debian="libcap-dev"
1000 tor_cap_devpkg_redhat="libcap-devel"
1002 AC_CHECK_LIB([cap], [cap_init], [],
1003 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
1005 AC_CHECK_FUNCS(cap_set_proc)
1007 dnl ---------------------------------------------------------------------
1008 dnl Now that we know about our major libraries, we can check for compiler
1009 dnl and linker hardening options. We need to do this with the libraries known,
1010 dnl since sometimes the linker will like an option but not be willing to
1011 dnl use it with a build of a library.
1013 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1014 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"
1022 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1023 #if !defined(__clang__)
1025 #endif])], have_clang=yes, have_clang=no)
1027 if test "x$enable_gcc_hardening" != "xno"; then
1028 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1029 if test "x$have_clang" = "xyes"; then
1030 TOR_CHECK_CFLAGS(-Qunused-arguments)
1032 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1033 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1034 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1035 m4_ifdef([AS_VAR_IF],[
1036 AS_VAR_IF(can_compile, [yes],
1037 AS_VAR_IF(can_link, [yes],
1039 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.)]))
1041 AS_VAR_POPDEF([can_link])
1042 AS_VAR_POPDEF([can_compile])
1043 TOR_CHECK_CFLAGS(-Wstack-protector)
1044 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1045 if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1046 TOR_CHECK_CFLAGS(-fPIE)
1047 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1049 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1052 if test "$fragile_hardening" = "yes"; then
1053 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1054 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1055 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.])
1058 if test "$tor_cv_cflags__ftrapv" != "yes"; then
1059 AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1062 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1063 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1064 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*])
1067 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1068 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1069 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*])
1072 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1075 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1076 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1078 mulodi_fixes_ftrapv=no
1079 if test "$have_clang" = "yes"; then
1080 saved_CFLAGS="$CFLAGS"
1081 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1082 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1087 int main(int argc, char **argv)
1089 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1090 * (int64_t)atoi(argv[3]);
1093 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1094 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1095 if test "$ftrapv_can_link" = "no"; then
1096 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1101 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1105 int main(int argc, char **argv)
1107 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1108 * (int64_t)atoi(argv[3]);
1111 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1112 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1114 CFLAGS="$saved_CFLAGS"
1117 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1119 dnl These cflags add bunches of branches, and we haven't been able to
1120 dnl persuade ourselves that they're suitable for code that needs to be
1122 AC_SUBST(CFLAGS_BUGTRAP)
1123 dnl These cflags are variant ones sutable for code that needs to be
1125 AC_SUBST(CFLAGS_CONSTTIME)
1127 if test "x$enable_linker_hardening" != "xno"; then
1128 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1131 # For backtrace support
1132 TOR_CHECK_LDFLAGS(-rdynamic)
1134 dnl ------------------------------------------------------
1135 dnl Now see if we have a -fomit-frame-pointer compiler option.
1137 saved_CFLAGS="$CFLAGS"
1138 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1139 F_OMIT_FRAME_POINTER=''
1140 if test "$saved_CFLAGS" != "$CFLAGS"; then
1141 if test "$fragile_hardening" = "yes"; then
1142 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1145 CFLAGS="$saved_CFLAGS"
1146 AC_SUBST(F_OMIT_FRAME_POINTER)
1148 dnl ------------------------------------------------------
1149 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1150 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1151 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1153 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1155 dnl ============================================================
1156 dnl Check for libseccomp
1158 if test "x$enable_seccomp" != "xno"; then
1159 AC_CHECK_HEADERS([seccomp.h])
1160 AC_SEARCH_LIBS(seccomp_init, [seccomp])
1163 dnl ============================================================
1164 dnl Check for libscrypt
1166 if test "x$enable_libscrypt" != "xno"; then
1167 AC_CHECK_HEADERS([libscrypt.h])
1168 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1169 AC_CHECK_FUNCS([libscrypt_scrypt])
1172 dnl ============================================================
1173 dnl We need an implementation of curve25519.
1175 dnl set these defaults.
1176 build_curve25519_donna=no
1177 build_curve25519_donna_c64=no
1178 use_curve25519_donna=no
1179 use_curve25519_nacl=no
1182 dnl The best choice is using curve25519-donna-c64, but that requires
1184 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1185 tor_cv_can_use_curve25519_donna_c64,
1187 [AC_LANG_PROGRAM([dnl
1189 typedef unsigned uint128_t __attribute__((mode(TI)));
1190 int func(uint64_t a, uint64_t b) {
1191 uint128_t c = ((uint128_t)a) * b;
1192 int ok = ((uint64_t)(c>>96)) == 522859 &&
1193 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1194 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1195 (((uint64_t)(c))&0xffffffffL) == 0;
1199 int ok = func( ((uint64_t)2000000000) * 1000000000,
1200 ((uint64_t)1234567890) << 24);
1203 [tor_cv_can_use_curve25519_donna_c64=yes],
1204 [tor_cv_can_use_curve25519_donna_c64=no],
1206 [AC_LANG_PROGRAM([dnl
1208 typedef unsigned uint128_t __attribute__((mode(TI)));
1209 int func(uint64_t a, uint64_t b) {
1210 uint128_t c = ((uint128_t)a) * b;
1211 int ok = ((uint64_t)(c>>96)) == 522859 &&
1212 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1213 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1214 (((uint64_t)(c))&0xffffffffL) == 0;
1218 int ok = func( ((uint64_t)2000000000) * 1000000000,
1219 ((uint64_t)1234567890) << 24);
1222 [tor_cv_can_use_curve25519_donna_c64=cross],
1223 [tor_cv_can_use_curve25519_donna_c64=no])])])
1225 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1226 nacl/crypto_scalarmult_curve25519.h])
1228 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1229 tor_cv_can_use_curve25519_nacl,
1230 [tor_saved_LIBS="$LIBS"
1233 [AC_LANG_PROGRAM([dnl
1234 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1235 #include <crypto_scalarmult_curve25519.h>
1236 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1237 #include <nacl/crypto_scalarmult_curve25519.h>
1239 #ifdef crypto_scalarmult_curve25519_ref_BYTES
1240 #error Hey, this is the reference implementation! That's not fast.
1243 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1244 ])], [tor_cv_can_use_curve25519_nacl=yes],
1245 [tor_cv_can_use_curve25519_nacl=no])
1246 LIBS="$tor_saved_LIBS" ])
1248 dnl Okay, now we need to figure out which one to actually use. Fall back
1249 dnl to curve25519-donna.c
1251 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1252 build_curve25519_donna_c64=yes
1253 use_curve25519_donna=yes
1254 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1255 use_curve25519_nacl=yes
1256 CURVE25519_LIBS=-lnacl
1258 build_curve25519_donna=yes
1259 use_curve25519_donna=yes
1262 if test "x$use_curve25519_donna" = "xyes"; then
1263 AC_DEFINE(USE_CURVE25519_DONNA, 1,
1264 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1266 if test "x$use_curve25519_nacl" = "xyes"; then
1267 AC_DEFINE(USE_CURVE25519_NACL, 1,
1268 [Defined if we should use a curve25519 from nacl])
1270 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1271 test "x$build_curve25519_donna" = "xyes")
1272 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1273 test "x$build_curve25519_donna_c64" = "xyes")
1274 AC_SUBST(CURVE25519_LIBS)
1276 dnl Make sure to enable support for large off_t if available.
1279 AC_CHECK_HEADERS([assert.h \
1294 gnu/libc-version.h \
1334 AC_CHECK_HEADERS(sys/param.h)
1336 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1337 [#ifdef HAVE_SYS_TYPES_H
1338 #include <sys/types.h>
1340 #ifdef HAVE_SYS_SOCKET_H
1341 #include <sys/socket.h>
1343 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1344 [#ifdef HAVE_SYS_TYPES_H
1345 #include <sys/types.h>
1347 #ifdef HAVE_SYS_SOCKET_H
1348 #include <sys/socket.h>
1350 #ifdef HAVE_NET_IF_H
1353 #ifdef HAVE_NETINET_IN_H
1354 #include <netinet/in.h>
1357 AC_CHECK_HEADERS(linux/if.h,[],[],
1359 #ifdef HAVE_SYS_SOCKET_H
1360 #include <sys/socket.h>
1364 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1365 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1366 [#ifdef HAVE_SYS_TYPES_H
1367 #include <sys/types.h>
1369 #ifdef HAVE_SYS_SOCKET_H
1370 #include <sys/socket.h>
1372 #ifdef HAVE_LIMITS_H
1375 #ifdef HAVE_LINUX_TYPES_H
1376 #include <linux/types.h>
1378 #ifdef HAVE_NETINET_IN6_H
1379 #include <netinet/in6.h>
1381 #ifdef HAVE_NETINET_IN_H
1382 #include <netinet/in.h>
1385 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1386 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1387 [#ifdef HAVE_SYS_TYPES_H
1388 #include <sys/types.h>
1390 #ifdef HAVE_SYS_SOCKET_H
1391 #include <sys/socket.h>
1393 #ifdef HAVE_LIMITS_H
1396 #ifdef HAVE_LINUX_TYPES_H
1397 #include <linux/types.h>
1399 #ifdef HAVE_NETINET_IN6_H
1400 #include <netinet/in6.h>
1402 #ifdef HAVE_NETINET_IN_H
1403 #include <netinet/in.h>
1405 #ifdef HAVE_LINUX_IF_H
1406 #include <linux/if.h>
1410 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1413 if test "x$linux_netfilter_ipv4" = "x1"; then
1416 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1419 if test "x$transparent_ok" = "x1"; then
1420 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1422 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1425 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1426 [#ifdef HAVE_SYS_TYPES_H
1427 #include <sys/types.h>
1429 #ifdef HAVE_SYS_TIME_H
1430 #include <sys/time.h>
1433 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1436 AC_CHECK_SIZEOF(int8_t)
1437 AC_CHECK_SIZEOF(int16_t)
1438 AC_CHECK_SIZEOF(int32_t)
1439 AC_CHECK_SIZEOF(int64_t)
1440 AC_CHECK_SIZEOF(uint8_t)
1441 AC_CHECK_SIZEOF(uint16_t)
1442 AC_CHECK_SIZEOF(uint32_t)
1443 AC_CHECK_SIZEOF(uint64_t)
1444 AC_CHECK_SIZEOF(intptr_t)
1445 AC_CHECK_SIZEOF(uintptr_t)
1447 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1449 AC_CHECK_SIZEOF(char)
1450 AC_CHECK_SIZEOF(short)
1451 AC_CHECK_SIZEOF(int)
1452 AC_CHECK_SIZEOF(long)
1453 AC_CHECK_SIZEOF(long long)
1454 AC_CHECK_SIZEOF(__int64)
1455 AC_CHECK_SIZEOF(void *)
1456 AC_CHECK_SIZEOF(time_t)
1457 AC_CHECK_SIZEOF(size_t)
1458 AC_CHECK_SIZEOF(pid_t)
1460 AC_CHECK_TYPES([uint, u_char, ssize_t])
1462 AC_PC_FROM_UCONTEXT([:])
1464 dnl used to include sockaddr_storage, but everybody has that.
1465 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1466 [#ifdef HAVE_SYS_TYPES_H
1467 #include <sys/types.h>
1469 #ifdef HAVE_NETINET_IN_H
1470 #include <netinet/in.h>
1472 #ifdef HAVE_NETINET_IN6_H
1473 #include <netinet/in6.h>
1475 #ifdef HAVE_SYS_SOCKET_H
1476 #include <sys/socket.h>
1479 #define _WIN32_WINNT 0x0501
1480 #define WIN32_LEAN_AND_MEAN
1481 #include <winsock2.h>
1482 #include <ws2tcpip.h>
1485 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1486 [#ifdef HAVE_SYS_TYPES_H
1487 #include <sys/types.h>
1489 #ifdef HAVE_NETINET_IN_H
1490 #include <netinet/in.h>
1492 #ifdef HAVE_NETINET_IN6_H
1493 #include <netinet/in6.h>
1495 #ifdef HAVE_SYS_SOCKET_H
1496 #include <sys/socket.h>
1499 #define _WIN32_WINNT 0x0501
1500 #define WIN32_LEAN_AND_MEAN
1501 #include <winsock2.h>
1502 #include <ws2tcpip.h>
1506 AC_CHECK_TYPES([rlim_t], , ,
1507 [#ifdef HAVE_SYS_TYPES_H
1508 #include <sys/types.h>
1510 #ifdef HAVE_SYS_TIME_H
1511 #include <sys/time.h>
1513 #ifdef HAVE_SYS_RESOURCE_H
1514 #include <sys/resource.h>
1518 AX_CHECK_SIGN([time_t],
1521 #ifdef HAVE_SYS_TYPES_H
1522 #include <sys/types.h>
1524 #ifdef HAVE_SYS_TIME_H
1525 #include <sys/time.h>
1532 if test "$ax_cv_decl_time_t_signed" = "no"; then
1533 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1536 AX_CHECK_SIGN([size_t],
1537 [ tor_cv_size_t_signed=yes ],
1538 [ tor_cv_size_t_signed=no ], [
1539 #ifdef HAVE_SYS_TYPES_H
1540 #include <sys/types.h>
1544 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1545 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1548 AX_CHECK_SIGN([enum always],
1549 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1551 enum always { AAA, BBB, CCC };
1554 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1555 #ifdef HAVE_SYS_SOCKET_H
1556 #include <sys/socket.h>
1560 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1562 AC_CHECK_SIZEOF(cell_t)
1564 # Let's see if stdatomic works. (There are some debian clangs that screw it
1565 # up; see Tor bug #26779 and debian bug 903709.)
1566 AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
1567 tor_cv_stdatomic_works,
1568 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1569 #include <stdatomic.h>
1570 struct x { atomic_size_t y; };
1571 void try_atomic_init(struct x *xx)
1573 atomic_init(&xx->y, 99);
1574 atomic_fetch_add(&xx->y, 1);
1576 ]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
1578 if test "$tor_cv_stdatomic_works" = "yes"; then
1579 AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
1580 elif test "$ac_cv_header_stdatomic_h" = "yes"; then
1581 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 ])
1584 # Now make sure that NULL can be represented as zero bytes.
1585 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1586 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1587 [[#include <stdlib.h>
1590 #ifdef HAVE_STDDEF_H
1593 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1594 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1595 [tor_cv_null_is_zero=yes],
1596 [tor_cv_null_is_zero=no],
1597 [tor_cv_null_is_zero=cross])])
1599 if test "$tor_cv_null_is_zero" = "cross"; then
1600 # Cross-compiling; let's hope that the target isn't raving mad.
1601 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1604 if test "$tor_cv_null_is_zero" != "no"; then
1605 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1606 [Define to 1 iff memset(0) sets pointers to NULL])
1609 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1610 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1611 [[#include <stdlib.h>
1614 #ifdef HAVE_STDDEF_H
1617 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1618 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1619 [tor_cv_dbl0_is_zero=yes],
1620 [tor_cv_dbl0_is_zero=no],
1621 [tor_cv_dbl0_is_zero=cross])])
1623 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1624 # Cross-compiling; let's hope that the target isn't raving mad.
1625 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1628 if test "$tor_cv_dbl0_is_zero" != "no"; then
1629 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1630 [Define to 1 iff memset(0) sets doubles to 0.0])
1633 # And what happens when we malloc zero?
1634 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1635 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1636 [[#include <stdlib.h>
1639 #ifdef HAVE_STDDEF_H
1642 int main () { return malloc(0)?0:1; }]])],
1643 [tor_cv_malloc_zero_works=yes],
1644 [tor_cv_malloc_zero_works=no],
1645 [tor_cv_malloc_zero_works=cross])])
1647 if test "$tor_cv_malloc_zero_works" = "cross"; then
1648 # Cross-compiling; let's hope that the target isn't raving mad.
1649 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1652 if test "$tor_cv_malloc_zero_works" = "yes"; then
1653 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1654 [Define to 1 iff malloc(0) returns a pointer])
1657 # whether we seem to be in a 2s-complement world.
1658 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1659 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1660 [[int main () { int problem = ((-99) != (~99)+1);
1661 return problem ? 1 : 0; }]])],
1662 [tor_cv_twos_complement=yes],
1663 [tor_cv_twos_complement=no],
1664 [tor_cv_twos_complement=cross])])
1666 if test "$tor_cv_twos_complement" = "cross"; then
1667 # Cross-compiling; let's hope that the target isn't raving mad.
1668 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1671 if test "$tor_cv_twos_complement" != "no"; then
1672 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1673 [Define to 1 iff we represent negative integers with
1677 # What does shifting a negative value do?
1678 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1679 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1680 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1681 [tor_cv_sign_extend=yes],
1682 [tor_cv_sign_extend=no],
1683 [tor_cv_sign_extend=cross])])
1685 if test "$tor_cv_sign_extend" = "cross"; then
1686 # Cross-compiling; let's hope that the target isn't raving mad.
1687 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1690 if test "$tor_cv_sign_extend" != "no"; then
1691 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1692 [Define to 1 iff right-shifting a negative value performs sign-extension])
1695 # Is uint8_t the same type as unsigned char?
1696 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
1697 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1700 unsigned char c;]])],
1701 [tor_cv_uint8_uchar=yes],
1702 [tor_cv_uint8_uchar=no],
1703 [tor_cv_uint8_uchar=cross])])
1705 if test "$tor_cv_uint8_uchar" = "cross"; then
1706 AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
1709 if test "$tor_cv_uint8_uchar" = "no"; then
1710 AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
1713 # Whether we should use the dmalloc memory allocation debugging library.
1714 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1715 AC_ARG_WITH(dmalloc,
1716 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1717 [if [[ "$withval" = "yes" ]]; then
1723 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1726 if [[ $dmalloc -eq 1 ]]; then
1727 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1728 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1729 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1730 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1733 AC_ARG_WITH(tcmalloc,
1734 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1735 [ tcmalloc=yes ], [ tcmalloc=no ])
1737 if test "x$tcmalloc" = "xyes"; then
1738 LDFLAGS="-ltcmalloc $LDFLAGS"
1741 using_custom_malloc=no
1742 if test "x$enable_openbsd_malloc" = "xyes"; then
1743 using_custom_malloc=yes
1745 if test "x$tcmalloc" = "xyes"; then
1746 using_custom_malloc=yes
1748 if test "$using_custom_malloc" = "no"; then
1749 AC_CHECK_FUNCS(mallinfo)
1751 if test "$using_custom_malloc" = "yes"; then
1752 # Tell the C compiler not to use the system allocator functions.
1753 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
1756 # By default, we're going to assume we don't have mlockall()
1757 # bionic and other platforms have various broken mlockall subsystems.
1758 # Some systems don't have a working mlockall, some aren't linkable,
1759 # and some have it but don't declare it.
1760 AC_CHECK_FUNCS(mlockall)
1761 AC_CHECK_DECLS([mlockall], , , [
1762 #ifdef HAVE_SYS_MMAN_H
1763 #include <sys/mman.h>
1766 # Some MinGW environments don't have getpagesize in unistd.h. We don't use
1767 # AC_CHECK_FUNCS(getpagesize), because other environments rename getpagesize
1769 AC_CHECK_DECLS([getpagesize], , , [
1770 #ifdef HAVE_UNISTD_H
1774 # Allow user to specify an alternate syslog facility
1775 AC_ARG_WITH(syslog-facility,
1776 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1777 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1778 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1779 AC_SUBST(LOGFACILITY)
1781 # Check if we have getresuid and getresgid
1782 AC_CHECK_FUNCS(getresuid getresgid)
1784 # Check for gethostbyname_r in all its glorious incompatible versions.
1785 # (This logic is based on that in Python's configure.in)
1786 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1787 [Define this if you have any gethostbyname_r()])
1789 AC_CHECK_FUNC(gethostbyname_r, [
1790 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1792 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1793 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1797 struct hostent *h1, *h2;
1799 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1801 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1802 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1803 [Define this if gethostbyname_r takes 6 arguments])
1806 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1812 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1814 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1815 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1816 [Define this if gethostbyname_r takes 5 arguments])
1819 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1824 struct hostent_data hd;
1825 (void) gethostbyname_r(cp1,h1,&hd);
1827 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1828 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1829 [Define this if gethostbyname_r takes 3 arguments])
1839 AC_CACHE_CHECK([whether the C compiler supports __func__],
1840 tor_cv_have_func_macro,
1841 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1843 int main(int c, char **v) { puts(__func__); }])],
1844 tor_cv_have_func_macro=yes,
1845 tor_cv_have_func_macro=no))
1847 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1848 tor_cv_have_FUNC_macro,
1849 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1851 int main(int c, char **v) { puts(__FUNC__); }])],
1852 tor_cv_have_FUNC_macro=yes,
1853 tor_cv_have_FUNC_macro=no))
1855 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1856 tor_cv_have_FUNCTION_macro,
1857 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1859 int main(int c, char **v) { puts(__FUNCTION__); }])],
1860 tor_cv_have_FUNCTION_macro=yes,
1861 tor_cv_have_FUNCTION_macro=no))
1863 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1864 tor_cv_have_environ_declared,
1865 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1866 #ifdef HAVE_UNISTD_H
1870 int main(int c, char **v) { char **t = environ; }])],
1871 tor_cv_have_environ_declared=yes,
1872 tor_cv_have_environ_declared=no))
1874 if test "$tor_cv_have_func_macro" = "yes"; then
1875 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1878 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1879 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1882 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1883 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1884 [Defined if the compiler supports __FUNCTION__])
1887 if test "$tor_cv_have_environ_declared" = "yes"; then
1888 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1889 [Defined if we have extern char **environ already declared])
1892 # $prefix stores the value of the --prefix command line option, or
1893 # NONE if the option wasn't set. In the case that it wasn't set, make
1894 # it be the default, so that we can use it to expand directories now.
1895 if test "x$prefix" = "xNONE"; then
1896 prefix=$ac_default_prefix
1899 # and similarly for $exec_prefix
1900 if test "x$exec_prefix" = "xNONE"; then
1904 if test "x$BUILDDIR" = "x"; then
1908 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1909 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1911 if test "x$CONFDIR" = "x"; then
1912 CONFDIR=`eval echo $sysconfdir/tor`
1915 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1916 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1918 BINDIR=`eval echo $bindir`
1920 LOCALSTATEDIR=`eval echo $localstatedir`
1921 AC_SUBST(LOCALSTATEDIR)
1923 if test "$bwin32" = "true"; then
1924 # Test if the linker supports the --nxcompat and --dynamicbase options
1926 save_LDFLAGS="$LDFLAGS"
1927 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1928 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1929 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1930 [AC_MSG_RESULT([yes])]
1931 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1932 [AC_MSG_RESULT([no])]
1934 LDFLAGS="$save_LDFLAGS"
1937 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1938 # than autoconf's macros like.
1939 if test "$GCC" = "yes"; then
1940 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1941 # accident waiting to happen.
1942 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1944 # Override optimization level for non-gcc compilers
1946 enable_gcc_warnings=no
1947 enable_gcc_warnings_advisory=no
1950 # Warnings implies advisory-warnings and -Werror.
1951 if test "$enable_gcc_warnings" = "yes"; then
1952 enable_gcc_warnings_advisory=yes
1953 enable_fatal_warnings=yes
1956 # OS X Lion started deprecating the system openssl. Let's just disable
1957 # all deprecation warnings on OS X. Also, to potentially make the binary
1958 # a little smaller, let's enable dead_strip.
1962 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1963 LDFLAGS="$LDFLAGS -dead_strip" ;;
1966 # Add some more warnings which we use in development but not in the
1967 # released versions. (Some relevant gcc versions can't handle these.)
1969 # Note that we have to do this near the end of the autoconf process, or
1970 # else we may run into problems when these warnings hit on the testing C
1971 # programs that autoconf wants to build.
1972 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1975 *-*-openbsd* | *-*-bitrig*)
1976 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1977 # That's fine, except that the headers don't pass -Wredundant-decls.
1978 # Therefore, let's disable -Wsystem-headers when we're building
1979 # with maximal warnings on OpenBSD.
1980 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1983 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1984 # have it work better.
1985 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1987 # This warning was added in gcc 4.3, but it appears to generate
1988 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1989 #CFLAGS="$CFLAGS -Wlogical-op"
1991 m4_foreach_w([warning_flag], [
1993 -Waddress-of-array-temporary
1994 -Waddress-of-temporary
1996 -Wanonymous-pack-parens
1999 -Warc-bridge-casts-disallowed-in-nonarc
2000 -Warc-maybe-repeated-use-of-weak
2001 -Warc-performSelector-leaks
2002 -Warc-repeated-use-of-weak
2004 -Warray-bounds-pointer-arithmetic
2006 -Wasm-operand-widths
2008 -Watomic-property-with-user-defined-accessor
2010 -Wauto-storage-class
2013 -Wbackslash-newline-escape
2014 -Wbad-array-new-length
2015 -Wbind-to-temporary-copy
2016 -Wbitfield-constant-conversion
2019 -Wbuiltin-requires-header
2021 -Wcompare-distinct-pointer-types
2022 -Wcomplex-component-init
2023 -Wconditional-type-mismatch
2025 -Wconstant-conversion
2026 -Wconstant-logical-operand
2027 -Wconstexpr-not-const
2028 -Wcustom-atomic-properties
2030 -Wdangling-initializer-list
2032 -Wdelegating-ctor-cycles
2033 -Wdeprecated-implementations
2034 -Wdeprecated-register
2035 -Wdirect-ivar-access
2037 -Wdistributed-object-modifiers
2039 -Wdollar-in-identifier-extension
2041 -Wduplicate-decl-specifier
2043 -Wduplicate-method-arg
2044 -Wduplicate-method-match
2046 -Wdynamic-class-memaccess
2047 -Wembedded-directive
2048 -Wempty-translation-unit
2050 -Wexit-time-destructors
2051 -Wexplicit-ownership-type
2052 -Wextern-initializer
2056 -Wflexible-array-extensions
2059 -Wfour-char-constants
2061 -Wglobal-constructors
2062 -Wgnu-array-member-paren-init
2064 -Wgnu-static-float-init
2067 -Widiomatic-parentheses
2068 -Wignored-attributes
2069 -Wimplicit-atomic-properties
2070 -Wimplicit-conversion-floating-point-to-bool
2071 -Wimplicit-exception-spec-mismatch
2072 -Wimplicit-fallthrough
2073 -Wimplicit-fallthrough-per-function
2074 -Wimplicit-retain-self
2075 -Wimport-preprocessor-directive-pedantic
2076 -Wincompatible-library-redeclaration
2077 -Wincompatible-pointer-types-discards-qualifiers
2078 -Wincomplete-implementation
2080 -Wincomplete-umbrella
2083 -Wint-to-void-pointer-cast
2089 -Winvalid-source-encoding
2090 -Winvalid-token-paste
2091 -Wknr-promoted-parameter
2092 -Wlarge-by-value-copy
2093 -Wliteral-conversion
2095 -Wlocal-type-template-args
2099 -Wmalformed-warning-check
2103 -Wmismatched-parameter-types
2104 -Wmismatched-return-types
2105 -Wmissing-field-initializers
2106 -Wmissing-format-attribute
2108 -Wmissing-selector-name
2110 -Wmissing-variable-declarations
2114 -Wnon-literal-null-conversion
2116 -Wnonportable-cfstrings
2122 -Wout-of-line-declaration
2124 -Woverlength-strings
2126 -Woverriding-method-mismatch
2127 -Wpointer-type-mismatch
2128 -Wpredefined-identifier-outside-function
2129 -Wprotocol-property-synthesis-ambiguity
2130 -Wreadonly-iboutlet-property
2131 -Wreadonly-setter-attrs
2133 -Wreceiver-forward-class
2135 -Wreinterpret-base-class
2136 -Wrequires-super-attribute
2137 -Wreserved-user-defined-literal
2138 -Wreturn-stack-address
2140 -Wselector-type-mismatch
2142 -Wserialized-diagnostics
2144 -Wshift-count-negative
2145 -Wshift-count-overflow
2146 -Wshift-negative-value
2148 -Wshift-sign-overflow
2150 -Wsizeof-array-argument
2151 -Wsource-uses-openmp
2154 -Wstatic-local-in-inline
2158 -Wstrlcpy-strlcat-size
2160 -Wsuggest-attribute=format
2161 -Wsuggest-attribute=noreturn
2162 -Wsuper-class-method-mismatch
2165 -Wtautological-constant-out-of-range-compare
2166 -Wtentative-definition-incomplete-type
2169 -Wtypedef-redefinition
2172 -Wundefined-internal
2173 -Wundefined-reinterpret-cast
2175 -Wunicode-whitespace
2176 -Wunknown-warning-option
2177 -Wunnamed-type-template-args
2178 -Wunneeded-member-function
2180 -Wunsupported-visibility
2181 -Wunused-but-set-parameter
2182 -Wunused-but-set-variable
2183 -Wunused-command-line-argument
2184 -Wunused-const-variable=2
2185 -Wunused-exception-parameter
2186 -Wunused-local-typedefs
2187 -Wunused-member-function
2188 -Wunused-sanitize-argument
2189 -Wunused-volatile-lvalue
2190 -Wuser-defined-literals
2193 -Wvector-conversions
2198 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
2200 dnl We should re-enable this in some later version. Clang doesn't
2201 dnl mind, but it causes trouble with GCC.
2202 dnl -Wstrict-overflow=2
2204 dnl These seem to require annotations that we don't currently use,
2205 dnl and they give false positives in our pthreads wrappers. (Clang 4)
2207 dnl -Wthread-safety-analysis
2208 dnl -Wthread-safety-attributes
2209 dnl -Wthread-safety-beta
2210 dnl -Wthread-safety-precise
2212 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2213 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2214 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2215 CFLAGS="$CFLAGS -Wwrite-strings"
2216 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2217 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
2218 CFLAGS="$CFLAGS -Wunused-parameter "
2219 # These interfere with building main() { return 0; }, which autoconf
2220 # likes to use as its default program.
2221 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
2223 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2224 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2226 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2227 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2229 if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2230 AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2233 if test "x$enable_fatal_warnings" = "xyes"; then
2234 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2235 # default autoconf programs are full of errors.
2236 CFLAGS="$CFLAGS -Werror"
2241 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2244 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.])
2248 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2253 contrib/dist/suse/tor.sh
2254 contrib/operator-tools/tor.logrotate
2257 contrib/dist/tor.service
2258 src/config/torrc.sample
2259 src/config/torrc.minimal
2260 src/rust/.cargo/config
2261 scripts/maint/checkOptionDocs.pl
2262 scripts/maint/updateVersions.pl
2265 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2266 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
2267 for file in $regular_mans ; do
2268 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2269 echo "==================================";
2271 echo "Building Tor has failed since manpages cannot be built.";
2273 echo "You need asciidoc installed to be able to build the manpages.";
2274 echo "To build without manpages, use the --disable-asciidoc argument";
2275 echo "when calling configure.";
2277 echo "==================================";
2283 if test "$fragile_hardening" = "yes"; then
2287 Warning! Building Tor with --enable-fragile-hardening (also known as
2288 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2289 other kinds of attacks easier. A Tor instance build with this option will be
2290 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2291 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2292 denial of service attacks. For more information, see
2293 https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening