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