1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2019, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
7 AC_INIT([tor],[0.4.3.0-alpha-dev])
8 AC_CONFIG_SRCDIR([src/app/main/tor_main.c])
9 AC_CONFIG_MACRO_DIR([m4])
13 # DO NOT EDIT THIS DEFINITION BY HAND UNLESS YOU KNOW WHAT YOU'RE DOING.
15 # The update_versions.py script updates this definition when the
16 # version number changes. Tor uses it to make sure that it
17 # only shuts down for missing "required protocols" when those protocols
18 # are listed as required by a consensus after this date.
19 AC_DEFINE(APPROX_RELEASE_DATE, ["2019-10-11"], # for 0.4.3.0-alpha-dev
20 [Approximate date when this software was released. (Updated when the version changes.)])
22 # "foreign" means we don't follow GNU package layout standards
23 # "1.11" means we require automake version 1.11 or newer
24 # "subdir-objects" means put .o files in the same directory as the .c files
25 AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects -Wall -Werror])
27 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
28 AC_CONFIG_HEADERS([orconfig.h])
30 AC_USE_SYSTEM_EXTENSIONS
34 if test "x$PKG_CONFIG" = "x" ; then
35 pkg_config_user_action="install pkg-config, and check the PKG_CONFIG_PATH environment variable"
36 AC_MSG_NOTICE([Some libraries need pkg-config, including systemd, nss, lzma, zstd, and custom mallocs.])
37 AC_MSG_NOTICE([To use those libraries, $pkg_config_user_action.])
39 pkg_config_user_action="check the PKG_CONFIG_PATH environment variable"
42 if test "x$PKG_CONFIG_PATH" = "x" && test "x$prefix" != "xNONE" && test "$host" != "$build"; then
43 export PKG_CONFIG_PATH=$prefix/lib/pkgconfig
44 AC_MSG_NOTICE([set PKG_CONFIG_PATH=$PKG_CONFIG_PATH to support cross-compiling])
47 AC_ARG_ENABLE(openbsd-malloc,
48 AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD. Linux only. Deprecated: see --with-malloc]))
49 AC_ARG_ENABLE(static-openssl,
50 AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
51 AC_ARG_ENABLE(static-libevent,
52 AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
53 AC_ARG_ENABLE(static-zlib,
54 AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
55 AC_ARG_ENABLE(static-tor,
56 AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
57 AC_ARG_ENABLE(unittests,
58 AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
59 AC_ARG_ENABLE(coverage,
60 AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
61 AC_ARG_ENABLE(asserts-in-tests,
62 AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
63 AC_ARG_ENABLE(system-torrc,
64 AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
65 AC_ARG_ENABLE(libfuzzer,
66 AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer']))
67 AC_ARG_ENABLE(oss-fuzz,
68 AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment]))
69 AC_ARG_ENABLE(memory-sentinels,
70 AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.]))
72 AS_HELP_STRING(--enable-rust, [enable rust integration]))
73 AC_ARG_ENABLE(cargo-online-mode,
74 AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.]))
75 AC_ARG_ENABLE(restart-debugging,
76 AS_HELP_STRING(--enable-restart-debugging, [Build Tor with support for debugging in-process restart. Developers only.]))
77 AC_ARG_ENABLE(zstd-advanced-apis,
78 AS_HELP_STRING(--disable-zstd-advanced-apis, [Build without support for zstd's "static-only" APIs.]))
80 AS_HELP_STRING(--enable-nss, [Use Mozilla's NSS TLS library. (EXPERIMENTAL)]))
82 AS_HELP_STRING(--enable-pic, [Build Tor's binaries as position-independent code, suitable to link as a library.]))
84 AC_ARG_ENABLE(missing-doc-warnings,
85 AS_HELP_STRING(--enable-missing-doc-warnings, [Tell doxygen to warn about missing documentation. Makes doxygen warnings nonfatal.]))
87 if test "$enable_missing_doc_warnings" = "yes"; then
88 DOXYGEN_FATAL_WARNINGS=NO
89 DOXYGEN_WARN_ON_MISSING=YES
90 elif test "$enable_fatal_warnings" = "yes"; then
91 # Fatal warnings from doxygen are nice, but not if we're warning about
92 # missing documentation.
93 DOXYGEN_FATAL_WARNINGS=YES
94 DOXYGEN_WARN_ON_MISSING=NO
96 DOXYGEN_FATAL_WARNINGS=NO
97 DOXYGEN_WARN_ON_MISSING=NO
99 AC_SUBST(DOXYGEN_FATAL_WARNINGS)
100 AC_SUBST(DOXYGEN_WARN_ON_MISSING)
102 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
103 AC_MSG_ERROR([Can't disable assertions outside of coverage build])
106 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
107 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
108 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
109 AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
110 AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
111 AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
112 AM_CONDITIONAL(USE_NSS, test "x$enable_nss" = "xyes")
113 AM_CONDITIONAL(USE_OPENSSL, test "x$enable_nss" != "xyes")
115 if test "x$enable_nss" = "xyes"; then
116 AC_DEFINE(ENABLE_NSS, 1,
117 [Defined if we're building with NSS.])
119 AC_DEFINE(ENABLE_OPENSSL, 1,
120 [Defined if we're building with OpenSSL or LibreSSL])
123 if test "$enable_static_tor" = "yes"; then
124 enable_static_libevent="yes";
125 enable_static_openssl="yes";
126 enable_static_zlib="yes";
127 CFLAGS="$CFLAGS -static"
130 if test "$enable_system_torrc" = "no"; then
131 AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
132 [Defined if we're not going to look for a torrc in SYSCONF])
135 if test "$enable_memory_sentinels" = "no"; then
136 AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
137 [Defined if we're turning off memory safety code to look for bugs])
140 AC_ARG_ENABLE(manpage,
141 AS_HELP_STRING(--disable-manpage, [Disable manpage generation.]))
143 AC_ARG_ENABLE(html-manual,
144 AS_HELP_STRING(--disable-html-manual, [Disable HTML documentation.]))
146 AC_ARG_ENABLE(asciidoc,
147 AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
148 [case "${enableval}" in
149 "yes") asciidoc=true ;;
150 "no") asciidoc=false ;;
151 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
152 esac], [asciidoc=true])
154 # systemd notify support
155 AC_ARG_ENABLE(systemd,
156 AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
157 [case "${enableval}" in
158 "yes") systemd=true ;;
159 "no") systemd=false ;;
160 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
161 esac], [systemd=auto])
163 if test "$enable_restart_debugging" = "yes"; then
164 AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
165 [Defined if we're building with support for in-process restart debugging.])
168 if test "$enable_zstd_advanced_apis" != "no"; then
169 AC_DEFINE(ENABLE_ZSTD_ADVANCED_APIS, 1,
170 [Defined if we're going to try to use zstd's "static-only" APIs.])
174 if test "x$enable_systemd" = "xno"; then
177 PKG_CHECK_MODULES(SYSTEMD,
181 if test "x$have_systemd" = "xno"; then
182 AC_MSG_NOTICE([Okay, checking for systemd a different way...])
183 PKG_CHECK_MODULES(SYSTEMD,
190 if test "x$have_systemd" = "xyes"; then
191 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
192 TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
193 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
194 PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
195 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or greater])], [])
197 AC_SUBST(TOR_SYSTEMD_CFLAGS)
198 AC_SUBST(TOR_SYSTEMD_LIBS)
200 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
201 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found, $pkg_config_user_action, or set SYSTEMD_CFLAGS and SYSTEMD_LIBS.])
206 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
210 AC_ARG_ENABLE(gcc-warnings,
211 AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
212 AC_ARG_ENABLE(fatal-warnings,
213 AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
214 AC_ARG_ENABLE(gcc-warnings-advisory,
215 AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
217 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
218 AC_ARG_ENABLE(gcc-hardening,
219 AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
221 dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
222 AC_ARG_ENABLE(expensive-hardening,
223 AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
224 AC_ARG_ENABLE(fragile-hardening,
225 AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
226 if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
227 fragile_hardening="yes"
228 AC_DEFINE(DEBUG_SMARTLIST, 1, [Enable smartlist debugging])
231 dnl Linker hardening options
232 dnl Currently these options are ELF specific - you can't use this with MacOSX
233 AC_ARG_ENABLE(linker-hardening,
234 AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
236 AC_ARG_ENABLE(local-appdata,
237 AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
238 if test "$enable_local_appdata" = "yes"; then
239 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
240 [Defined if we default to host local appdata paths on Windows])
243 AC_ARG_ENABLE(tool-name-check,
244 AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
246 AC_ARG_ENABLE(seccomp,
247 AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
249 AC_ARG_ENABLE(libscrypt,
250 AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
252 dnl Enable event tracing which are transformed to debug log statement.
253 AC_ARG_ENABLE(event-tracing-debug,
254 AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log]))
255 AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"])
257 if test x$enable_event_tracing_debug = xyes; then
258 AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug])
259 AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation])
262 dnl Enable Android only features.
263 AC_ARG_ENABLE(android,
264 AS_HELP_STRING(--enable-android, [build with Android features enabled]))
265 AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])
267 if test "x$enable_android" = "xyes"; then
268 AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])
270 dnl Check if the Android log library is available.
271 AC_CHECK_HEADERS([android/log.h])
272 AC_SEARCH_LIBS(__android_log_write, [log])
277 dnl Tor modules options. These options are namespaced with --disable-module-XXX
281 m4_define(MODULES, relay dirauth)
284 AC_ARG_ENABLE([module-relay],
285 AS_HELP_STRING([--disable-module-relay],
286 [Build tor without the Relay modules: tor can not run as a relay, bridge, or authority. Implies --disable-module-dirauth]))
287 AM_CONDITIONAL(BUILD_MODULE_RELAY, [test "x$enable_module_relay" != "xno"])
288 AM_COND_IF(BUILD_MODULE_RELAY,
289 AC_DEFINE([HAVE_MODULE_RELAY], [1],
290 [Compile with Relay feature support]))
292 dnl Directory Authority module.
293 AC_ARG_ENABLE([module-dirauth],
294 AS_HELP_STRING([--disable-module-dirauth],
295 [Build tor without the Directory Authority module: tor can not run as a directory authority or bridge authority]))
296 AM_CONDITIONAL(BUILD_MODULE_DIRAUTH,[test "x$enable_module_dirauth" != "xno" && test "x$enable_module_relay" != "xno"])
297 AM_COND_IF(BUILD_MODULE_DIRAUTH,
298 AC_DEFINE([HAVE_MODULE_DIRAUTH], [1],
299 [Compile with Directory Authority feature support]))
301 dnl Helper variables.
302 TOR_MODULES_ALL_ENABLED=
303 AC_DEFUN([ADD_MODULE], [
304 MODULE=m4_toupper($1)
305 TOR_MODULES_ALL_ENABLED="${TOR_MODULES_ALL_ENABLED} -DHAVE_MODULE_${MODULE}=1"
307 m4_foreach_w([module], MODULES, [ADD_MODULE([module])])
308 AC_SUBST(TOR_MODULES_ALL_ENABLED)
310 dnl check for the correct "ar" when cross-compiling.
311 dnl (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
312 dnl so kludge up a replacement for the case where it isn't there yet.)
313 m4_ifdef([AM_PROG_AR],
315 [AN_MAKEVAR([AR], [AC_PROG_AR])
316 AN_PROGRAM([ar], [AC_PROG_AR])
317 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
320 dnl Check whether the above macro has settled for a simply named tool even
321 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
322 dnl because that will find any cc on the system, not only the cross-compiler,
323 dnl and then verify that a binary built with this compiler runs on the
324 dnl build system. It will then come to the false conclusion that we're not
326 if test "x$enable_tool_name_check" != "xno"; then
327 if test "x$ac_tool_warned" = "xyes"; then
328 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.)])
329 elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
330 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.)])
340 AC_ARG_VAR([PERL], [path to Perl binary])
341 AC_CHECK_PROGS([PERL], [perl])
342 AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
344 dnl check for asciidoc and a2x
345 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
346 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
348 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
349 AM_CONDITIONAL(BUILD_MANPAGE, [test "x$enable_manpage" != "xno"])
350 AM_CONDITIONAL(BUILD_HTML_DOCS, [test "x$enable_html_manual" != "xno"])
355 AC_CACHE_CHECK([for Python 3], [tor_cv_PYTHON],
356 [AC_PATH_PROGS_FEATURE_CHECK([PYTHON], [ \
358 python3.8 python3.7 python3.6 python3.5 python3.4 \
360 [["$ac_path_PYTHON" -c 'import sys; sys.exit(sys.version_info[0]<3)' && tor_cv_PYTHON="$ac_path_PYTHON" ac_path_PYTHON_found=:]] )])
361 AC_SUBST([PYTHON], [$tor_cv_PYTHON])
363 PYTHON="$tor_cv_PYTHON"
365 if test "x$PYTHON" = "x"; then
366 AC_MSG_WARN([Python 3 unavailable; some tests will not be run.])
369 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
371 dnl List all external rust crates we depend on here. Include the version
376 AC_SUBST(rust_crates)
378 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
379 AC_C_FLEXIBLE_ARRAY_MEMBER
381 dnl Maybe we've got an old autoconf...
382 AC_CACHE_CHECK([for flexible array members],
386 struct abc { int a; char b[]; };
388 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
391 [tor_cv_c_flexarray=yes],
392 [tor_cv_c_flexarray=no])])
393 if test "$tor_cv_flexarray" = "yes"; then
394 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
396 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
400 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
403 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
404 [tor_cv_c_c99_decl=yes],
405 [tor_cv_c_c99_decl=no] )])
406 if test "$tor_cv_c_c99_decl" != "yes"; then
407 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
410 AC_CACHE_CHECK([for working C99 designated initializers],
411 tor_cv_c_c99_designated_init,
413 [AC_LANG_PROGRAM([struct s { int a; int b; };],
414 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
415 [tor_cv_c_c99_designated_init=yes],
416 [tor_cv_c_c99_designated_init=no] )])
418 if test "$tor_cv_c_c99_designated_init" != "yes"; then
419 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
423 AC_ARG_WITH(tor-user,
424 AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
432 AC_ARG_WITH(tor-group,
433 AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
441 dnl If _WIN32 is defined and non-zero, we are building for win32
442 AC_MSG_CHECKING([for win32])
443 AC_RUN_IFELSE([AC_LANG_SOURCE([
444 int main(int c, char **v) {
455 bwin32=true; AC_MSG_RESULT([yes]),
456 bwin32=false; AC_MSG_RESULT([no]),
457 bwin32=cross; AC_MSG_RESULT([cross])
460 if test "$bwin32" = "cross"; then
461 AC_MSG_CHECKING([for win32 (cross)])
462 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
464 int main(int c, char **v) {return 0;}
467 int main(int c, char **v) {return x(y);}
470 bwin32=true; AC_MSG_RESULT([yes]),
471 bwin32=false; AC_MSG_RESULT([no]))
476 /* Defined to access windows functions and definitions for >=WinXP */
478 # define WINVER 0x0501
481 /* Defined to access _other_ windows functions and definitions for >=WinXP */
482 # ifndef _WIN32_WINNT
483 # define _WIN32_WINNT 0x0501
486 /* Defined to avoid including some windows headers as part of Windows.h */
487 # ifndef WIN32_LEAN_AND_MEAN
488 # define WIN32_LEAN_AND_MEAN 1
493 AM_CONDITIONAL(WIN32, test "x$bwin32" = "xtrue")
494 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
495 AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
497 dnl Enable C99 when compiling with MIPSpro
498 AC_MSG_CHECKING([for MIPSpro compiler])
499 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
500 #if (defined(__sgi) && defined(_COMPILER_VERSION))
505 bmipspro=false; AC_MSG_RESULT(no),
506 bmipspro=true; AC_MSG_RESULT(yes))
508 if test "$bmipspro" = "true"; then
509 CFLAGS="$CFLAGS -c99"
514 AC_ARG_VAR([TOR_RUST_TARGET], [Rust target, must be specified when cross-compiling (HOST != BUILD). example: i686-pc-windows-gnu])
516 if test "x$enable_rust" = "xyes"; then
517 AC_ARG_VAR([RUSTC], [path to the rustc binary])
518 AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
519 if test "x$RUSTC" = "xno"; then
520 AC_MSG_ERROR([rustc unavailable but rust integration requested.])
523 AC_ARG_VAR([CARGO], [path to the cargo binary])
524 AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
525 if test "x$CARGO" = "xno"; then
526 AC_MSG_ERROR([cargo unavailable but rust integration requested.])
529 AC_DEFINE([HAVE_RUST], 1, [have Rust])
530 if test "x$enable_fatal_warnings" = "xyes"; then
535 if test "x$enable_cargo_online_mode" = "xyes"; then
539 CARGO_ONLINE=--frozen
542 dnl When we're not allowed to touch the network, we need crate dependencies
543 dnl locally available.
544 AC_MSG_CHECKING([rust crate dependencies])
545 AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
546 if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
547 TOR_RUST_DEPENDENCIES="${srcdir}/src/ext/rust/crates"
549 dnl Check whether the path exists before we try to cd into it.
550 if test ! -d "$TOR_RUST_DEPENDENCIES"; then
551 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.])
554 dnl Make the path absolute, since we'll be using it from within a
556 TOR_RUST_DEPENDENCIES=$(cd "$TOR_RUST_DEPENDENCIES" ; pwd)
558 for dep in $rust_crates; do
559 if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
560 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.])
564 if test "x$ERRORED" = "x"; then
569 dnl For now both MSVC and MinGW rust libraries will output static libs with
570 dnl the MSVC naming convention.
571 if test "$bwin32" = "true"; then
572 tor_rust_static_name=tor_rust.lib
574 tor_rust_static_name=libtor_rust.a
579 if test -n "$TOR_RUST_TARGET"; then
580 if test "$host" = "$build"; then
581 AC_MSG_ERROR([HOST = BUILD is invalid if TOR_RUST_TARGET is specified, see configure --help for more information.])
583 RUST_TARGET_PROP="target = '$TOR_RUST_TARGET'"
584 TOR_RUST_LIB_PATH="src/rust/target/$TOR_RUST_TARGET/release/$tor_rust_static_name"
586 if test "$host" != "$build"; then
587 AC_MSG_ERROR([TOR_RUST_TARGET must be specified when cross-compiling with Rust enabled.])
590 TOR_RUST_LIB_PATH="src/rust/target/release/$tor_rust_static_name"
593 AC_SUBST(RUST_TARGET_PROP)
594 AC_SUBST(TOR_RUST_LIB_PATH)
595 AC_SUBST(CARGO_ONLINE)
599 dnl Let's check the rustc version, too
600 AC_MSG_CHECKING([rust version])
601 RUSTC_VERSION=`$RUSTC --version`
602 RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
603 RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
604 if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
605 AC_MSG_ERROR([rustc version couldn't be identified])
607 if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 31; then
608 AC_MSG_ERROR([rustc must be at least version 1.31.0])
610 AC_MSG_RESULT([$RUSTC_VERSION])
613 AC_SEARCH_LIBS(socket, [socket network])
614 AC_SEARCH_LIBS(gethostbyname, [nsl])
615 AC_SEARCH_LIBS(dlopen, [dl])
616 AC_SEARCH_LIBS(inet_aton, [resolv])
617 AC_SEARCH_LIBS(backtrace, [execinfo])
619 AC_SEARCH_LIBS([clock_gettime], [rt])
620 if test "$LIBS" != "$saved_LIBS"; then
621 # Looks like we need -lrt for clock_gettime().
625 if test "$bwin32" = "false"; then
626 AC_SEARCH_LIBS(pthread_create, [pthread])
627 AC_SEARCH_LIBS(pthread_detach, [pthread])
630 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
631 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
635 RtlSecureZeroMemory \
639 backtrace_symbols_fd \
645 get_current_dir_name \
654 gnu_get_libc_version \
692 # Apple messed up when they added some functions: they
693 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
696 # We should only probe for these functions if we are sure that we
697 # are not targeting OS X 10.9 or earlier.
698 AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
699 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
701 # include <AvailabilityMacros.h>
702 # ifndef MAC_OS_X_VERSION_10_10
703 # define MAC_OS_X_VERSION_10_10 101000
705 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
706 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
707 # error "Running on Mac OS X 10.9 or earlier"
712 [on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
713 [on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])
715 if test "$on_macos_pre_10_10" = "no"; then
717 mach_approximate_time \
721 # We should only probe for these functions if we are sure that we
722 # are not targeting OSX 10.11 or earlier.
723 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
724 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
726 # include <AvailabilityMacros.h>
727 # ifndef MAC_OS_X_VERSION_10_12
728 # define MAC_OS_X_VERSION_10_12 101200
730 # if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
731 # if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
732 # error "Running on Mac OSX 10.11 or earlier"
737 [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
738 [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
740 if test "$on_macos_pre_10_12" = "no"; then
747 if test "$bwin32" != "true"; then
748 AC_CHECK_HEADERS(pthread.h)
749 AC_CHECK_FUNCS(pthread_create)
750 AC_CHECK_FUNCS(pthread_condattr_setclock)
753 if test "$bwin32" = "true"; then
754 AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
761 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
762 test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
764 AC_MSG_CHECKING([whether free(NULL) works])
765 AC_RUN_IFELSE([AC_LANG_PROGRAM([
771 [free_null_ok=true; AC_MSG_RESULT(yes)],
772 [free_null_ok=false; AC_MSG_RESULT(no)],
773 [free_null_ok=cross; AC_MSG_RESULT(cross)])
775 if test "$free_null_ok" = "false"; then
776 AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
779 dnl ------------------------------------------------------
780 dnl Where do you live, libevent? And how do we call you?
782 if test "$bwin32" = "true"; then
783 TOR_LIB_WS32=-lws2_32
784 TOR_LIB_IPHLPAPI=-liphlpapi
785 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
786 # think it's actually necessary.
788 TOR_LIB_USERENV=-luserenv
794 AC_SUBST(TOR_LIB_WS32)
795 AC_SUBST(TOR_LIB_GDI)
796 AC_SUBST(TOR_LIB_IPHLPAPI)
797 AC_SUBST(TOR_LIB_USERENV)
799 tor_libevent_pkg_redhat="libevent"
800 tor_libevent_pkg_debian="libevent-dev"
801 tor_libevent_devpkg_redhat="libevent-devel"
802 tor_libevent_devpkg_debian="libevent-dev"
804 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
805 dnl linking for static builds.
806 STATIC_LIBEVENT_FLAGS=""
807 if test "$enable_static_libevent" = "yes"; then
808 if test "$have_rt" = "yes"; then
809 STATIC_LIBEVENT_FLAGS=" -lrt "
813 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
815 #include <winsock2.h>
817 #include <sys/time.h>
818 #include <sys/types.h>
819 #include <event2/event.h>], [
821 #include <winsock2.h>
824 struct event_base *event_base_new(void);
825 void event_base_free(struct event_base *);],
828 {WSADATA d; WSAStartup(0x101,&d); }
830 event_base_free(event_base_new());
831 ], [--with-libevent-dir], [/opt/libevent])
833 dnl Determine the incantation needed to link libevent.
835 save_LDFLAGS="$LDFLAGS"
836 save_CPPFLAGS="$CPPFLAGS"
838 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
839 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
840 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
842 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
844 if test "$enable_static_libevent" = "yes"; then
845 if test "$tor_cv_library_libevent_dir" = "(system)"; then
846 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
848 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
851 if test "x$ac_cv_header_event2_event_h" = "xyes"; then
852 AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
853 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"))
855 if test "$ac_cv_search_event_new" != "none required"; then
856 TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
858 if test "$ac_cv_search_evdns_base_new" != "none required"; then
859 TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
862 AC_MSG_ERROR("libevent2 is required but the headers could not be found")
866 dnl Now check for particular libevent functions.
867 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
868 evutil_secure_rng_add_bytes \
869 evdns_base_get_nameserver_addr \
874 LDFLAGS="$save_LDFLAGS"
875 CPPFLAGS="$save_CPPFLAGS"
877 dnl Check that libevent is at least at version 2.0.10, the first stable
878 dnl release of its series
879 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
880 AC_MSG_CHECKING([whether Libevent is new enough])
881 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
882 #include <event2/event.h>
883 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
889 ])], [ AC_MSG_RESULT([yes]) ],
890 [ AC_MSG_RESULT([no])
891 AC_MSG_ERROR([Libevent is not new enough. We require 2.0.10-stable or later]) ] )
894 LDFLAGS="$save_LDFLAGS"
895 CPPFLAGS="$save_CPPFLAGS"
897 AC_SUBST(TOR_LIBEVENT_LIBS)
899 dnl ------------------------------------------------------
900 dnl Where do you live, libm?
902 dnl On some platforms (Haiku/BeOS) the math library is
903 dnl part of libroot. In which case don't link against lm
906 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
907 if test "$ac_cv_search_pow" != "none required"; then
908 TOR_LIB_MATH="$ac_cv_search_pow"
911 AC_SUBST(TOR_LIB_MATH)
913 dnl ------------------------------------------------------
914 dnl Hello, NSS. You're new around here.
915 if test "x$enable_nss" = "xyes"; then
916 PKG_CHECK_MODULES(NSS,
919 [have_nss=no; AC_MSG_ERROR([You asked for NSS but I can't find it, $pkg_config_user_action, or set NSS_CFLAGS and NSS_LIBS.])])
924 dnl ------------------------------------------------------
925 dnl Where do you live, openssl? And how do we call you?
927 if test "x$enable_nss" != "xyes"; then
929 tor_openssl_pkg_redhat="openssl"
930 tor_openssl_pkg_debian="libssl-dev"
931 tor_openssl_devpkg_redhat="openssl-devel"
932 tor_openssl_devpkg_debian="libssl-dev"
934 ALT_openssl_WITHVAL=""
936 AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
938 if test "x$withval" != "xno" && test "x$withval" != "x"; then
939 ALT_openssl_WITHVAL="$withval"
943 AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
944 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
945 [#include <openssl/ssl.h>
946 char *getenv(const char *);],
947 [struct ssl_cipher_st;
948 unsigned SSL_CIPHER_get_id(const struct ssl_cipher_st *);
949 char *getenv(const char *);],
950 dnl This funny-looking test program calls getenv, so that the compiler
951 dnl will neither make code that call SSL_CIPHER_get_id(NULL) [producing
952 dnl a crash], nor optimize out the call to SSL_CIPHER_get_id().
953 dnl We look for SSL_cipher_get_id() because it is present in
954 dnl OpenSSL >=1.0.1, because it is not deprecated, and because Tor
956 [if (getenv("THIS_SHOULDNT_BE_SET_X201803")) SSL_CIPHER_get_id((void *)0);], [],
957 [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
959 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
961 if test "$enable_static_openssl" = "yes"; then
962 if test "$tor_cv_library_openssl_dir" = "(system)"; then
963 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
965 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
968 TOR_OPENSSL_LIBS="-lssl -lcrypto"
970 AC_SUBST(TOR_OPENSSL_LIBS)
972 dnl Now check for particular openssl functions.
974 save_LDFLAGS="$LDFLAGS"
975 save_CPPFLAGS="$CPPFLAGS"
976 LIBS="$TOR_OPENSSL_LIBS $LIBS"
977 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
978 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
980 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
981 #include <openssl/opensslv.h>
982 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
987 [ 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.]) ])
989 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
990 #include <openssl/opensslv.h>
991 #include <openssl/evp.h>
992 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
995 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
996 #error "curves unavailable"
1000 [ 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.]) ])
1002 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
1003 [#include <openssl/ssl.h>
1006 dnl OpenSSL functions which we might not have. In theory, we could just
1007 dnl check the openssl version number, but in practice that gets pretty
1008 dnl confusing with LibreSSL, OpenSSL, and various distributions' patches
1011 ERR_load_KDF_strings \
1015 SSL_CTX_set1_groups_list \
1016 SSL_CTX_set_security_level \
1017 SSL_SESSION_get_master_key \
1018 SSL_get_client_ciphers \
1019 SSL_get_client_random \
1020 SSL_get_server_random \
1024 dnl Check if OpenSSL structures are opaque
1025 AC_CHECK_MEMBERS([SSL.state], , ,
1026 [#include <openssl/ssl.h>
1029 AC_CHECK_SIZEOF(SHA_CTX, , [AC_INCLUDES_DEFAULT()
1030 #include <openssl/sha.h>
1035 dnl We will someday make KECCAK_TINY optional, but for now we still need
1036 dnl it for SHAKE, since OpenSSL's SHAKE can't be squeezed more than
1037 dnl once. See comment in the definition of crypto_xof_t.
1039 dnl AM_CONDITIONAL(BUILD_KECCAK_TINY,
1040 dnl test "x$ac_cv_func_EVP_sha3_256" != "xyes")
1042 AM_CONDITIONAL(BUILD_KECCAK_TINY, true)
1044 dnl ======================================================================
1045 dnl Can we use KIST?
1047 dnl Define the set of checks for KIST scheduler support.
1048 AC_DEFUN([CHECK_KIST_SUPPORT],[
1049 dnl KIST needs struct tcp_info and for certain members to exist.
1051 [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
1052 , ,[[#include <netinet/tcp.h>]])
1053 dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
1054 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1055 #include <linux/sockios.h>
1059 ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
1060 if test "x$have_siocoutqnsd" = "xyes"; then
1061 if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
1062 if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
1063 have_kist_support=yes
1068 dnl Now, trigger the check.
1070 AS_IF([test "x$have_kist_support" = "xyes"],
1071 [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
1073 [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
1076 LDFLAGS="$save_LDFLAGS"
1077 CPPFLAGS="$save_CPPFLAGS"
1079 dnl ------------------------------------------------------
1080 dnl Where do you live, zlib? And how do we call you?
1082 tor_zlib_pkg_redhat="zlib"
1083 tor_zlib_pkg_debian="zlib1g"
1084 tor_zlib_devpkg_redhat="zlib-devel"
1085 tor_zlib_devpkg_debian="zlib1g-dev"
1087 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
1088 [#include <zlib.h>],
1089 [const char * zlibVersion(void);],
1090 [zlibVersion();], [--with-zlib-dir],
1093 if test "$enable_static_zlib" = "yes"; then
1094 if test "$tor_cv_library_zlib_dir" = "(system)"; then
1095 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
1096 using --enable-static-zlib")
1098 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
1103 AC_SUBST(TOR_ZLIB_LIBS)
1105 dnl ------------------------------------------------------
1106 dnl Where we do we find lzma?
1109 AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
1110 [case "${enableval}" in
1113 * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
1114 esac], [enable_lzma=auto])
1116 if test "x$enable_lzma" = "xno"; then
1119 PKG_CHECK_MODULES([LZMA],
1124 if test "x$have_lzma" = "xno" ; then
1125 AC_MSG_WARN([Unable to find liblzma, $pkg_config_user_action, or set LZMA_CFLAGS and LZMA_LIBS.])
1129 if test "x$have_lzma" = "xyes"; then
1130 AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
1131 TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
1132 TOR_LZMA_LIBS="${LZMA_LIBS}"
1134 AC_SUBST(TOR_LZMA_CFLAGS)
1135 AC_SUBST(TOR_LZMA_LIBS)
1137 dnl ------------------------------------------------------
1138 dnl Where we do we find zstd?
1141 AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
1142 [case "${enableval}" in
1145 * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
1146 esac], [enable_zstd=auto])
1148 if test "x$enable_zstd" = "xno"; then
1151 PKG_CHECK_MODULES([ZSTD],
1156 if test "x$have_zstd" = "xno" ; then
1157 AC_MSG_WARN([Unable to find libzstd, $pkg_config_user_action, or set ZSTD_CFLAGS and ZSTD_LIBS.])
1161 if test "x$have_zstd" = "xyes"; then
1162 AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
1163 TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
1164 TOR_ZSTD_LIBS="${ZSTD_LIBS}"
1166 dnl now check for zstd functions
1168 save_CFLAGS="$CFLAGS"
1169 LIBS="$LIBS $ZSTD_LIBS"
1170 CFLAGS="$CFLAGS $ZSTD_CFLAGS"
1171 AC_CHECK_FUNCS(ZSTD_estimateCStreamSize \
1172 ZSTD_estimateDCtxSize)
1174 CFLAGS="$save_CFLAGS"
1176 AC_SUBST(TOR_ZSTD_CFLAGS)
1177 AC_SUBST(TOR_ZSTD_LIBS)
1179 dnl ----------------------------------------------------------------------
1180 dnl Check if libcap is available for capabilities.
1182 tor_cap_pkg_debian="libcap2"
1183 tor_cap_pkg_redhat="libcap"
1184 tor_cap_devpkg_debian="libcap-dev"
1185 tor_cap_devpkg_redhat="libcap-devel"
1187 AC_CHECK_LIB([cap], [cap_init], [],
1188 AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
1190 AC_CHECK_FUNCS(cap_set_proc)
1192 dnl ---------------------------------------------------------------------
1193 dnl Now that we know about our major libraries, we can check for compiler
1194 dnl and linker hardening options. We need to do this with the libraries known,
1195 dnl since sometimes the linker will like an option but not be willing to
1196 dnl use it with a build of a library.
1198 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1199 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"
1207 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1208 #if !defined(__clang__)
1210 #endif])], have_clang=yes, have_clang=no)
1212 if test "x$enable_pic" = "xyes"; then
1213 TOR_CHECK_CFLAGS(-fPIC)
1216 if test "x$enable_gcc_hardening" != "xno"; then
1217 CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1218 if test "x$have_clang" = "xyes"; then
1219 TOR_CHECK_CFLAGS(-Qunused-arguments)
1221 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1222 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1223 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1224 m4_ifdef([AS_VAR_IF],[
1225 AS_VAR_IF(can_compile, [yes],
1226 AS_VAR_IF(can_link, [yes],
1228 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.)]))
1230 AS_VAR_POPDEF([can_link])
1231 AS_VAR_POPDEF([can_compile])
1232 TOR_CHECK_CFLAGS(-Wstack-protector)
1233 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1234 if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1235 if test "$enable_pic" != "yes"; then
1236 # If we have already enabled -fPIC, then we don't also need to
1237 # compile with -fPIE...
1238 TOR_CHECK_CFLAGS(-fPIE)
1240 # ... but we want to link our executables with -pie in any case, since
1241 # they're executables, not a library.
1242 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1244 TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1246 AC_MSG_CHECKING([whether we can run hardened binaries])
1247 AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
1248 [AC_MSG_RESULT([yes])],
1249 [AC_MSG_RESULT([no])
1251 We can link with compiler hardening options, but we can't run with them.
1252 That's a bad sign! If you must, you can pass --disable-gcc-hardening to
1253 configure, but it would be better to figure out what the underlying problem
1255 [AC_MSG_RESULT([cross])])
1258 if test "$fragile_hardening" = "yes"; then
1259 TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1260 if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1261 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.])
1264 if test "$tor_cv_cflags__ftrapv" != "yes"; then
1265 AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1268 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1269 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1270 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*])
1273 TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1274 if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1275 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*])
1278 TOR_TRY_COMPILE_WITH_CFLAGS([-fno-sanitize=float-divide-by-zero], also_link, CFLAGS_UBSAN="-fno-sanitize=float-divide-by-zero", true)
1279 if test "$tor_cv_cflags__fno_sanitize_float_divide_by_zero" = "yes" && test "$tor_can_link__fno_sanitize_float_divide_by_zero" != "yes"; then
1280 AC_MSG_ERROR([The compiler supports -fno-sanitize=float-divide-by-zero, 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*])
1283 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1286 dnl Find the correct libraries to add in order to use the sanitizers.
1288 dnl When building Rust, Cargo will run the linker with the -nodefaultlibs
1289 dnl option, which will prevent the compiler from linking the sanitizer
1290 dnl libraries it needs. We need to specify them manually.
1292 dnl What's more, we need to specify them in a linker script rather than
1293 dnl from build.rs: these options aren't allowed in the cargo:rustc-flags
1295 RUST_LINKER_OPTIONS=""
1296 if test "x$have_clang" = "xyes"; then
1297 if test "x$CFLAGS_ASAN" != "x"; then
1298 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_ASAN -Cdefault-linker-libraries"
1300 if test "x$CFLAGS_UBSAN" != "x"; then
1301 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_UBSAN -Cdefault-linker-libraries"
1304 if test "x$CFLAGS_ASAN" != "x"; then
1305 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=address -Cdefault-linker-libraries"
1307 if test "x$CFLAGS_UBSAN" != "x"; then
1308 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=undefined -Cdefault-linker-libraries"
1311 AC_SUBST(RUST_LINKER_OPTIONS)
1313 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1314 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1316 mulodi_fixes_ftrapv=no
1317 if test "$have_clang" = "yes"; then
1318 saved_CFLAGS="$CFLAGS"
1319 CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1320 AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1325 int main(int argc, char **argv)
1327 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1328 * (int64_t)atoi(argv[3]);
1331 [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1332 [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1333 if test "$ftrapv_can_link" = "no"; then
1334 AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1339 int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1343 int main(int argc, char **argv)
1345 int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1346 * (int64_t)atoi(argv[3]);
1349 [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1350 [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1352 CFLAGS="$saved_CFLAGS"
1355 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1357 dnl These cflags add bunches of branches, and we haven't been able to
1358 dnl persuade ourselves that they're suitable for code that needs to be
1360 AC_SUBST(CFLAGS_BUGTRAP)
1361 dnl These cflags are variant ones sutable for code that needs to be
1363 AC_SUBST(CFLAGS_CONSTTIME)
1365 if test "x$enable_linker_hardening" != "xno"; then
1366 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1369 # For backtrace support
1370 TOR_CHECK_LDFLAGS(-rdynamic)
1372 dnl ------------------------------------------------------
1373 dnl Now see if we have a -fomit-frame-pointer compiler option.
1375 saved_CFLAGS="$CFLAGS"
1376 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1377 F_OMIT_FRAME_POINTER=''
1378 if test "$saved_CFLAGS" != "$CFLAGS"; then
1379 if test "$fragile_hardening" = "yes"; then
1380 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1383 CFLAGS="$saved_CFLAGS"
1384 AC_SUBST(F_OMIT_FRAME_POINTER)
1386 dnl ------------------------------------------------------
1387 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1388 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1389 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1391 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1393 dnl ============================================================
1394 dnl Check for libseccomp
1396 if test "x$enable_seccomp" != "xno"; then
1397 AC_CHECK_HEADERS([seccomp.h])
1398 AC_SEARCH_LIBS(seccomp_init, [seccomp])
1401 dnl ============================================================
1402 dnl Check for libscrypt
1404 if test "x$enable_libscrypt" != "xno"; then
1405 AC_CHECK_HEADERS([libscrypt.h])
1406 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1407 AC_CHECK_FUNCS([libscrypt_scrypt])
1410 dnl ============================================================
1411 dnl We need an implementation of curve25519.
1413 dnl set these defaults.
1414 build_curve25519_donna=no
1415 build_curve25519_donna_c64=no
1416 use_curve25519_donna=no
1417 use_curve25519_nacl=no
1420 dnl The best choice is using curve25519-donna-c64, but that requires
1422 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1423 tor_cv_can_use_curve25519_donna_c64,
1425 [AC_LANG_PROGRAM([dnl
1427 typedef unsigned uint128_t __attribute__((mode(TI)));
1428 int func(uint64_t a, uint64_t b) {
1429 uint128_t c = ((uint128_t)a) * b;
1430 int ok = ((uint64_t)(c>>96)) == 522859 &&
1431 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1432 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1433 (((uint64_t)(c))&0xffffffffL) == 0;
1437 int ok = func( ((uint64_t)2000000000) * 1000000000,
1438 ((uint64_t)1234567890) << 24);
1441 [tor_cv_can_use_curve25519_donna_c64=yes],
1442 [tor_cv_can_use_curve25519_donna_c64=no],
1444 [AC_LANG_PROGRAM([dnl
1446 typedef unsigned uint128_t __attribute__((mode(TI)));
1447 int func(uint64_t a, uint64_t b) {
1448 uint128_t c = ((uint128_t)a) * b;
1449 int ok = ((uint64_t)(c>>96)) == 522859 &&
1450 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1451 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1452 (((uint64_t)(c))&0xffffffffL) == 0;
1456 int ok = func( ((uint64_t)2000000000) * 1000000000,
1457 ((uint64_t)1234567890) << 24);
1460 [tor_cv_can_use_curve25519_donna_c64=cross],
1461 [tor_cv_can_use_curve25519_donna_c64=no])])])
1463 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1464 nacl/crypto_scalarmult_curve25519.h])
1466 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1467 tor_cv_can_use_curve25519_nacl,
1468 [tor_saved_LIBS="$LIBS"
1471 [AC_LANG_PROGRAM([dnl
1472 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1473 #include <crypto_scalarmult_curve25519.h>
1474 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1475 #include <nacl/crypto_scalarmult_curve25519.h>
1477 #ifdef crypto_scalarmult_curve25519_ref_BYTES
1478 #error Hey, this is the reference implementation! That's not fast.
1481 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1482 ])], [tor_cv_can_use_curve25519_nacl=yes],
1483 [tor_cv_can_use_curve25519_nacl=no])
1484 LIBS="$tor_saved_LIBS" ])
1486 dnl Okay, now we need to figure out which one to actually use. Fall back
1487 dnl to curve25519-donna.c
1489 if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1490 build_curve25519_donna_c64=yes
1491 use_curve25519_donna=yes
1492 elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1493 use_curve25519_nacl=yes
1494 CURVE25519_LIBS=-lnacl
1496 build_curve25519_donna=yes
1497 use_curve25519_donna=yes
1500 if test "x$use_curve25519_donna" = "xyes"; then
1501 AC_DEFINE(USE_CURVE25519_DONNA, 1,
1502 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1504 if test "x$use_curve25519_nacl" = "xyes"; then
1505 AC_DEFINE(USE_CURVE25519_NACL, 1,
1506 [Defined if we should use a curve25519 from nacl])
1508 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1509 test "x$build_curve25519_donna" = "xyes")
1510 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1511 test "x$build_curve25519_donna_c64" = "xyes")
1512 AC_SUBST(CURVE25519_LIBS)
1514 dnl Make sure to enable support for large off_t if available.
1517 AC_CHECK_HEADERS([errno.h \
1531 gnu/libc-version.h \
1571 AC_CHECK_HEADERS(sys/param.h)
1573 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1574 [#ifdef HAVE_SYS_TYPES_H
1575 #include <sys/types.h>
1577 #ifdef HAVE_SYS_SOCKET_H
1578 #include <sys/socket.h>
1580 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1581 [#ifdef HAVE_SYS_TYPES_H
1582 #include <sys/types.h>
1584 #ifdef HAVE_SYS_SOCKET_H
1585 #include <sys/socket.h>
1587 #ifdef HAVE_NET_IF_H
1590 #ifdef HAVE_NETINET_IN_H
1591 #include <netinet/in.h>
1594 AC_CHECK_HEADERS(linux/if.h,[],[],
1596 #ifdef HAVE_SYS_SOCKET_H
1597 #include <sys/socket.h>
1601 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1602 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1603 [#ifdef HAVE_SYS_TYPES_H
1604 #include <sys/types.h>
1606 #ifdef HAVE_SYS_SOCKET_H
1607 #include <sys/socket.h>
1609 #ifdef HAVE_LIMITS_H
1612 #ifdef HAVE_LINUX_TYPES_H
1613 #include <linux/types.h>
1615 #ifdef HAVE_NETINET_IN6_H
1616 #include <netinet/in6.h>
1618 #ifdef HAVE_NETINET_IN_H
1619 #include <netinet/in.h>
1622 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1623 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1624 [#ifdef HAVE_SYS_TYPES_H
1625 #include <sys/types.h>
1627 #ifdef HAVE_SYS_SOCKET_H
1628 #include <sys/socket.h>
1630 #ifdef HAVE_LIMITS_H
1633 #ifdef HAVE_LINUX_TYPES_H
1634 #include <linux/types.h>
1636 #ifdef HAVE_NETINET_IN6_H
1637 #include <netinet/in6.h>
1639 #ifdef HAVE_NETINET_IN_H
1640 #include <netinet/in.h>
1642 #ifdef HAVE_LINUX_IF_H
1643 #include <linux/if.h>
1647 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1650 if test "x$linux_netfilter_ipv4" = "x1"; then
1653 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1656 if test "x$transparent_ok" = "x1"; then
1657 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1659 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1662 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1663 [#ifdef HAVE_SYS_TYPES_H
1664 #include <sys/types.h>
1666 #ifdef HAVE_SYS_TIME_H
1667 #include <sys/time.h>
1670 AC_CHECK_SIZEOF(char)
1671 AC_CHECK_SIZEOF(short)
1672 AC_CHECK_SIZEOF(int)
1673 AC_CHECK_SIZEOF(unsigned int)
1674 AC_CHECK_SIZEOF(long)
1675 AC_CHECK_SIZEOF(long long)
1676 AC_CHECK_SIZEOF(__int64)
1677 AC_CHECK_SIZEOF(void *)
1678 AC_CHECK_SIZEOF(time_t)
1679 AC_CHECK_SIZEOF(size_t)
1680 AC_CHECK_SIZEOF(pid_t)
1682 AC_CHECK_TYPES([uint, u_char, ssize_t])
1684 AC_PC_FROM_UCONTEXT([:])
1686 dnl used to include sockaddr_storage, but everybody has that.
1687 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1688 [#ifdef HAVE_SYS_TYPES_H
1689 #include <sys/types.h>
1691 #ifdef HAVE_NETINET_IN_H
1692 #include <netinet/in.h>
1694 #ifdef HAVE_NETINET_IN6_H
1695 #include <netinet/in6.h>
1697 #ifdef HAVE_SYS_SOCKET_H
1698 #include <sys/socket.h>
1701 #define _WIN32_WINNT 0x0501
1702 #define WIN32_LEAN_AND_MEAN
1703 #include <winsock2.h>
1704 #include <ws2tcpip.h>
1707 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1708 [#ifdef HAVE_SYS_TYPES_H
1709 #include <sys/types.h>
1711 #ifdef HAVE_NETINET_IN_H
1712 #include <netinet/in.h>
1714 #ifdef HAVE_NETINET_IN6_H
1715 #include <netinet/in6.h>
1717 #ifdef HAVE_SYS_SOCKET_H
1718 #include <sys/socket.h>
1721 #define _WIN32_WINNT 0x0501
1722 #define WIN32_LEAN_AND_MEAN
1723 #include <winsock2.h>
1724 #include <ws2tcpip.h>
1728 AC_CHECK_TYPES([rlim_t], , ,
1729 [#ifdef HAVE_SYS_TYPES_H
1730 #include <sys/types.h>
1732 #ifdef HAVE_SYS_TIME_H
1733 #include <sys/time.h>
1735 #ifdef HAVE_SYS_RESOURCE_H
1736 #include <sys/resource.h>
1740 AX_CHECK_SIGN([time_t],
1743 #ifdef HAVE_SYS_TYPES_H
1744 #include <sys/types.h>
1746 #ifdef HAVE_SYS_TIME_H
1747 #include <sys/time.h>
1754 if test "$ax_cv_decl_time_t_signed" = "no"; then
1755 AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1758 AX_CHECK_SIGN([size_t],
1759 [ tor_cv_size_t_signed=yes ],
1760 [ tor_cv_size_t_signed=no ], [
1761 #ifdef HAVE_SYS_TYPES_H
1762 #include <sys/types.h>
1766 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1767 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1770 AX_CHECK_SIGN([enum always],
1771 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1773 enum always { AAA, BBB, CCC };
1776 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1777 #ifdef HAVE_SYS_SOCKET_H
1778 #include <sys/socket.h>
1782 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1784 AC_CHECK_SIZEOF(cell_t)
1786 # Let's see if stdatomic works. (There are some debian clangs that screw it
1787 # up; see Tor bug #26779 and debian bug 903709.)
1788 AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
1789 tor_cv_stdatomic_works,
1790 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1791 #include <stdatomic.h>
1792 struct x { atomic_size_t y; };
1793 void try_atomic_init(struct x *xx)
1795 atomic_init(&xx->y, 99);
1796 atomic_fetch_add(&xx->y, 1);
1798 ]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
1800 if test "$tor_cv_stdatomic_works" = "yes"; then
1801 AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
1802 elif test "$ac_cv_header_stdatomic_h" = "yes"; then
1803 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 ])
1806 # Now make sure that NULL can be represented as zero bytes.
1807 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1808 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1809 [[#include <stdlib.h>
1812 #ifdef HAVE_STDDEF_H
1815 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1816 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1817 [tor_cv_null_is_zero=yes],
1818 [tor_cv_null_is_zero=no],
1819 [tor_cv_null_is_zero=cross])])
1821 if test "$tor_cv_null_is_zero" = "cross"; then
1822 # Cross-compiling; let's hope that the target isn't raving mad.
1823 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1826 if test "$tor_cv_null_is_zero" != "no"; then
1827 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1828 [Define to 1 iff memset(0) sets pointers to NULL])
1831 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1832 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1833 [[#include <stdlib.h>
1836 #ifdef HAVE_STDDEF_H
1839 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1840 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1841 [tor_cv_dbl0_is_zero=yes],
1842 [tor_cv_dbl0_is_zero=no],
1843 [tor_cv_dbl0_is_zero=cross])])
1845 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1846 # Cross-compiling; let's hope that the target isn't raving mad.
1847 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1850 if test "$tor_cv_dbl0_is_zero" != "no"; then
1851 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1852 [Define to 1 iff memset(0) sets doubles to 0.0])
1855 # And what happens when we malloc zero?
1856 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1857 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1858 [[#include <stdlib.h>
1861 #ifdef HAVE_STDDEF_H
1864 int main () { return malloc(0)?0:1; }]])],
1865 [tor_cv_malloc_zero_works=yes],
1866 [tor_cv_malloc_zero_works=no],
1867 [tor_cv_malloc_zero_works=cross])])
1869 if test "$tor_cv_malloc_zero_works" = "cross"; then
1870 # Cross-compiling; let's hope that the target isn't raving mad.
1871 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1874 if test "$tor_cv_malloc_zero_works" = "yes"; then
1875 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1876 [Define to 1 iff malloc(0) returns a pointer])
1879 # whether we seem to be in a 2s-complement world.
1880 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1881 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1882 [[int main () { int problem = ((-99) != (~99)+1);
1883 return problem ? 1 : 0; }]])],
1884 [tor_cv_twos_complement=yes],
1885 [tor_cv_twos_complement=no],
1886 [tor_cv_twos_complement=cross])])
1888 if test "$tor_cv_twos_complement" = "cross"; then
1889 # Cross-compiling; let's hope that the target isn't raving mad.
1890 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1893 if test "$tor_cv_twos_complement" != "no"; then
1894 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1895 [Define to 1 iff we represent negative integers with
1899 # What does shifting a negative value do?
1900 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1901 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1902 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1903 [tor_cv_sign_extend=yes],
1904 [tor_cv_sign_extend=no],
1905 [tor_cv_sign_extend=cross])])
1907 if test "$tor_cv_sign_extend" = "cross"; then
1908 # Cross-compiling; let's hope that the target isn't raving mad.
1909 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1912 if test "$tor_cv_sign_extend" != "no"; then
1913 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1914 [Define to 1 iff right-shifting a negative value performs sign-extension])
1917 # Is uint8_t the same type as unsigned char?
1918 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
1919 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1922 unsigned char c;]])],
1923 [tor_cv_uint8_uchar=yes],
1924 [tor_cv_uint8_uchar=no],
1925 [tor_cv_uint8_uchar=cross])])
1927 if test "$tor_cv_uint8_uchar" = "cross"; then
1928 AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
1931 if test "$tor_cv_uint8_uchar" = "no"; then
1932 AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
1935 AC_ARG_WITH(tcmalloc,
1936 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library. Deprecated; see --with-malloc]))
1938 default_malloc=system
1940 if test "x$enable_openbsd_malloc" = "xyes" ; then
1941 AC_MSG_NOTICE([The --enable-openbsd-malloc argument is deprecated; use --with-malloc=openbsd instead.])
1942 default_malloc=openbsd
1945 if test "x$with_tcmalloc" = "xyes"; then
1946 AC_MSG_NOTICE([The --with-tcmalloc argument is deprecated; use --with-malloc=tcmalloc instead.])
1947 default_malloc=tcmalloc
1951 AS_HELP_STRING([--with-malloc=[system,jemalloc,tcmalloc,openbsd]],
1952 [select special malloc implementation [system]]),
1953 [ malloc="$with_malloc" ], [ malloc="$default_malloc" ])
1957 PKG_CHECK_MODULES([TCMALLOC],
1962 if test "x$have_tcmalloc" = "xno" ; then
1963 AC_MSG_ERROR([Unable to find tcmalloc requested by --with-malloc, $pkg_config_user_action, or set TCMALLOC_CFLAGS and TCMALLOC_LIBS.])
1966 CFLAGS="$CFLAGS $TCMALLOC_CFLAGS"
1967 LIBS="$TCMALLOC_LIBS $LIBS"
1971 PKG_CHECK_MODULES([JEMALLOC],
1976 if test "x$have_jemalloc" = "xno" ; then
1977 AC_MSG_ERROR([Unable to find jemalloc requested by --with-malloc, $pkg_config_user_action, or set JEMALLOC_CFLAGS and JEMALLOC_LIBS.])
1980 CFLAGS="$CFLAGS $JEMALLOC_CFLAGS"
1981 LIBS="$JEMALLOC_LIBS $LIBS"
1982 using_custom_malloc=yes
1986 AC_MSG_WARN([The openbsd malloc port is deprecated in Tor 0.3.5 and will be removed in a future version.])
1987 enable_openbsd_malloc=yes
1991 # handle this later, including the jemalloc fallback
1992 AC_CHECK_FUNCS(mallinfo)
1995 [AC_MSG_ERROR([--with-malloc=`$with_malloc' not supported, see --help])
1998 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
2000 if test "$malloc" != "system"; then
2001 # Tell the C compiler not to use the system allocator functions.
2002 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2004 if test "$using_custom_malloc" = "yes"; then
2005 # Tell the C compiler not to use the system allocator functions.
2006 TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2009 # By default, we're going to assume we don't have mlockall()
2010 # bionic and other platforms have various broken mlockall subsystems.
2011 # Some systems don't have a working mlockall, some aren't linkable,
2012 # and some have it but don't declare it.
2013 AC_CHECK_FUNCS(mlockall)
2014 AC_CHECK_DECLS([mlockall], , , [
2015 #ifdef HAVE_SYS_MMAN_H
2016 #include <sys/mman.h>
2019 # Allow user to specify an alternate syslog facility
2020 AC_ARG_WITH(syslog-facility,
2021 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
2022 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
2023 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
2024 AC_SUBST(LOGFACILITY)
2026 # Check if we have getresuid and getresgid
2027 AC_CHECK_FUNCS(getresuid getresgid)
2029 # Check for gethostbyname_r in all its glorious incompatible versions.
2030 # (This logic is based on that in Python's configure.in)
2031 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
2032 [Define this if you have any gethostbyname_r()])
2034 AC_CHECK_FUNC(gethostbyname_r, [
2035 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
2037 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
2038 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2042 struct hostent *h1, *h2;
2044 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
2046 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2047 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
2048 [Define this if gethostbyname_r takes 6 arguments])
2051 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2057 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
2059 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2060 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
2061 [Define this if gethostbyname_r takes 5 arguments])
2064 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2069 struct hostent_data hd;
2070 (void) gethostbyname_r(cp1,h1,&hd);
2072 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2073 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
2074 [Define this if gethostbyname_r takes 3 arguments])
2084 AC_CACHE_CHECK([whether the C compiler supports __func__],
2085 tor_cv_have_func_macro,
2086 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2088 int main(int c, char **v) { puts(__func__); }])],
2089 tor_cv_have_func_macro=yes,
2090 tor_cv_have_func_macro=no))
2092 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
2093 tor_cv_have_FUNC_macro,
2094 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2096 int main(int c, char **v) { puts(__FUNC__); }])],
2097 tor_cv_have_FUNC_macro=yes,
2098 tor_cv_have_FUNC_macro=no))
2100 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
2101 tor_cv_have_FUNCTION_macro,
2102 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2104 int main(int c, char **v) { puts(__FUNCTION__); }])],
2105 tor_cv_have_FUNCTION_macro=yes,
2106 tor_cv_have_FUNCTION_macro=no))
2108 AC_CACHE_CHECK([whether we have extern char **environ already declared],
2109 tor_cv_have_environ_declared,
2110 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2111 #ifdef HAVE_UNISTD_H
2115 int main(int c, char **v) { char **t = environ; }])],
2116 tor_cv_have_environ_declared=yes,
2117 tor_cv_have_environ_declared=no))
2119 if test "$tor_cv_have_func_macro" = "yes"; then
2120 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
2123 if test "$tor_cv_have_FUNC_macro" = "yes"; then
2124 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
2127 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
2128 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
2129 [Defined if the compiler supports __FUNCTION__])
2132 if test "$tor_cv_have_environ_declared" = "yes"; then
2133 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
2134 [Defined if we have extern char **environ already declared])
2137 # $prefix stores the value of the --prefix command line option, or
2138 # NONE if the option wasn't set. In the case that it wasn't set, make
2139 # it be the default, so that we can use it to expand directories now.
2140 if test "x$prefix" = "xNONE"; then
2141 prefix=$ac_default_prefix
2144 # and similarly for $exec_prefix
2145 if test "x$exec_prefix" = "xNONE"; then
2149 if test "x$BUILDDIR" = "x"; then
2153 AH_TEMPLATE([BUILDDIR],[tor's build directory])
2154 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
2156 if test "x$SRCDIR" = "x"; then
2157 SRCDIR=$(cd "$srcdir"; pwd)
2159 AH_TEMPLATE([SRCDIR],[tor's sourcedir directory])
2160 AC_DEFINE_UNQUOTED(SRCDIR,"$SRCDIR")
2162 if test "x$CONFDIR" = "x"; then
2163 CONFDIR=`eval echo $sysconfdir/tor`
2166 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
2167 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
2169 BINDIR=`eval echo $bindir`
2171 LOCALSTATEDIR=`eval echo $localstatedir`
2172 AC_SUBST(LOCALSTATEDIR)
2174 if test "$bwin32" = "true"; then
2175 # Test if the linker supports the --nxcompat and --dynamicbase options
2177 save_LDFLAGS="$LDFLAGS"
2178 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
2179 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
2180 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
2181 [AC_MSG_RESULT([yes])]
2182 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
2183 [AC_MSG_RESULT([no])]
2185 LDFLAGS="$save_LDFLAGS"
2188 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
2189 # than autoconf's macros like.
2190 if test "$GCC" = "yes"; then
2191 # Disable GCC's strict aliasing checks. They are an hours-to-debug
2192 # accident waiting to happen.
2193 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
2195 # Override optimization level for non-gcc compilers
2197 enable_gcc_warnings=no
2198 enable_gcc_warnings_advisory=no
2201 # Warnings implies advisory-warnings and -Werror.
2202 if test "$enable_gcc_warnings" = "yes"; then
2203 enable_gcc_warnings_advisory=yes
2204 enable_fatal_warnings=yes
2207 # OS X Lion started deprecating the system openssl. Let's just disable
2208 # all deprecation warnings on OS X. Also, to potentially make the binary
2209 # a little smaller, let's enable dead_strip.
2213 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
2214 LDFLAGS="$LDFLAGS -dead_strip" ;;
2217 TOR_WARNING_FLAGS=""
2219 # Add some more warnings which we use in development but not in the
2220 # released versions. (Some relevant gcc versions can't handle these.)
2222 # Note that we have to do this near the end of the autoconf process, or
2223 # else we may run into problems when these warnings hit on the testing C
2224 # programs that autoconf wants to build.
2225 if test "x$enable_gcc_warnings_advisory" != "xno"; then
2228 *-*-openbsd* | *-*-bitrig*)
2229 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
2230 # That's fine, except that the headers don't pass -Wredundant-decls.
2231 # Therefore, let's disable -Wsystem-headers when we're building
2232 # with maximal warnings on OpenBSD.
2233 CFLAGS="$CFLAGS -Wno-system-headers" ;;
2236 CFLAGS_NOWARNINGS="$CFLAGS"
2238 # GCC4.3 users once report trouble with -Wstrict-overflow=5. GCC5 users
2239 # have it work better.
2240 # CFLAGS="$CFLAGS -Wstrict-overflow=1"
2242 # This warning was added in gcc 4.3, but it appears to generate
2243 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
2244 #CFLAGS="$CFLAGS -Wlogical-op"
2246 m4_foreach_w([warning_flag], [
2248 -Waddress-of-array-temporary
2249 -Waddress-of-temporary
2251 -Wanonymous-pack-parens
2254 -Warc-bridge-casts-disallowed-in-nonarc
2255 -Warc-maybe-repeated-use-of-weak
2256 -Warc-performSelector-leaks
2257 -Warc-repeated-use-of-weak
2259 -Warray-bounds-pointer-arithmetic
2261 -Wasm-operand-widths
2263 -Watomic-property-with-user-defined-accessor
2265 -Wauto-storage-class
2268 -Wbackslash-newline-escape
2269 -Wbad-array-new-length
2270 -Wbind-to-temporary-copy
2271 -Wbitfield-constant-conversion
2274 -Wbuiltin-requires-header
2276 -Wcompare-distinct-pointer-types
2277 -Wcomplex-component-init
2278 -Wconditional-type-mismatch
2280 -Wconstant-conversion
2281 -Wconstant-logical-operand
2282 -Wconstexpr-not-const
2283 -Wcustom-atomic-properties
2285 -Wdangling-initializer-list
2287 -Wdelegating-ctor-cycles
2288 -Wdeprecated-implementations
2289 -Wdeprecated-register
2290 -Wdirect-ivar-access
2292 -Wdistributed-object-modifiers
2294 -Wdollar-in-identifier-extension
2296 -Wduplicate-decl-specifier
2298 -Wduplicate-method-arg
2299 -Wduplicate-method-match
2301 -Wdynamic-class-memaccess
2302 -Wembedded-directive
2303 -Wempty-translation-unit
2305 -Wexit-time-destructors
2306 -Wexplicit-ownership-type
2307 -Wextern-initializer
2311 -Wflexible-array-extensions
2314 -Wfour-char-constants
2316 -Wglobal-constructors
2317 -Wgnu-array-member-paren-init
2319 -Wgnu-static-float-init
2322 -Widiomatic-parentheses
2323 -Wignored-attributes
2324 -Wimplicit-atomic-properties
2325 -Wimplicit-conversion-floating-point-to-bool
2326 -Wimplicit-exception-spec-mismatch
2327 -Wimplicit-fallthrough
2328 -Wimplicit-fallthrough-per-function
2329 -Wimplicit-retain-self
2330 -Wimport-preprocessor-directive-pedantic
2331 -Wincompatible-library-redeclaration
2332 -Wincompatible-pointer-types-discards-qualifiers
2333 -Wincomplete-implementation
2335 -Wincomplete-umbrella
2338 -Wint-to-void-pointer-cast
2344 -Winvalid-source-encoding
2345 -Winvalid-token-paste
2346 -Wknr-promoted-parameter
2347 -Wlarge-by-value-copy
2348 -Wliteral-conversion
2350 -Wlocal-type-template-args
2354 -Wmalformed-warning-check
2358 -Wmismatched-parameter-types
2359 -Wmismatched-return-types
2360 -Wmissing-field-initializers
2361 -Wmissing-format-attribute
2363 -Wmissing-selector-name
2365 -Wmissing-variable-declarations
2369 -Wnon-literal-null-conversion
2371 -Wnonportable-cfstrings
2377 -Wout-of-line-declaration
2379 -Woverlength-strings
2381 -Woverriding-method-mismatch
2382 -Wpointer-type-mismatch
2383 -Wpredefined-identifier-outside-function
2384 -Wprotocol-property-synthesis-ambiguity
2385 -Wreadonly-iboutlet-property
2386 -Wreadonly-setter-attrs
2388 -Wreceiver-forward-class
2390 -Wreinterpret-base-class
2391 -Wrequires-super-attribute
2392 -Wreserved-user-defined-literal
2393 -Wreturn-stack-address
2395 -Wselector-type-mismatch
2397 -Wserialized-diagnostics
2399 -Wshift-count-negative
2400 -Wshift-count-overflow
2401 -Wshift-negative-value
2403 -Wshift-sign-overflow
2405 -Wsizeof-array-argument
2406 -Wsource-uses-openmp
2409 -Wstatic-local-in-inline
2413 -Wstrlcpy-strlcat-size
2415 -Wsuggest-attribute=format
2416 -Wsuggest-attribute=noreturn
2417 -Wsuper-class-method-mismatch
2420 -Wtautological-constant-out-of-range-compare
2421 -Wtentative-definition-incomplete-type
2424 -Wtypedef-redefinition
2427 -Wundefined-internal
2428 -Wundefined-reinterpret-cast
2430 -Wunicode-whitespace
2431 -Wunknown-warning-option
2432 -Wunnamed-type-template-args
2433 -Wunneeded-member-function
2435 -Wunsupported-visibility
2436 -Wunused-but-set-parameter
2437 -Wunused-but-set-variable
2438 -Wunused-command-line-argument
2439 -Wunused-const-variable=2
2440 -Wunused-exception-parameter
2441 -Wunused-local-typedefs
2442 -Wunused-member-function
2443 -Wunused-sanitize-argument
2444 -Wunused-volatile-lvalue
2445 -Wuser-defined-literals
2448 -Wvector-conversions
2453 ], [ TOR_TRY_COMPILE_WITH_CFLAGS(warning_flag, [],
2454 [TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS warning_flag" CFLAGS="$CFLAGS warning_flag"], true)
2457 dnl We should re-enable this in some later version. Clang doesn't
2458 dnl mind, but it causes trouble with GCC.
2459 dnl -Wstrict-overflow=2
2461 dnl These seem to require annotations that we don't currently use,
2462 dnl and they give false positives in our pthreads wrappers. (Clang 4)
2464 dnl -Wthread-safety-analysis
2465 dnl -Wthread-safety-attributes
2466 dnl -Wthread-safety-beta
2467 dnl -Wthread-safety-precise
2469 W_FLAGS="$W_FLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2470 W_FLAGS="$W_FLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2471 W_FLAGS="$W_FLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2472 W_FLAGS="$W_FLAGS -Wwrite-strings"
2473 W_FLAGS="$W_FLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2474 W_FLAGS="$W_FLAGS -Waggregate-return -Wpacked -Wunused"
2475 W_FLAGS="$W_FLAGS -Wunused-parameter "
2476 # These interfere with building main() { return 0; }, which autoconf
2477 # likes to use as its default program.
2478 W_FLAGS="$W_FLAGS -Wold-style-definition -Wmissing-declarations"
2480 TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS $W_FLAGS"
2481 CFLAGS="$CFLAGS $W_FLAGS"
2483 if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2484 AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2486 if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2487 AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2489 if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2490 AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2493 CFLAGS="$CFLAGS_NOWARNINGS"
2495 if test "x$enable_fatal_warnings" = "xyes"; then
2496 # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2497 # default autoconf programs are full of errors.
2498 CFLAGS="$CFLAGS -Werror"
2503 AC_SUBST(TOR_WARNING_FLAGS)
2505 echo "$TOR_WARNING_FLAGS">warning_flags
2507 TOR_TRY_COMPILE_WITH_CFLAGS([@warning_flags], [],
2508 CFLAGS="$CFLAGS @warning_flags",
2509 CFLAGS="$CFLAGS $TOR_WARNING_FLAGS")
2511 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2514 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.])
2518 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2524 contrib/operator-tools/tor.logrotate
2525 contrib/dist/tor.service
2526 src/config/torrc.sample
2527 src/config/torrc.minimal
2528 src/rust/.cargo/config
2529 scripts/maint/checkOptionDocs.pl
2533 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2534 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
2535 for file in $regular_mans ; do
2536 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2537 echo "==================================";
2539 echo "Building Tor has failed since manpages cannot be built.";
2541 echo "You need asciidoc installed to be able to build the manpages.";
2542 echo "To build without manpages, use the --disable-asciidoc argument";
2543 echo "when calling configure.";
2545 echo "==================================";
2551 if test "$fragile_hardening" = "yes"; then
2555 Warning! Building Tor with --enable-fragile-hardening (also known as
2556 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2557 other kinds of attacks easier. A Tor instance build with this option will be
2558 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2559 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2560 denial of service attacks. For more information, see
2561 https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening
2569 # Mini-report on what will be built.
2573 PPRINT_SET_INDENT(1)
2577 AS_ECHO("Tor Version: ${PPRINT_COLOR_BLDBLU}Tor $PACKAGE_VERSION $PPRINT_COLOR_RST")
2580 PPRINT_SUBTITLE([Build Features])
2582 PPRINT_PROP_STRING([Compiler], [$CC])
2583 PPRINT_PROP_STRING([Host OS], [$host_os])
2586 test "x$enable_gcc_warnings" = "xyes" && value=1 || value=0
2587 PPRINT_PROP_BOOL([Verbose Warnings (--enable-gcc-warnings)], $value)
2589 test "x$enable_fatal_warnings" = "xyes" && value=1 || value=0
2590 PPRINT_PROP_BOOL([Warnings are fatal (--enable-fatal-warnings)], $value)
2592 test "x$enable_rust" = "xyes" && value=1 || value=0
2593 PPRINT_PROP_BOOL([Rust support (--enable-rust)], $value)
2595 test "x$enable_android" = "xyes" && value=1 || value=0
2596 PPRINT_PROP_BOOL([Android support (--enable-android)], $value)
2598 test "x$enable_systemd" = "xyes" && value=1 || value=0
2599 PPRINT_PROP_BOOL([Systemd support (--enable-systemd)], $value)
2602 PPRINT_SUBTITLE([Static Build])
2604 test "x$enable_static_tor" = "xyes" && value=1 || value=0
2605 PPRINT_PROP_BOOL([tor (--enable-static-tor)], $value)
2607 if test "x$enable_static_libevent" = "xyes"; then
2608 PPRINT_PROP_STRING([libevent], [$TOR_LIBDIR_libevent])
2610 PPRINT_PROP_BOOL([libevent (--enable-static-libevent)], $value)
2613 if test "x$enable_static_openssl" = "xyes"; then
2614 PPRINT_PROP_STRING([libssl], [$TOR_LIBDIR_openssl])
2616 PPRINT_PROP_BOOL([libssl (--enable-static-openssl)], $value)
2619 if test "x$enable_static_zlib" = "xyes"; then
2620 PPRINT_PROP_STRING([zlib1g], [$TOR_LIBDIR_zlib])
2622 PPRINT_PROP_BOOL([zlib1g (--enable-static-zlib)], $value)
2626 PPRINT_SUBTITLE([Optional Libraries])
2628 test "x$enable_nss" = "xyes" && value=1 || value=0
2629 PPRINT_PROP_BOOL([libnss (--enable-nss)], $value)
2631 test "x$enable_seccomp" != "xno" && value=1 || value=0
2632 PPRINT_PROP_BOOL([libseccomp (--disable-seccomp)], $value)
2634 test "x$enable_libscrypt" != "xno" && value=1 || value=0
2635 PPRINT_PROP_BOOL([libscrypt (--disable-libscrypt)], $value)
2638 PPRINT_SUBTITLE([Hardening])
2640 test "x$enable_gcc_hardening" != "xno" && value=1 || value=0
2641 PPRINT_PROP_BOOL([Compiler Hardening (--disable-gcc-hardening)], $value)
2643 test "x$enable_linker_hardening" != "xno" && value=1 || value=0
2644 PPRINT_PROP_BOOL([Linker Hardening (--disable-linker-hardening)], $value)
2646 test "x$enable_fragile_hardening" = "xyes" && value=1 || value=0
2647 PPRINT_PROP_BOOL([Fragile Hardening (--enable-fragile-hardening, dev only)], $value)
2650 PPRINT_SUBTITLE([Modules])
2652 test "x$enable_module_dirauth" != "xno" && value=1 || value=0
2653 PPRINT_PROP_BOOL([Directory Authority (--disable-module-dirauth)], $value)
2655 test "x$enable_module_relay" != "xno" && value=1 || value=0
2656 PPRINT_PROP_BOOL([Relay (--disable-module-relay)], $value)
2659 PPRINT_SUBTITLE([Documentation])
2661 test "x$enable_manpage" != "xno" && value=1 || value=0
2662 PPRINT_PROP_BOOL([Man Pages (--disable-manpage)], $value)
2664 test "x$enable_html_manual" != "xno" && value=1 || value=0
2665 PPRINT_PROP_BOOL([HTML Manual (--disable-html-manual)], $value)
2668 PPRINT_SUBTITLE([Tests])
2670 test "x$enable_unittests" != "xno" && value=1 || value=0
2671 PPRINT_PROP_BOOL([Unit tests (--disable-unittests)], $value)
2673 test "x$enable_asserts_in_tests" = "xno" && value=1 || value=0
2674 PPRINT_PROP_BOOL([assert()s disabled (--disable-asserts-in-tests, dev only)], $value)
2676 test "x$enable_coverage" = "xyes" && value=1 || value=0
2677 PPRINT_PROP_BOOL([Code Coverage (--enable-coverage)], $value)
2679 test "x$enable_libfuzzer" = "xyes" && value=1 || value=0
2680 PPRINT_PROP_BOOL([libFuzzer support (--enable-libfuzzer)], $value)
2682 test "x$enable_oss_fuzz" = "xyes" && value=1 || value=0
2683 PPRINT_PROP_BOOL([OSS-Fuzz support (--enable-oss-fuzz)], $value)
2686 PPRINT_SUBTITLE([Install Directories])
2688 report_mandir="`eval eval echo $mandir`"
2689 PPRINT_PROP_STRING([Binaries], [$BINDIR])
2690 PPRINT_PROP_STRING([Configuration], [$CONFDIR])
2691 PPRINT_PROP_STRING([Man Pages], [$report_mandir])
2694 AS_ECHO(["Configure Line: ./configure $configure_flags"])