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.4.0-alpha-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.]))
64 AC_ARG_ENABLE(zstd-advanced-apis,
65 AS_HELP_STRING(--disable-zstd-advanced-apis, [Build without support for zstd's "static-only" APIs.]))
67 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
68 AC_MSG_ERROR([Can't disable assertions outside of coverage build])
71 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
72 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
73 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
74 AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
75 AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
76 AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
78 if test "$enable_static_tor" = "yes"; then
79 enable_static_libevent="yes";
80 enable_static_openssl="yes";
81 enable_static_zlib="yes";
82 CFLAGS="$CFLAGS -static"
85 if test "$enable_system_torrc" = "no"; then
86 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
87 [Defined if we're not going to look for a torrc in SYSCONF])
90 if test "$enable_memory_sentinels" = "no"; then
91 AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
92 [Defined if we're turning off memory safety code to look for bugs])
95 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
97 AC_ARG_ENABLE(asciidoc,
98 AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
99 [case "${enableval}" in
100 "yes") asciidoc=true ;;
101 "no") asciidoc=false ;;
102 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
103 esac], [asciidoc=true])
105 # systemd notify support
106 AC_ARG_ENABLE(systemd,
107 AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
108 [case "${enableval}" in
109 "yes") systemd=true ;;
110 "no") systemd=false ;;
111 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
112 esac], [systemd=auto])
114 if test "$enable_restart_debugging" = "yes"; then
115 AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
116 [Defined if we're building with support for in-process restart debugging.])
119 if test "$enable_zstd_advanced_apis" != "no"; then
120 AC_DEFINE(ENABLE_ZSTD_ADVANCED_APIS, 1,
121 [Defined if we're going to try to use zstd's "static-only" APIs.])
125 if test "x$enable_systemd" = "xno"; then
128 PKG_CHECK_MODULES(SYSTEMD,
132 if test "x$have_systemd" = "xno"; then
133 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
134 PKG_CHECK_MODULES(SYSTEMD,
141 if test "x$have_systemd" = "xyes"; then
142 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
143 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
144 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
145 PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
146 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
148 AC_SUBST(TOR_SYSTEMD_CFLAGS)
149 AC_SUBST(TOR_SYSTEMD_LIBS)
151 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
152 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
157 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
161 AC_ARG_ENABLE(gcc-warnings,
162 AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
163 AC_ARG_ENABLE(fatal-warnings,
164 AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
165 AC_ARG_ENABLE(gcc-warnings-advisory,
166 AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
168 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
169 AC_ARG_ENABLE(gcc-hardening,
170 AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
172 dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
173 AC_ARG_ENABLE(expensive-hardening,
174 AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
175 AC_ARG_ENABLE(fragile-hardening,
176 AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
177 if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
178 fragile_hardening="yes"
181 dnl Linker hardening options
182 dnl Currently these options are ELF specific - you can't use this with MacOSX
183 AC_ARG_ENABLE(linker-hardening,
184 AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
186 AC_ARG_ENABLE(local-appdata,
187 AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
188 if test "$enable_local_appdata" = "yes"; then
189 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
190 [Defined if we default to host local appdata paths on Windows])
194 AC_ARG_ENABLE(tor2web-mode,
195 AS_HELP_STRING(--enable-tor2web-mode, [support tor2web non-anonymous mode]),
196 [if test "x$enableval" = "xyes"; then
197 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
200 AC_ARG_ENABLE(tool-name-check,
201 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
203 AC_ARG_ENABLE(seccomp,
204 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
206 AC_ARG_ENABLE(libscrypt,
207 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
209 dnl Enable event tracing which are transformed to debug log statement.
210 AC_ARG_ENABLE(event-tracing-debug,
211 AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log]))
212 AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"])
214 if test x$enable_event_tracing_debug = xyes; then
215 AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug])
216 AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation])
219 dnl Enable Android only features.
220 AC_ARG_ENABLE(android,
221 AS_HELP_STRING(--enable-android, [build with Android features enabled]))
222 AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])
224 if test "x$enable_android" = "xyes"; then
225 AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])
227 dnl Check if the Android log library is available.
228 AC_CHECK_HEADERS([android/log.h])
229 AC_SEARCH_LIBS(__android_log_write, [log])
233 dnl check for the correct "ar" when cross-compiling.
234 dnl (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
235 dnl so kludge up a replacement for the case where it isn't there yet.)
236 m4_ifdef([AM_PROG_AR],
238 [AN_MAKEVAR([AR], [AC_PROG_AR])
239 AN_PROGRAM([ar], [AC_PROG_AR])
240 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
243 dnl Check whether the above macro has settled for a simply named tool even
244 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
245 dnl because that will find any cc on the system, not only the cross-compiler,
246 dnl and then verify that a binary built with this compiler runs on the
247 dnl build system. It will then come to the false conclusion that we're not
249 if test "x$enable_tool_name_check" != "xno"; then
250 if test "x$ac_tool_warned" = "xyes"; then
251 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.)])
252 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
253 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.)])
263 AC_ARG_VAR([PERL], [path to Perl binary])
264 AC_CHECK_PROGS([PERL], [perl])
265 AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
267 dnl check for asciidoc and a2x
268 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
269 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
271 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
276 AC_ARG_VAR([PYTHON], [path to Python binary])
277 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
278 if test "x$PYTHON" = "x"; then
279 AC_MSG_WARN([Python unavailable; some tests will not be run.])
281 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
283 dnl List all external rust crates we depend on here. Include the version
284 rust_crates="libc-0.2.22"
285 AC_SUBST(rust_crates)
287 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
288 AC_C_FLEXIBLE_ARRAY_MEMBER
290 dnl Maybe we've got an old autoconf...
291 AC_CACHE_CHECK([for flexible array members],
295 struct abc { int a; char b[]; };
297 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
300 [tor_cv_c_flexarray=yes],
301 [tor_cv_c_flexarray=no])])
302 if test "$tor_cv_flexarray" = "yes"; then
303 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
305 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
309 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
312 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
313 [tor_cv_c_c99_decl=yes],
314 [tor_cv_c_c99_decl=no] )])
315 if test "$tor_cv_c_c99_decl" != "yes"; then
316 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
319 AC_CACHE_CHECK([for working C99 designated initializers],
320 tor_cv_c_c99_designated_init,
322 [AC_LANG_PROGRAM([struct s { int a; int b; };],
323 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
324 [tor_cv_c_c99_designated_init=yes],
325 [tor_cv_c_c99_designated_init=no] )])
327 if test "$tor_cv_c_c99_designated_init" != "yes"; then
328 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
332 AC_ARG_WITH(tor-user,
333 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
341 AC_ARG_WITH(tor-group,
342 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
350 dnl If _WIN32 is defined and non-zero, we are building for win32
351 AC_MSG_CHECKING([for win32])
352 AC_RUN_IFELSE([AC_LANG_SOURCE([
353 int main(int c, char **v) {
364 bwin32=true; AC_MSG_RESULT([yes]),
365 bwin32=false; AC_MSG_RESULT([no]),
366 bwin32=cross; AC_MSG_RESULT([cross])
369 if test "$bwin32" = "cross"; then
370 AC_MSG_CHECKING([for win32 (cross)])
371 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
373 int main(int c, char **v) {return 0;}
376 int main(int c, char **v) {return x(y);}
379 bwin32=true; AC_MSG_RESULT([yes]),
380 bwin32=false; AC_MSG_RESULT([no]))
385 /* Defined to access windows functions and definitions for >=WinXP */
387 # define WINVER 0x0501
390 /* Defined to access _other_ windows functions and definitions for >=WinXP */
391 # ifndef _WIN32_WINNT
392 # define _WIN32_WINNT 0x0501
395 /* Defined to avoid including some windows headers as part of Windows.h */
396 # ifndef WIN32_LEAN_AND_MEAN
397 # define WIN32_LEAN_AND_MEAN 1
403 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
404 AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
406 dnl Enable C99 when compiling with MIPSpro
407 AC_MSG_CHECKING([for MIPSpro compiler])
408 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
409 #if (defined(__sgi) && defined(_COMPILER_VERSION))
414 bmipspro=false; AC_MSG_RESULT(no),
415 bmipspro=true; AC_MSG_RESULT(yes))
417 if test "$bmipspro" = "true"; then
418 CFLAGS="$CFLAGS -c99"
423 if test "x$enable_rust" = "xyes"; then
424 AC_ARG_VAR([RUSTC], [path to the rustc binary])
425 AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
426 if test "x$RUSTC" = "xno"; then
427 AC_MSG_ERROR([rustc unavailable but rust integration requested.])
430 AC_ARG_VAR([CARGO], [path to the cargo binary])
431 AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
432 if test "x$CARGO" = "xno"; then
433 AC_MSG_ERROR([cargo unavailable but rust integration requested.])
436 AC_DEFINE([HAVE_RUST], 1, [have Rust])
437 if test "x$enable_cargo_online_mode" = "xyes"; then
441 CARGO_ONLINE=--frozen
444 dnl When we're not allowed to touch the network, we need crate dependencies
445 dnl locally available.
446 AC_MSG_CHECKING([rust crate dependencies])
447 AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
448 if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
449 TOR_RUST_DEPENDENCIES="$srcdir/src/ext/rust/"
452 if test ! -d "$TOR_RUST_DEPENDENCIES"; then
453 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.])
456 for dep in $rust_crates; do
457 if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
458 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.])
462 if test "x$NEED_MOD" = "x1"; then
463 dnl When looking for dependencies from cargo, pick right directory
464 TOR_RUST_DEPENDENCIES="../../src/ext/rust"
466 if test "x$ERRORED" = "x"; then
471 dnl This is a workaround for #46797
472 dnl (a.k.a https://github.com/rust-lang/rust/issues/46797 ). Once the
473 dnl upstream bug is fixed, we can remove this workaround.
476 TOR_RUST_EXTRA_LIBS="-lresolv"
480 dnl For now both MSVC and MinGW rust libraries will output static libs with
481 dnl the MSVC naming convention.
482 if test "$bwin32" = "true"; then
483 TOR_RUST_STATIC_NAME=tor_rust.lib
485 TOR_RUST_STATIC_NAME=libtor_rust.a
488 AC_SUBST(TOR_RUST_STATIC_NAME)
489 AC_SUBST(CARGO_ONLINE)
492 dnl Let's check the rustc version, too
493 AC_MSG_CHECKING([rust version])
494 RUSTC_VERSION=`$RUSTC --version`
495 RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
496 RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
497 if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
498 AC_MSG_ERROR([rustc version couldn't be identified])
500 if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 14; then
501 AC_MSG_ERROR([rustc must be at least version 1.14])
503 AC_MSG_RESULT([$RUSTC_VERSION])
506 AC_SUBST(TOR_RUST_EXTRA_LIBS)
508 AC_SEARCH_LIBS(socket, [socket network])
509 AC_SEARCH_LIBS(gethostbyname, [nsl])
510 AC_SEARCH_LIBS(dlopen, [dl])
511 AC_SEARCH_LIBS(inet_aton, [resolv])
512 AC_SEARCH_LIBS(backtrace, [execinfo])
514 AC_SEARCH_LIBS([clock_gettime], [rt])
515 if test "$LIBS" != "$saved_LIBS"; then
516 # Looks like we need -lrt for clock_gettime().
520 AC_SEARCH_LIBS(pthread_create, [pthread])
521 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 \
553 mach_approximate_time \
579 # Apple messed up when they added two functions functions in Sierra: they
580 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
581 # checks. So we should only probe for those functions if we are sure that we
582 # are not targeting OSX 10.11 or earlier.
583 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
584 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
586 # include <AvailabilityMacros.h>
587 # ifndef MAC_OS_X_VERSION_10_12
588 # define MAC_OS_X_VERSION_10_12 101200
590 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
591 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
592 # error "Running on Mac OSX 10.11 or earlier"
597 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
598 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
600 if test "$on_macos_pre_10_12" = "no"; then
607 if test "$bwin32" != "true"; then
608 AC_CHECK_HEADERS(pthread.h)
609 AC_CHECK_FUNCS(pthread_create)
610 AC_CHECK_FUNCS(pthread_condattr_setclock)
613 if test "$bwin32" = "true"; then
614 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
621 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
622 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
624 AC_MSG_CHECKING([whether free(NULL) works])
625 AC_RUN_IFELSE([AC_LANG_PROGRAM([
631 [free_null_ok=true; AC_MSG_RESULT(yes)],
632 [free_null_ok=false; AC_MSG_RESULT(no)],
633 [free_null_ok=cross; AC_MSG_RESULT(cross)])
635 if test "$free_null_ok" = "false"; then
636 AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
639 dnl ------------------------------------------------------
640 dnl Where do you live, libevent? And how do we call you?
642 if test "$bwin32" = "true"; then
643 TOR_LIB_WS32=-lws2_32
644 TOR_LIB_IPHLPAPI=-liphlpapi
645 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
646 # think it's actually necessary.
648 TOR_LIB_USERENV=-luserenv
654 AC_SUBST(TOR_LIB_WS32)
655 AC_SUBST(TOR_LIB_GDI)
656 AC_SUBST(TOR_LIB_IPHLPAPI)
657 AC_SUBST(TOR_LIB_USERENV)
659 tor_libevent_pkg_redhat="libevent"
660 tor_libevent_pkg_debian="libevent-dev"
661 tor_libevent_devpkg_redhat="libevent-devel"
662 tor_libevent_devpkg_debian="libevent-dev"
664 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
665 dnl linking for static builds.
666 STATIC_LIBEVENT_FLAGS=""
667 if test "$enable_static_libevent" = "yes"; then
668 if test "$have_rt" = "yes"; then
669 STATIC_LIBEVENT_FLAGS=" -lrt "
673 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
675 #include <winsock2.h>
677 #include <sys/time.h>
678 #include <sys/types.h>
679 #include <event2/event.h>], [
681 #include <winsock2.h>
684 struct event_base *event_base_new(void);],
687 {WSADATA d; WSAStartup(0x101,&d); }
689 event_base_free(event_base_new());
690 ], [--with-libevent-dir], [/opt/libevent])
692 dnl Determine the incantation needed to link libevent.
694 save_LDFLAGS="$LDFLAGS"
695 save_CPPFLAGS="$CPPFLAGS"
697 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
698 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
699 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
701 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
703 if test "$enable_static_libevent" = "yes"; then
704 if test "$tor_cv_library_libevent_dir" = "(system)"; then
705 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
707 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
710 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
711 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
712 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"))
714 if test "$ac_cv_search_event_new" != "none required"; then
715 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
717 if test "$ac_cv_search_evdns_base_new" != "none required"; then
718 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
721 AC_MSG_ERROR("libevent2 is required but the headers could not be found")
725 dnl Now check for particular libevent functions.
726 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
727 evutil_secure_rng_add_bytes \
731 LDFLAGS="$save_LDFLAGS"
732 CPPFLAGS="$save_CPPFLAGS"
734 dnl Check that libevent is at least at version 2.0.10, the first stable
735 dnl release of its series
736 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
737 AC_MSG_CHECKING([whether Libevent is new enough])
738 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
739 #include <event2/event.h>
740 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
746 ])], [ AC_MSG_RESULT([yes]) ],
747 [ AC_MSG_RESULT([no])
748 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
751 LDFLAGS="$save_LDFLAGS"
752 CPPFLAGS="$save_CPPFLAGS"
754 AC_SUBST(TOR_LIBEVENT_LIBS)
756 dnl ------------------------------------------------------
757 dnl Where do you live, libm?
759 dnl On some platforms (Haiku/BeOS) the math library is
760 dnl part of libroot. In which case don't link against lm
763 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
764 if test "$ac_cv_search_pow" != "none required"; then
765 TOR_LIB_MATH="$ac_cv_search_pow"
768 AC_SUBST(TOR_LIB_MATH)
770 dnl ------------------------------------------------------
771 dnl Where do you live, openssl? And how do we call you?
773 tor_openssl_pkg_redhat="openssl"
774 tor_openssl_pkg_debian="libssl-dev"
775 tor_openssl_devpkg_redhat="openssl-devel"
776 tor_openssl_devpkg_debian="libssl-dev"
778 ALT_openssl_WITHVAL=""
780 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
782 if test "x$withval" != "xno" && test "x$withval" != "x"; then
783 ALT_openssl_WITHVAL="$withval"
787 AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
788 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
789 [#include <openssl/ssl.h>],
790 [struct ssl_method_st; const struct ssl_method_st *TLSv1_1_method(void);],
791 [TLSv1_1_method();], [],
792 [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
794 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
796 if test "$enable_static_openssl" = "yes"; then
797 if test "$tor_cv_library_openssl_dir" = "(system)"; then
798 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
800 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
803 TOR_OPENSSL_LIBS="-lssl -lcrypto"
805 AC_SUBST(TOR_OPENSSL_LIBS)
807 dnl Now check for particular openssl functions.
809 save_LDFLAGS="$LDFLAGS"
810 save_CPPFLAGS="$CPPFLAGS"
811 LIBS="$TOR_OPENSSL_LIBS $LIBS"
812 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
813 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
815 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
816 #include <openssl/opensslv.h>
817 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
822 [ 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.]) ])
824 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
825 #include <openssl/opensslv.h>
826 #include <openssl/evp.h>
827 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
830 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
831 #error "curves unavailable"
835 [ 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.]) ])
837 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
838 [#include <openssl/ssl.h>
842 SSL_SESSION_get_master_key \
843 SSL_get_server_random \
844 SSL_get_client_ciphers \
845 SSL_get_client_random \
850 dnl Check if OpenSSL has scrypt implementation.
851 AC_CHECK_FUNCS([ EVP_PBE_scrypt ])
853 dnl Check if OpenSSL structures are opaque
854 AC_CHECK_MEMBERS([SSL.state], , ,
855 [#include <openssl/ssl.h>
858 dnl Define the set of checks for KIST scheduler support.
859 AC_DEFUN([CHECK_KIST_SUPPORT],[
860 dnl KIST needs struct tcp_info and for certain members to exist.
862 [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
863 , ,[[#include <netinet/tcp.h>]])
864 dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
865 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
866 #include <linux/sockios.h>
870 ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
871 if test "x$have_siocoutqnsd" = "xyes"; then
872 if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
873 if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
874 have_kist_support=yes
879 dnl Now, trigger the check.
881 AS_IF([test "x$have_kist_support" = "xyes"],
882 [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
884 [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
887 LDFLAGS="$save_LDFLAGS"
888 CPPFLAGS="$save_CPPFLAGS"
890 dnl ------------------------------------------------------
891 dnl Where do you live, zlib? And how do we call you?
893 tor_zlib_pkg_redhat="zlib"
894 tor_zlib_pkg_debian="zlib1g"
895 tor_zlib_devpkg_redhat="zlib-devel"
896 tor_zlib_devpkg_debian="zlib1g-dev"
898 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
900 [const char * zlibVersion(void);],
901 [zlibVersion();], [--with-zlib-dir],
904 if test "$enable_static_zlib" = "yes"; then
905 if test "$tor_cv_library_zlib_dir" = "(system)"; then
906 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
907 using --enable-static-zlib")
909 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
914 AC_SUBST(TOR_ZLIB_LIBS)
916 dnl ------------------------------------------------------
917 dnl Where we do we find lzma?
920 AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
921 [case "${enableval}" in
924 * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
927 if test "x$enable_lzma" = "xno"; then
930 PKG_CHECK_MODULES([LZMA],
935 if test "x$have_lzma" = "xno" ; then
936 AC_MSG_WARN([Unable to find liblzma.])
940 if test "x$have_lzma" = "xyes"; then
941 AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
942 TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
943 TOR_LZMA_LIBS="${LZMA_LIBS}"
945 AC_SUBST(TOR_LZMA_CFLAGS)
946 AC_SUBST(TOR_LZMA_LIBS)
948 dnl ------------------------------------------------------
949 dnl Where we do we find zstd?
952 AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
953 [case "${enableval}" in
956 * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
959 if test "x$enable_zstd" = "xno"; then
962 PKG_CHECK_MODULES([ZSTD],
967 if test "x$have_zstd" = "xno" ; then
968 AC_MSG_WARN([Unable to find libzstd.])
972 if test "x$have_zstd" = "xyes"; then
973 AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
974 TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
975 TOR_ZSTD_LIBS="${ZSTD_LIBS}"
977 AC_SUBST(TOR_ZSTD_CFLAGS)
978 AC_SUBST(TOR_ZSTD_LIBS)
980 dnl ----------------------------------------------------------------------
981 dnl Check if libcap is available for capabilities.
983 tor_cap_pkg_debian="libcap2"
984 tor_cap_pkg_redhat="libcap"
985 tor_cap_devpkg_debian="libcap-dev"
986 tor_cap_devpkg_redhat="libcap-devel"
988 AC_CHECK_LIB([cap], [cap_init], [],
989 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
991 AC_CHECK_FUNCS(cap_set_proc)
993 dnl ---------------------------------------------------------------------
994 dnl Now that we know about our major libraries, we can check for compiler
995 dnl and linker hardening options. We need to do this with the libraries known,
996 dnl since sometimes the linker will like an option but not be willing to
997 dnl use it with a build of a library.
999 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1000 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"
1008 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1009 #if !defined(__clang__)
1011 #endif])], have_clang=yes, have_clang=no)
1013 if test "x$enable_gcc_hardening" != "xno"; then
1014 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1015 if test "x$have_clang" = "xyes"; then
1016 TOR_CHECK_CFLAGS(-Qunused-arguments)
1018 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1019 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1020 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1021 m4_ifdef([AS_VAR_IF],[
1022 AS_VAR_IF(can_compile, [yes],
1023 AS_VAR_IF(can_link, [yes],
1025 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.)]))
1027 AS_VAR_POPDEF([can_link])
1028 AS_VAR_POPDEF([can_compile])
1029 TOR_CHECK_CFLAGS(-Wstack-protector)
1030 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1031 if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1032 TOR_CHECK_CFLAGS(-fPIE)
1033 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1035 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1038 if test "$fragile_hardening" = "yes"; then
1039 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1040 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1041 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.])
1044 if test "$tor_cv_cflags__ftrapv" != "yes"; then
1045 AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1048 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1049 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1050 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*])
1053 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1054 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1055 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*])
1058 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1061 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1062 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1064 mulodi_fixes_ftrapv=no
1065 if test "$have_clang" = "yes"; then
1066 saved_CFLAGS="$CFLAGS"
1067 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1068 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1073 int main(int argc, char **argv)
1075 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1076 * (int64_t)atoi(argv[3]);
1079 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1080 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1081 if test "$ftrapv_can_link" = "no"; then
1082 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1087 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1091 int main(int argc, char **argv)
1093 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1094 * (int64_t)atoi(argv[3]);
1097 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1098 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1100 CFLAGS="$saved_CFLAGS"
1103 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1105 dnl These cflags add bunches of branches, and we haven't been able to
1106 dnl persuade ourselves that they're suitable for code that needs to be
1108 AC_SUBST(CFLAGS_BUGTRAP)
1109 dnl These cflags are variant ones sutable for code that needs to be
1111 AC_SUBST(CFLAGS_CONSTTIME)
1113 if test "x$enable_linker_hardening" != "xno"; then
1114 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1117 # For backtrace support
1118 TOR_CHECK_LDFLAGS(-rdynamic)
1120 dnl ------------------------------------------------------
1121 dnl Now see if we have a -fomit-frame-pointer compiler option.
1123 saved_CFLAGS="$CFLAGS"
1124 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1125 F_OMIT_FRAME_POINTER=''
1126 if test "$saved_CFLAGS" != "$CFLAGS"; then
1127 if test "$fragile_hardening" = "yes"; then
1128 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1131 CFLAGS="$saved_CFLAGS"
1132 AC_SUBST(F_OMIT_FRAME_POINTER)
1134 dnl ------------------------------------------------------
1135 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1136 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1137 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1139 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1141 dnl ============================================================
1142 dnl Check for libseccomp
1144 if test "x$enable_seccomp" != "xno"; then
1145 AC_CHECK_HEADERS([seccomp.h])
1146 AC_SEARCH_LIBS(seccomp_init, [seccomp])
1149 dnl ============================================================
1150 dnl Check for libscrypt
1152 if test "x$enable_libscrypt" != "xno"; then
1153 AC_CHECK_HEADERS([libscrypt.h])
1154 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1155 AC_CHECK_FUNCS([libscrypt_scrypt])
1158 dnl ============================================================
1159 dnl We need an implementation of curve25519.
1161 dnl set these defaults.
1162 build_curve25519_donna=no
1163 build_curve25519_donna_c64=no
1164 use_curve25519_donna=no
1165 use_curve25519_nacl=no
1168 dnl The best choice is using curve25519-donna-c64, but that requires
1170 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1171 tor_cv_can_use_curve25519_donna_c64,
1173 [AC_LANG_PROGRAM([dnl
1175 typedef unsigned uint128_t __attribute__((mode(TI)));
1176 int func(uint64_t a, uint64_t b) {
1177 uint128_t c = ((uint128_t)a) * b;
1178 int ok = ((uint64_t)(c>>96)) == 522859 &&
1179 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1180 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1181 (((uint64_t)(c))&0xffffffffL) == 0;
1185 int ok = func( ((uint64_t)2000000000) * 1000000000,
1186 ((uint64_t)1234567890) << 24);
1189 [tor_cv_can_use_curve25519_donna_c64=yes],
1190 [tor_cv_can_use_curve25519_donna_c64=no],
1192 [AC_LANG_PROGRAM([dnl
1194 typedef unsigned uint128_t __attribute__((mode(TI)));
1195 int func(uint64_t a, uint64_t b) {
1196 uint128_t c = ((uint128_t)a) * b;
1197 int ok = ((uint64_t)(c>>96)) == 522859 &&
1198 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1199 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1200 (((uint64_t)(c))&0xffffffffL) == 0;
1204 int ok = func( ((uint64_t)2000000000) * 1000000000,
1205 ((uint64_t)1234567890) << 24);
1208 [tor_cv_can_use_curve25519_donna_c64=cross],
1209 [tor_cv_can_use_curve25519_donna_c64=no])])])
1211 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1212 nacl/crypto_scalarmult_curve25519.h])
1214 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1215 tor_cv_can_use_curve25519_nacl,
1216 [tor_saved_LIBS="$LIBS"
1219 [AC_LANG_PROGRAM([dnl
1220 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1221 #include <crypto_scalarmult_curve25519.h>
1222 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1223 #include <nacl/crypto_scalarmult_curve25519.h>
1225 #ifdef crypto_scalarmult_curve25519_ref_BYTES
1226 #error Hey, this is the reference implementation! That's not fast.
1229 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1230 ])], [tor_cv_can_use_curve25519_nacl=yes],
1231 [tor_cv_can_use_curve25519_nacl=no])
1232 LIBS="$tor_saved_LIBS" ])
1234 dnl Okay, now we need to figure out which one to actually use. Fall back
1235 dnl to curve25519-donna.c
1237 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1238 build_curve25519_donna_c64=yes
1239 use_curve25519_donna=yes
1240 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1241 use_curve25519_nacl=yes
1242 CURVE25519_LIBS=-lnacl
1244 build_curve25519_donna=yes
1245 use_curve25519_donna=yes
1248 if test "x$use_curve25519_donna" = "xyes"; then
1249 AC_DEFINE(USE_CURVE25519_DONNA, 1,
1250 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1252 if test "x$use_curve25519_nacl" = "xyes"; then
1253 AC_DEFINE(USE_CURVE25519_NACL, 1,
1254 [Defined if we should use a curve25519 from nacl])
1256 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1257 test "x$build_curve25519_donna" = "xyes")
1258 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1259 test "x$build_curve25519_donna_c64" = "xyes")
1260 AC_SUBST(CURVE25519_LIBS)
1262 dnl Make sure to enable support for large off_t if available.
1265 AC_CHECK_HEADERS([assert.h \
1280 gnu/libc-version.h \
1320 AC_CHECK_HEADERS(sys/param.h)
1322 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1323 [#ifdef HAVE_SYS_TYPES_H
1324 #include <sys/types.h>
1326 #ifdef HAVE_SYS_SOCKET_H
1327 #include <sys/socket.h>
1329 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1330 [#ifdef HAVE_SYS_TYPES_H
1331 #include <sys/types.h>
1333 #ifdef HAVE_SYS_SOCKET_H
1334 #include <sys/socket.h>
1336 #ifdef HAVE_NET_IF_H
1339 #ifdef HAVE_NETINET_IN_H
1340 #include <netinet/in.h>
1343 AC_CHECK_HEADERS(linux/if.h,[],[],
1345 #ifdef HAVE_SYS_SOCKET_H
1346 #include <sys/socket.h>
1350 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1351 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1352 [#ifdef HAVE_SYS_TYPES_H
1353 #include <sys/types.h>
1355 #ifdef HAVE_SYS_SOCKET_H
1356 #include <sys/socket.h>
1358 #ifdef HAVE_LIMITS_H
1361 #ifdef HAVE_LINUX_TYPES_H
1362 #include <linux/types.h>
1364 #ifdef HAVE_NETINET_IN6_H
1365 #include <netinet/in6.h>
1367 #ifdef HAVE_NETINET_IN_H
1368 #include <netinet/in.h>
1371 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1372 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1373 [#ifdef HAVE_SYS_TYPES_H
1374 #include <sys/types.h>
1376 #ifdef HAVE_SYS_SOCKET_H
1377 #include <sys/socket.h>
1379 #ifdef HAVE_LIMITS_H
1382 #ifdef HAVE_LINUX_TYPES_H
1383 #include <linux/types.h>
1385 #ifdef HAVE_NETINET_IN6_H
1386 #include <netinet/in6.h>
1388 #ifdef HAVE_NETINET_IN_H
1389 #include <netinet/in.h>
1391 #ifdef HAVE_LINUX_IF_H
1392 #include <linux/if.h>
1396 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1399 if test "x$linux_netfilter_ipv4" = "x1"; then
1402 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1405 if test "x$transparent_ok" = "x1"; then
1406 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1408 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1411 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1412 [#ifdef HAVE_SYS_TYPES_H
1413 #include <sys/types.h>
1415 #ifdef HAVE_SYS_TIME_H
1416 #include <sys/time.h>
1419 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1422 AC_CHECK_SIZEOF(int8_t)
1423 AC_CHECK_SIZEOF(int16_t)
1424 AC_CHECK_SIZEOF(int32_t)
1425 AC_CHECK_SIZEOF(int64_t)
1426 AC_CHECK_SIZEOF(uint8_t)
1427 AC_CHECK_SIZEOF(uint16_t)
1428 AC_CHECK_SIZEOF(uint32_t)
1429 AC_CHECK_SIZEOF(uint64_t)
1430 AC_CHECK_SIZEOF(intptr_t)
1431 AC_CHECK_SIZEOF(uintptr_t)
1433 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1435 AC_CHECK_SIZEOF(char)
1436 AC_CHECK_SIZEOF(short)
1437 AC_CHECK_SIZEOF(int)
1438 AC_CHECK_SIZEOF(long)
1439 AC_CHECK_SIZEOF(long long)
1440 AC_CHECK_SIZEOF(__int64)
1441 AC_CHECK_SIZEOF(void *)
1442 AC_CHECK_SIZEOF(time_t)
1443 AC_CHECK_SIZEOF(size_t)
1444 AC_CHECK_SIZEOF(pid_t)
1446 AC_CHECK_TYPES([uint, u_char, ssize_t])
1448 AC_PC_FROM_UCONTEXT([:])
1450 dnl used to include sockaddr_storage, but everybody has that.
1451 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1452 [#ifdef HAVE_SYS_TYPES_H
1453 #include <sys/types.h>
1455 #ifdef HAVE_NETINET_IN_H
1456 #include <netinet/in.h>
1458 #ifdef HAVE_NETINET_IN6_H
1459 #include <netinet/in6.h>
1461 #ifdef HAVE_SYS_SOCKET_H
1462 #include <sys/socket.h>
1465 #define _WIN32_WINNT 0x0501
1466 #define WIN32_LEAN_AND_MEAN
1467 #include <winsock2.h>
1468 #include <ws2tcpip.h>
1471 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1472 [#ifdef HAVE_SYS_TYPES_H
1473 #include <sys/types.h>
1475 #ifdef HAVE_NETINET_IN_H
1476 #include <netinet/in.h>
1478 #ifdef HAVE_NETINET_IN6_H
1479 #include <netinet/in6.h>
1481 #ifdef HAVE_SYS_SOCKET_H
1482 #include <sys/socket.h>
1485 #define _WIN32_WINNT 0x0501
1486 #define WIN32_LEAN_AND_MEAN
1487 #include <winsock2.h>
1488 #include <ws2tcpip.h>
1492 AC_CHECK_TYPES([rlim_t], , ,
1493 [#ifdef HAVE_SYS_TYPES_H
1494 #include <sys/types.h>
1496 #ifdef HAVE_SYS_TIME_H
1497 #include <sys/time.h>
1499 #ifdef HAVE_SYS_RESOURCE_H
1500 #include <sys/resource.h>
1504 AX_CHECK_SIGN([time_t],
1507 #ifdef HAVE_SYS_TYPES_H
1508 #include <sys/types.h>
1510 #ifdef HAVE_SYS_TIME_H
1511 #include <sys/time.h>
1518 if test "$ax_cv_decl_time_t_signed" = "no"; then
1519 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1522 AX_CHECK_SIGN([size_t],
1523 [ tor_cv_size_t_signed=yes ],
1524 [ tor_cv_size_t_signed=no ], [
1525 #ifdef HAVE_SYS_TYPES_H
1526 #include <sys/types.h>
1530 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1531 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1534 AX_CHECK_SIGN([enum always],
1535 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1537 enum always { AAA, BBB, CCC };
1540 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1541 #ifdef HAVE_SYS_SOCKET_H
1542 #include <sys/socket.h>
1546 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1548 AC_CHECK_SIZEOF(cell_t)
1550 # Now make sure that NULL can be represented as zero bytes.
1551 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1552 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1553 [[#include <stdlib.h>
1556 #ifdef HAVE_STDDEF_H
1559 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1560 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1561 [tor_cv_null_is_zero=yes],
1562 [tor_cv_null_is_zero=no],
1563 [tor_cv_null_is_zero=cross])])
1565 if test "$tor_cv_null_is_zero" = "cross"; then
1566 # Cross-compiling; let's hope that the target isn't raving mad.
1567 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1570 if test "$tor_cv_null_is_zero" != "no"; then
1571 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1572 [Define to 1 iff memset(0) sets pointers to NULL])
1575 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1576 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1577 [[#include <stdlib.h>
1580 #ifdef HAVE_STDDEF_H
1583 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1584 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1585 [tor_cv_dbl0_is_zero=yes],
1586 [tor_cv_dbl0_is_zero=no],
1587 [tor_cv_dbl0_is_zero=cross])])
1589 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1590 # Cross-compiling; let's hope that the target isn't raving mad.
1591 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1594 if test "$tor_cv_dbl0_is_zero" != "no"; then
1595 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1596 [Define to 1 iff memset(0) sets doubles to 0.0])
1599 # And what happens when we malloc zero?
1600 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1601 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1602 [[#include <stdlib.h>
1605 #ifdef HAVE_STDDEF_H
1608 int main () { return malloc(0)?0:1; }]])],
1609 [tor_cv_malloc_zero_works=yes],
1610 [tor_cv_malloc_zero_works=no],
1611 [tor_cv_malloc_zero_works=cross])])
1613 if test "$tor_cv_malloc_zero_works" = "cross"; then
1614 # Cross-compiling; let's hope that the target isn't raving mad.
1615 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1618 if test "$tor_cv_malloc_zero_works" = "yes"; then
1619 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1620 [Define to 1 iff malloc(0) returns a pointer])
1623 # whether we seem to be in a 2s-complement world.
1624 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1625 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1626 [[int main () { int problem = ((-99) != (~99)+1);
1627 return problem ? 1 : 0; }]])],
1628 [tor_cv_twos_complement=yes],
1629 [tor_cv_twos_complement=no],
1630 [tor_cv_twos_complement=cross])])
1632 if test "$tor_cv_twos_complement" = "cross"; then
1633 # Cross-compiling; let's hope that the target isn't raving mad.
1634 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1637 if test "$tor_cv_twos_complement" != "no"; then
1638 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1639 [Define to 1 iff we represent negative integers with
1643 # What does shifting a negative value do?
1644 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1645 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1646 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1647 [tor_cv_sign_extend=yes],
1648 [tor_cv_sign_extend=no],
1649 [tor_cv_sign_extend=cross])])
1651 if test "$tor_cv_sign_extend" = "cross"; then
1652 # Cross-compiling; let's hope that the target isn't raving mad.
1653 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1656 if test "$tor_cv_sign_extend" != "no"; then
1657 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1658 [Define to 1 iff right-shifting a negative value performs sign-extension])
1661 # Is uint8_t the same type as unsigned char?
1662 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
1663 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1666 unsigned char c;]])],
1667 [tor_cv_uint8_uchar=yes],
1668 [tor_cv_uint8_uchar=no],
1669 [tor_cv_uint8_uchar=cross])])
1671 if test "$tor_cv_uint8_uchar" = "cross"; then
1672 AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
1675 if test "$tor_cv_uint8_uchar" = "no"; then
1676 AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
1679 # Whether we should use the dmalloc memory allocation debugging library.
1680 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1681 AC_ARG_WITH(dmalloc,
1682 AS_HELP_STRING(--with-dmalloc, [use debug memory allocation library]),
1683 [if [[ "$withval" = "yes" ]]; then
1689 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1692 if [[ $dmalloc -eq 1 ]]; then
1693 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1694 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1695 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1696 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1699 AC_ARG_WITH(tcmalloc,
1700 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library]),
1701 [ tcmalloc=yes ], [ tcmalloc=no ])
1703 if test "x$tcmalloc" = "xyes"; then
1704 LDFLAGS="-ltcmalloc $LDFLAGS"
1707 using_custom_malloc=no
1708 if test "x$enable_openbsd_malloc" = "xyes"; then
1709 using_custom_malloc=yes
1711 if test "x$tcmalloc" = "xyes"; then
1712 using_custom_malloc=yes
1714 if test "$using_custom_malloc" = "no"; then
1715 AC_CHECK_FUNCS(mallinfo)
1718 # By default, we're going to assume we don't have mlockall()
1719 # bionic and other platforms have various broken mlockall subsystems.
1720 # Some systems don't have a working mlockall, some aren't linkable,
1721 # and some have it but don't declare it.
1722 AC_CHECK_FUNCS(mlockall)
1723 AC_CHECK_DECLS([mlockall], , , [
1724 #ifdef HAVE_SYS_MMAN_H
1725 #include <sys/mman.h>
1728 # Some MinGW environments don't have getpagesize in unistd.h. We don't use
1729 # AC_CHECK_FUNCS(getpagesize), because other environments rename getpagesize
1731 AC_CHECK_DECLS([getpagesize], , , [
1732 #ifdef HAVE_UNISTD_H
1736 # Allow user to specify an alternate syslog facility
1737 AC_ARG_WITH(syslog-facility,
1738 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
1739 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1740 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1741 AC_SUBST(LOGFACILITY)
1743 # Check if we have getresuid and getresgid
1744 AC_CHECK_FUNCS(getresuid getresgid)
1746 # Check for gethostbyname_r in all its glorious incompatible versions.
1747 # (This logic is based on that in Python's configure.in)
1748 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1749 [Define this if you have any gethostbyname_r()])
1751 AC_CHECK_FUNC(gethostbyname_r, [
1752 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1754 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1755 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1759 struct hostent *h1, *h2;
1761 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1763 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1764 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1765 [Define this if gethostbyname_r takes 6 arguments])
1768 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1774 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1776 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1777 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1778 [Define this if gethostbyname_r takes 5 arguments])
1781 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1786 struct hostent_data hd;
1787 (void) gethostbyname_r(cp1,h1,&hd);
1789 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1790 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1791 [Define this if gethostbyname_r takes 3 arguments])
1801 AC_CACHE_CHECK([whether the C compiler supports __func__],
1802 tor_cv_have_func_macro,
1803 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1805 int main(int c, char **v) { puts(__func__); }])],
1806 tor_cv_have_func_macro=yes,
1807 tor_cv_have_func_macro=no))
1809 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1810 tor_cv_have_FUNC_macro,
1811 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1813 int main(int c, char **v) { puts(__FUNC__); }])],
1814 tor_cv_have_FUNC_macro=yes,
1815 tor_cv_have_FUNC_macro=no))
1817 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1818 tor_cv_have_FUNCTION_macro,
1819 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1821 int main(int c, char **v) { puts(__FUNCTION__); }])],
1822 tor_cv_have_FUNCTION_macro=yes,
1823 tor_cv_have_FUNCTION_macro=no))
1825 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1826 tor_cv_have_environ_declared,
1827 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1828 #ifdef HAVE_UNISTD_H
1832 int main(int c, char **v) { char **t = environ; }])],
1833 tor_cv_have_environ_declared=yes,
1834 tor_cv_have_environ_declared=no))
1836 if test "$tor_cv_have_func_macro" = "yes"; then
1837 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1840 if test "$tor_cv_have_FUNC_macro" = "yes"; then
1841 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1844 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
1845 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1846 [Defined if the compiler supports __FUNCTION__])
1849 if test "$tor_cv_have_environ_declared" = "yes"; then
1850 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1851 [Defined if we have extern char **environ already declared])
1854 # $prefix stores the value of the --prefix command line option, or
1855 # NONE if the option wasn't set. In the case that it wasn't set, make
1856 # it be the default, so that we can use it to expand directories now.
1857 if test "x$prefix" = "xNONE"; then
1858 prefix=$ac_default_prefix
1861 # and similarly for $exec_prefix
1862 if test "x$exec_prefix" = "xNONE"; then
1866 if test "x$BUILDDIR" = "x"; then
1870 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1871 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1873 if test "x$CONFDIR" = "x"; then
1874 CONFDIR=`eval echo $sysconfdir/tor`
1877 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1878 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1880 BINDIR=`eval echo $bindir`
1882 LOCALSTATEDIR=`eval echo $localstatedir`
1883 AC_SUBST(LOCALSTATEDIR)
1885 if test "$bwin32" = "true"; then
1886 # Test if the linker supports the --nxcompat and --dynamicbase options
1888 save_LDFLAGS="$LDFLAGS"
1889 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1890 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1891 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1892 [AC_MSG_RESULT([yes])]
1893 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1894 [AC_MSG_RESULT([no])]
1896 LDFLAGS="$save_LDFLAGS"
1899 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1900 # than autoconf's macros like.
1901 if test "$GCC" = "yes"; then
1902 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1903 # accident waiting to happen.
1904 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1906 # Override optimization level for non-gcc compilers
1908 enable_gcc_warnings=no
1909 enable_gcc_warnings_advisory=no
1912 # Warnings implies advisory-warnings and -Werror.
1913 if test "$enable_gcc_warnings" = "yes"; then
1914 enable_gcc_warnings_advisory=yes
1915 enable_fatal_warnings=yes
1918 # OS X Lion started deprecating the system openssl. Let's just disable
1919 # all deprecation warnings on OS X. Also, to potentially make the binary
1920 # a little smaller, let's enable dead_strip.
1924 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1925 LDFLAGS="$LDFLAGS -dead_strip" ;;
1928 # Add some more warnings which we use in development but not in the
1929 # released versions. (Some relevant gcc versions can't handle these.)
1931 # Note that we have to do this near the end of the autoconf process, or
1932 # else we may run into problems when these warnings hit on the testing C
1933 # programs that autoconf wants to build.
1934 if test "x$enable_gcc_warnings_advisory" != "xno"; then
1937 *-*-openbsd* | *-*-bitrig*)
1938 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1939 # That's fine, except that the headers don't pass -Wredundant-decls.
1940 # Therefore, let's disable -Wsystem-headers when we're building
1941 # with maximal warnings on OpenBSD.
1942 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1945 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
1946 # have it work better.
1947 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
1949 # This warning was added in gcc 4.3, but it appears to generate
1950 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1951 #CFLAGS="$CFLAGS -Wlogical-op"
1953 m4_foreach_w([warning_flag], [
1955 -Waddress-of-array-temporary
1956 -Waddress-of-temporary
1958 -Wanonymous-pack-parens
1961 -Warc-bridge-casts-disallowed-in-nonarc
1962 -Warc-maybe-repeated-use-of-weak
1963 -Warc-performSelector-leaks
1964 -Warc-repeated-use-of-weak
1966 -Warray-bounds-pointer-arithmetic
1968 -Wasm-operand-widths
1970 -Watomic-property-with-user-defined-accessor
1972 -Wauto-storage-class
1975 -Wbackslash-newline-escape
1976 -Wbad-array-new-length
1977 -Wbind-to-temporary-copy
1978 -Wbitfield-constant-conversion
1981 -Wbuiltin-requires-header
1983 -Wcompare-distinct-pointer-types
1984 -Wcomplex-component-init
1985 -Wconditional-type-mismatch
1987 -Wconstant-conversion
1988 -Wconstant-logical-operand
1989 -Wconstexpr-not-const
1990 -Wcustom-atomic-properties
1992 -Wdangling-initializer-list
1994 -Wdelegating-ctor-cycles
1995 -Wdeprecated-implementations
1996 -Wdeprecated-register
1997 -Wdirect-ivar-access
1999 -Wdistributed-object-modifiers
2001 -Wdollar-in-identifier-extension
2003 -Wduplicate-decl-specifier
2005 -Wduplicate-method-arg
2006 -Wduplicate-method-match
2008 -Wdynamic-class-memaccess
2009 -Wembedded-directive
2010 -Wempty-translation-unit
2012 -Wexit-time-destructors
2013 -Wexplicit-ownership-type
2014 -Wextern-initializer
2018 -Wflexible-array-extensions
2021 -Wfour-char-constants
2023 -Wglobal-constructors
2024 -Wgnu-array-member-paren-init
2026 -Wgnu-static-float-init
2029 -Widiomatic-parentheses
2030 -Wignored-attributes
2031 -Wimplicit-atomic-properties
2032 -Wimplicit-conversion-floating-point-to-bool
2033 -Wimplicit-exception-spec-mismatch
2034 -Wimplicit-fallthrough
2035 -Wimplicit-fallthrough-per-function
2036 -Wimplicit-retain-self
2037 -Wimport-preprocessor-directive-pedantic
2038 -Wincompatible-library-redeclaration
2039 -Wincompatible-pointer-types-discards-qualifiers
2040 -Wincomplete-implementation
2042 -Wincomplete-umbrella
2045 -Wint-to-void-pointer-cast
2051 -Winvalid-source-encoding
2052 -Winvalid-token-paste
2053 -Wknr-promoted-parameter
2054 -Wlarge-by-value-copy
2055 -Wliteral-conversion
2057 -Wlocal-type-template-args
2061 -Wmalformed-warning-check
2065 -Wmismatched-parameter-types
2066 -Wmismatched-return-types
2067 -Wmissing-field-initializers
2068 -Wmissing-format-attribute
2070 -Wmissing-selector-name
2072 -Wmissing-variable-declarations
2076 -Wnon-literal-null-conversion
2078 -Wnonportable-cfstrings
2084 -Wout-of-line-declaration
2086 -Woverlength-strings
2088 -Woverriding-method-mismatch
2089 -Wpointer-type-mismatch
2090 -Wpredefined-identifier-outside-function
2091 -Wprotocol-property-synthesis-ambiguity
2092 -Wreadonly-iboutlet-property
2093 -Wreadonly-setter-attrs
2095 -Wreceiver-forward-class
2097 -Wreinterpret-base-class
2098 -Wrequires-super-attribute
2099 -Wreserved-user-defined-literal
2100 -Wreturn-stack-address
2102 -Wselector-type-mismatch
2104 -Wserialized-diagnostics
2106 -Wshift-count-negative
2107 -Wshift-count-overflow
2108 -Wshift-negative-value
2110 -Wshift-sign-overflow
2112 -Wsizeof-array-argument
2113 -Wsource-uses-openmp
2116 -Wstatic-local-in-inline
2120 -Wstrlcpy-strlcat-size
2122 -Wsuggest-attribute=format
2123 -Wsuggest-attribute=noreturn
2124 -Wsuper-class-method-mismatch
2127 -Wtautological-constant-out-of-range-compare
2128 -Wtentative-definition-incomplete-type
2131 -Wtypedef-redefinition
2134 -Wundefined-internal
2135 -Wundefined-reinterpret-cast
2137 -Wunicode-whitespace
2138 -Wunknown-warning-option
2139 -Wunnamed-type-template-args
2140 -Wunneeded-member-function
2142 -Wunsupported-visibility
2143 -Wunused-but-set-parameter
2144 -Wunused-but-set-variable
2145 -Wunused-command-line-argument
2146 -Wunused-const-variable=2
2147 -Wunused-exception-parameter
2148 -Wunused-local-typedefs
2149 -Wunused-member-function
2150 -Wunused-sanitize-argument
2151 -Wunused-volatile-lvalue
2152 -Wuser-defined-literals
2155 -Wvector-conversions
2160 ], [ TOR_CHECK_CFLAGS([warning_flag]) ])
2162 dnl We should re-enable this in some later version. Clang doesn't
2163 dnl mind, but it causes trouble with GCC.
2164 dnl -Wstrict-overflow=2
2166 dnl These seem to require annotations that we don't currently use,
2167 dnl and they give false positives in our pthreads wrappers. (Clang 4)
2169 dnl -Wthread-safety-analysis
2170 dnl -Wthread-safety-attributes
2171 dnl -Wthread-safety-beta
2172 dnl -Wthread-safety-precise
2174 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2175 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2176 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2177 CFLAGS="$CFLAGS -Wwrite-strings"
2178 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2179 CFLAGS="$CFLAGS -Waggregate-return -Wpacked -Wunused"
2180 CFLAGS="$CFLAGS -Wunused-parameter "
2181 # These interfere with building main() { return 0; }, which autoconf
2182 # likes to use as its default program.
2183 CFLAGS="$CFLAGS -Wold-style-definition -Wmissing-declarations"
2185 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2186 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2188 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2189 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2192 if test "x$enable_fatal_warnings" = "xyes"; then
2193 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2194 # default autoconf programs are full of errors.
2195 CFLAGS="$CFLAGS -Werror"
2200 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2203 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.])
2207 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2212 contrib/dist/suse/tor.sh
2213 contrib/operator-tools/tor.logrotate
2216 contrib/dist/tor.service
2217 src/config/torrc.sample
2218 src/config/torrc.minimal
2219 src/rust/.cargo/config
2220 scripts/maint/checkOptionDocs.pl
2221 scripts/maint/updateVersions.pl
2224 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2225 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
2226 for file in $regular_mans ; do
2227 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2228 echo "==================================";
2230 echo "Building Tor has failed since manpages cannot be built.";
2232 echo "You need asciidoc installed to be able to build the manpages.";
2233 echo "To build without manpages, use the --disable-asciidoc argument";
2234 echo "when calling configure.";
2236 echo "==================================";
2242 if test "$fragile_hardening" = "yes"; then
2246 Warning! Building Tor with --enable-fragile-hardening (also known as
2247 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2248 other kinds of attacks easier. A Tor instance build with this option will be
2249 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2250 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2251 denial of service attacks. For more information, see
2252 https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening