Merge branch 'tor-gitlab/mr/326' into maint-0.4.5
[tor.git] / configure.ac
blob4d91b11cea3cc292b3087b33c0e4c7f3f8043a57
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.6-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-02-15"], # for 0.4.5.6-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   ],
2148   [AC_MSG_ERROR([--with-malloc=`$with_malloc' not supported, see --help])
2151 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
2153 if test "$malloc" != "system"; then
2154   # Tell the C compiler not to use the system allocator functions.
2155   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2157 if test "$using_custom_malloc" = "yes"; then
2158   # Tell the C compiler not to use the system allocator functions.
2159   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2162 # By default, we're going to assume we don't have mlockall()
2163 # bionic and other platforms have various broken mlockall subsystems.
2164 # Some systems don't have a working mlockall, some aren't linkable,
2165 # and some have it but don't declare it.
2166 AC_CHECK_FUNCS(mlockall)
2167 AC_CHECK_DECLS([mlockall], , , [
2168 #ifdef HAVE_SYS_MMAN_H
2169 #include <sys/mman.h>
2170 #endif])
2172 # Allow user to specify an alternate syslog facility
2173 AC_ARG_WITH(syslog-facility,
2174 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
2175 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
2176 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
2177 AC_SUBST(LOGFACILITY)
2179 # Check if we have getresuid and getresgid
2180 AC_CHECK_FUNCS(getresuid getresgid)
2182 # Check for gethostbyname_r in all its glorious incompatible versions.
2183 #   (This logic is based on that in Python's configure.in)
2184 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
2185   [Define this if you have any gethostbyname_r()])
2187 AC_CHECK_FUNC(gethostbyname_r, [
2188   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
2189   OLD_CFLAGS=$CFLAGS
2190   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
2191   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2192 #include <netdb.h>
2193   ]], [[
2194     char *cp1, *cp2;
2195     struct hostent *h1, *h2;
2196     int i1, i2;
2197     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
2198   ]])],[
2199     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2200     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
2201      [Define this if gethostbyname_r takes 6 arguments])
2202     AC_MSG_RESULT(6)
2203   ], [
2204     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2205 #include <netdb.h>
2206     ]], [[
2207       char *cp1, *cp2;
2208       struct hostent *h1;
2209       int i1, i2;
2210       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
2211     ]])], [
2212       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2213       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
2214         [Define this if gethostbyname_r takes 5 arguments])
2215       AC_MSG_RESULT(5)
2216    ], [
2217       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2218 #include <netdb.h>
2219      ]], [[
2220        char *cp1;
2221        struct hostent *h1;
2222        struct hostent_data hd;
2223        (void) gethostbyname_r(cp1,h1,&hd);
2224      ]])], [
2225        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2226        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
2227          [Define this if gethostbyname_r takes 3 arguments])
2228        AC_MSG_RESULT(3)
2229      ], [
2230        AC_MSG_RESULT(0)
2231      ])
2232   ])
2233  ])
2234  CFLAGS=$OLD_CFLAGS
2237 AC_CACHE_CHECK([whether the C compiler supports __func__],
2238   tor_cv_have_func_macro,
2239   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2240 #include <stdio.h>
2241 int main(int c, char **v) { puts(__func__); }])],
2242   tor_cv_have_func_macro=yes,
2243   tor_cv_have_func_macro=no))
2245 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
2246   tor_cv_have_FUNC_macro,
2247   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2248 #include <stdio.h>
2249 int main(int c, char **v) { puts(__FUNC__); }])],
2250   tor_cv_have_FUNC_macro=yes,
2251   tor_cv_have_FUNC_macro=no))
2253 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
2254   tor_cv_have_FUNCTION_macro,
2255   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2256 #include <stdio.h>
2257 int main(int c, char **v) { puts(__FUNCTION__); }])],
2258   tor_cv_have_FUNCTION_macro=yes,
2259   tor_cv_have_FUNCTION_macro=no))
2261 AC_CACHE_CHECK([whether we have extern char **environ already declared],
2262   tor_cv_have_environ_declared,
2263   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2264 #ifdef HAVE_UNISTD_H
2265 #include <unistd.h>
2266 #endif
2267 #include <stdlib.h>
2268 int main(int c, char **v) { char **t = environ; }])],
2269   tor_cv_have_environ_declared=yes,
2270   tor_cv_have_environ_declared=no))
2272 if test "$tor_cv_have_func_macro" = "yes"; then
2273   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
2276 if test "$tor_cv_have_FUNC_macro" = "yes"; then
2277   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
2280 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
2281   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
2282            [Defined if the compiler supports __FUNCTION__])
2285 if test "$tor_cv_have_environ_declared" = "yes"; then
2286   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
2287            [Defined if we have extern char **environ already declared])
2290 # $prefix stores the value of the --prefix command line option, or
2291 # NONE if the option wasn't set.  In the case that it wasn't set, make
2292 # it be the default, so that we can use it to expand directories now.
2293 if test "x$prefix" = "xNONE"; then
2294   prefix=$ac_default_prefix
2297 # and similarly for $exec_prefix
2298 if test "x$exec_prefix" = "xNONE"; then
2299   exec_prefix=$prefix
2302 if test "x$BUILDDIR" = "x"; then
2303   BUILDDIR=`pwd`
2305 AC_SUBST(BUILDDIR)
2306 AH_TEMPLATE([BUILDDIR],[tor's build directory])
2307 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
2309 if test "x$SRCDIR" = "x"; then
2310   SRCDIR=$(cd "$srcdir"; pwd)
2312 AH_TEMPLATE([SRCDIR],[tor's sourcedir directory])
2313 AC_DEFINE_UNQUOTED(SRCDIR,"$SRCDIR")
2315 if test "x$CONFDIR" = "x"; then
2316   CONFDIR=`eval echo $sysconfdir/tor`
2318 AC_SUBST(CONFDIR)
2319 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
2320 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
2322 BINDIR=`eval echo $bindir`
2323 AC_SUBST(BINDIR)
2324 LOCALSTATEDIR=`eval echo $localstatedir`
2325 AC_SUBST(LOCALSTATEDIR)
2327 if test "$bwin32" = "true"; then
2328   # Test if the linker supports the --nxcompat and --dynamicbase options
2329   # for Windows
2330   save_LDFLAGS="$LDFLAGS"
2331   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
2332   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
2333   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
2334     [AC_MSG_RESULT([yes])]
2335     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
2336     [AC_MSG_RESULT([no])]
2337   )
2338   LDFLAGS="$save_LDFLAGS"
2341 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
2342 # than autoconf's macros like.
2343 if test "$GCC" = "yes"; then
2344   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
2345   # accident waiting to happen.
2346   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
2347 else
2348   # Override optimization level for non-gcc compilers
2349   CFLAGS="$CFLAGS -O"
2350   enable_gcc_warnings=no
2351   enable_gcc_warnings_advisory=no
2354 # Warnings implies advisory-warnings and -Werror.
2355 if test "$enable_gcc_warnings" = "yes"; then
2356   enable_gcc_warnings_advisory=yes
2357   enable_fatal_warnings=yes
2360 # OS X Lion started deprecating the system openssl. Let's just disable
2361 # all deprecation warnings on OS X. Also, to potentially make the binary
2362 # a little smaller, let's enable dead_strip.
2363 case "$host_os" in
2365  darwin*)
2366     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
2367     LDFLAGS="$LDFLAGS -dead_strip" ;;
2368 esac
2370 TOR_WARNING_FLAGS=""
2372 # Add some more warnings which we use in development but not in the
2373 # released versions.  (Some relevant gcc versions can't handle these.)
2375 # Note that we have to do this near the end  of the autoconf process, or
2376 # else we may run into problems when these warnings hit on the testing C
2377 # programs that autoconf wants to build.
2378 if test "x$enable_gcc_warnings_advisory" != "xno"; then
2380   case "$host" in
2381     *-*-openbsd* | *-*-bitrig*)
2382       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
2383       # That's fine, except that the headers don't pass -Wredundant-decls.
2384       # Therefore, let's disable -Wsystem-headers when we're building
2385       # with maximal warnings on OpenBSD.
2386       CFLAGS="$CFLAGS -Wno-system-headers" ;;
2387   esac
2389   CFLAGS_NOWARNINGS="$CFLAGS"
2391   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
2392   # have it work better.
2393   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
2395   # This warning was added in gcc 4.3, but it appears to generate
2396   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
2397   #CFLAGS="$CFLAGS -Wlogical-op"
2399   m4_foreach_w([warning_flag], [
2400      -Waddress
2401      -Waddress-of-array-temporary
2402      -Waddress-of-temporary
2403      -Wambiguous-macro
2404      -Wanonymous-pack-parens
2405      -Warc
2406      -Warc-abi
2407      -Warc-bridge-casts-disallowed-in-nonarc
2408      -Warc-maybe-repeated-use-of-weak
2409      -Warc-performSelector-leaks
2410      -Warc-repeated-use-of-weak
2411      -Warray-bounds
2412      -Warray-bounds-pointer-arithmetic
2413      -Wasm
2414      -Wasm-operand-widths
2415      -Watomic-properties
2416      -Watomic-property-with-user-defined-accessor
2417      -Wauto-import
2418      -Wauto-storage-class
2419      -Wauto-var-id
2420      -Wavailability
2421      -Wbackslash-newline-escape
2422      -Wbad-array-new-length
2423      -Wbind-to-temporary-copy
2424      -Wbitfield-constant-conversion
2425      -Wbool-conversion
2426      -Wbool-conversions
2427      -Wbuiltin-requires-header
2428      -Wchar-align
2429      -Wcompare-distinct-pointer-types
2430      -Wcomplex-component-init
2431      -Wconditional-type-mismatch
2432      -Wconfig-macros
2433      -Wconstant-conversion
2434      -Wconstant-logical-operand
2435      -Wconstexpr-not-const
2436      -Wcustom-atomic-properties
2437      -Wdangling-field
2438      -Wdangling-initializer-list
2439      -Wdate-time
2440      -Wdelegating-ctor-cycles
2441      -Wdeprecated-implementations
2442      -Wdeprecated-register
2443      -Wdirect-ivar-access
2444      -Wdiscard-qual
2445      -Wdistributed-object-modifiers
2446      -Wdivision-by-zero
2447      -Wdollar-in-identifier-extension
2448      -Wdouble-promotion
2449      -Wduplicate-decl-specifier
2450      -Wduplicate-enum
2451      -Wduplicate-method-arg
2452      -Wduplicate-method-match
2453      -Wduplicated-cond
2454      -Wdynamic-class-memaccess
2455      -Wembedded-directive
2456      -Wempty-translation-unit
2457      -Wenum-conversion
2458      -Wexit-time-destructors
2459      -Wexplicit-ownership-type
2460      -Wextern-initializer
2461      -Wextra
2462      -Wextra-semi
2463      -Wextra-tokens
2464      -Wflexible-array-extensions
2465      -Wfloat-conversion
2466      -Wformat-non-iso
2467      -Wfour-char-constants
2468      -Wgcc-compat
2469      -Wglobal-constructors
2470      -Wgnu-array-member-paren-init
2471      -Wgnu-designator
2472      -Wgnu-static-float-init
2473      -Wheader-guard
2474      -Wheader-hygiene
2475      -Widiomatic-parentheses
2476      -Wignored-attributes
2477      -Wimplicit-atomic-properties
2478      -Wimplicit-conversion-floating-point-to-bool
2479      -Wimplicit-exception-spec-mismatch
2480      -Wimplicit-fallthrough
2481      -Wimplicit-fallthrough-per-function
2482      -Wimplicit-retain-self
2483      -Wimport-preprocessor-directive-pedantic
2484      -Wincompatible-library-redeclaration
2485      -Wincompatible-pointer-types-discards-qualifiers
2486      -Wincomplete-implementation
2487      -Wincomplete-module
2488      -Wincomplete-umbrella
2489      -Winit-self
2490      -Wint-conversions
2491      -Wint-to-void-pointer-cast
2492      -Winteger-overflow
2493      -Winvalid-constexpr
2494      -Winvalid-iboutlet
2495      -Winvalid-noreturn
2496      -Winvalid-pp-token
2497      -Winvalid-source-encoding
2498      -Winvalid-token-paste
2499      -Wknr-promoted-parameter
2500      -Wlarge-by-value-copy
2501      -Wliteral-conversion
2502      -Wliteral-range
2503      -Wlocal-type-template-args
2504      -Wlogical-op
2505      -Wloop-analysis
2506      -Wmain-return-type
2507      -Wmalformed-warning-check
2508      -Wmethod-signatures
2509      -Wmicrosoft
2510      -Wmicrosoft-exists
2511      -Wmismatched-parameter-types
2512      -Wmismatched-return-types
2513      -Wmissing-field-initializers
2514      -Wmissing-format-attribute
2515      -Wmissing-noreturn
2516      -Wmissing-selector-name
2517      -Wmissing-sysroot
2518      -Wmissing-variable-declarations
2519      -Wmodule-conflict
2520      -Wnested-anon-types
2521      -Wnewline-eof
2522      -Wnon-literal-null-conversion
2523      -Wnon-pod-varargs
2524      -Wnonportable-cfstrings
2525      -Wnormalized=nfkc
2526      -Wnull-arithmetic
2527      -Wnull-character
2528      -Wnull-conversion
2529      -Wnull-dereference
2530      -Wout-of-line-declaration
2531      -Wover-aligned
2532      -Woverlength-strings
2533      -Woverride-init
2534      -Woverriding-method-mismatch
2535      -Wpointer-type-mismatch
2536      -Wpredefined-identifier-outside-function
2537      -Wprotocol-property-synthesis-ambiguity
2538      -Wreadonly-iboutlet-property
2539      -Wreadonly-setter-attrs
2540      -Wreceiver-expr
2541      -Wreceiver-forward-class
2542      -Wreceiver-is-weak
2543      -Wreinterpret-base-class
2544      -Wrequires-super-attribute
2545      -Wreserved-user-defined-literal
2546      -Wreturn-stack-address
2547      -Wsection
2548      -Wselector-type-mismatch
2549      -Wsentinel
2550      -Wserialized-diagnostics
2551      -Wshadow
2552      -Wshift-count-negative
2553      -Wshift-count-overflow
2554      -Wshift-negative-value
2555      -Wshift-overflow=2
2556      -Wshift-sign-overflow
2557      -Wshorten-64-to-32
2558      -Wsizeof-array-argument
2559      -Wsource-uses-openmp
2560      -Wstatic-float-init
2561      -Wstatic-in-inline
2562      -Wstatic-local-in-inline
2563      -Wstrict-overflow=1
2564      -Wstring-compare
2565      -Wstring-conversion
2566      -Wstrlcpy-strlcat-size
2567      -Wstrncat-size
2568      -Wsuggest-attribute=format
2569      -Wsuggest-attribute=noreturn
2570      -Wsuper-class-method-mismatch
2571      -Wswitch-bool
2572      -Wsync-nand
2573      -Wtautological-constant-out-of-range-compare
2574      -Wtentative-definition-incomplete-type
2575      -Wtrampolines
2576      -Wtype-safety
2577      -Wtypedef-redefinition
2578      -Wtypename-missing
2579      -Wundefined-inline
2580      -Wundefined-internal
2581      -Wundefined-reinterpret-cast
2582      -Wunicode
2583      -Wunicode-whitespace
2584      -Wunknown-warning-option
2585      -Wunnamed-type-template-args
2586      -Wunneeded-member-function
2587      -Wunsequenced
2588      -Wunsupported-visibility
2589      -Wunused-but-set-parameter
2590      -Wunused-but-set-variable
2591      -Wunused-command-line-argument
2592      -Wunused-const-variable=2
2593      -Wunused-exception-parameter
2594      -Wunused-local-typedefs
2595      -Wunused-member-function
2596      -Wunused-sanitize-argument
2597      -Wunused-volatile-lvalue
2598      -Wuser-defined-literals
2599      -Wvariadic-macros
2600      -Wvector-conversion
2601      -Wvector-conversions
2602      -Wvexing-parse
2603      -Wvisibility
2604      -Wvla-extension
2605      -Wzero-length-array
2606   ], [ TOR_TRY_COMPILE_WITH_CFLAGS(warning_flag, [],
2607               [TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS warning_flag" CFLAGS="$CFLAGS warning_flag"], true)
2608      ])
2610 dnl    We should re-enable this in some later version.  Clang doesn't
2611 dnl    mind, but it causes trouble with GCC.
2612 dnl     -Wstrict-overflow=2
2614 dnl    These seem to require annotations that we don't currently use,
2615 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
2616 dnl     -Wthread-safety
2617 dnl     -Wthread-safety-analysis
2618 dnl     -Wthread-safety-attributes
2619 dnl     -Wthread-safety-beta
2620 dnl     -Wthread-safety-precise
2622   W_FLAGS="$W_FLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2623   W_FLAGS="$W_FLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2624   W_FLAGS="$W_FLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2625   W_FLAGS="$W_FLAGS -Wwrite-strings"
2626   W_FLAGS="$W_FLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2627   W_FLAGS="$W_FLAGS -Waggregate-return -Wpacked -Wunused"
2628   W_FLAGS="$W_FLAGS -Wunused-parameter "
2629   # These interfere with building main() { return 0; }, which autoconf
2630   # likes to use as its default program.
2631   W_FLAGS="$W_FLAGS -Wold-style-definition -Wmissing-declarations"
2633   TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS $W_FLAGS"
2634   CFLAGS="$CFLAGS $W_FLAGS"
2636   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2637     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2638   fi
2639   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2640     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2641   fi
2642   if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2643     AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2644   fi
2646   CFLAGS="$CFLAGS_NOWARNINGS"
2648   if test "x$enable_fatal_warnings" = "xyes"; then
2649     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2650     # default autoconf programs are full of errors.
2651     CFLAGS="$CFLAGS -Werror"
2652   fi
2656 AC_SUBST(TOR_WARNING_FLAGS)
2658 echo "$TOR_WARNING_FLAGS">warning_flags
2660 TOR_TRY_COMPILE_WITH_CFLAGS([@warning_flags], [],
2661                             CFLAGS="$CFLAGS @warning_flags",
2662                             CFLAGS="$CFLAGS $TOR_WARNING_FLAGS")
2664 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2665    case "$host_os" in
2666     darwin*)
2667       tor_incr_n_warnings
2668       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.])
2669    esac
2672 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2674 AC_CONFIG_FILES([
2675         Doxyfile
2676         Makefile
2677         config.rust
2678         contrib/operator-tools/tor.logrotate
2679         src/config/torrc.sample
2680         src/config/torrc.minimal
2681         src/rust/.cargo/config
2682         scripts/maint/checkOptionDocs.pl
2683         warning_flags
2686 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2687   regular_mans="doc/man/tor doc/man/tor-gencert doc/man/tor-resolve doc/man/torify"
2688   for file in $regular_mans ; do
2689     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2690       echo "==================================";
2691       echo;
2692       echo "Building Tor has failed since manpages cannot be built.";
2693       echo;
2694       echo "You need asciidoc installed to be able to build the manpages.";
2695       echo "To build without manpages, use the --disable-asciidoc argument";
2696       echo "when calling configure.";
2697       echo;
2698       echo "==================================";
2699       exit 1;
2700     fi
2701   done
2704 if test "$fragile_hardening" = "yes"; then
2705   tor_incr_n_warnings
2706   AC_MSG_WARN([
2708 ============
2709 Warning!  Building Tor with --enable-fragile-hardening (also known as
2710 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2711 other kinds of attacks easier. A Tor instance build with this option will be
2712 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2713 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2714 denial of service attacks. For more information, see
2715 https://gitlab.torproject.org/tpo/core/team/-/wikis/TorFragileHardening
2716 ============
2717   ])
2720 AC_OUTPUT
2722 if test "$openssl_ver_mismatch" = "yes"; then
2723    tor_incr_n_warnings
2724    AC_MSG_WARN([
2725 ============
2726 Warning! The version OpenSSL headers we get from compiling with
2727     "${TOR_CPPFLAGS_OPENSSL:-(no extra options)}"
2728 do not match version of the OpenSSL library we get when linking with
2729     "$TOR_LDFLAGS_OPENSSL $TOR_OPENSSL_LIBS".
2730 This might cause compilation to fail. Try using --with-openssl-dir to specify
2731 the exact OpenSSL path you want.
2732 ============
2737 # Mini-report on what will be built.
2740 PPRINT_INIT
2741 PPRINT_SET_INDENT(1)
2742 PPRINT_SET_TS(65)
2744 AS_ECHO
2745 AS_ECHO("Tor Version: ${PPRINT_COLOR_BLDBLU}Tor $PACKAGE_VERSION $PPRINT_COLOR_RST")
2746 AS_ECHO
2748 PPRINT_SUBTITLE([Build Features])
2750 PPRINT_PROP_STRING([Compiler], [$CC])
2751 PPRINT_PROP_STRING([Host OS], [$host_os])
2752 AS_ECHO
2754 test "x$enable_fatal_warnings" = "xyes" && value=1 || value=0
2755 PPRINT_PROP_BOOL([Warnings are fatal (--enable-fatal-warnings)], $value)
2757 test "x$enable_rust" = "xyes" && value=1 || value=0
2758 PPRINT_PROP_BOOL([Rust support (--enable-rust)], $value)
2760 test "x$enable_cargo_online_mode" = "xyes" && value=1 || value=0
2761 PPRINT_PROP_BOOL([Cargo Online Fetch (--enable-cargo-online-mode)], $value)
2763 test "x$enable_android" = "xyes" && value=1 || value=0
2764 PPRINT_PROP_BOOL([Android support (--enable-android)], $value)
2766 AS_ECHO
2767 PPRINT_SUBTITLE([Static Build])
2769 test "x$enable_static_tor" = "xyes" && value=1 || value=0
2770 PPRINT_PROP_BOOL([tor (--enable-static-tor)], $value)
2772 if test "x$enable_static_libevent" = "xyes"; then
2773   PPRINT_PROP_STRING([libevent], [$TOR_LIBDIR_libevent])
2774 else
2775   PPRINT_PROP_BOOL([libevent (--enable-static-libevent)], $value)
2778 if test "x$enable_static_openssl" = "xyes"; then
2779   PPRINT_PROP_STRING([libssl], [$TOR_LIBDIR_openssl])
2780 else
2781   PPRINT_PROP_BOOL([libssl (--enable-static-openssl)], $value)
2784 if test "x$enable_static_zlib" = "xyes"; then
2785   PPRINT_PROP_STRING([zlib1g], [$TOR_LIBDIR_zlib])
2786 else
2787   PPRINT_PROP_BOOL([zlib1g (--enable-static-zlib)], $value)
2790 AS_ECHO
2791 PPRINT_SUBTITLE([Optional Libraries])
2793 test "x$enable_nss" = "xyes" && value=1 || value=0
2794 PPRINT_PROP_BOOL([libnss (--enable-nss)], $value)
2796 test "x$enable_seccomp" != "xno" && value=1 || value=0
2797 PPRINT_PROP_BOOL([libseccomp (--disable-seccomp)], $value)
2799 test "x$enable_libscrypt" != "xno" && value=1 || value=0
2800 PPRINT_PROP_BOOL([libscrypt (--disable-libscrypt)], $value)
2802 test "x$enable_systemd" = "xyes" && value=1 || value=0
2803 PPRINT_PROP_BOOL([Systemd support (--enable-systemd)], $value)
2805 test "x$enable_lzma" = "xyes" && value=1 || value=0
2806 PPRINT_PROP_BOOL([liblzma (--enable-lzma)], $value)
2808 test "x$enable_zstd" = "xyes" && value=1 || value=0
2809 PPRINT_PROP_BOOL([libzstd (--enable-zstd)], $value)
2811 AS_ECHO
2812 PPRINT_SUBTITLE([Hardening])
2814 test "x$enable_gcc_hardening" != "xno" && value=1 || value=0
2815 PPRINT_PROP_BOOL([Compiler Hardening (--disable-gcc-hardening)], $value)
2817 test "x$enable_linker_hardening" != "xno" && value=1 || value=0
2818 PPRINT_PROP_BOOL([Linker Hardening (--disable-linker-hardening)], $value)
2820 test "x$fragile_hardening" = "xyes" && value=1 || value=0
2821 PPRINT_PROP_BOOL([Fragile Hardening (--enable-fragile-hardening, dev only)], $value)
2823 AS_ECHO
2824 PPRINT_SUBTITLE([Modules])
2826 m4_foreach_w([mname], MODULES,
2827   [
2828     AM_COND_IF(m4_join([], [BUILD_MODULE_], m4_toupper([]mname[])), value=1, value=0)
2829     m4_set_contains([MODULES_WITH_NO_OPTIONS], mname,
2830                     PPRINT_PROP_BOOL([mname], $value),
2831                     PPRINT_PROP_BOOL([mname (--disable-module-mname)], $value))
2832   ]
2835 AS_ECHO
2836 PPRINT_SUBTITLE([Documentation])
2838 test "x$enable_asciidoc" != "xno" && value=1 || value=0
2839 PPRINT_PROP_BOOL([AsciiDoc (--disable-asciidoc)], $value)
2841 test "x$enable_manpage" != "xno" && value=1 || value=0
2842 PPRINT_PROP_BOOL([Man Pages (--disable-manpage)], $value)
2844 test "x$enable_html_manual" != "xno" && value=1 || value=0
2845 PPRINT_PROP_BOOL([HTML Manual (--disable-html-manual)], $value)
2847 AS_ECHO
2848 PPRINT_SUBTITLE([Tests])
2850 test "x$enable_unittests" != "xno" && value=1 || value=0
2851 PPRINT_PROP_BOOL([Unit tests (--disable-unittests)], $value)
2853 test "x$enable_asserts_in_tests" = "xno" && value=1 || value=0
2854 PPRINT_PROP_BOOL([assert()s enabled (--enable-asserts-in-tests, dev only)], $value)
2856 test "x$enable_coverage" = "xyes" && value=1 || value=0
2857 PPRINT_PROP_BOOL([Code Coverage (--enable-coverage)], $value)
2859 test "x$enable_libfuzzer" = "xyes" && value=1 || value=0
2860 PPRINT_PROP_BOOL([libFuzzer support (--enable-libfuzzer)], $value)
2862 test "x$enable_oss_fuzz" = "xyes" && value=1 || value=0
2863 PPRINT_PROP_BOOL([OSS-Fuzz support (--enable-oss-fuzz)], $value)
2865 AS_ECHO
2866 PPRINT_SUBTITLE([Tracing (--enable-tracing-instrumentation-<type>)])
2868 test "x$enable_tracing_instrumentation_log_debug" = "xyes" && value=1 || value=0
2869 PPRINT_PROP_BOOL([Tracepoints to log_debug() (log-debug)], $value)
2871 test "x$enable_tracing_instrumentation_usdt" = "xyes" && value=1 || value=0
2872 PPRINT_PROP_BOOL([USDT Instrumentation (usdt)], $value)
2874 test "x$enable_tracing_instrumentation_lttng" = "xyes" && value=1 || value=0
2875 PPRINT_PROP_BOOL([LTTng Instrumentation (lttng)], $value)
2877 AS_ECHO
2878 PPRINT_SUBTITLE([Install Directories])
2880 report_mandir="`eval eval echo $mandir`"
2881 PPRINT_PROP_STRING([Binaries], [$BINDIR])
2882 PPRINT_PROP_STRING([Configuration], [$CONFDIR])
2883 PPRINT_PROP_STRING([Man Pages], [$report_mandir])
2885 AS_ECHO
2886 AS_ECHO(["Configure Line: ./configure $configure_flags"])
2888 if test "$tor_ac_n_warnings" != "0"; then
2889   AS_ECHO
2890   PPRINT_WARN([
2891 Encountered $tor_ac_n_warnings warning(s). See messages above for more info.
2892   ])