Use "flavor" spelling consistently on manpage.
[tor.git] / configure.ac
blob9abc1e530a0ec5827f3c2d147b66008b7fdaa3f7
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
6 AC_PREREQ([2.63])
7 AC_INIT([tor],[0.4.5.0-alpha-dev])
8 AC_CONFIG_SRCDIR([src/app/main/tor_main.c])
9 AC_CONFIG_MACRO_DIR([m4])
11 configure_flags="$*"
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, ["2020-06-09"], # for 0.4.5.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 tor_ac_n_warnings=0
28 tor_incr_n_warnings() {
29   tor_ac_n_warnings=`expr $tor_ac_n_warnings + 1`
32 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
33 AC_CONFIG_HEADERS([orconfig.h])
35 AC_USE_SYSTEM_EXTENSIONS
36 AC_CANONICAL_HOST
38 PKG_PROG_PKG_CONFIG
39 if test "x$PKG_CONFIG" = "x" ; then
40     pkg_config_user_action="install pkg-config, and check the PKG_CONFIG_PATH environment variable"
41     AC_MSG_NOTICE([Some libraries need pkg-config, including systemd, nss, lzma, zstd, and custom mallocs.])
42     AC_MSG_NOTICE([To use those libraries, $pkg_config_user_action.])
43 else
44     pkg_config_user_action="check the PKG_CONFIG_PATH environment variable"
47 if test "x$PKG_CONFIG_PATH" = "x" && test "x$prefix" != "xNONE" && test "$host" != "$build"; then
48    export PKG_CONFIG_PATH=$prefix/lib/pkgconfig
49    AC_MSG_NOTICE([set PKG_CONFIG_PATH=$PKG_CONFIG_PATH to support cross-compiling])
52 AC_ARG_ENABLE(openbsd-malloc,
53    AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD.  Linux only. Deprecated: see --with-malloc]))
54 AC_ARG_ENABLE(static-openssl,
55    AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
56 AC_ARG_ENABLE(static-libevent,
57    AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
58 AC_ARG_ENABLE(static-zlib,
59    AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
60 AC_ARG_ENABLE(static-tor,
61    AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
62 AC_ARG_ENABLE(unittests,
63    AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
64 AC_ARG_ENABLE(coverage,
65    AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
66 AC_ARG_ENABLE(asserts-in-tests,
67    AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
68 AC_ARG_ENABLE(system-torrc,
69    AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
70 AC_ARG_ENABLE(libfuzzer,
71    AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer']))
72 AC_ARG_ENABLE(oss-fuzz,
73    AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment]))
74 AC_ARG_ENABLE(memory-sentinels,
75    AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.]))
76 AC_ARG_ENABLE(rust,
77    AS_HELP_STRING(--enable-rust, [enable rust integration]))
78 AC_ARG_ENABLE(cargo-online-mode,
79    AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.]))
80 AC_ARG_ENABLE(restart-debugging,
81    AS_HELP_STRING(--enable-restart-debugging, [Build Tor with support for debugging in-process restart. Developers only.]))
82 AC_ARG_ENABLE(zstd-advanced-apis,
83    AS_HELP_STRING(--disable-zstd-advanced-apis, [Build without support for zstd's "static-only" APIs.]))
84 AC_ARG_ENABLE(nss,
85    AS_HELP_STRING(--enable-nss, [Use Mozilla's NSS TLS library. (EXPERIMENTAL)]))
86 AC_ARG_ENABLE(pic,
87    AS_HELP_STRING(--enable-pic, [Build Tor's binaries as position-independent code, suitable to link as a library.]))
89 AC_ARG_ENABLE(missing-doc-warnings,
90    AS_HELP_STRING(--enable-missing-doc-warnings, [Tell doxygen to warn about missing documentation. Makes doxygen warnings nonfatal.]))
92 if test "$enable_missing_doc_warnings" = "yes"; then
93    DOXYGEN_FATAL_WARNINGS=NO
94    DOXYGEN_WARN_ON_MISSING=YES
95 elif test "$enable_fatal_warnings" = "yes"; then
96    # Fatal warnings from doxygen are nice, but not if we're warning about
97    # missing documentation.
98    DOXYGEN_FATAL_WARNINGS=YES
99    DOXYGEN_WARN_ON_MISSING=NO
100 else
101    DOXYGEN_FATAL_WARNINGS=NO
102    DOXYGEN_WARN_ON_MISSING=NO
104 AC_SUBST(DOXYGEN_FATAL_WARNINGS)
105 AC_SUBST(DOXYGEN_WARN_ON_MISSING)
107 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
108     AC_MSG_ERROR([Can't disable assertions outside of coverage build])
111 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
112 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
113 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
114 AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
115 AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
116 AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
117 AM_CONDITIONAL(USE_NSS, test "x$enable_nss" = "xyes")
118 AM_CONDITIONAL(USE_OPENSSL, test "x$enable_nss" != "xyes")
120 if test "x$enable_nss" = "xyes"; then
121   AC_DEFINE(ENABLE_NSS, 1,
122             [Defined if we're building with NSS.])
123 else
124   AC_DEFINE(ENABLE_OPENSSL, 1,
125             [Defined if we're building with OpenSSL or LibreSSL])
128 if test "$enable_static_tor" = "yes"; then
129   enable_static_libevent="yes";
130   enable_static_openssl="yes";
131   enable_static_zlib="yes";
132   CFLAGS="$CFLAGS -static"
135 if test "$enable_system_torrc" = "no"; then
136   AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
137             [Defined if we're not going to look for a torrc in SYSCONF])
140 if test "$enable_memory_sentinels" = "no"; then
141   AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
142            [Defined if we're turning off memory safety code to look for bugs])
145 AC_ARG_ENABLE(manpage,
146               AS_HELP_STRING(--disable-manpage, [Disable manpage generation.]))
148 AC_ARG_ENABLE(html-manual,
149               AS_HELP_STRING(--disable-html-manual, [Disable HTML documentation.]))
151 AC_ARG_ENABLE(asciidoc,
152      AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
153      [case "${enableval}" in
154         "yes") asciidoc=true ;;
155         "no")  asciidoc=false ;;
156         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
157       esac], [asciidoc=true])
159 # systemd notify support
160 AC_ARG_ENABLE(systemd,
161       AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
162       [case "${enableval}" in
163         "yes") systemd=true ;;
164         "no")  systemd=false ;;
165         * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
166       esac], [systemd=auto])
168 if test "$enable_restart_debugging" = "yes"; then
169   AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
170             [Defined if we're building with support for in-process restart debugging.])
173 if test "$enable_zstd_advanced_apis" != "no"; then
174    AC_DEFINE(ENABLE_ZSTD_ADVANCED_APIS, 1,
175              [Defined if we're going to try to use zstd's "static-only" APIs.])
178 # systemd support
179 if test "x$enable_systemd" = "xno"; then
180     have_systemd=no;
181 else
182     PKG_CHECK_MODULES(SYSTEMD,
183         [libsystemd-daemon],
184         have_systemd=yes,
185         have_systemd=no)
186     if test "x$have_systemd" = "xno"; then
187         AC_MSG_NOTICE([Okay, checking for systemd a different way...])
188         PKG_CHECK_MODULES(SYSTEMD,
189             [libsystemd],
190             have_systemd=yes,
191             have_systemd=no)
192     fi
195 if test "x$have_systemd" = "xyes"; then
196     AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
197     TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
198     TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
199     PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
200          [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or greater])], [])
202 AC_SUBST(TOR_SYSTEMD_CFLAGS)
203 AC_SUBST(TOR_SYSTEMD_LIBS)
205 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
206     AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found, $pkg_config_user_action, or set SYSTEMD_CFLAGS and SYSTEMD_LIBS.])
209 case "$host" in
210    *-*-solaris* )
211      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
212      ;;
213 esac
215 AC_ARG_ENABLE(gcc-warnings,
216      AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
217 AC_ARG_ENABLE(fatal-warnings,
218      AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
219 AC_ARG_ENABLE(gcc-warnings-advisory,
220      AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
222 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
223 AC_ARG_ENABLE(gcc-hardening,
224     AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
226 dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
227 AC_ARG_ENABLE(expensive-hardening,
228     AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
229 AC_ARG_ENABLE(fragile-hardening,
230     AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
231 if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
232   fragile_hardening="yes"
233   AC_DEFINE(DEBUG_SMARTLIST, 1, [Enable smartlist debugging])
236 AC_ARG_ENABLE(all-bugs-are-fatal,
237    AS_HELP_STRING(--enable-all-bugs-are-fatal, [force all soft asserts in Tor codebase (tor_assert_nonfatal(), BUG(), etc.) to act as hard asserts (tor_assert() and equivalents); makes Tor fragile; only recommended for dev builds]))
239 if test "x$enable_all_bugs_are_fatal" = "xyes"; then
240   AC_DEFINE(ALL_BUGS_ARE_FATAL, 1, [All assert failures are fatal])
243 dnl Linker hardening options
244 dnl Currently these options are ELF specific - you can't use this with MacOSX
245 AC_ARG_ENABLE(linker-hardening,
246     AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
248 AC_ARG_ENABLE(local-appdata,
249    AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
250 if test "$enable_local_appdata" = "yes"; then
251   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
252             [Defined if we default to host local appdata paths on Windows])
255 AC_ARG_ENABLE(tool-name-check,
256      AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
258 AC_ARG_ENABLE(seccomp,
259      AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
261 AC_ARG_ENABLE(libscrypt,
262      AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
264 dnl --- Tracing Options. ---
266 TOR_TRACE_LIBS=
268 dnl LTTng instrumentation option.
269 AC_ARG_ENABLE(tracing-instrumentation-lttng,
270               AS_HELP_STRING([--enable-tracing-instrumentation-lttng],
271                              [build with LTTng-UST instrumentation]))
272 AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_LTTNG],
273                [test "x$enable_tracing_instrumentation_lttng" = "xyes"])
275 if test "x$enable_tracing_instrumentation_lttng" = "xyes"; then
276   AC_CHECK_HEADERS([lttng/tracepoint.h], [],
277                    [AC_MSG_ERROR([LTTng instrumentation headers not found.
278                                   On Debian, apt install liblttng-ust-dev"])], [])
279   AC_DEFINE([USE_TRACING_INSTRUMENTATION_LTTNG], [1], [Using LTTng instrumentation])
280   TOR_TRACE_LIBS="-llttng-ust -ldl"
281   have_tracing=1
284 dnl USDT instrumentation option.
285 AC_ARG_ENABLE(tracing-instrumentation-usdt,
286               AS_HELP_STRING([--enable-tracing-instrumentation-usdt],
287                              [build with tracing USDT instrumentation]))
288 AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_USDT],
289                [test "x$enable_tracing_instrumentation_usdt" = "xyes"])
291 if test "x$enable_tracing_instrumentation_usdt" = "xyes"; then
292   AC_CHECK_HEADERS([sys/sdt.h], [],
293                    [AC_MSG_ERROR([USDT instrumentation requires sys/sdt.h header.
294                                   On Debian, apt install systemtap-sdt-dev])], [])
295   dnl LTTng generates USDT probes if the UST library was built with
296   dnl --with-sdt. There is unfortunately no way to check that so we always
297   dnl build the USDT probes even though LTTng instrumentation was requested.
298   AC_DEFINE([USE_TRACING_INSTRUMENTATION_USDT], [1], [Using USDT instrumentation])
299   have_tracing=1
302 dnl Tracepoints event to debug logs.
303 AC_ARG_ENABLE(tracing-instrumentation-log-debug,
304      AS_HELP_STRING([--enable-tracing-instrumentation-log-debug],
305                     [build with tracing event to debug log]),
306      AC_DEFINE([USE_TRACING_INSTRUMENTATION_LOG_DEBUG], [1],
307                [Tracepoints to log debug]), [])
308 AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_LOG_DEBUG],
309                [test "x$enable_tracing_instrumentation_log_debug" = "xyes"])
310 if test "x$enable_tracing_instrumentation_log_debug" = "xyes"; then
311   have_tracing=1
314 dnl Define that tracing is supported if any instrumentation is used.
315 AM_COND_IF([USE_TRACING_INSTRUMENTATION_LOG_DEBUG],
316            AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
317 AM_COND_IF([USE_TRACING_INSTRUMENTATION_USDT],
318            AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
319 AM_COND_IF([USE_TRACING_INSTRUMENTATION_LTTNG],
320            AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
321 AM_CONDITIONAL([USE_TRACING], [test "x$have_tracing" = x1 ])
323 dnl Finally, define the trace libs.
324 AC_SUBST([TOR_TRACE_LIBS])
326 dnl -- End Tracing Options. --
328 dnl Enable Android only features.
329 AC_ARG_ENABLE(android,
330      AS_HELP_STRING(--enable-android, [build with Android features enabled]))
331 AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])
333 if test "x$enable_android" = "xyes"; then
334   AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])
338 dnl ---
339 dnl Tor modules options. These options are namespaced with --disable-module-XXX
340 dnl ---
342 dnl All our modules.
343 m4_define(MODULES, relay dirauth dircache)
345 dnl Relay module.
346 AC_ARG_ENABLE([module-relay],
347               AS_HELP_STRING([--disable-module-relay],
348                              [Build tor without the Relay modules: tor can not run as a relay, bridge, or authority. Implies --disable-module-dirauth]))
349 AM_CONDITIONAL(BUILD_MODULE_RELAY, [test "x$enable_module_relay" != "xno"])
350 AM_COND_IF(BUILD_MODULE_RELAY,
351            AC_DEFINE([HAVE_MODULE_RELAY], [1],
352                      [Compile with Relay feature support]))
354 dnl Dircache module.  (This cannot be enabled or disabled independently of
355 dnl the relay module.  It is not listed by --list-modules for this reason.)
356 AM_CONDITIONAL(BUILD_MODULE_DIRCACHE,
357                [test "x$enable_module_relay" != "xno"])
358 AM_COND_IF(BUILD_MODULE_DIRCACHE,
359            AC_DEFINE([HAVE_MODULE_DIRCACHE], [1],
360                      [Compile with directory cache support]))
362 dnl Directory Authority module.
363 AC_ARG_ENABLE([module-dirauth],
364               AS_HELP_STRING([--disable-module-dirauth],
365                              [Build tor without the Directory Authority module: tor can not run as a directory authority or bridge authority]))
366 AM_CONDITIONAL(BUILD_MODULE_DIRAUTH,[test "x$enable_module_dirauth" != "xno" && test "x$enable_module_relay" != "xno"])
367 AM_COND_IF(BUILD_MODULE_DIRAUTH,
368            AC_DEFINE([HAVE_MODULE_DIRAUTH], [1],
369                      [Compile with Directory Authority feature support]))
371 dnl Helper variables.
372 TOR_MODULES_ALL_ENABLED=
373 AC_DEFUN([ADD_MODULE], [
374     MODULE=m4_toupper($1)
375     TOR_MODULES_ALL_ENABLED="${TOR_MODULES_ALL_ENABLED} -DHAVE_MODULE_${MODULE}=1"
377 m4_foreach_w([module], MODULES, [ADD_MODULE([module])])
378 AC_SUBST(TOR_MODULES_ALL_ENABLED)
380 dnl check for the correct "ar" when cross-compiling.
381 dnl   (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
382 dnl    so kludge up a replacement for the case where it isn't there yet.)
383 m4_ifdef([AM_PROG_AR],
384          [AM_PROG_AR],
385          [AN_MAKEVAR([AR], [AC_PROG_AR])
386           AN_PROGRAM([ar], [AC_PROG_AR])
387           AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
388           AC_PROG_AR])
390 dnl Check whether the above macro has settled for a simply named tool even
391 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
392 dnl because that will find any cc on the system, not only the cross-compiler,
393 dnl and then verify that a binary built with this compiler runs on the
394 dnl build system. It will then come to the false conclusion that we're not
395 dnl cross-compiling.
396 if test "x$enable_tool_name_check" != "xno"; then
397     if test "x$ac_tool_warned" = "xyes"; then
398         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.)])
399         elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
400                 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.)])
401         fi
404 AC_PROG_CC
405 AC_PROG_CPP
406 AC_PROG_MAKE_SET
407 AC_PROG_RANLIB
408 AC_PROG_SED
410 AC_ARG_VAR([PERL], [path to Perl binary])
411 AC_CHECK_PROGS([PERL], [perl])
412 AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
414 dnl check for asciidoc and a2x
415 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
416 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
418 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
419 AM_CONDITIONAL(BUILD_MANPAGE, [test "x$enable_manpage" != "xno"])
420 AM_CONDITIONAL(BUILD_HTML_DOCS, [test "x$enable_html_manual" != "xno"])
422 AM_PROG_CC_C_O
423 AC_PROG_CC_C99
425 AC_CACHE_CHECK([for Python 3], [tor_cv_PYTHON],
426    [AC_PATH_PROGS_FEATURE_CHECK([PYTHON], [ \
427         python3 \
428         python3.8 python3.7 python3.6 python3.5 python3.4 \
429         python ],
430    [["$ac_path_PYTHON" -c 'import sys; sys.exit(sys.version_info[0]<3)' && tor_cv_PYTHON="$ac_path_PYTHON" ac_path_PYTHON_found=:]] )])
431 AC_SUBST([PYTHON], [$tor_cv_PYTHON])
433 PYTHON="$tor_cv_PYTHON"
435 if test "x$PYTHON" = "x"; then
436   tor_incr_n_warnings
437   AC_MSG_WARN([Python 3 unavailable; some tests will not be run.])
440 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
442 dnl List all external rust crates we depend on here. Include the version
443 rust_crates=" \
444     digest-0.7.2 \
445     libc-0.2.39 \
447 AC_SUBST(rust_crates)
449 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
450 AC_C_FLEXIBLE_ARRAY_MEMBER
451 ], [
452  dnl Maybe we've got an old autoconf...
453  AC_CACHE_CHECK([for flexible array members],
454      tor_cv_c_flexarray,
455      [AC_COMPILE_IFELSE(
456        AC_LANG_PROGRAM([
457  struct abc { int a; char b[]; };
458 ], [
459  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
460  def->b[0] = 33;
462   [tor_cv_c_flexarray=yes],
463   [tor_cv_c_flexarray=no])])
464  if test "$tor_cv_flexarray" = "yes"; then
465    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
466  else
467    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
468  fi
471 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
472       tor_cv_c_c99_decl,
473       [AC_COMPILE_IFELSE(
474          [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
475          [tor_cv_c_c99_decl=yes],
476          [tor_cv_c_c99_decl=no] )])
477 if test "$tor_cv_c_c99_decl" != "yes"; then
478   AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
481 AC_CACHE_CHECK([for working C99 designated initializers],
482       tor_cv_c_c99_designated_init,
483       [AC_COMPILE_IFELSE(
484          [AC_LANG_PROGRAM([struct s { int a; int b; };],
485                [[ struct s ss = { .b = 5, .a = 6 }; ]])],
486          [tor_cv_c_c99_designated_init=yes],
487          [tor_cv_c_c99_designated_init=no] )])
489 if test "$tor_cv_c_c99_designated_init" != "yes"; then
490   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
493 saved_CFLAGS="$CFLAGS"
494 CFLAGS="$CFLAGS -Werror"
495 AC_CACHE_CHECK([for __attribute__((fallthrough))],
496       tor_cv_c_attr_fallthrough,
497       [AC_COMPILE_IFELSE(
498          [AC_LANG_PROGRAM([extern int x; void fn(void) ;],
499                [[ switch (x) { case 1: fn(); __attribute__((fallthrough));
500                                case 2: fn(); break; } ]])],
501          [tor_cv_c_attr_fallthrough=yes],
502          [tor_cv_c_attr_fallthrough=no] )])
503 CFLAGS="$saved_CFLAGS"
505 if test "$tor_cv_c_attr_fallthrough" = "yes"; then
506   AC_DEFINE(HAVE_ATTR_FALLTHROUGH, [1], [defined if we have the fallthrough attribute.])
509 TORUSER=_tor
510 AC_ARG_WITH(tor-user,
511         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
512         [
513            TORUSER=$withval
514         ]
516 AC_SUBST(TORUSER)
518 TORGROUP=_tor
519 AC_ARG_WITH(tor-group,
520         AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
521         [
522            TORGROUP=$withval
523         ]
525 AC_SUBST(TORGROUP)
528 dnl If _WIN32 is defined and non-zero, we are building for win32
529 AC_MSG_CHECKING([for win32])
530 AC_RUN_IFELSE([AC_LANG_SOURCE([
531 int main(int c, char **v) {
532 #ifdef _WIN32
533 #if _WIN32
534   return 0;
535 #else
536   return 1;
537 #endif
538 #else
539   return 2;
540 #endif
541 }])],
542 bwin32=true; AC_MSG_RESULT([yes]),
543 bwin32=false; AC_MSG_RESULT([no]),
544 bwin32=cross; AC_MSG_RESULT([cross])
547 if test "$bwin32" = "cross"; then
548 AC_MSG_CHECKING([for win32 (cross)])
549 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
550 #ifdef _WIN32
551 int main(int c, char **v) {return 0;}
552 #else
553 #error
554 int main(int c, char **v) {return x(y);}
555 #endif
556 ])],
557 bwin32=true; AC_MSG_RESULT([yes]),
558 bwin32=false; AC_MSG_RESULT([no]))
561 AH_BOTTOM([
562 #ifdef _WIN32
563 /* Defined to access windows functions and definitions for >=WinXP */
564 # ifndef WINVER
565 #  define WINVER 0x0501
566 # endif
568 /* Defined to access _other_ windows functions and definitions for >=WinXP */
569 # ifndef _WIN32_WINNT
570 #  define _WIN32_WINNT 0x0501
571 # endif
573 /* Defined to avoid including some windows headers as part of Windows.h */
574 # ifndef WIN32_LEAN_AND_MEAN
575 #  define WIN32_LEAN_AND_MEAN 1
576 # endif
577 #endif
580 AM_CONDITIONAL(WIN32, test "x$bwin32" = "xtrue")
581 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
582 AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
584 dnl Enable C99 when compiling with MIPSpro
585 AC_MSG_CHECKING([for MIPSpro compiler])
586 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
587 #if (defined(__sgi) && defined(_COMPILER_VERSION))
588 #error
589   return x(y);
590 #endif
591 ])],
592 bmipspro=false; AC_MSG_RESULT(no),
593 bmipspro=true; AC_MSG_RESULT(yes))
595 if test "$bmipspro" = "true"; then
596   CFLAGS="$CFLAGS -c99"
599 AC_C_BIGENDIAN
601 AC_ARG_VAR([TOR_RUST_TARGET], [Rust target, must be specified when cross-compiling (HOST != BUILD). example: i686-pc-windows-gnu])
603 if test "x$enable_rust" = "xyes"; then
604   AC_ARG_VAR([RUSTC], [path to the rustc binary])
605   AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
606   if test "x$RUSTC" = "xno"; then
607     AC_MSG_ERROR([rustc unavailable but rust integration requested.])
608   fi
610   AC_ARG_VAR([CARGO], [path to the cargo binary])
611   AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
612   if test "x$CARGO" = "xno"; then
613     AC_MSG_ERROR([cargo unavailable but rust integration requested.])
614   fi
616   AC_DEFINE([HAVE_RUST], 1, [have Rust])
617   if test "x$enable_fatal_warnings" = "xyes"; then
618     RUST_WARN=
619   else
620     RUST_WARN=#
621   fi
622   if test "x$enable_cargo_online_mode" = "xyes"; then
623     CARGO_ONLINE=
624     RUST_DL=#
625   else
626     CARGO_ONLINE=--frozen
627     RUST_DL=
629     dnl When we're not allowed to touch the network, we need crate dependencies
630     dnl locally available.
631     AC_MSG_CHECKING([rust crate dependencies])
632     AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
633     if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
634       TOR_RUST_DEPENDENCIES="${srcdir}/src/ext/rust/crates"
635     fi
636     dnl Check whether the path exists before we try to cd into it.
637     if test ! -d "$TOR_RUST_DEPENDENCIES"; then
638       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.])
639       ERRORED=1
640     fi
641     dnl Make the path absolute, since we'll be using it from within a
642     dnl subdirectory.
643     TOR_RUST_DEPENDENCIES=$(cd "$TOR_RUST_DEPENDENCIES" ; pwd)
645     for dep in $rust_crates; do
646       if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
647         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.])
648         ERRORED=1
649       fi
650     done
651     if test "x$ERRORED" = "x"; then
652       AC_MSG_RESULT([yes])
653     fi
654   fi
656   dnl For now both MSVC and MinGW rust libraries will output static libs with
657   dnl the MSVC naming convention.
658   if test "$bwin32" = "true"; then
659     tor_rust_static_name=tor_rust.lib
660   else
661     tor_rust_static_name=libtor_rust.a
662   fi
664   AC_CANONICAL_BUILD
666   if test -n "$TOR_RUST_TARGET"; then
667     if test "$host" = "$build"; then
668       AC_MSG_ERROR([HOST = BUILD is invalid if TOR_RUST_TARGET is specified, see configure --help for more information.])
669     fi
670     RUST_TARGET_PROP="target = '$TOR_RUST_TARGET'"
671     TOR_RUST_LIB_PATH="src/rust/target/$TOR_RUST_TARGET/release/$tor_rust_static_name"
672   else
673     if test "$host" != "$build"; then
674       AC_MSG_ERROR([TOR_RUST_TARGET must be specified when cross-compiling with Rust enabled.])
675     fi
676     RUST_TARGET_PROP=
677     TOR_RUST_LIB_PATH="src/rust/target/release/$tor_rust_static_name"
678   fi
680   AC_SUBST(RUST_TARGET_PROP)
681   AC_SUBST(TOR_RUST_LIB_PATH)
682   AC_SUBST(CARGO_ONLINE)
683   AC_SUBST(RUST_WARN)
684   AC_SUBST(RUST_DL)
686   dnl Let's check the rustc version, too
687   AC_MSG_CHECKING([rust version])
688   RUSTC_VERSION=`$RUSTC --version`
689   RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
690   RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
691   if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
692     AC_MSG_ERROR([rustc version couldn't be identified])
693   fi
694   if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 31; then
695     AC_MSG_ERROR([rustc must be at least version 1.31.0])
696   fi
697   AC_MSG_RESULT([$RUSTC_VERSION])
700 AC_SEARCH_LIBS(socket, [socket network])
701 AC_SEARCH_LIBS(gethostbyname, [nsl])
702 AC_SEARCH_LIBS(dlopen, [dl])
703 AC_SEARCH_LIBS(inet_aton, [resolv])
704 AC_SEARCH_LIBS(backtrace, [execinfo])
705 saved_LIBS="$LIBS"
706 AC_SEARCH_LIBS([clock_gettime], [rt])
707 if test "$LIBS" != "$saved_LIBS"; then
708    # Looks like we need -lrt for clock_gettime().
709    have_rt=yes
712 if test "$bwin32" = "false"; then
713   AC_SEARCH_LIBS(pthread_create, [pthread])
714   AC_SEARCH_LIBS(pthread_detach, [pthread])
717 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
718 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
720 AC_CHECK_FUNCS(
721         _NSGetEnviron \
722         RtlSecureZeroMemory \
723         SecureZeroMemory \
724         accept4 \
725         backtrace \
726         backtrace_symbols_fd \
727         eventfd \
728         explicit_bzero \
729         timingsafe_memcmp \
730         flock \
731         fsync \
732         ftime \
733         get_current_dir_name \
734         getaddrinfo \
735         getdelim \
736         getifaddrs \
737         getline \
738         getrlimit \
739         gettimeofday \
740         gmtime_r \
741         gnu_get_libc_version \
742         inet_aton \
743         ioctl \
744         issetugid \
745         llround \
746         localtime_r \
747         lround \
748         madvise \
749         memmem \
750         memset_s \
751         minherit \
752         mmap \
753         pipe \
754         pipe2 \
755         prctl \
756         readpassphrase \
757         rint \
758         sigaction \
759         socketpair \
760         statvfs \
761         strncasecmp \
762         strcasecmp \
763         strlcat \
764         strlcpy \
765         strnlen \
766         strptime \
767         strtok_r \
768         strtoull \
769         sysconf \
770         sysctl \
771         truncate \
772         uname \
773         usleep \
774         vasprintf \
775         _vscprintf
778 # Apple messed up when they added some functions: they
779 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
780 # checks.
782 # We should only probe for these functions if we are sure that we
783 # are not targeting OS X 10.9 or earlier.
784 AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
785 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
786 #ifdef __APPLE__
787 #  include <AvailabilityMacros.h>
788 #  ifndef MAC_OS_X_VERSION_10_10
789 #    define MAC_OS_X_VERSION_10_10 101000
790 #  endif
791 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
792 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
793 #      error "Running on Mac OS X 10.9 or earlier"
794 #    endif
795 #  endif
796 #endif
797 ]], [[]])],
798    [on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
799    [on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])
801 if test "$on_macos_pre_10_10" = "no"; then
802   AC_CHECK_FUNCS(
803         mach_approximate_time \
804   )
807 # We should only probe for these functions if we are sure that we
808 # are not targeting OSX 10.11 or earlier.
809 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
810 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
811 #ifdef __APPLE__
812 #  include <AvailabilityMacros.h>
813 #  ifndef MAC_OS_X_VERSION_10_12
814 #    define MAC_OS_X_VERSION_10_12 101200
815 #  endif
816 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
817 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
818 #      error "Running on Mac OSX 10.11 or earlier"
819 #    endif
820 #  endif
821 #endif
822 ]], [[]])],
823    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
824    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
826 if test "$on_macos_pre_10_12" = "no"; then
827   AC_CHECK_FUNCS(
828         clock_gettime \
829         getentropy \
830   )
833 if test "$bwin32" != "true"; then
834   AC_CHECK_HEADERS(pthread.h)
835   AC_CHECK_FUNCS(pthread_create)
836   AC_CHECK_FUNCS(pthread_condattr_setclock)
839 if test "$bwin32" = "true"; then
840   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
841 #include <windows.h>
842 #include <conio.h>
843 #include <wchar.h>
844                  ])
847 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
848   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
850 AC_CHECK_FUNCS(glob)
852 AC_MSG_CHECKING([whether free(NULL) works])
853 AC_RUN_IFELSE([AC_LANG_PROGRAM([
854   #include <stdlib.h>
855 ], [
856 char *p = NULL;
857 free(p);
858 ])],
859 [free_null_ok=true; AC_MSG_RESULT(yes)],
860 [free_null_ok=false; AC_MSG_RESULT(no)],
861 [free_null_ok=cross; AC_MSG_RESULT(cross)])
863 if test "$free_null_ok" = "false"; then
864    AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
867 dnl ------------------------------------------------------
868 dnl Where do you live, libevent?  And how do we call you?
870 if test "$bwin32" = "true"; then
871   TOR_LIB_WS32=-lws2_32
872   TOR_LIB_IPHLPAPI=-liphlpapi
873   TOR_LIB_SHLWAPI=-lshlwapi
874   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
875   # think it's actually necessary.
876   TOR_LIB_GDI=-lgdi32
877   TOR_LIB_USERENV=-luserenv
878 else
879   TOR_LIB_WS32=
880   TOR_LIB_GDI=
881   TOR_LIB_USERENV=
883 AC_SUBST(TOR_LIB_WS32)
884 AC_SUBST(TOR_LIB_GDI)
885 AC_SUBST(TOR_LIB_IPHLPAPI)
886 AC_SUBST(TOR_LIB_SHLWAPI)
887 AC_SUBST(TOR_LIB_USERENV)
889 tor_libevent_pkg_redhat="libevent"
890 tor_libevent_pkg_debian="libevent-dev"
891 tor_libevent_devpkg_redhat="libevent-devel"
892 tor_libevent_devpkg_debian="libevent-dev"
894 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
895 dnl linking for static builds.
896 STATIC_LIBEVENT_FLAGS=""
897 if test "$enable_static_libevent" = "yes"; then
898     if test "$have_rt" = "yes"; then
899       STATIC_LIBEVENT_FLAGS=" -lrt "
900     fi
903 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
904 #ifdef _WIN32
905 #include <winsock2.h>
906 #endif
907 #include <sys/time.h>
908 #include <sys/types.h>
909 #include <event2/event.h>], [
910 #ifdef _WIN32
911 #include <winsock2.h>
912 #endif
913 struct event_base;
914 struct event_base *event_base_new(void);
915 void event_base_free(struct event_base *);],
916     [
917 #ifdef _WIN32
918 {WSADATA d; WSAStartup(0x101,&d); }
919 #endif
920 event_base_free(event_base_new());
921 ], [--with-libevent-dir], [/opt/libevent])
923 dnl Determine the incantation needed to link libevent.
924 save_LIBS="$LIBS"
925 save_LDFLAGS="$LDFLAGS"
926 save_CPPFLAGS="$CPPFLAGS"
928 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
929 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
930 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
932 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
934 if test "$enable_static_libevent" = "yes"; then
935    if test "$tor_cv_library_libevent_dir" = "(system)"; then
936      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
937    else
938      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
939    fi
940 else
941      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
942        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
943        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"))
945        if test "$ac_cv_search_event_new" != "none required"; then
946          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
947        fi
948        if test "$ac_cv_search_evdns_base_new" != "none required"; then
949          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
950        fi
951      else
952        AC_MSG_ERROR("libevent2 is required but the headers could not be found")
953      fi
956 dnl Now check for particular libevent functions.
957 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
958                 evutil_secure_rng_add_bytes \
959                 evdns_base_get_nameserver_addr \
963 LIBS="$save_LIBS"
964 LDFLAGS="$save_LDFLAGS"
965 CPPFLAGS="$save_CPPFLAGS"
967 dnl Check that libevent is at least at version 2.0.10, the first stable
968 dnl release of its series
969 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
970 AC_MSG_CHECKING([whether Libevent is new enough])
971 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
972 #include <event2/event.h>
973 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
974 #error
975 int x = y(zz);
976 #else
977 int x = 1;
978 #endif
979 ])], [ AC_MSG_RESULT([yes]) ],
980    [ AC_MSG_RESULT([no])
981      AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )
983 LIBS="$save_LIBS"
984 LDFLAGS="$save_LDFLAGS"
985 CPPFLAGS="$save_CPPFLAGS"
987 AC_SUBST(TOR_LIBEVENT_LIBS)
989 dnl ------------------------------------------------------
990 dnl Where do you live, libm?
992 dnl On some platforms (Haiku/BeOS) the math library is
993 dnl part of libroot. In which case don't link against lm
994 TOR_LIB_MATH=""
995 save_LIBS="$LIBS"
996 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
997 if test "$ac_cv_search_pow" != "none required"; then
998     TOR_LIB_MATH="$ac_cv_search_pow"
1000 LIBS="$save_LIBS"
1001 AC_SUBST(TOR_LIB_MATH)
1003 dnl ------------------------------------------------------
1004 dnl Hello, NSS.  You're new around here.
1005 if test "x$enable_nss" = "xyes"; then
1006   PKG_CHECK_MODULES(NSS,
1007      [nss],
1008      [have_nss=yes],
1009      [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.])])
1010   AC_SUBST(NSS_CFLAGS)
1011   AC_SUBST(NSS_LIBS)
1014 dnl ------------------------------------------------------
1015 dnl Where do you live, openssl?  And how do we call you?
1017 if test "x$enable_nss" != "xyes"; then
1019 tor_openssl_pkg_redhat="openssl"
1020 tor_openssl_pkg_debian="libssl-dev"
1021 tor_openssl_devpkg_redhat="openssl-devel"
1022 tor_openssl_devpkg_debian="libssl-dev"
1024 ALT_openssl_WITHVAL=""
1025 AC_ARG_WITH(ssl-dir,
1026   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
1027   [
1028       if test "x$withval" != "xno" && test "x$withval" != "x"; then
1029          ALT_openssl_WITHVAL="$withval"
1030       fi
1031   ])
1033 AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
1034 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
1035     [#include <openssl/ssl.h>
1036      char *getenv(const char *);],
1037     [struct ssl_cipher_st;
1038      unsigned SSL_CIPHER_get_id(const struct ssl_cipher_st *);
1039      char *getenv(const char *);],
1040     dnl This funny-looking test program calls getenv, so that the compiler
1041     dnl will neither make code that call SSL_CIPHER_get_id(NULL) [producing
1042     dnl a crash], nor optimize out the call to SSL_CIPHER_get_id().
1043     dnl We look for SSL_cipher_get_id() because it is present in
1044     dnl OpenSSL >=1.0.1, because it is not deprecated, and because Tor
1045     dnl depends on it.
1046     [if (getenv("THIS_SHOULDNT_BE_SET_X201803")) SSL_CIPHER_get_id((void *)0);], [],
1047     [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
1049 if test "$enable_static_openssl" = "yes"; then
1050    if test "$tor_cv_library_openssl_dir" = "(system)"; then
1051      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
1052    else
1053      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
1054    fi
1055 else
1056      TOR_OPENSSL_LIBS="-lssl -lcrypto"
1058 AC_SUBST(TOR_OPENSSL_LIBS)
1060 dnl Now validate openssl, and check for particular openssl functions.
1061 save_LIBS="$LIBS"
1062 save_LDFLAGS="$LDFLAGS"
1063 save_CPPFLAGS="$CPPFLAGS"
1064 LIBS="$TOR_OPENSSL_LIBS $LIBS"
1065 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
1066 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
1068 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1069 #include <openssl/opensslv.h>
1070 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
1071 #error "too old"
1072 #endif
1073    ]], [[]])],
1074    [ : ],
1075    [ 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.]) ])
1077 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1078 #include <openssl/opensslv.h>
1079 #include <openssl/evp.h>
1080 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
1081 #error "no ECC"
1082 #endif
1083 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
1084 #error "curves unavailable"
1085 #endif
1086    ]], [[]])],
1087    [ : ],
1088    [ 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.]) ])
1090 dnl Let's see if we have a version mismatch between includes and libs.
1091 AC_MSG_CHECKING([for significant mismatch between openssl headers and libraries])
1092 ac_retval=foo
1093 AC_RUN_IFELSE([AC_LANG_SOURCE([AC_LANG_PROGRAM([[
1094  #include <openssl/opensslv.h>
1095  #include <openssl/crypto.h>
1096 ]], [[
1097   /* Include major, minor, and fix, but not patch or status. */
1098   unsigned long mask = 0xfffff000;
1099   unsigned long linking = OpenSSL_version_num() & mask;
1100   unsigned long running = OPENSSL_VERSION_NUMBER & mask;
1101   return !(linking==running);
1102 ]])])], [openssl_ver_mismatch=no], [
1103    # This is a kludge to figure out whether compilation failed, or whether
1104    # running the program failed.
1105    if test "$ac_retval" == "1"; then
1106       openssl_ver_mismatch=inconclusive
1107    else
1108       openssl_ver_mismatch=yes
1109    fi], [openssl_ver_mismatch=cross])
1110 AC_MSG_RESULT([$openssl_ver_mismatch])
1112 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
1113 [#include <openssl/ssl.h>
1116 dnl OpenSSL functions which we might not have.  In theory, we could just
1117 dnl check the openssl version number, but in practice that gets pretty
1118 dnl confusing with LibreSSL, OpenSSL, and various distributions' patches
1119 dnl to them.
1120 AC_CHECK_FUNCS([ \
1121                 ERR_load_KDF_strings \
1122                 EVP_PBE_scrypt \
1123                 SSL_CIPHER_find \
1124                 SSL_CTX_set1_groups_list \
1125                 SSL_CTX_set_security_level \
1126                 SSL_SESSION_get_master_key \
1127                 SSL_get_client_ciphers \
1128                 SSL_get_client_random \
1129                 SSL_get_server_random \
1130                 TLS_method \
1131                ])
1133 dnl Check if OpenSSL structures are opaque
1134 AC_CHECK_MEMBERS([SSL.state], , ,
1135 [#include <openssl/ssl.h>
1138 AC_CHECK_SIZEOF(SHA_CTX, , [AC_INCLUDES_DEFAULT()
1139 #include <openssl/sha.h>
1142 fi # enable_nss
1144 dnl We will someday make KECCAK_TINY optional, but for now we still need
1145 dnl it for SHAKE, since OpenSSL's SHAKE can't be squeezed more than
1146 dnl once.  See comment in the definition of crypto_xof_t.
1148 dnl AM_CONDITIONAL(BUILD_KECCAK_TINY,
1149 dnl   test "x$ac_cv_func_EVP_sha3_256" != "xyes")
1151 AM_CONDITIONAL(BUILD_KECCAK_TINY, true)
1153 dnl ======================================================================
1154 dnl Can we use KIST?
1156 dnl Define the set of checks for KIST scheduler support.
1157 AC_DEFUN([CHECK_KIST_SUPPORT],[
1158   dnl KIST needs struct tcp_info and for certain members to exist.
1159   AC_CHECK_MEMBERS(
1160     [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
1161     , ,[[#include <netinet/tcp.h>]])
1162   dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
1163   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1164                      #include <linux/sockios.h>
1165                      #ifndef SIOCOUTQNSD
1166                      #error
1167                      #endif
1168                      ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
1169   if test "x$have_siocoutqnsd" = "xyes"; then
1170     if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
1171       if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
1172         have_kist_support=yes
1173       fi
1174     fi
1175   fi
1177 dnl Now, trigger the check.
1178 CHECK_KIST_SUPPORT
1179 AS_IF([test "x$have_kist_support" = "xyes"],
1180       [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
1181                                         on this system])],
1182       [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
1184 LIBS="$save_LIBS"
1185 LDFLAGS="$save_LDFLAGS"
1186 CPPFLAGS="$save_CPPFLAGS"
1188 dnl ------------------------------------------------------
1189 dnl Where do you live, zlib?  And how do we call you?
1191 tor_zlib_pkg_redhat="zlib"
1192 tor_zlib_pkg_debian="zlib1g"
1193 tor_zlib_devpkg_redhat="zlib-devel"
1194 tor_zlib_devpkg_debian="zlib1g-dev"
1196 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
1197     [#include <zlib.h>],
1198     [const char * zlibVersion(void);],
1199     [zlibVersion();], [--with-zlib-dir],
1200     [/opt/zlib])
1202 if test "$enable_static_zlib" = "yes"; then
1203    if test "$tor_cv_library_zlib_dir" = "(system)"; then
1204      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
1205  using --enable-static-zlib")
1206    else
1207      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
1208    fi
1209 else
1210      TOR_ZLIB_LIBS="-lz"
1212 AC_SUBST(TOR_ZLIB_LIBS)
1214 dnl ------------------------------------------------------
1215 dnl Where we do we find lzma?
1217 AC_ARG_ENABLE(lzma,
1218       AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
1219       [case "${enableval}" in
1220         "yes") ;;
1221         "no")  ;;
1222         * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
1223       esac], [enable_lzma=auto])
1225 if test "x$enable_lzma" = "xno"; then
1226     have_lzma=no;
1227 else
1228     PKG_CHECK_MODULES([LZMA],
1229                       [liblzma],
1230                       have_lzma=yes,
1231                       have_lzma=no)
1233     if test "x$have_lzma" = "xno" ; then
1234         tor_incr_n_warnings
1235         AC_MSG_WARN([Unable to find liblzma, $pkg_config_user_action, or set LZMA_CFLAGS and LZMA_LIBS.])
1236     fi
1239 if test "x$have_lzma" = "xyes"; then
1240     AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
1241     TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
1242     TOR_LZMA_LIBS="${LZMA_LIBS}"
1244 AC_SUBST(TOR_LZMA_CFLAGS)
1245 AC_SUBST(TOR_LZMA_LIBS)
1247 dnl ------------------------------------------------------
1248 dnl Where we do we find zstd?
1250 AC_ARG_ENABLE(zstd,
1251       AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
1252       [case "${enableval}" in
1253         "yes") ;;
1254         "no")  ;;
1255         * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
1256       esac], [enable_zstd=auto])
1258 if test "x$enable_zstd" = "xno"; then
1259     have_zstd=no;
1260 else
1261     PKG_CHECK_MODULES([ZSTD],
1262                       [libzstd >= 1.1],
1263                       have_zstd=yes,
1264                       have_zstd=no)
1266     if test "x$have_zstd" = "xno" ; then
1267         tor_incr_n_warnings
1268         AC_MSG_WARN([Unable to find libzstd, $pkg_config_user_action, or set ZSTD_CFLAGS and ZSTD_LIBS.])
1269     fi
1272 if test "x$have_zstd" = "xyes"; then
1273     AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
1274     TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
1275     TOR_ZSTD_LIBS="${ZSTD_LIBS}"
1277     dnl now check for zstd functions
1278     save_LIBS="$LIBS"
1279     save_CFLAGS="$CFLAGS"
1280     LIBS="$LIBS $ZSTD_LIBS"
1281     CFLAGS="$CFLAGS $ZSTD_CFLAGS"
1282     AC_CHECK_FUNCS(ZSTD_estimateCStreamSize \
1283                    ZSTD_estimateDCtxSize)
1284     LIBS="$save_LIBS"
1285     CFLAGS="$save_CFLAGS"
1287 AC_SUBST(TOR_ZSTD_CFLAGS)
1288 AC_SUBST(TOR_ZSTD_LIBS)
1290 dnl ----------------------------------------------------------------------
1291 dnl Check if libcap is available for capabilities.
1293 tor_cap_pkg_debian="libcap2"
1294 tor_cap_pkg_redhat="libcap"
1295 tor_cap_devpkg_debian="libcap-dev"
1296 tor_cap_devpkg_redhat="libcap-devel"
1298 AC_CHECK_LIB([cap], [cap_init], [],
1299   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
1301 AC_CHECK_FUNCS(cap_set_proc)
1303 dnl ---------------------------------------------------------------------
1304 dnl Now that we know about our major libraries, we can check for compiler
1305 dnl and linker hardening options.  We need to do this with the libraries known,
1306 dnl since sometimes the linker will like an option but not be willing to
1307 dnl use it with a build of a library.
1309 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1310 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"
1312 CFLAGS_FTRAPV=
1313 CFLAGS_FWRAPV=
1314 CFLAGS_ASAN=
1315 CFLAGS_UBSAN=
1318 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1319 #if !defined(__clang__)
1320 #error
1321 #endif])], have_clang=yes, have_clang=no)
1323 if test "x$enable_pic" = "xyes"; then
1324     TOR_CHECK_CFLAGS(-fPIC)
1327 if test "x$enable_gcc_hardening" != "xno"; then
1328     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1329     if test "x$have_clang" = "xyes"; then
1330         TOR_CHECK_CFLAGS(-Qunused-arguments)
1331     fi
1332     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1333     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1334     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1335 m4_ifdef([AS_VAR_IF],[
1336     AS_VAR_IF(can_compile, [yes],
1337         AS_VAR_IF(can_link, [yes],
1338                   [],
1339                   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.)]))
1340         )])
1341     AS_VAR_POPDEF([can_link])
1342     AS_VAR_POPDEF([can_compile])
1343     TOR_CHECK_CFLAGS(-Wstack-protector)
1344     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1345     if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1346        if test "$enable_pic" != "yes"; then
1347            # If we have already enabled -fPIC, then we don't also need to
1348            # compile with -fPIE...
1349            TOR_CHECK_CFLAGS(-fPIE)
1350        fi
1351        # ... but we want to link our executables with -pie in any case, since
1352        # they're executables, not a library.
1353        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1354     fi
1355     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1357    AC_MSG_CHECKING([whether we can run hardened binaries])
1358    AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
1359         [AC_MSG_RESULT([yes])],
1360         [AC_MSG_RESULT([no])
1361          AC_MSG_ERROR([dnl
1362  We can link with compiler hardening options, but we can't run with them.
1363  That's a bad sign! If you must, you can pass --disable-gcc-hardening to
1364  configure, but it would be better to figure out what the underlying problem
1365  is.])],
1366         [AC_MSG_RESULT([cross])])
1369 if test "$fragile_hardening" = "yes"; then
1370     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1371    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1372       tor_incr_n_warnings
1373       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.])
1374    fi
1376    if test "$tor_cv_cflags__ftrapv" != "yes"; then
1377      AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1378    fi
1380    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1381     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1382       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*])
1383     fi
1385    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1386     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1387       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*])
1388     fi
1390    TOR_TRY_COMPILE_WITH_CFLAGS([-fno-sanitize=float-divide-by-zero], also_link, CFLAGS_UBSAN="-fno-sanitize=float-divide-by-zero", true)
1391     if test "$tor_cv_cflags__fno_sanitize_float_divide_by_zero" = "yes" && test "$tor_can_link__fno_sanitize_float_divide_by_zero" != "yes"; then
1392       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*])
1393     fi
1395 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1398 dnl Find the correct libraries to add in order to use the sanitizers.
1400 dnl When building Rust, Cargo will run the linker with the -nodefaultlibs
1401 dnl option, which will prevent the compiler from linking the sanitizer
1402 dnl libraries it needs.  We need to specify them manually.
1404 dnl What's more, we need to specify them in a linker script rather than
1405 dnl from build.rs: these options aren't allowed in the cargo:rustc-flags
1406 dnl variable.
1407 RUST_LINKER_OPTIONS=""
1408 if test "x$have_clang" = "xyes"; then
1409         if test "x$CFLAGS_ASAN" != "x"; then
1410                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_ASAN -Cdefault-linker-libraries"
1411         fi
1412         if test "x$CFLAGS_UBSAN" != "x"; then
1413                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_UBSAN -Cdefault-linker-libraries"
1414         fi
1415 else
1416         if test "x$CFLAGS_ASAN" != "x"; then
1417                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=address -Cdefault-linker-libraries"
1418         fi
1419         if test "x$CFLAGS_UBSAN" != "x"; then
1420                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=undefined -Cdefault-linker-libraries"
1421         fi
1423 AC_SUBST(RUST_LINKER_OPTIONS)
1425 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1426 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1428 mulodi_fixes_ftrapv=no
1429 if test "$have_clang" = "yes"; then
1430   saved_CFLAGS="$CFLAGS"
1431   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1432   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1433   AC_LINK_IFELSE([
1434       AC_LANG_SOURCE([[
1435           #include <stdint.h>
1436           #include <stdlib.h>
1437           int main(int argc, char **argv)
1438           {
1439             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1440                         * (int64_t)atoi(argv[3]);
1441             return x == 9;
1442           } ]])],
1443           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1444           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1445   if test "$ftrapv_can_link" = "no"; then
1446     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1447     AC_LINK_IFELSE([
1448       AC_LANG_SOURCE([[
1449           #include <stdint.h>
1450           #include <stdlib.h>
1451           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1452              *overflow=0;
1453              return a;
1454           }
1455           int main(int argc, char **argv)
1456           {
1457             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1458                         * (int64_t)atoi(argv[3]);
1459             return x == 9;
1460           } ]])],
1461           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1462           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1463   fi
1464   CFLAGS="$saved_CFLAGS"
1467 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1469 dnl These cflags add bunches of branches, and we haven't been able to
1470 dnl persuade ourselves that they're suitable for code that needs to be
1471 dnl constant time.
1472 AC_SUBST(CFLAGS_BUGTRAP)
1473 dnl These cflags are variant ones sutable for code that needs to be
1474 dnl constant-time.
1475 AC_SUBST(CFLAGS_CONSTTIME)
1477 if test "x$enable_linker_hardening" != "xno"; then
1478     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1481 # For backtrace support
1482 TOR_CHECK_LDFLAGS(-rdynamic)
1484 dnl ------------------------------------------------------
1485 dnl Now see if we have a -fomit-frame-pointer compiler option.
1487 saved_CFLAGS="$CFLAGS"
1488 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1489 F_OMIT_FRAME_POINTER=''
1490 if test "$saved_CFLAGS" != "$CFLAGS"; then
1491   if test "$fragile_hardening" = "yes"; then
1492     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1493   fi
1495 CFLAGS="$saved_CFLAGS"
1496 AC_SUBST(F_OMIT_FRAME_POINTER)
1498 dnl ------------------------------------------------------
1499 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1500 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1501 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1502 dnl code will work.
1503 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1505 dnl ============================================================
1506 dnl Check for libseccomp
1508 if test "x$enable_seccomp" != "xno"; then
1509   AC_CHECK_HEADERS([seccomp.h])
1510   AC_SEARCH_LIBS(seccomp_init, [seccomp])
1513 dnl ============================================================
1514 dnl Check for libscrypt
1516 if test "x$enable_libscrypt" != "xno"; then
1517   AC_CHECK_HEADERS([libscrypt.h])
1518   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1519   AC_CHECK_FUNCS([libscrypt_scrypt])
1522 dnl ============================================================
1523 dnl We need an implementation of curve25519.
1525 dnl set these defaults.
1526 build_curve25519_donna=no
1527 build_curve25519_donna_c64=no
1528 use_curve25519_donna=no
1529 use_curve25519_nacl=no
1530 CURVE25519_LIBS=
1532 dnl The best choice is using curve25519-donna-c64, but that requires
1533 dnl that we
1534 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1535   tor_cv_can_use_curve25519_donna_c64,
1536   [AC_RUN_IFELSE(
1537     [AC_LANG_PROGRAM([dnl
1538       #include <stdint.h>
1539       typedef unsigned uint128_t __attribute__((mode(TI)));
1540   int func(uint64_t a, uint64_t b) {
1541            uint128_t c = ((uint128_t)a) * b;
1542            int ok = ((uint64_t)(c>>96)) == 522859 &&
1543              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1544                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1545                  (((uint64_t)(c))&0xffffffffL) == 0;
1546            return ok;
1547       }
1548   ], [dnl
1549     int ok = func( ((uint64_t)2000000000) * 1000000000,
1550                    ((uint64_t)1234567890) << 24);
1551         return !ok;
1552       ])],
1553   [tor_cv_can_use_curve25519_donna_c64=yes],
1554       [tor_cv_can_use_curve25519_donna_c64=no],
1555   [AC_LINK_IFELSE(
1556         [AC_LANG_PROGRAM([dnl
1557       #include <stdint.h>
1558       typedef unsigned uint128_t __attribute__((mode(TI)));
1559   int func(uint64_t a, uint64_t b) {
1560            uint128_t c = ((uint128_t)a) * b;
1561            int ok = ((uint64_t)(c>>96)) == 522859 &&
1562              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1563                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1564                  (((uint64_t)(c))&0xffffffffL) == 0;
1565            return ok;
1566       }
1567   ], [dnl
1568     int ok = func( ((uint64_t)2000000000) * 1000000000,
1569                  ((uint64_t)1234567890) << 24);
1570         return !ok;
1571       ])],
1572           [tor_cv_can_use_curve25519_donna_c64=cross],
1573       [tor_cv_can_use_curve25519_donna_c64=no])])])
1575 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1576                   nacl/crypto_scalarmult_curve25519.h])
1578 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1579   tor_cv_can_use_curve25519_nacl,
1580   [tor_saved_LIBS="$LIBS"
1581    LIBS="$LIBS -lnacl"
1582    AC_LINK_IFELSE(
1583      [AC_LANG_PROGRAM([dnl
1584        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1585        #include <crypto_scalarmult_curve25519.h>
1586    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1587    #include <nacl/crypto_scalarmult_curve25519.h>
1588    #endif
1589        #ifdef crypto_scalarmult_curve25519_ref_BYTES
1590    #error Hey, this is the reference implementation! That's not fast.
1591    #endif
1592      ], [
1593    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1594      ])], [tor_cv_can_use_curve25519_nacl=yes],
1595      [tor_cv_can_use_curve25519_nacl=no])
1596    LIBS="$tor_saved_LIBS" ])
1598  dnl Okay, now we need to figure out which one to actually use. Fall back
1599  dnl to curve25519-donna.c
1601  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1602    build_curve25519_donna_c64=yes
1603    use_curve25519_donna=yes
1604  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1605    use_curve25519_nacl=yes
1606    CURVE25519_LIBS=-lnacl
1607  else
1608    build_curve25519_donna=yes
1609    use_curve25519_donna=yes
1610  fi
1612 if test "x$use_curve25519_donna" = "xyes"; then
1613   AC_DEFINE(USE_CURVE25519_DONNA, 1,
1614             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1616 if test "x$use_curve25519_nacl" = "xyes"; then
1617   AC_DEFINE(USE_CURVE25519_NACL, 1,
1618             [Defined if we should use a curve25519 from nacl])
1620 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1621   test "x$build_curve25519_donna" = "xyes")
1622 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1623   test "x$build_curve25519_donna_c64" = "xyes")
1624 AC_SUBST(CURVE25519_LIBS)
1626 dnl Make sure to enable support for large off_t if available.
1627 AC_SYS_LARGEFILE
1629 AC_CHECK_HEADERS([errno.h \
1630                   fcntl.h \
1631                   signal.h \
1632                   string.h \
1633                   sys/capability.h \
1634                   sys/fcntl.h \
1635                   sys/stat.h \
1636                   sys/time.h \
1637                   sys/types.h \
1638                   time.h \
1639                   unistd.h \
1640                   arpa/inet.h \
1641                   crt_externs.h \
1642                   execinfo.h \
1643                   gnu/libc-version.h \
1644                   grp.h \
1645                   ifaddrs.h \
1646                   inttypes.h \
1647                   limits.h \
1648                   linux/types.h \
1649                   mach/vm_inherit.h \
1650                   machine/limits.h \
1651                   malloc.h \
1652                   netdb.h \
1653                   netinet/in.h \
1654                   netinet/in6.h \
1655                   pwd.h \
1656                   readpassphrase.h \
1657                   stdatomic.h \
1658                   sys/eventfd.h \
1659                   sys/file.h \
1660                   sys/ioctl.h \
1661                   sys/limits.h \
1662                   sys/mman.h \
1663                   sys/param.h \
1664                   sys/prctl.h \
1665                   sys/random.h \
1666                   sys/resource.h \
1667                   sys/select.h \
1668                   sys/socket.h \
1669                   sys/statvfs.h \
1670                   sys/syscall.h \
1671                   sys/sysctl.h \
1672                   sys/time.h \
1673                   sys/types.h \
1674                   sys/un.h \
1675                   sys/utime.h \
1676                   sys/wait.h \
1677                   syslog.h \
1678                   utime.h \
1679                   glob.h])
1681 AC_CHECK_HEADERS(sys/param.h)
1683 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1684 [#ifdef HAVE_SYS_TYPES_H
1685 #include <sys/types.h>
1686 #endif
1687 #ifdef HAVE_SYS_SOCKET_H
1688 #include <sys/socket.h>
1689 #endif])
1690 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1691 [#ifdef HAVE_SYS_TYPES_H
1692 #include <sys/types.h>
1693 #endif
1694 #ifdef HAVE_SYS_SOCKET_H
1695 #include <sys/socket.h>
1696 #endif
1697 #ifdef HAVE_NET_IF_H
1698 #include <net/if.h>
1699 #endif
1700 #ifdef HAVE_NETINET_IN_H
1701 #include <netinet/in.h>
1702 #endif])
1704 AC_CHECK_HEADERS(linux/if.h,[],[],
1706 #ifdef HAVE_SYS_SOCKET_H
1707 #include <sys/socket.h>
1708 #endif
1711 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1712         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1713 [#ifdef HAVE_SYS_TYPES_H
1714 #include <sys/types.h>
1715 #endif
1716 #ifdef HAVE_SYS_SOCKET_H
1717 #include <sys/socket.h>
1718 #endif
1719 #ifdef HAVE_LIMITS_H
1720 #include <limits.h>
1721 #endif
1722 #ifdef HAVE_LINUX_TYPES_H
1723 #include <linux/types.h>
1724 #endif
1725 #ifdef HAVE_NETINET_IN6_H
1726 #include <netinet/in6.h>
1727 #endif
1728 #ifdef HAVE_NETINET_IN_H
1729 #include <netinet/in.h>
1730 #endif])
1732 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1733         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1734 [#ifdef HAVE_SYS_TYPES_H
1735 #include <sys/types.h>
1736 #endif
1737 #ifdef HAVE_SYS_SOCKET_H
1738 #include <sys/socket.h>
1739 #endif
1740 #ifdef HAVE_LIMITS_H
1741 #include <limits.h>
1742 #endif
1743 #ifdef HAVE_LINUX_TYPES_H
1744 #include <linux/types.h>
1745 #endif
1746 #ifdef HAVE_NETINET_IN6_H
1747 #include <netinet/in6.h>
1748 #endif
1749 #ifdef HAVE_NETINET_IN_H
1750 #include <netinet/in.h>
1751 #endif
1752 #ifdef HAVE_LINUX_IF_H
1753 #include <linux/if.h>
1754 #endif])
1756 transparent_ok=0
1757 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1758   transparent_ok=1
1760 if test "x$linux_netfilter_ipv4" = "x1"; then
1761   transparent_ok=1
1763 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1764   transparent_ok=1
1766 if test "x$transparent_ok" = "x1"; then
1767   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1768 else
1769   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1772 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1773 [#ifdef HAVE_SYS_TYPES_H
1774 #include <sys/types.h>
1775 #endif
1776 #ifdef HAVE_SYS_TIME_H
1777 #include <sys/time.h>
1778 #endif])
1780 AC_CHECK_SIZEOF(char)
1781 AC_CHECK_SIZEOF(short)
1782 AC_CHECK_SIZEOF(int)
1783 AC_CHECK_SIZEOF(unsigned int)
1784 AC_CHECK_SIZEOF(long)
1785 AC_CHECK_SIZEOF(long long)
1786 AC_CHECK_SIZEOF(__int64)
1787 AC_CHECK_SIZEOF(void *)
1788 AC_CHECK_SIZEOF(time_t)
1789 AC_CHECK_SIZEOF(size_t)
1790 AC_CHECK_SIZEOF(pid_t)
1792 AC_CHECK_TYPES([uint, u_char, ssize_t])
1794 AC_PC_FROM_UCONTEXT([:])
1796 dnl used to include sockaddr_storage, but everybody has that.
1797 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1798 [#ifdef HAVE_SYS_TYPES_H
1799 #include <sys/types.h>
1800 #endif
1801 #ifdef HAVE_NETINET_IN_H
1802 #include <netinet/in.h>
1803 #endif
1804 #ifdef HAVE_NETINET_IN6_H
1805 #include <netinet/in6.h>
1806 #endif
1807 #ifdef HAVE_SYS_SOCKET_H
1808 #include <sys/socket.h>
1809 #endif
1810 #ifdef _WIN32
1811 #define _WIN32_WINNT 0x0501
1812 #define WIN32_LEAN_AND_MEAN
1813 #include <winsock2.h>
1814 #include <ws2tcpip.h>
1815 #endif
1817 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1818 [#ifdef HAVE_SYS_TYPES_H
1819 #include <sys/types.h>
1820 #endif
1821 #ifdef HAVE_NETINET_IN_H
1822 #include <netinet/in.h>
1823 #endif
1824 #ifdef HAVE_NETINET_IN6_H
1825 #include <netinet/in6.h>
1826 #endif
1827 #ifdef HAVE_SYS_SOCKET_H
1828 #include <sys/socket.h>
1829 #endif
1830 #ifdef _WIN32
1831 #define _WIN32_WINNT 0x0501
1832 #define WIN32_LEAN_AND_MEAN
1833 #include <winsock2.h>
1834 #include <ws2tcpip.h>
1835 #endif
1838 AC_CHECK_TYPES([rlim_t], , ,
1839 [#ifdef HAVE_SYS_TYPES_H
1840 #include <sys/types.h>
1841 #endif
1842 #ifdef HAVE_SYS_TIME_H
1843 #include <sys/time.h>
1844 #endif
1845 #ifdef HAVE_SYS_RESOURCE_H
1846 #include <sys/resource.h>
1847 #endif
1850 AX_CHECK_SIGN([time_t],
1851        [ : ],
1852        [ : ], [
1853 #ifdef HAVE_SYS_TYPES_H
1854 #include <sys/types.h>
1855 #endif
1856 #ifdef HAVE_SYS_TIME_H
1857 #include <sys/time.h>
1858 #endif
1859 #ifdef HAVE_TIME_H
1860 #include <time.h>
1861 #endif
1864 if test "$ax_cv_decl_time_t_signed" = "no"; then
1865   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1868 AX_CHECK_SIGN([size_t],
1869        [ tor_cv_size_t_signed=yes ],
1870        [ tor_cv_size_t_signed=no ], [
1871 #ifdef HAVE_SYS_TYPES_H
1872 #include <sys/types.h>
1873 #endif
1876 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1877   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1880 AX_CHECK_SIGN([enum always],
1881        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1882        [ : ], [
1883  enum always { AAA, BBB, CCC };
1886 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1887 #ifdef HAVE_SYS_SOCKET_H
1888 #include <sys/socket.h>
1889 #endif
1892 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1894 AC_CHECK_SIZEOF(cell_t)
1896 # Let's see if stdatomic works. (There are some debian clangs that screw it
1897 # up; see Tor bug #26779 and debian bug 903709.)
1898 AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
1899                tor_cv_stdatomic_works,
1900 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1901 #include <stdatomic.h>
1902 struct x { atomic_size_t y; };
1903 void try_atomic_init(struct x *xx)
1905   atomic_init(&xx->y, 99);
1906   atomic_fetch_add(&xx->y, 1);
1908 ]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
1910 if test "$tor_cv_stdatomic_works" = "yes"; then
1911    AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
1912 elif test "$ac_cv_header_stdatomic_h" = "yes"; then
1913    tor_incr_n_warnings
1914    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 ])
1917 # Now make sure that NULL can be represented as zero bytes.
1918 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1919 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1920 [[#include <stdlib.h>
1921 #include <string.h>
1922 #include <stdio.h>
1923 #ifdef HAVE_STDDEF_H
1924 #include <stddef.h>
1925 #endif
1926 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1927 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1928        [tor_cv_null_is_zero=yes],
1929        [tor_cv_null_is_zero=no],
1930        [tor_cv_null_is_zero=cross])])
1932 if test "$tor_cv_null_is_zero" = "cross"; then
1933   # Cross-compiling; let's hope that the target isn't raving mad.
1934   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1937 if test "$tor_cv_null_is_zero" != "no"; then
1938   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1939             [Define to 1 iff memset(0) sets pointers to NULL])
1942 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1943 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1944 [[#include <stdlib.h>
1945 #include <string.h>
1946 #include <stdio.h>
1947 #ifdef HAVE_STDDEF_H
1948 #include <stddef.h>
1949 #endif
1950 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1951 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1952        [tor_cv_dbl0_is_zero=yes],
1953        [tor_cv_dbl0_is_zero=no],
1954        [tor_cv_dbl0_is_zero=cross])])
1956 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1957   # Cross-compiling; let's hope that the target isn't raving mad.
1958   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1961 if test "$tor_cv_dbl0_is_zero" != "no"; then
1962   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1963             [Define to 1 iff memset(0) sets doubles to 0.0])
1966 # And what happens when we malloc zero?
1967 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1968 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1969 [[#include <stdlib.h>
1970 #include <string.h>
1971 #include <stdio.h>
1972 #ifdef HAVE_STDDEF_H
1973 #include <stddef.h>
1974 #endif
1975 int main () { return malloc(0)?0:1; }]])],
1976        [tor_cv_malloc_zero_works=yes],
1977        [tor_cv_malloc_zero_works=no],
1978        [tor_cv_malloc_zero_works=cross])])
1980 if test "$tor_cv_malloc_zero_works" = "cross"; then
1981   # Cross-compiling; let's hope that the target isn't raving mad.
1982   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1985 if test "$tor_cv_malloc_zero_works" = "yes"; then
1986   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1987             [Define to 1 iff malloc(0) returns a pointer])
1990 # whether we seem to be in a 2s-complement world.
1991 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1992 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1993 [[int main () { int problem = ((-99) != (~99)+1);
1994 return problem ? 1 : 0; }]])],
1995        [tor_cv_twos_complement=yes],
1996        [tor_cv_twos_complement=no],
1997        [tor_cv_twos_complement=cross])])
1999 if test "$tor_cv_twos_complement" = "cross"; then
2000   # Cross-compiling; let's hope that the target isn't raving mad.
2001   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
2004 if test "$tor_cv_twos_complement" != "no"; then
2005   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
2006             [Define to 1 iff we represent negative integers with
2007              two's complement])
2010 # What does shifting a negative value do?
2011 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
2012 [AC_RUN_IFELSE([AC_LANG_SOURCE(
2013 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
2014        [tor_cv_sign_extend=yes],
2015        [tor_cv_sign_extend=no],
2016        [tor_cv_sign_extend=cross])])
2018 if test "$tor_cv_sign_extend" = "cross"; then
2019   # Cross-compiling; let's hope that the target isn't raving mad.
2020   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
2023 if test "$tor_cv_sign_extend" != "no"; then
2024   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
2025             [Define to 1 iff right-shifting a negative value performs sign-extension])
2028 # Is uint8_t the same type as unsigned char?
2029 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
2030 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
2031 #include <stdint.h>
2032 extern uint8_t c;
2033 unsigned char c;]])],
2034        [tor_cv_uint8_uchar=yes],
2035        [tor_cv_uint8_uchar=no],
2036        [tor_cv_uint8_uchar=cross])])
2038 if test "$tor_cv_uint8_uchar" = "cross"; then
2039   AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
2042 if test "$tor_cv_uint8_uchar" = "no"; then
2043   AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
2046 AC_ARG_WITH(tcmalloc,
2047 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library. Deprecated; see --with-malloc]))
2049 default_malloc=system
2051 if test "x$enable_openbsd_malloc" = "xyes" ; then
2052   AC_MSG_NOTICE([The --enable-openbsd-malloc argument is deprecated; use --with-malloc=openbsd instead.])
2053   default_malloc=openbsd
2056 if test "x$with_tcmalloc" = "xyes"; then
2057   AC_MSG_NOTICE([The --with-tcmalloc argument is deprecated; use --with-malloc=tcmalloc instead.])
2058   default_malloc=tcmalloc
2061 AC_ARG_WITH(malloc,
2062    AS_HELP_STRING([--with-malloc=[system,jemalloc,tcmalloc,openbsd]],
2063                   [select special malloc implementation [system]]),
2064    [ malloc="$with_malloc" ], [ malloc="$default_malloc" ])
2066 AS_CASE([$malloc],
2067   [tcmalloc], [
2068       PKG_CHECK_MODULES([TCMALLOC],
2069                         [libtcmalloc],
2070                         have_tcmalloc=yes,
2071                         have_tcmalloc=no)
2073       if test "x$have_tcmalloc" = "xno" ; then
2074           AC_MSG_ERROR([Unable to find tcmalloc requested by --with-malloc, $pkg_config_user_action, or set TCMALLOC_CFLAGS and TCMALLOC_LIBS.])
2075       fi
2077       CFLAGS="$CFLAGS $TCMALLOC_CFLAGS"
2078       LIBS="$TCMALLOC_LIBS $LIBS"
2079   ],
2081   [jemalloc], [
2082       PKG_CHECK_MODULES([JEMALLOC],
2083                         [jemalloc],
2084                         have_jemalloc=yes,
2085                         have_jemalloc=no)
2087       if test "x$have_jemalloc" = "xno" ; then
2088           AC_MSG_ERROR([Unable to find jemalloc requested by --with-malloc, $pkg_config_user_action, or set JEMALLOC_CFLAGS and JEMALLOC_LIBS.])
2089       fi
2091       CFLAGS="$CFLAGS $JEMALLOC_CFLAGS"
2092       LIBS="$JEMALLOC_LIBS $LIBS"
2093       using_custom_malloc=yes
2094   ],
2096   [openbsd], [
2097     tor_incr_n_warnings
2098     AC_MSG_WARN([The openbsd malloc port is deprecated in Tor 0.3.5 and will be removed in a future version.])
2099     enable_openbsd_malloc=yes
2100   ],
2102   [system], [
2103      # handle this later, including the jemalloc fallback
2104     AC_CHECK_FUNCS(mallinfo)
2105   ],
2107   [AC_MSG_ERROR([--with-malloc=`$with_malloc' not supported, see --help])
2110 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
2112 if test "$malloc" != "system"; then
2113   # Tell the C compiler not to use the system allocator functions.
2114   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2116 if test "$using_custom_malloc" = "yes"; then
2117   # Tell the C compiler not to use the system allocator functions.
2118   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2121 # By default, we're going to assume we don't have mlockall()
2122 # bionic and other platforms have various broken mlockall subsystems.
2123 # Some systems don't have a working mlockall, some aren't linkable,
2124 # and some have it but don't declare it.
2125 AC_CHECK_FUNCS(mlockall)
2126 AC_CHECK_DECLS([mlockall], , , [
2127 #ifdef HAVE_SYS_MMAN_H
2128 #include <sys/mman.h>
2129 #endif])
2131 # Allow user to specify an alternate syslog facility
2132 AC_ARG_WITH(syslog-facility,
2133 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
2134 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
2135 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
2136 AC_SUBST(LOGFACILITY)
2138 # Check if we have getresuid and getresgid
2139 AC_CHECK_FUNCS(getresuid getresgid)
2141 # Check for gethostbyname_r in all its glorious incompatible versions.
2142 #   (This logic is based on that in Python's configure.in)
2143 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
2144   [Define this if you have any gethostbyname_r()])
2146 AC_CHECK_FUNC(gethostbyname_r, [
2147   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
2148   OLD_CFLAGS=$CFLAGS
2149   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
2150   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2151 #include <netdb.h>
2152   ]], [[
2153     char *cp1, *cp2;
2154     struct hostent *h1, *h2;
2155     int i1, i2;
2156     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
2157   ]])],[
2158     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2159     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
2160      [Define this if gethostbyname_r takes 6 arguments])
2161     AC_MSG_RESULT(6)
2162   ], [
2163     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2164 #include <netdb.h>
2165     ]], [[
2166       char *cp1, *cp2;
2167       struct hostent *h1;
2168       int i1, i2;
2169       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
2170     ]])], [
2171       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2172       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
2173         [Define this if gethostbyname_r takes 5 arguments])
2174       AC_MSG_RESULT(5)
2175    ], [
2176       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2177 #include <netdb.h>
2178      ]], [[
2179        char *cp1;
2180        struct hostent *h1;
2181        struct hostent_data hd;
2182        (void) gethostbyname_r(cp1,h1,&hd);
2183      ]])], [
2184        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2185        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
2186          [Define this if gethostbyname_r takes 3 arguments])
2187        AC_MSG_RESULT(3)
2188      ], [
2189        AC_MSG_RESULT(0)
2190      ])
2191   ])
2192  ])
2193  CFLAGS=$OLD_CFLAGS
2196 AC_CACHE_CHECK([whether the C compiler supports __func__],
2197   tor_cv_have_func_macro,
2198   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2199 #include <stdio.h>
2200 int main(int c, char **v) { puts(__func__); }])],
2201   tor_cv_have_func_macro=yes,
2202   tor_cv_have_func_macro=no))
2204 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
2205   tor_cv_have_FUNC_macro,
2206   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2207 #include <stdio.h>
2208 int main(int c, char **v) { puts(__FUNC__); }])],
2209   tor_cv_have_FUNC_macro=yes,
2210   tor_cv_have_FUNC_macro=no))
2212 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
2213   tor_cv_have_FUNCTION_macro,
2214   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2215 #include <stdio.h>
2216 int main(int c, char **v) { puts(__FUNCTION__); }])],
2217   tor_cv_have_FUNCTION_macro=yes,
2218   tor_cv_have_FUNCTION_macro=no))
2220 AC_CACHE_CHECK([whether we have extern char **environ already declared],
2221   tor_cv_have_environ_declared,
2222   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2223 #ifdef HAVE_UNISTD_H
2224 #include <unistd.h>
2225 #endif
2226 #include <stdlib.h>
2227 int main(int c, char **v) { char **t = environ; }])],
2228   tor_cv_have_environ_declared=yes,
2229   tor_cv_have_environ_declared=no))
2231 if test "$tor_cv_have_func_macro" = "yes"; then
2232   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
2235 if test "$tor_cv_have_FUNC_macro" = "yes"; then
2236   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
2239 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
2240   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
2241            [Defined if the compiler supports __FUNCTION__])
2244 if test "$tor_cv_have_environ_declared" = "yes"; then
2245   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
2246            [Defined if we have extern char **environ already declared])
2249 # $prefix stores the value of the --prefix command line option, or
2250 # NONE if the option wasn't set.  In the case that it wasn't set, make
2251 # it be the default, so that we can use it to expand directories now.
2252 if test "x$prefix" = "xNONE"; then
2253   prefix=$ac_default_prefix
2256 # and similarly for $exec_prefix
2257 if test "x$exec_prefix" = "xNONE"; then
2258   exec_prefix=$prefix
2261 if test "x$BUILDDIR" = "x"; then
2262   BUILDDIR=`pwd`
2264 AC_SUBST(BUILDDIR)
2265 AH_TEMPLATE([BUILDDIR],[tor's build directory])
2266 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
2268 if test "x$SRCDIR" = "x"; then
2269   SRCDIR=$(cd "$srcdir"; pwd)
2271 AH_TEMPLATE([SRCDIR],[tor's sourcedir directory])
2272 AC_DEFINE_UNQUOTED(SRCDIR,"$SRCDIR")
2274 if test "x$CONFDIR" = "x"; then
2275   CONFDIR=`eval echo $sysconfdir/tor`
2277 AC_SUBST(CONFDIR)
2278 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
2279 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
2281 BINDIR=`eval echo $bindir`
2282 AC_SUBST(BINDIR)
2283 LOCALSTATEDIR=`eval echo $localstatedir`
2284 AC_SUBST(LOCALSTATEDIR)
2286 if test "$bwin32" = "true"; then
2287   # Test if the linker supports the --nxcompat and --dynamicbase options
2288   # for Windows
2289   save_LDFLAGS="$LDFLAGS"
2290   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
2291   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
2292   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
2293     [AC_MSG_RESULT([yes])]
2294     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
2295     [AC_MSG_RESULT([no])]
2296   )
2297   LDFLAGS="$save_LDFLAGS"
2300 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
2301 # than autoconf's macros like.
2302 if test "$GCC" = "yes"; then
2303   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
2304   # accident waiting to happen.
2305   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
2306 else
2307   # Override optimization level for non-gcc compilers
2308   CFLAGS="$CFLAGS -O"
2309   enable_gcc_warnings=no
2310   enable_gcc_warnings_advisory=no
2313 # Warnings implies advisory-warnings and -Werror.
2314 if test "$enable_gcc_warnings" = "yes"; then
2315   enable_gcc_warnings_advisory=yes
2316   enable_fatal_warnings=yes
2319 # OS X Lion started deprecating the system openssl. Let's just disable
2320 # all deprecation warnings on OS X. Also, to potentially make the binary
2321 # a little smaller, let's enable dead_strip.
2322 case "$host_os" in
2324  darwin*)
2325     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
2326     LDFLAGS="$LDFLAGS -dead_strip" ;;
2327 esac
2329 TOR_WARNING_FLAGS=""
2331 # Add some more warnings which we use in development but not in the
2332 # released versions.  (Some relevant gcc versions can't handle these.)
2334 # Note that we have to do this near the end  of the autoconf process, or
2335 # else we may run into problems when these warnings hit on the testing C
2336 # programs that autoconf wants to build.
2337 if test "x$enable_gcc_warnings_advisory" != "xno"; then
2339   case "$host" in
2340     *-*-openbsd* | *-*-bitrig*)
2341       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
2342       # That's fine, except that the headers don't pass -Wredundant-decls.
2343       # Therefore, let's disable -Wsystem-headers when we're building
2344       # with maximal warnings on OpenBSD.
2345       CFLAGS="$CFLAGS -Wno-system-headers" ;;
2346   esac
2348   CFLAGS_NOWARNINGS="$CFLAGS"
2350   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
2351   # have it work better.
2352   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
2354   # This warning was added in gcc 4.3, but it appears to generate
2355   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
2356   #CFLAGS="$CFLAGS -Wlogical-op"
2358   m4_foreach_w([warning_flag], [
2359      -Waddress
2360      -Waddress-of-array-temporary
2361      -Waddress-of-temporary
2362      -Wambiguous-macro
2363      -Wanonymous-pack-parens
2364      -Warc
2365      -Warc-abi
2366      -Warc-bridge-casts-disallowed-in-nonarc
2367      -Warc-maybe-repeated-use-of-weak
2368      -Warc-performSelector-leaks
2369      -Warc-repeated-use-of-weak
2370      -Warray-bounds
2371      -Warray-bounds-pointer-arithmetic
2372      -Wasm
2373      -Wasm-operand-widths
2374      -Watomic-properties
2375      -Watomic-property-with-user-defined-accessor
2376      -Wauto-import
2377      -Wauto-storage-class
2378      -Wauto-var-id
2379      -Wavailability
2380      -Wbackslash-newline-escape
2381      -Wbad-array-new-length
2382      -Wbind-to-temporary-copy
2383      -Wbitfield-constant-conversion
2384      -Wbool-conversion
2385      -Wbool-conversions
2386      -Wbuiltin-requires-header
2387      -Wchar-align
2388      -Wcompare-distinct-pointer-types
2389      -Wcomplex-component-init
2390      -Wconditional-type-mismatch
2391      -Wconfig-macros
2392      -Wconstant-conversion
2393      -Wconstant-logical-operand
2394      -Wconstexpr-not-const
2395      -Wcustom-atomic-properties
2396      -Wdangling-field
2397      -Wdangling-initializer-list
2398      -Wdate-time
2399      -Wdelegating-ctor-cycles
2400      -Wdeprecated-implementations
2401      -Wdeprecated-register
2402      -Wdirect-ivar-access
2403      -Wdiscard-qual
2404      -Wdistributed-object-modifiers
2405      -Wdivision-by-zero
2406      -Wdollar-in-identifier-extension
2407      -Wdouble-promotion
2408      -Wduplicate-decl-specifier
2409      -Wduplicate-enum
2410      -Wduplicate-method-arg
2411      -Wduplicate-method-match
2412      -Wduplicated-cond
2413      -Wdynamic-class-memaccess
2414      -Wembedded-directive
2415      -Wempty-translation-unit
2416      -Wenum-conversion
2417      -Wexit-time-destructors
2418      -Wexplicit-ownership-type
2419      -Wextern-initializer
2420      -Wextra
2421      -Wextra-semi
2422      -Wextra-tokens
2423      -Wflexible-array-extensions
2424      -Wfloat-conversion
2425      -Wformat-non-iso
2426      -Wfour-char-constants
2427      -Wgcc-compat
2428      -Wglobal-constructors
2429      -Wgnu-array-member-paren-init
2430      -Wgnu-designator
2431      -Wgnu-static-float-init
2432      -Wheader-guard
2433      -Wheader-hygiene
2434      -Widiomatic-parentheses
2435      -Wignored-attributes
2436      -Wimplicit-atomic-properties
2437      -Wimplicit-conversion-floating-point-to-bool
2438      -Wimplicit-exception-spec-mismatch
2439      -Wimplicit-fallthrough
2440      -Wimplicit-fallthrough-per-function
2441      -Wimplicit-retain-self
2442      -Wimport-preprocessor-directive-pedantic
2443      -Wincompatible-library-redeclaration
2444      -Wincompatible-pointer-types-discards-qualifiers
2445      -Wincomplete-implementation
2446      -Wincomplete-module
2447      -Wincomplete-umbrella
2448      -Winit-self
2449      -Wint-conversions
2450      -Wint-to-void-pointer-cast
2451      -Winteger-overflow
2452      -Winvalid-constexpr
2453      -Winvalid-iboutlet
2454      -Winvalid-noreturn
2455      -Winvalid-pp-token
2456      -Winvalid-source-encoding
2457      -Winvalid-token-paste
2458      -Wknr-promoted-parameter
2459      -Wlarge-by-value-copy
2460      -Wliteral-conversion
2461      -Wliteral-range
2462      -Wlocal-type-template-args
2463      -Wlogical-op
2464      -Wloop-analysis
2465      -Wmain-return-type
2466      -Wmalformed-warning-check
2467      -Wmethod-signatures
2468      -Wmicrosoft
2469      -Wmicrosoft-exists
2470      -Wmismatched-parameter-types
2471      -Wmismatched-return-types
2472      -Wmissing-field-initializers
2473      -Wmissing-format-attribute
2474      -Wmissing-noreturn
2475      -Wmissing-selector-name
2476      -Wmissing-sysroot
2477      -Wmissing-variable-declarations
2478      -Wmodule-conflict
2479      -Wnested-anon-types
2480      -Wnewline-eof
2481      -Wnon-literal-null-conversion
2482      -Wnon-pod-varargs
2483      -Wnonportable-cfstrings
2484      -Wnormalized=nfkc
2485      -Wnull-arithmetic
2486      -Wnull-character
2487      -Wnull-conversion
2488      -Wnull-dereference
2489      -Wout-of-line-declaration
2490      -Wover-aligned
2491      -Woverlength-strings
2492      -Woverride-init
2493      -Woverriding-method-mismatch
2494      -Wpointer-type-mismatch
2495      -Wpredefined-identifier-outside-function
2496      -Wprotocol-property-synthesis-ambiguity
2497      -Wreadonly-iboutlet-property
2498      -Wreadonly-setter-attrs
2499      -Wreceiver-expr
2500      -Wreceiver-forward-class
2501      -Wreceiver-is-weak
2502      -Wreinterpret-base-class
2503      -Wrequires-super-attribute
2504      -Wreserved-user-defined-literal
2505      -Wreturn-stack-address
2506      -Wsection
2507      -Wselector-type-mismatch
2508      -Wsentinel
2509      -Wserialized-diagnostics
2510      -Wshadow
2511      -Wshift-count-negative
2512      -Wshift-count-overflow
2513      -Wshift-negative-value
2514      -Wshift-overflow=2
2515      -Wshift-sign-overflow
2516      -Wshorten-64-to-32
2517      -Wsizeof-array-argument
2518      -Wsource-uses-openmp
2519      -Wstatic-float-init
2520      -Wstatic-in-inline
2521      -Wstatic-local-in-inline
2522      -Wstrict-overflow=1
2523      -Wstring-compare
2524      -Wstring-conversion
2525      -Wstrlcpy-strlcat-size
2526      -Wstrncat-size
2527      -Wsuggest-attribute=format
2528      -Wsuggest-attribute=noreturn
2529      -Wsuper-class-method-mismatch
2530      -Wswitch-bool
2531      -Wsync-nand
2532      -Wtautological-constant-out-of-range-compare
2533      -Wtentative-definition-incomplete-type
2534      -Wtrampolines
2535      -Wtype-safety
2536      -Wtypedef-redefinition
2537      -Wtypename-missing
2538      -Wundefined-inline
2539      -Wundefined-internal
2540      -Wundefined-reinterpret-cast
2541      -Wunicode
2542      -Wunicode-whitespace
2543      -Wunknown-warning-option
2544      -Wunnamed-type-template-args
2545      -Wunneeded-member-function
2546      -Wunsequenced
2547      -Wunsupported-visibility
2548      -Wunused-but-set-parameter
2549      -Wunused-but-set-variable
2550      -Wunused-command-line-argument
2551      -Wunused-const-variable=2
2552      -Wunused-exception-parameter
2553      -Wunused-local-typedefs
2554      -Wunused-member-function
2555      -Wunused-sanitize-argument
2556      -Wunused-volatile-lvalue
2557      -Wuser-defined-literals
2558      -Wvariadic-macros
2559      -Wvector-conversion
2560      -Wvector-conversions
2561      -Wvexing-parse
2562      -Wvisibility
2563      -Wvla-extension
2564      -Wzero-length-array
2565   ], [ TOR_TRY_COMPILE_WITH_CFLAGS(warning_flag, [],
2566               [TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS warning_flag" CFLAGS="$CFLAGS warning_flag"], true)
2567      ])
2569 dnl    We should re-enable this in some later version.  Clang doesn't
2570 dnl    mind, but it causes trouble with GCC.
2571 dnl     -Wstrict-overflow=2
2573 dnl    These seem to require annotations that we don't currently use,
2574 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
2575 dnl     -Wthread-safety
2576 dnl     -Wthread-safety-analysis
2577 dnl     -Wthread-safety-attributes
2578 dnl     -Wthread-safety-beta
2579 dnl     -Wthread-safety-precise
2581   W_FLAGS="$W_FLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2582   W_FLAGS="$W_FLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2583   W_FLAGS="$W_FLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2584   W_FLAGS="$W_FLAGS -Wwrite-strings"
2585   W_FLAGS="$W_FLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2586   W_FLAGS="$W_FLAGS -Waggregate-return -Wpacked -Wunused"
2587   W_FLAGS="$W_FLAGS -Wunused-parameter "
2588   # These interfere with building main() { return 0; }, which autoconf
2589   # likes to use as its default program.
2590   W_FLAGS="$W_FLAGS -Wold-style-definition -Wmissing-declarations"
2592   TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS $W_FLAGS"
2593   CFLAGS="$CFLAGS $W_FLAGS"
2595   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2596     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2597   fi
2598   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2599     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2600   fi
2601   if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2602     AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2603   fi
2605   CFLAGS="$CFLAGS_NOWARNINGS"
2607   if test "x$enable_fatal_warnings" = "xyes"; then
2608     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2609     # default autoconf programs are full of errors.
2610     CFLAGS="$CFLAGS -Werror"
2611   fi
2615 AC_SUBST(TOR_WARNING_FLAGS)
2617 echo "$TOR_WARNING_FLAGS">warning_flags
2619 TOR_TRY_COMPILE_WITH_CFLAGS([@warning_flags], [],
2620                             CFLAGS="$CFLAGS @warning_flags",
2621                             CFLAGS="$CFLAGS $TOR_WARNING_FLAGS")
2623 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2624    case "$host_os" in
2625     darwin*)
2626       tor_incr_n_warnings
2627       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.])
2628    esac
2631 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2633 AC_CONFIG_FILES([
2634         Doxyfile
2635         Makefile
2636         config.rust
2637         contrib/operator-tools/tor.logrotate
2638         src/config/torrc.sample
2639         src/config/torrc.minimal
2640         src/rust/.cargo/config
2641         scripts/maint/checkOptionDocs.pl
2642         warning_flags
2645 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2646   regular_mans="doc/man/tor doc/man/tor-gencert doc/man/tor-resolve doc/man/torify"
2647   for file in $regular_mans ; do
2648     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2649       echo "==================================";
2650       echo;
2651       echo "Building Tor has failed since manpages cannot be built.";
2652       echo;
2653       echo "You need asciidoc installed to be able to build the manpages.";
2654       echo "To build without manpages, use the --disable-asciidoc argument";
2655       echo "when calling configure.";
2656       echo;
2657       echo "==================================";
2658       exit 1;
2659     fi
2660   done
2663 if test "$fragile_hardening" = "yes"; then
2664   tor_incr_n_warnings
2665   AC_MSG_WARN([
2667 ============
2668 Warning!  Building Tor with --enable-fragile-hardening (also known as
2669 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2670 other kinds of attacks easier. A Tor instance build with this option will be
2671 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2672 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2673 denial of service attacks. For more information, see
2674 https://gitlab.torproject.org/tpo/core/team/-/wikis/TorFragileHardening
2675 ============
2676   ])
2679 AC_OUTPUT
2681 if test "$openssl_ver_mismatch" = "yes"; then
2682    tor_incr_n_warnings
2683    AC_MSG_WARN([
2684 ============
2685 Warning! The version OpenSSL headers we get from compiling with
2686     "${TOR_CPPFLAGS_OPENSSL:-(no extra options)}"
2687 do not match version of the OpenSSL library we get when linking with
2688     "$TOR_LDFLAGS_OPENSSL $TOR_OPENSSL_LIBS".
2689 This might cause compilation to fail. Try using --with-openssl-dir to specify
2690 the exact OpenSSL path you want.
2691 ============
2696 # Mini-report on what will be built.
2699 PPRINT_INIT
2700 PPRINT_SET_INDENT(1)
2701 PPRINT_SET_TS(65)
2703 AS_ECHO
2704 AS_ECHO("Tor Version: ${PPRINT_COLOR_BLDBLU}Tor $PACKAGE_VERSION $PPRINT_COLOR_RST")
2705 AS_ECHO
2707 PPRINT_SUBTITLE([Build Features])
2709 PPRINT_PROP_STRING([Compiler], [$CC])
2710 PPRINT_PROP_STRING([Host OS], [$host_os])
2711 AS_ECHO
2713 test "x$enable_fatal_warnings" = "xyes" && value=1 || value=0
2714 PPRINT_PROP_BOOL([Warnings are fatal (--enable-fatal-warnings)], $value)
2716 test "x$enable_rust" = "xyes" && value=1 || value=0
2717 PPRINT_PROP_BOOL([Rust support (--enable-rust)], $value)
2719 test "x$enable_cargo_online_mode" = "xyes" && value=1 || value=0
2720 PPRINT_PROP_BOOL([Cargo Online Fetch (--enable-cargo-online-mode)], $value)
2722 test "x$enable_android" = "xyes" && value=1 || value=0
2723 PPRINT_PROP_BOOL([Android support (--enable-android)], $value)
2725 AS_ECHO
2726 PPRINT_SUBTITLE([Static Build])
2728 test "x$enable_static_tor" = "xyes" && value=1 || value=0
2729 PPRINT_PROP_BOOL([tor (--enable-static-tor)], $value)
2731 if test "x$enable_static_libevent" = "xyes"; then
2732   PPRINT_PROP_STRING([libevent], [$TOR_LIBDIR_libevent])
2733 else
2734   PPRINT_PROP_BOOL([libevent (--enable-static-libevent)], $value)
2737 if test "x$enable_static_openssl" = "xyes"; then
2738   PPRINT_PROP_STRING([libssl], [$TOR_LIBDIR_openssl])
2739 else
2740   PPRINT_PROP_BOOL([libssl (--enable-static-openssl)], $value)
2743 if test "x$enable_static_zlib" = "xyes"; then
2744   PPRINT_PROP_STRING([zlib1g], [$TOR_LIBDIR_zlib])
2745 else
2746   PPRINT_PROP_BOOL([zlib1g (--enable-static-zlib)], $value)
2749 AS_ECHO
2750 PPRINT_SUBTITLE([Optional Libraries])
2752 test "x$enable_nss" = "xyes" && value=1 || value=0
2753 PPRINT_PROP_BOOL([libnss (--enable-nss)], $value)
2755 test "x$enable_seccomp" != "xno" && value=1 || value=0
2756 PPRINT_PROP_BOOL([libseccomp (--disable-seccomp)], $value)
2758 test "x$enable_libscrypt" != "xno" && value=1 || value=0
2759 PPRINT_PROP_BOOL([libscrypt (--disable-libscrypt)], $value)
2761 test "x$enable_systemd" = "xyes" && value=1 || value=0
2762 PPRINT_PROP_BOOL([Systemd support (--enable-systemd)], $value)
2764 test "x$enable_lzma" = "xyes" && value=1 || value=0
2765 PPRINT_PROP_BOOL([liblzma (--enable-lzma)], $value)
2767 test "x$enable_zstd" = "xyes" && value=1 || value=0
2768 PPRINT_PROP_BOOL([libzstd (--enable-zstd)], $value)
2770 AS_ECHO
2771 PPRINT_SUBTITLE([Hardening])
2773 test "x$enable_gcc_hardening" != "xno" && value=1 || value=0
2774 PPRINT_PROP_BOOL([Compiler Hardening (--disable-gcc-hardening)], $value)
2776 test "x$enable_linker_hardening" != "xno" && value=1 || value=0
2777 PPRINT_PROP_BOOL([Linker Hardening (--disable-linker-hardening)], $value)
2779 test "x$fragile_hardening" = "xyes" && value=1 || value=0
2780 PPRINT_PROP_BOOL([Fragile Hardening (--enable-fragile-hardening, dev only)], $value)
2782 AS_ECHO
2783 PPRINT_SUBTITLE([Modules])
2785 m4_foreach_w([mname], MODULES,
2786   [
2787     AM_COND_IF(m4_join([], [BUILD_MODULE_], m4_toupper([]mname[])), value=1, value=0)
2788     PPRINT_PROP_BOOL([mname (--disable-module-mname)], $value)
2789   ]
2792 AS_ECHO
2793 PPRINT_SUBTITLE([Documentation])
2795 test "x$enable_asciidoc" != "xno" && value=1 || value=0
2796 PPRINT_PROP_BOOL([AsciiDoc (--disable-asciidoc)], $value)
2798 test "x$enable_manpage" != "xno" && value=1 || value=0
2799 PPRINT_PROP_BOOL([Man Pages (--disable-manpage)], $value)
2801 test "x$enable_html_manual" != "xno" && value=1 || value=0
2802 PPRINT_PROP_BOOL([HTML Manual (--disable-html-manual)], $value)
2804 AS_ECHO
2805 PPRINT_SUBTITLE([Tests])
2807 test "x$enable_unittests" != "xno" && value=1 || value=0
2808 PPRINT_PROP_BOOL([Unit tests (--disable-unittests)], $value)
2810 test "x$enable_asserts_in_tests" = "xno" && value=1 || value=0
2811 PPRINT_PROP_BOOL([assert()s enabled (--enable-asserts-in-tests, dev only)], $value)
2813 test "x$enable_coverage" = "xyes" && value=1 || value=0
2814 PPRINT_PROP_BOOL([Code Coverage (--enable-coverage)], $value)
2816 test "x$enable_libfuzzer" = "xyes" && value=1 || value=0
2817 PPRINT_PROP_BOOL([libFuzzer support (--enable-libfuzzer)], $value)
2819 test "x$enable_oss_fuzz" = "xyes" && value=1 || value=0
2820 PPRINT_PROP_BOOL([OSS-Fuzz support (--enable-oss-fuzz)], $value)
2822 AS_ECHO
2823 PPRINT_SUBTITLE([Tracing (--enable-tracing-instrumentation-<type>)])
2825 test "x$enable_tracing_instrumentation_log_debug" = "xyes" && value=1 || value=0
2826 PPRINT_PROP_BOOL([Tracepoints to log_debug() (log-debug)], $value)
2828 test "x$enable_tracing_instrumentation_usdt" = "xyes" && value=1 || value=0
2829 PPRINT_PROP_BOOL([USDT Instrumentation (usdt)], $value)
2831 test "x$enable_tracing_instrumentation_lttng" = "xyes" && value=1 || value=0
2832 PPRINT_PROP_BOOL([LTTng Instrumentation (lttng)], $value)
2834 AS_ECHO
2835 PPRINT_SUBTITLE([Install Directories])
2837 report_mandir="`eval eval echo $mandir`"
2838 PPRINT_PROP_STRING([Binaries], [$BINDIR])
2839 PPRINT_PROP_STRING([Configuration], [$CONFDIR])
2840 PPRINT_PROP_STRING([Man Pages], [$report_mandir])
2842 AS_ECHO
2843 AS_ECHO(["Configure Line: ./configure $configure_flags"])
2845 if test "$tor_ac_n_warnings" != "0"; then
2846   AS_ECHO
2847   PPRINT_WARN([
2848 Encountered $tor_ac_n_warnings warning(s). See messages above for more info.
2849   ])