Fix spacing in tor_inet_aton() function header
[tor.git] / configure.ac
blob894ca2b0f8a72304e06e61e81ea8c8d25cbea45d
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.3.0-alpha-dev])
8 AC_CONFIG_SRCDIR([src/app/main/tor_main.c])
9 AC_CONFIG_MACRO_DIR([m4])
11 configure_flags="$*"
13 # DO NOT EDIT THIS DEFINITION BY HAND UNLESS YOU KNOW WHAT YOU'RE DOING.
15 # The update_versions.py script updates this definition when the
16 # version number changes.  Tor uses it to make sure that it
17 # only shuts down for missing "required protocols" when those protocols
18 # are listed as required by a consensus after this date.
19 AC_DEFINE(APPROX_RELEASE_DATE, ["2019-10-11"], # for 0.4.3.0-alpha-dev
20           [Approximate date when this software was released. (Updated when the version changes.)])
22 # "foreign" means we don't follow GNU package layout standards
23 # "1.11" means we require automake version 1.11 or newer
24 # "subdir-objects" means put .o files in the same directory as the .c files
25 AM_INIT_AUTOMAKE([foreign 1.11 subdir-objects -Wall -Werror])
27 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
28 AC_CONFIG_HEADERS([orconfig.h])
30 AC_USE_SYSTEM_EXTENSIONS
31 AC_CANONICAL_HOST
33 PKG_PROG_PKG_CONFIG
34 if test "x$PKG_CONFIG" = "x" ; then
35     pkg_config_user_action="install pkg-config, and check the PKG_CONFIG_PATH environment variable"
36     AC_MSG_NOTICE([Some libraries need pkg-config, including systemd, nss, lzma, zstd, and custom mallocs.])
37     AC_MSG_NOTICE([To use those libraries, $pkg_config_user_action.])
38 else
39     pkg_config_user_action="check the PKG_CONFIG_PATH environment variable"
42 if test "x$PKG_CONFIG_PATH" = "x" && test "x$prefix" != "xNONE" && test "$host" != "$build"; then
43    export PKG_CONFIG_PATH=$prefix/lib/pkgconfig
44    AC_MSG_NOTICE([set PKG_CONFIG_PATH=$PKG_CONFIG_PATH to support cross-compiling])
47 AC_ARG_ENABLE(openbsd-malloc,
48    AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD.  Linux only. Deprecated: see --with-malloc]))
49 AC_ARG_ENABLE(static-openssl,
50    AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
51 AC_ARG_ENABLE(static-libevent,
52    AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
53 AC_ARG_ENABLE(static-zlib,
54    AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
55 AC_ARG_ENABLE(static-tor,
56    AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
57 AC_ARG_ENABLE(unittests,
58    AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
59 AC_ARG_ENABLE(coverage,
60    AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
61 AC_ARG_ENABLE(asserts-in-tests,
62    AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
63 AC_ARG_ENABLE(system-torrc,
64    AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
65 AC_ARG_ENABLE(libfuzzer,
66    AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer']))
67 AC_ARG_ENABLE(oss-fuzz,
68    AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment]))
69 AC_ARG_ENABLE(memory-sentinels,
70    AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.]))
71 AC_ARG_ENABLE(rust,
72    AS_HELP_STRING(--enable-rust, [enable rust integration]))
73 AC_ARG_ENABLE(cargo-online-mode,
74    AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.]))
75 AC_ARG_ENABLE(restart-debugging,
76    AS_HELP_STRING(--enable-restart-debugging, [Build Tor with support for debugging in-process restart. Developers only.]))
77 AC_ARG_ENABLE(zstd-advanced-apis,
78    AS_HELP_STRING(--disable-zstd-advanced-apis, [Build without support for zstd's "static-only" APIs.]))
79 AC_ARG_ENABLE(nss,
80    AS_HELP_STRING(--enable-nss, [Use Mozilla's NSS TLS library. (EXPERIMENTAL)]))
81 AC_ARG_ENABLE(pic,
82    AS_HELP_STRING(--enable-pic, [Build Tor's binaries as position-independent code, suitable to link as a library.]))
84 AC_ARG_ENABLE(missing-doc-warnings,
85    AS_HELP_STRING(--enable-missing-doc-warnings, [Tell doxygen to warn about missing documentation. Makes doxygen warnings nonfatal.]))
87 if test "$enable_missing_doc_warnings" = "yes"; then
88    DOXYGEN_FATAL_WARNINGS=NO
89    DOXYGEN_WARN_ON_MISSING=YES
90 elif test "$enable_fatal_warnings" = "yes"; then
91    # Fatal warnings from doxygen are nice, but not if we're warning about
92    # missing documentation.
93    DOXYGEN_FATAL_WARNINGS=YES
94    DOXYGEN_WARN_ON_MISSING=NO
95 else
96    DOXYGEN_FATAL_WARNINGS=NO
97    DOXYGEN_WARN_ON_MISSING=NO
99 AC_SUBST(DOXYGEN_FATAL_WARNINGS)
100 AC_SUBST(DOXYGEN_WARN_ON_MISSING)
102 if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
103     AC_MSG_ERROR([Can't disable assertions outside of coverage build])
106 AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
107 AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
108 AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
109 AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
110 AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
111 AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
112 AM_CONDITIONAL(USE_NSS, test "x$enable_nss" = "xyes")
113 AM_CONDITIONAL(USE_OPENSSL, test "x$enable_nss" != "xyes")
115 if test "x$enable_nss" = "xyes"; then
116   AC_DEFINE(ENABLE_NSS, 1,
117             [Defined if we're building with NSS.])
118 else
119   AC_DEFINE(ENABLE_OPENSSL, 1,
120             [Defined if we're building with OpenSSL or LibreSSL])
123 if test "$enable_static_tor" = "yes"; then
124   enable_static_libevent="yes";
125   enable_static_openssl="yes";
126   enable_static_zlib="yes";
127   CFLAGS="$CFLAGS -static"
130 if test "$enable_system_torrc" = "no"; then
131   AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
132             [Defined if we're not going to look for a torrc in SYSCONF])
135 if test "$enable_memory_sentinels" = "no"; then
136   AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
137            [Defined if we're turning off memory safety code to look for bugs])
140 AC_ARG_ENABLE(manpage,
141               AS_HELP_STRING(--disable-manpage, [Disable manpage generation.]))
143 AC_ARG_ENABLE(html-manual,
144               AS_HELP_STRING(--disable-html-manual, [Disable HTML documentation.]))
146 AC_ARG_ENABLE(asciidoc,
147      AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
148      [case "${enableval}" in
149         "yes") asciidoc=true ;;
150         "no")  asciidoc=false ;;
151         *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
152       esac], [asciidoc=true])
154 # systemd notify support
155 AC_ARG_ENABLE(systemd,
156       AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
157       [case "${enableval}" in
158         "yes") systemd=true ;;
159         "no")  systemd=false ;;
160         * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
161       esac], [systemd=auto])
163 if test "$enable_restart_debugging" = "yes"; then
164   AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
165             [Defined if we're building with support for in-process restart debugging.])
168 if test "$enable_zstd_advanced_apis" != "no"; then
169    AC_DEFINE(ENABLE_ZSTD_ADVANCED_APIS, 1,
170              [Defined if we're going to try to use zstd's "static-only" APIs.])
173 # systemd support
174 if test "x$enable_systemd" = "xno"; then
175     have_systemd=no;
176 else
177     PKG_CHECK_MODULES(SYSTEMD,
178         [libsystemd-daemon],
179         have_systemd=yes,
180         have_systemd=no)
181     if test "x$have_systemd" = "xno"; then
182         AC_MSG_NOTICE([Okay, checking for systemd a different way...])
183         PKG_CHECK_MODULES(SYSTEMD,
184             [libsystemd],
185             have_systemd=yes,
186             have_systemd=no)
187     fi
190 if test "x$have_systemd" = "xyes"; then
191     AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
192     TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
193     TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
194     PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
195          [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or greater])], [])
197 AC_SUBST(TOR_SYSTEMD_CFLAGS)
198 AC_SUBST(TOR_SYSTEMD_LIBS)
200 if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
201     AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found, $pkg_config_user_action, or set SYSTEMD_CFLAGS and SYSTEMD_LIBS.])
204 case "$host" in
205    *-*-solaris* )
206      AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
207      ;;
208 esac
210 AC_ARG_ENABLE(gcc-warnings,
211      AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
212 AC_ARG_ENABLE(fatal-warnings,
213      AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
214 AC_ARG_ENABLE(gcc-warnings-advisory,
215      AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
217 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
218 AC_ARG_ENABLE(gcc-hardening,
219     AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
221 dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
222 AC_ARG_ENABLE(expensive-hardening,
223     AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
224 AC_ARG_ENABLE(fragile-hardening,
225     AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
226 if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
227   fragile_hardening="yes"
228   AC_DEFINE(DEBUG_SMARTLIST, 1, [Enable smartlist debugging])
231 dnl Linker hardening options
232 dnl Currently these options are ELF specific - you can't use this with MacOSX
233 AC_ARG_ENABLE(linker-hardening,
234     AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
236 AC_ARG_ENABLE(local-appdata,
237    AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
238 if test "$enable_local_appdata" = "yes"; then
239   AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
240             [Defined if we default to host local appdata paths on Windows])
243 AC_ARG_ENABLE(tool-name-check,
244      AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
246 AC_ARG_ENABLE(seccomp,
247      AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
249 AC_ARG_ENABLE(libscrypt,
250      AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
252 dnl Enable event tracing which are transformed to debug log statement.
253 AC_ARG_ENABLE(event-tracing-debug,
254      AS_HELP_STRING(--enable-event-tracing-debug, [build with event tracing to debug log]))
255 AM_CONDITIONAL([USE_EVENT_TRACING_DEBUG], [test "x$enable_event_tracing_debug" = "xyes"])
257 if test x$enable_event_tracing_debug = xyes; then
258   AC_DEFINE([USE_EVENT_TRACING_DEBUG], [1], [Tracing framework to log debug])
259   AC_DEFINE([TOR_EVENT_TRACING_ENABLED], [1], [Compile the event tracing instrumentation])
262 dnl Enable Android only features.
263 AC_ARG_ENABLE(android,
264      AS_HELP_STRING(--enable-android, [build with Android features enabled]))
265 AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])
267 if test "x$enable_android" = "xyes"; then
268   AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])
270   dnl Check if the Android log library is available.
271   AC_CHECK_HEADERS([android/log.h])
272   AC_SEARCH_LIBS(__android_log_write, [log])
276 dnl ---
277 dnl Tor modules options. These options are namespaced with --disable-module-XXX
278 dnl ---
280 dnl All our modules.
281 m4_define(MODULES, relay dirauth)
283 dnl Relay module.
284 AC_ARG_ENABLE([module-relay],
285               AS_HELP_STRING([--disable-module-relay],
286                              [Build tor without the Relay modules: tor can not run as a relay, bridge, or authority. Implies --disable-module-dirauth]))
287 AM_CONDITIONAL(BUILD_MODULE_RELAY, [test "x$enable_module_relay" != "xno"])
288 AM_COND_IF(BUILD_MODULE_RELAY,
289            AC_DEFINE([HAVE_MODULE_RELAY], [1],
290                      [Compile with Relay feature support]))
292 dnl Directory Authority module.
293 AC_ARG_ENABLE([module-dirauth],
294               AS_HELP_STRING([--disable-module-dirauth],
295                              [Build tor without the Directory Authority module: tor can not run as a directory authority or bridge authority]))
296 AM_CONDITIONAL(BUILD_MODULE_DIRAUTH,[test "x$enable_module_dirauth" != "xno" && test "x$enable_module_relay" != "xno"])
297 AM_COND_IF(BUILD_MODULE_DIRAUTH,
298            AC_DEFINE([HAVE_MODULE_DIRAUTH], [1],
299                      [Compile with Directory Authority feature support]))
301 dnl Helper variables.
302 TOR_MODULES_ALL_ENABLED=
303 AC_DEFUN([ADD_MODULE], [
304     MODULE=m4_toupper($1)
305     TOR_MODULES_ALL_ENABLED="${TOR_MODULES_ALL_ENABLED} -DHAVE_MODULE_${MODULE}=1"
307 m4_foreach_w([module], MODULES, [ADD_MODULE([module])])
308 AC_SUBST(TOR_MODULES_ALL_ENABLED)
310 dnl check for the correct "ar" when cross-compiling.
311 dnl   (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
312 dnl    so kludge up a replacement for the case where it isn't there yet.)
313 m4_ifdef([AM_PROG_AR],
314          [AM_PROG_AR],
315          [AN_MAKEVAR([AR], [AC_PROG_AR])
316           AN_PROGRAM([ar], [AC_PROG_AR])
317           AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
318           AC_PROG_AR])
320 dnl Check whether the above macro has settled for a simply named tool even
321 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
322 dnl because that will find any cc on the system, not only the cross-compiler,
323 dnl and then verify that a binary built with this compiler runs on the
324 dnl build system. It will then come to the false conclusion that we're not
325 dnl cross-compiling.
326 if test "x$enable_tool_name_check" != "xno"; then
327     if test "x$ac_tool_warned" = "xyes"; then
328         AC_MSG_ERROR([We are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
329         elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
330                 AC_MSG_ERROR([We think we are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
331         fi
334 AC_PROG_CC
335 AC_PROG_CPP
336 AC_PROG_MAKE_SET
337 AC_PROG_RANLIB
338 AC_PROG_SED
340 AC_ARG_VAR([PERL], [path to Perl binary])
341 AC_CHECK_PROGS([PERL], [perl])
342 AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
344 dnl check for asciidoc and a2x
345 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
346 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
348 AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
349 AM_CONDITIONAL(BUILD_MANPAGE, [test "x$enable_manpage" != "xno"])
350 AM_CONDITIONAL(BUILD_HTML_DOCS, [test "x$enable_html_manual" != "xno"])
352 AM_PROG_CC_C_O
353 AC_PROG_CC_C99
355 AC_CACHE_CHECK([for Python 3], [tor_cv_PYTHON],
356    [AC_PATH_PROGS_FEATURE_CHECK([PYTHON], [ \
357         python3 \
358         python3.8 python3.7 python3.6 python3.5 python3.4 \
359         python ],
360    [["$ac_path_PYTHON" -c 'import sys; sys.exit(sys.version_info[0]<3)' && tor_cv_PYTHON="$ac_path_PYTHON" ac_path_PYTHON_found=:]] )])
361 AC_SUBST([PYTHON], [$tor_cv_PYTHON])
363 PYTHON="$tor_cv_PYTHON"
365 if test "x$PYTHON" = "x"; then
366   AC_MSG_WARN([Python 3 unavailable; some tests will not be run.])
369 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
371 dnl List all external rust crates we depend on here. Include the version
372 rust_crates=" \
373     digest-0.7.2 \
374     libc-0.2.39 \
376 AC_SUBST(rust_crates)
378 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
379 AC_C_FLEXIBLE_ARRAY_MEMBER
380 ], [
381  dnl Maybe we've got an old autoconf...
382  AC_CACHE_CHECK([for flexible array members],
383      tor_cv_c_flexarray,
384      [AC_COMPILE_IFELSE(
385        AC_LANG_PROGRAM([
386  struct abc { int a; char b[]; };
387 ], [
388  struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
389  def->b[0] = 33;
391   [tor_cv_c_flexarray=yes],
392   [tor_cv_c_flexarray=no])])
393  if test "$tor_cv_flexarray" = "yes"; then
394    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
395  else
396    AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
397  fi
400 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
401       tor_cv_c_c99_decl,
402       [AC_COMPILE_IFELSE(
403          [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
404          [tor_cv_c_c99_decl=yes],
405          [tor_cv_c_c99_decl=no] )])
406 if test "$tor_cv_c_c99_decl" != "yes"; then
407   AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
410 AC_CACHE_CHECK([for working C99 designated initializers],
411       tor_cv_c_c99_designated_init,
412       [AC_COMPILE_IFELSE(
413          [AC_LANG_PROGRAM([struct s { int a; int b; };],
414                [[ struct s ss = { .b = 5, .a = 6 }; ]])],
415          [tor_cv_c_c99_designated_init=yes],
416          [tor_cv_c_c99_designated_init=no] )])
418 if test "$tor_cv_c_c99_designated_init" != "yes"; then
419   AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
422 TORUSER=_tor
423 AC_ARG_WITH(tor-user,
424         AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
425         [
426            TORUSER=$withval
427         ]
429 AC_SUBST(TORUSER)
431 TORGROUP=_tor
432 AC_ARG_WITH(tor-group,
433         AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
434         [
435            TORGROUP=$withval
436         ]
438 AC_SUBST(TORGROUP)
441 dnl If _WIN32 is defined and non-zero, we are building for win32
442 AC_MSG_CHECKING([for win32])
443 AC_RUN_IFELSE([AC_LANG_SOURCE([
444 int main(int c, char **v) {
445 #ifdef _WIN32
446 #if _WIN32
447   return 0;
448 #else
449   return 1;
450 #endif
451 #else
452   return 2;
453 #endif
454 }])],
455 bwin32=true; AC_MSG_RESULT([yes]),
456 bwin32=false; AC_MSG_RESULT([no]),
457 bwin32=cross; AC_MSG_RESULT([cross])
460 if test "$bwin32" = "cross"; then
461 AC_MSG_CHECKING([for win32 (cross)])
462 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
463 #ifdef _WIN32
464 int main(int c, char **v) {return 0;}
465 #else
466 #error
467 int main(int c, char **v) {return x(y);}
468 #endif
469 ])],
470 bwin32=true; AC_MSG_RESULT([yes]),
471 bwin32=false; AC_MSG_RESULT([no]))
474 AH_BOTTOM([
475 #ifdef _WIN32
476 /* Defined to access windows functions and definitions for >=WinXP */
477 # ifndef WINVER
478 #  define WINVER 0x0501
479 # endif
481 /* Defined to access _other_ windows functions and definitions for >=WinXP */
482 # ifndef _WIN32_WINNT
483 #  define _WIN32_WINNT 0x0501
484 # endif
486 /* Defined to avoid including some windows headers as part of Windows.h */
487 # ifndef WIN32_LEAN_AND_MEAN
488 #  define WIN32_LEAN_AND_MEAN 1
489 # endif
490 #endif
493 AM_CONDITIONAL(WIN32, test "x$bwin32" = "xtrue")
494 AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
495 AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
497 dnl Enable C99 when compiling with MIPSpro
498 AC_MSG_CHECKING([for MIPSpro compiler])
499 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
500 #if (defined(__sgi) && defined(_COMPILER_VERSION))
501 #error
502   return x(y);
503 #endif
504 ])],
505 bmipspro=false; AC_MSG_RESULT(no),
506 bmipspro=true; AC_MSG_RESULT(yes))
508 if test "$bmipspro" = "true"; then
509   CFLAGS="$CFLAGS -c99"
512 AC_C_BIGENDIAN
514 AC_ARG_VAR([TOR_RUST_TARGET], [Rust target, must be specified when cross-compiling (HOST != BUILD). example: i686-pc-windows-gnu])
516 if test "x$enable_rust" = "xyes"; then
517   AC_ARG_VAR([RUSTC], [path to the rustc binary])
518   AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
519   if test "x$RUSTC" = "xno"; then
520     AC_MSG_ERROR([rustc unavailable but rust integration requested.])
521   fi
523   AC_ARG_VAR([CARGO], [path to the cargo binary])
524   AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
525   if test "x$CARGO" = "xno"; then
526     AC_MSG_ERROR([cargo unavailable but rust integration requested.])
527   fi
529   AC_DEFINE([HAVE_RUST], 1, [have Rust])
530   if test "x$enable_fatal_warnings" = "xyes"; then
531     RUST_WARN=
532   else
533     RUST_WARN=#
534   fi
535   if test "x$enable_cargo_online_mode" = "xyes"; then
536     CARGO_ONLINE=
537     RUST_DL=#
538   else
539     CARGO_ONLINE=--frozen
540     RUST_DL=
542     dnl When we're not allowed to touch the network, we need crate dependencies
543     dnl locally available.
544     AC_MSG_CHECKING([rust crate dependencies])
545     AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
546     if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
547       TOR_RUST_DEPENDENCIES="${srcdir}/src/ext/rust/crates"
548     fi
549     dnl Check whether the path exists before we try to cd into it.
550     if test ! -d "$TOR_RUST_DEPENDENCIES"; then
551       AC_MSG_ERROR([Rust dependency directory $TOR_RUST_DEPENDENCIES does not exist. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
552       ERRORED=1
553     fi
554     dnl Make the path absolute, since we'll be using it from within a
555     dnl subdirectory.
556     TOR_RUST_DEPENDENCIES=$(cd "$TOR_RUST_DEPENDENCIES" ; pwd)
558     for dep in $rust_crates; do
559       if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
560         AC_MSG_ERROR([Failure to find rust dependency $TOR_RUST_DEPENDENCIES/$dep. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
561         ERRORED=1
562       fi
563     done
564     if test "x$ERRORED" = "x"; then
565       AC_MSG_RESULT([yes])
566     fi
567   fi
569   dnl For now both MSVC and MinGW rust libraries will output static libs with
570   dnl the MSVC naming convention.
571   if test "$bwin32" = "true"; then
572     tor_rust_static_name=tor_rust.lib
573   else
574     tor_rust_static_name=libtor_rust.a
575   fi
577   AC_CANONICAL_BUILD
579   if test -n "$TOR_RUST_TARGET"; then
580     if test "$host" = "$build"; then
581       AC_MSG_ERROR([HOST = BUILD is invalid if TOR_RUST_TARGET is specified, see configure --help for more information.])
582     fi
583     RUST_TARGET_PROP="target = '$TOR_RUST_TARGET'"
584     TOR_RUST_LIB_PATH="src/rust/target/$TOR_RUST_TARGET/release/$tor_rust_static_name"
585   else
586     if test "$host" != "$build"; then
587       AC_MSG_ERROR([TOR_RUST_TARGET must be specified when cross-compiling with Rust enabled.])
588     fi
589     RUST_TARGET_PROP=
590     TOR_RUST_LIB_PATH="src/rust/target/release/$tor_rust_static_name"
591   fi
593   AC_SUBST(RUST_TARGET_PROP)
594   AC_SUBST(TOR_RUST_LIB_PATH)
595   AC_SUBST(CARGO_ONLINE)
596   AC_SUBST(RUST_WARN)
597   AC_SUBST(RUST_DL)
599   dnl Let's check the rustc version, too
600   AC_MSG_CHECKING([rust version])
601   RUSTC_VERSION=`$RUSTC --version`
602   RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
603   RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
604   if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
605     AC_MSG_ERROR([rustc version couldn't be identified])
606   fi
607   if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 31; then
608     AC_MSG_ERROR([rustc must be at least version 1.31.0])
609   fi
610   AC_MSG_RESULT([$RUSTC_VERSION])
613 AC_SEARCH_LIBS(socket, [socket network])
614 AC_SEARCH_LIBS(gethostbyname, [nsl])
615 AC_SEARCH_LIBS(dlopen, [dl])
616 AC_SEARCH_LIBS(inet_aton, [resolv])
617 AC_SEARCH_LIBS(backtrace, [execinfo])
618 saved_LIBS="$LIBS"
619 AC_SEARCH_LIBS([clock_gettime], [rt])
620 if test "$LIBS" != "$saved_LIBS"; then
621    # Looks like we need -lrt for clock_gettime().
622    have_rt=yes
625 if test "$bwin32" = "false"; then
626   AC_SEARCH_LIBS(pthread_create, [pthread])
627   AC_SEARCH_LIBS(pthread_detach, [pthread])
630 AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
631 AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
633 AC_CHECK_FUNCS(
634         _NSGetEnviron \
635         RtlSecureZeroMemory \
636         SecureZeroMemory \
637         accept4 \
638         backtrace \
639         backtrace_symbols_fd \
640         eventfd \
641         explicit_bzero \
642         timingsafe_memcmp \
643         flock \
644         ftime \
645         get_current_dir_name \
646         getaddrinfo \
647         getdelim \
648         getifaddrs \
649         getline \
650         getpass \
651         getrlimit \
652         gettimeofday \
653         gmtime_r \
654         gnu_get_libc_version \
655         htonll \
656         inet_aton \
657         ioctl \
658         issetugid \
659         llround \
660         localtime_r \
661         lround \
662         madvise \
663         memmem \
664         memset_s \
665         minherit \
666         mmap \
667         pipe \
668         pipe2 \
669         prctl \
670         readpassphrase \
671         rint \
672         sigaction \
673         socketpair \
674         statvfs \
675         strncasecmp \
676         strcasecmp \
677         strlcat \
678         strlcpy \
679         strnlen \
680         strptime \
681         strtok_r \
682         strtoull \
683         sysconf \
684         sysctl \
685         truncate \
686         uname \
687         usleep \
688         vasprintf \
689         _vscprintf
692 # Apple messed up when they added some functions: they
693 # forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
694 # checks.
696 # We should only probe for these functions if we are sure that we
697 # are not targeting OS X 10.9 or earlier.
698 AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
699 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
700 #ifdef __APPLE__
701 #  include <AvailabilityMacros.h>
702 #  ifndef MAC_OS_X_VERSION_10_10
703 #    define MAC_OS_X_VERSION_10_10 101000
704 #  endif
705 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
706 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
707 #      error "Running on Mac OS X 10.9 or earlier"
708 #    endif
709 #  endif
710 #endif
711 ]], [[]])],
712    [on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
713    [on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])
715 if test "$on_macos_pre_10_10" = "no"; then
716   AC_CHECK_FUNCS(
717         mach_approximate_time \
718   )
721 # We should only probe for these functions if we are sure that we
722 # are not targeting OSX 10.11 or earlier.
723 AC_MSG_CHECKING([for a pre-Sierra OSX build target])
724 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
725 #ifdef __APPLE__
726 #  include <AvailabilityMacros.h>
727 #  ifndef MAC_OS_X_VERSION_10_12
728 #    define MAC_OS_X_VERSION_10_12 101200
729 #  endif
730 #  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
731 #    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
732 #      error "Running on Mac OSX 10.11 or earlier"
733 #    endif
734 #  endif
735 #endif
736 ]], [[]])],
737    [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
738    [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])
740 if test "$on_macos_pre_10_12" = "no"; then
741   AC_CHECK_FUNCS(
742         clock_gettime \
743         getentropy \
744   )
747 if test "$bwin32" != "true"; then
748   AC_CHECK_HEADERS(pthread.h)
749   AC_CHECK_FUNCS(pthread_create)
750   AC_CHECK_FUNCS(pthread_condattr_setclock)
753 if test "$bwin32" = "true"; then
754   AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
755 #include <windows.h>
756 #include <conio.h>
757 #include <wchar.h>
758                  ])
761 AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
762   test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
764 AC_MSG_CHECKING([whether free(NULL) works])
765 AC_RUN_IFELSE([AC_LANG_PROGRAM([
766   #include <stdlib.h>
767 ], [
768 char *p = NULL;
769 free(p);
770 ])],
771 [free_null_ok=true; AC_MSG_RESULT(yes)],
772 [free_null_ok=false; AC_MSG_RESULT(no)],
773 [free_null_ok=cross; AC_MSG_RESULT(cross)])
775 if test "$free_null_ok" = "false"; then
776    AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
779 dnl ------------------------------------------------------
780 dnl Where do you live, libevent?  And how do we call you?
782 if test "$bwin32" = "true"; then
783   TOR_LIB_WS32=-lws2_32
784   TOR_LIB_IPHLPAPI=-liphlpapi
785   # Some of the cargo-cults recommend -lwsock32 as well, but I don't
786   # think it's actually necessary.
787   TOR_LIB_GDI=-lgdi32
788   TOR_LIB_USERENV=-luserenv
789 else
790   TOR_LIB_WS32=
791   TOR_LIB_GDI=
792   TOR_LIB_USERENV=
794 AC_SUBST(TOR_LIB_WS32)
795 AC_SUBST(TOR_LIB_GDI)
796 AC_SUBST(TOR_LIB_IPHLPAPI)
797 AC_SUBST(TOR_LIB_USERENV)
799 tor_libevent_pkg_redhat="libevent"
800 tor_libevent_pkg_debian="libevent-dev"
801 tor_libevent_devpkg_redhat="libevent-devel"
802 tor_libevent_devpkg_debian="libevent-dev"
804 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
805 dnl linking for static builds.
806 STATIC_LIBEVENT_FLAGS=""
807 if test "$enable_static_libevent" = "yes"; then
808     if test "$have_rt" = "yes"; then
809       STATIC_LIBEVENT_FLAGS=" -lrt "
810     fi
813 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
814 #ifdef _WIN32
815 #include <winsock2.h>
816 #endif
817 #include <sys/time.h>
818 #include <sys/types.h>
819 #include <event2/event.h>], [
820 #ifdef _WIN32
821 #include <winsock2.h>
822 #endif
823 struct event_base;
824 struct event_base *event_base_new(void);
825 void event_base_free(struct event_base *);],
826     [
827 #ifdef _WIN32
828 {WSADATA d; WSAStartup(0x101,&d); }
829 #endif
830 event_base_free(event_base_new());
831 ], [--with-libevent-dir], [/opt/libevent])
833 dnl Determine the incantation needed to link libevent.
834 save_LIBS="$LIBS"
835 save_LDFLAGS="$LDFLAGS"
836 save_CPPFLAGS="$CPPFLAGS"
838 LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
839 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
840 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
842 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
844 if test "$enable_static_libevent" = "yes"; then
845    if test "$tor_cv_library_libevent_dir" = "(system)"; then
846      AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
847    else
848      TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
849    fi
850 else
851      if test "x$ac_cv_header_event2_event_h" = "xyes"; then
852        AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
853        AC_SEARCH_LIBS(evdns_base_new, [event event_extra], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for evdns_base_new"))
855        if test "$ac_cv_search_event_new" != "none required"; then
856          TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
857        fi
858        if test "$ac_cv_search_evdns_base_new" != "none required"; then
859          TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
860        fi
861      else
862        AC_MSG_ERROR("libevent2 is required but the headers could not be found")
863      fi
866 dnl Now check for particular libevent functions.
867 AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
868                 evutil_secure_rng_add_bytes \
869                 evdns_base_get_nameserver_addr \
873 LIBS="$save_LIBS"
874 LDFLAGS="$save_LDFLAGS"
875 CPPFLAGS="$save_CPPFLAGS"
877 dnl Check that libevent is at least at version 2.0.10, the first stable
878 dnl release of its series
879 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
880 AC_MSG_CHECKING([whether Libevent is new enough])
881 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
882 #include <event2/event.h>
883 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
884 #error
885 int x = y(zz);
886 #else
887 int x = 1;
888 #endif
889 ])], [ AC_MSG_RESULT([yes]) ],
890    [ AC_MSG_RESULT([no])
891      AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )
893 LIBS="$save_LIBS"
894 LDFLAGS="$save_LDFLAGS"
895 CPPFLAGS="$save_CPPFLAGS"
897 AC_SUBST(TOR_LIBEVENT_LIBS)
899 dnl ------------------------------------------------------
900 dnl Where do you live, libm?
902 dnl On some platforms (Haiku/BeOS) the math library is
903 dnl part of libroot. In which case don't link against lm
904 TOR_LIB_MATH=""
905 save_LIBS="$LIBS"
906 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
907 if test "$ac_cv_search_pow" != "none required"; then
908     TOR_LIB_MATH="$ac_cv_search_pow"
910 LIBS="$save_LIBS"
911 AC_SUBST(TOR_LIB_MATH)
913 dnl ------------------------------------------------------
914 dnl Hello, NSS.  You're new around here.
915 if test "x$enable_nss" = "xyes"; then
916   PKG_CHECK_MODULES(NSS,
917      [nss],
918      [have_nss=yes],
919      [have_nss=no; AC_MSG_ERROR([You asked for NSS but I can't find it, $pkg_config_user_action, or set NSS_CFLAGS and NSS_LIBS.])])
920   AC_SUBST(NSS_CFLAGS)
921   AC_SUBST(NSS_LIBS)
924 dnl ------------------------------------------------------
925 dnl Where do you live, openssl?  And how do we call you?
927 if test "x$enable_nss" != "xyes"; then
929 tor_openssl_pkg_redhat="openssl"
930 tor_openssl_pkg_debian="libssl-dev"
931 tor_openssl_devpkg_redhat="openssl-devel"
932 tor_openssl_devpkg_debian="libssl-dev"
934 ALT_openssl_WITHVAL=""
935 AC_ARG_WITH(ssl-dir,
936   AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
937   [
938       if test "x$withval" != "xno" && test "x$withval" != "x"; then
939          ALT_openssl_WITHVAL="$withval"
940       fi
941   ])
943 AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
944 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
945     [#include <openssl/ssl.h>
946      char *getenv(const char *);],
947     [struct ssl_cipher_st;
948      unsigned SSL_CIPHER_get_id(const struct ssl_cipher_st *);
949      char *getenv(const char *);],
950     dnl This funny-looking test program calls getenv, so that the compiler
951     dnl will neither make code that call SSL_CIPHER_get_id(NULL) [producing
952     dnl a crash], nor optimize out the call to SSL_CIPHER_get_id().
953     dnl We look for SSL_cipher_get_id() because it is present in
954     dnl OpenSSL >=1.0.1, because it is not deprecated, and because Tor
955     dnl depends on it.
956     [if (getenv("THIS_SHOULDNT_BE_SET_X201803")) SSL_CIPHER_get_id((void *)0);], [],
957     [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
959 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
961 if test "$enable_static_openssl" = "yes"; then
962    if test "$tor_cv_library_openssl_dir" = "(system)"; then
963      AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
964    else
965      TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
966    fi
967 else
968      TOR_OPENSSL_LIBS="-lssl -lcrypto"
970 AC_SUBST(TOR_OPENSSL_LIBS)
972 dnl Now check for particular openssl functions.
973 save_LIBS="$LIBS"
974 save_LDFLAGS="$LDFLAGS"
975 save_CPPFLAGS="$CPPFLAGS"
976 LIBS="$TOR_OPENSSL_LIBS $LIBS"
977 LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
978 CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
980 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
981 #include <openssl/opensslv.h>
982 #if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
983 #error "too old"
984 #endif
985    ]], [[]])],
986    [ : ],
987    [ AC_MSG_ERROR([OpenSSL is too old. We require 1.0.1 or later. You can specify a path to a newer one with --with-openssl-dir.]) ])
989 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
990 #include <openssl/opensslv.h>
991 #include <openssl/evp.h>
992 #if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
993 #error "no ECC"
994 #endif
995 #if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
996 #error "curves unavailable"
997 #endif
998    ]], [[]])],
999    [ : ],
1000    [ AC_MSG_ERROR([OpenSSL is built without full ECC support, including curves P256 and P224. You can specify a path to one with ECC support with --with-openssl-dir.]) ])
1002 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
1003 [#include <openssl/ssl.h>
1006 dnl OpenSSL functions which we might not have.  In theory, we could just
1007 dnl check the openssl version number, but in practice that gets pretty
1008 dnl confusing with LibreSSL, OpenSSL, and various distributions' patches
1009 dnl to them.
1010 AC_CHECK_FUNCS([ \
1011                 ERR_load_KDF_strings \
1012                 EVP_PBE_scrypt \
1013                 EVP_sha3_256 \
1014                 SSL_CIPHER_find \
1015                 SSL_CTX_set1_groups_list \
1016                 SSL_CTX_set_security_level \
1017                 SSL_SESSION_get_master_key \
1018                 SSL_get_client_ciphers \
1019                 SSL_get_client_random \
1020                 SSL_get_server_random \
1021                 TLS_method \
1022                ])
1024 dnl Check if OpenSSL structures are opaque
1025 AC_CHECK_MEMBERS([SSL.state], , ,
1026 [#include <openssl/ssl.h>
1029 AC_CHECK_SIZEOF(SHA_CTX, , [AC_INCLUDES_DEFAULT()
1030 #include <openssl/sha.h>
1033 fi # enable_nss
1035 dnl We will someday make KECCAK_TINY optional, but for now we still need
1036 dnl it for SHAKE, since OpenSSL's SHAKE can't be squeezed more than
1037 dnl once.  See comment in the definition of crypto_xof_t.
1039 dnl AM_CONDITIONAL(BUILD_KECCAK_TINY,
1040 dnl   test "x$ac_cv_func_EVP_sha3_256" != "xyes")
1042 AM_CONDITIONAL(BUILD_KECCAK_TINY, true)
1044 dnl ======================================================================
1045 dnl Can we use KIST?
1047 dnl Define the set of checks for KIST scheduler support.
1048 AC_DEFUN([CHECK_KIST_SUPPORT],[
1049   dnl KIST needs struct tcp_info and for certain members to exist.
1050   AC_CHECK_MEMBERS(
1051     [struct tcp_info.tcpi_unacked, struct tcp_info.tcpi_snd_mss],
1052     , ,[[#include <netinet/tcp.h>]])
1053   dnl KIST needs SIOCOUTQNSD to exist for an ioctl call.
1054   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1055                      #include <linux/sockios.h>
1056                      #ifndef SIOCOUTQNSD
1057                      #error
1058                      #endif
1059                      ])], have_siocoutqnsd=yes, have_siocoutqnsd=no)
1060   if test "x$have_siocoutqnsd" = "xyes"; then
1061     if test "x$ac_cv_member_struct_tcp_info_tcpi_unacked" = "xyes"; then
1062       if test "x$ac_cv_member_struct_tcp_info_tcpi_snd_mss" = "xyes"; then
1063         have_kist_support=yes
1064       fi
1065     fi
1066   fi
1068 dnl Now, trigger the check.
1069 CHECK_KIST_SUPPORT
1070 AS_IF([test "x$have_kist_support" = "xyes"],
1071       [AC_DEFINE(HAVE_KIST_SUPPORT, 1, [Defined if KIST scheduler is supported
1072                                         on this system])],
1073       [AC_MSG_NOTICE([KIST scheduler can't be used. Missing support.])])
1075 LIBS="$save_LIBS"
1076 LDFLAGS="$save_LDFLAGS"
1077 CPPFLAGS="$save_CPPFLAGS"
1079 dnl ------------------------------------------------------
1080 dnl Where do you live, zlib?  And how do we call you?
1082 tor_zlib_pkg_redhat="zlib"
1083 tor_zlib_pkg_debian="zlib1g"
1084 tor_zlib_devpkg_redhat="zlib-devel"
1085 tor_zlib_devpkg_debian="zlib1g-dev"
1087 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
1088     [#include <zlib.h>],
1089     [const char * zlibVersion(void);],
1090     [zlibVersion();], [--with-zlib-dir],
1091     [/opt/zlib])
1093 if test "$enable_static_zlib" = "yes"; then
1094    if test "$tor_cv_library_zlib_dir" = "(system)"; then
1095      AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
1096  using --enable-static-zlib")
1097    else
1098      TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
1099    fi
1100 else
1101      TOR_ZLIB_LIBS="-lz"
1103 AC_SUBST(TOR_ZLIB_LIBS)
1105 dnl ------------------------------------------------------
1106 dnl Where we do we find lzma?
1108 AC_ARG_ENABLE(lzma,
1109       AS_HELP_STRING(--enable-lzma, [enable support for the LZMA compression scheme.]),
1110       [case "${enableval}" in
1111         "yes") ;;
1112         "no")  ;;
1113         * ) AC_MSG_ERROR(bad value for --enable-lzma) ;;
1114       esac], [enable_lzma=auto])
1116 if test "x$enable_lzma" = "xno"; then
1117     have_lzma=no;
1118 else
1119     PKG_CHECK_MODULES([LZMA],
1120                       [liblzma],
1121                       have_lzma=yes,
1122                       have_lzma=no)
1124     if test "x$have_lzma" = "xno" ; then
1125         AC_MSG_WARN([Unable to find liblzma, $pkg_config_user_action, or set LZMA_CFLAGS and LZMA_LIBS.])
1126     fi
1129 if test "x$have_lzma" = "xyes"; then
1130     AC_DEFINE(HAVE_LZMA,1,[Have LZMA])
1131     TOR_LZMA_CFLAGS="${LZMA_CFLAGS}"
1132     TOR_LZMA_LIBS="${LZMA_LIBS}"
1134 AC_SUBST(TOR_LZMA_CFLAGS)
1135 AC_SUBST(TOR_LZMA_LIBS)
1137 dnl ------------------------------------------------------
1138 dnl Where we do we find zstd?
1140 AC_ARG_ENABLE(zstd,
1141       AS_HELP_STRING(--enable-zstd, [enable support for the Zstandard compression scheme.]),
1142       [case "${enableval}" in
1143         "yes") ;;
1144         "no")  ;;
1145         * ) AC_MSG_ERROR(bad value for --enable-zstd) ;;
1146       esac], [enable_zstd=auto])
1148 if test "x$enable_zstd" = "xno"; then
1149     have_zstd=no;
1150 else
1151     PKG_CHECK_MODULES([ZSTD],
1152                       [libzstd >= 1.1],
1153                       have_zstd=yes,
1154                       have_zstd=no)
1156     if test "x$have_zstd" = "xno" ; then
1157         AC_MSG_WARN([Unable to find libzstd, $pkg_config_user_action, or set ZSTD_CFLAGS and ZSTD_LIBS.])
1158     fi
1161 if test "x$have_zstd" = "xyes"; then
1162     AC_DEFINE(HAVE_ZSTD,1,[Have Zstd])
1163     TOR_ZSTD_CFLAGS="${ZSTD_CFLAGS}"
1164     TOR_ZSTD_LIBS="${ZSTD_LIBS}"
1166     dnl now check for zstd functions
1167     save_LIBS="$LIBS"
1168     save_CFLAGS="$CFLAGS"
1169     LIBS="$LIBS $ZSTD_LIBS"
1170     CFLAGS="$CFLAGS $ZSTD_CFLAGS"
1171     AC_CHECK_FUNCS(ZSTD_estimateCStreamSize \
1172                    ZSTD_estimateDCtxSize)
1173     LIBS="$save_LIBS"
1174     CFLAGS="$save_CFLAGS"
1176 AC_SUBST(TOR_ZSTD_CFLAGS)
1177 AC_SUBST(TOR_ZSTD_LIBS)
1179 dnl ----------------------------------------------------------------------
1180 dnl Check if libcap is available for capabilities.
1182 tor_cap_pkg_debian="libcap2"
1183 tor_cap_pkg_redhat="libcap"
1184 tor_cap_devpkg_debian="libcap-dev"
1185 tor_cap_devpkg_redhat="libcap-devel"
1187 AC_CHECK_LIB([cap], [cap_init], [],
1188   AC_MSG_NOTICE([Libcap was not found. Capabilities will not be usable.])
1190 AC_CHECK_FUNCS(cap_set_proc)
1192 dnl ---------------------------------------------------------------------
1193 dnl Now that we know about our major libraries, we can check for compiler
1194 dnl and linker hardening options.  We need to do this with the libraries known,
1195 dnl since sometimes the linker will like an option but not be willing to
1196 dnl use it with a build of a library.
1198 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
1199 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI $TOR_LIB_USERENV $TOR_CAP_LIBS"
1201 CFLAGS_FTRAPV=
1202 CFLAGS_FWRAPV=
1203 CFLAGS_ASAN=
1204 CFLAGS_UBSAN=
1207 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1208 #if !defined(__clang__)
1209 #error
1210 #endif])], have_clang=yes, have_clang=no)
1212 if test "x$enable_pic" = "xyes"; then
1213     TOR_CHECK_CFLAGS(-fPIC)
1216 if test "x$enable_gcc_hardening" != "xno"; then
1217     CFLAGS="$CFLAGS -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2"
1218     if test "x$have_clang" = "xyes"; then
1219         TOR_CHECK_CFLAGS(-Qunused-arguments)
1220     fi
1221     TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
1222     AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
1223     AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
1224 m4_ifdef([AS_VAR_IF],[
1225     AS_VAR_IF(can_compile, [yes],
1226         AS_VAR_IF(can_link, [yes],
1227                   [],
1228                   AC_MSG_ERROR([We tried to build with stack protection; it looks like your compiler supports it but your libc does not provide it. Are you missing libssp? (You can --disable-gcc-hardening to ignore this error.)]))
1229         )])
1230     AS_VAR_POPDEF([can_link])
1231     AS_VAR_POPDEF([can_compile])
1232     TOR_CHECK_CFLAGS(-Wstack-protector)
1233     TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
1234     if test "$bwin32" = "false" && test "$enable_libfuzzer" != "yes" && test "$enable_oss_fuzz" != "yes"; then
1235        if test "$enable_pic" != "yes"; then
1236            # If we have already enabled -fPIC, then we don't also need to
1237            # compile with -fPIE...
1238            TOR_CHECK_CFLAGS(-fPIE)
1239        fi
1240        # ... but we want to link our executables with -pie in any case, since
1241        # they're executables, not a library.
1242        TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
1243     fi
1244     TOR_TRY_COMPILE_WITH_CFLAGS(-fwrapv, also_link, CFLAGS_FWRAPV="-fwrapv", true)
1246    AC_MSG_CHECKING([whether we can run hardened binaries])
1247    AC_RUN_IFELSE([AC_LANG_PROGRAM([], [return 0;])],
1248         [AC_MSG_RESULT([yes])],
1249         [AC_MSG_RESULT([no])
1250          AC_MSG_ERROR([dnl
1251  We can link with compiler hardening options, but we can't run with them.
1252  That's a bad sign! If you must, you can pass --disable-gcc-hardening to
1253  configure, but it would be better to figure out what the underlying problem
1254  is.])],
1255         [AC_MSG_RESULT([cross])])
1258 if test "$fragile_hardening" = "yes"; then
1259     TOR_TRY_COMPILE_WITH_CFLAGS(-ftrapv, also_link, CFLAGS_FTRAPV="-ftrapv", true)
1260    if test "$tor_cv_cflags__ftrapv" = "yes" && test "$tor_can_link__ftrapv" != "yes"; then
1261       AC_MSG_WARN([The compiler supports -ftrapv, but for some reason I was not able to link with -ftrapv. Are you missing run-time support? Run-time hardening will not work as well as it should.])
1262    fi
1264    if test "$tor_cv_cflags__ftrapv" != "yes"; then
1265      AC_MSG_ERROR([You requested fragile hardening, but the compiler does not seem to support -ftrapv.])
1266    fi
1268    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=address], also_link, CFLAGS_ASAN="-fsanitize=address", true)
1269     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1270       AC_MSG_ERROR([The compiler supports -fsanitize=address, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libubsan.*, and with Clang you need libclang_rt.ubsan*])
1271     fi
1273    TOR_TRY_COMPILE_WITH_CFLAGS([-fsanitize=undefined], also_link, CFLAGS_UBSAN="-fsanitize=undefined", true)
1274     if test "$tor_cv_cflags__fsanitize_address" = "yes" && test "$tor_can_link__fsanitize_address" != "yes"; then
1275       AC_MSG_ERROR([The compiler supports -fsanitize=undefined, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libasan.*, and with Clang you need libclang_rt.ubsan*])
1276     fi
1278    TOR_TRY_COMPILE_WITH_CFLAGS([-fno-sanitize=float-divide-by-zero], also_link, CFLAGS_UBSAN="-fno-sanitize=float-divide-by-zero", true)
1279     if test "$tor_cv_cflags__fno_sanitize_float_divide_by_zero" = "yes" && test "$tor_can_link__fno_sanitize_float_divide_by_zero" != "yes"; then
1280       AC_MSG_ERROR([The compiler supports -fno-sanitize=float-divide-by-zero, but for some reason I was not able to link when using it. Are you missing run-time support? With GCC you need libasan.*, and with Clang you need libclang_rt.ubsan*])
1281     fi
1283 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
1286 dnl Find the correct libraries to add in order to use the sanitizers.
1288 dnl When building Rust, Cargo will run the linker with the -nodefaultlibs
1289 dnl option, which will prevent the compiler from linking the sanitizer
1290 dnl libraries it needs.  We need to specify them manually.
1292 dnl What's more, we need to specify them in a linker script rather than
1293 dnl from build.rs: these options aren't allowed in the cargo:rustc-flags
1294 dnl variable.
1295 RUST_LINKER_OPTIONS=""
1296 if test "x$have_clang" = "xyes"; then
1297         if test "x$CFLAGS_ASAN" != "x"; then
1298                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_ASAN -Cdefault-linker-libraries"
1299         fi
1300         if test "x$CFLAGS_UBSAN" != "x"; then
1301                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=$CFLAGS_UBSAN -Cdefault-linker-libraries"
1302         fi
1303 else
1304         if test "x$CFLAGS_ASAN" != "x"; then
1305                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=address -Cdefault-linker-libraries"
1306         fi
1307         if test "x$CFLAGS_UBSAN" != "x"; then
1308                 RUST_LINKER_OPTIONS="$RUST_LINKER_OPTIONS -Clink-arg=-fsanitize=undefined -Cdefault-linker-libraries"
1309         fi
1311 AC_SUBST(RUST_LINKER_OPTIONS)
1313 CFLAGS_BUGTRAP="$CFLAGS_FTRAPV $CFLAGS_ASAN $CFLAGS_UBSAN"
1314 CFLAGS_CONSTTIME="$CFLAGS_FWRAPV"
1316 mulodi_fixes_ftrapv=no
1317 if test "$have_clang" = "yes"; then
1318   saved_CFLAGS="$CFLAGS"
1319   CFLAGS="$CFLAGS $CFLAGS_FTRAPV"
1320   AC_MSG_CHECKING([whether clang -ftrapv can link a 64-bit int multiply])
1321   AC_LINK_IFELSE([
1322       AC_LANG_SOURCE([[
1323           #include <stdint.h>
1324           #include <stdlib.h>
1325           int main(int argc, char **argv)
1326           {
1327             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1328                         * (int64_t)atoi(argv[3]);
1329             return x == 9;
1330           } ]])],
1331           [ftrapv_can_link=yes; AC_MSG_RESULT([yes])],
1332           [ftrapv_can_link=no; AC_MSG_RESULT([no])])
1333   if test "$ftrapv_can_link" = "no"; then
1334     AC_MSG_CHECKING([whether defining __mulodi4 fixes that])
1335     AC_LINK_IFELSE([
1336       AC_LANG_SOURCE([[
1337           #include <stdint.h>
1338           #include <stdlib.h>
1339           int64_t __mulodi4(int64_t a, int64_t b, int *overflow) {
1340              *overflow=0;
1341              return a;
1342           }
1343           int main(int argc, char **argv)
1344           {
1345             int64_t x = ((int64_t)atoi(argv[1])) * (int64_t)atoi(argv[2])
1346                         * (int64_t)atoi(argv[3]);
1347             return x == 9;
1348           } ]])],
1349           [mulodi_fixes_ftrapv=yes; AC_MSG_RESULT([yes])],
1350           [mulodi_fixes_ftrapv=no; AC_MSG_RESULT([no])])
1351   fi
1352   CFLAGS="$saved_CFLAGS"
1355 AM_CONDITIONAL(ADD_MULODI4, test "$mulodi_fixes_ftrapv" = "yes")
1357 dnl These cflags add bunches of branches, and we haven't been able to
1358 dnl persuade ourselves that they're suitable for code that needs to be
1359 dnl constant time.
1360 AC_SUBST(CFLAGS_BUGTRAP)
1361 dnl These cflags are variant ones sutable for code that needs to be
1362 dnl constant-time.
1363 AC_SUBST(CFLAGS_CONSTTIME)
1365 if test "x$enable_linker_hardening" != "xno"; then
1366     TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
1369 # For backtrace support
1370 TOR_CHECK_LDFLAGS(-rdynamic)
1372 dnl ------------------------------------------------------
1373 dnl Now see if we have a -fomit-frame-pointer compiler option.
1375 saved_CFLAGS="$CFLAGS"
1376 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
1377 F_OMIT_FRAME_POINTER=''
1378 if test "$saved_CFLAGS" != "$CFLAGS"; then
1379   if test "$fragile_hardening" = "yes"; then
1380     F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
1381   fi
1383 CFLAGS="$saved_CFLAGS"
1384 AC_SUBST(F_OMIT_FRAME_POINTER)
1386 dnl ------------------------------------------------------
1387 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
1388 dnl for us, as GCC 4.6 and later do at many optimization levels), then
1389 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
1390 dnl code will work.
1391 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
1393 dnl ============================================================
1394 dnl Check for libseccomp
1396 if test "x$enable_seccomp" != "xno"; then
1397   AC_CHECK_HEADERS([seccomp.h])
1398   AC_SEARCH_LIBS(seccomp_init, [seccomp])
1401 dnl ============================================================
1402 dnl Check for libscrypt
1404 if test "x$enable_libscrypt" != "xno"; then
1405   AC_CHECK_HEADERS([libscrypt.h])
1406   AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
1407   AC_CHECK_FUNCS([libscrypt_scrypt])
1410 dnl ============================================================
1411 dnl We need an implementation of curve25519.
1413 dnl set these defaults.
1414 build_curve25519_donna=no
1415 build_curve25519_donna_c64=no
1416 use_curve25519_donna=no
1417 use_curve25519_nacl=no
1418 CURVE25519_LIBS=
1420 dnl The best choice is using curve25519-donna-c64, but that requires
1421 dnl that we
1422 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
1423   tor_cv_can_use_curve25519_donna_c64,
1424   [AC_RUN_IFELSE(
1425     [AC_LANG_PROGRAM([dnl
1426       #include <stdint.h>
1427       typedef unsigned uint128_t __attribute__((mode(TI)));
1428   int func(uint64_t a, uint64_t b) {
1429            uint128_t c = ((uint128_t)a) * b;
1430            int ok = ((uint64_t)(c>>96)) == 522859 &&
1431              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1432                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1433                  (((uint64_t)(c))&0xffffffffL) == 0;
1434            return ok;
1435       }
1436   ], [dnl
1437     int ok = func( ((uint64_t)2000000000) * 1000000000,
1438                    ((uint64_t)1234567890) << 24);
1439         return !ok;
1440       ])],
1441   [tor_cv_can_use_curve25519_donna_c64=yes],
1442       [tor_cv_can_use_curve25519_donna_c64=no],
1443   [AC_LINK_IFELSE(
1444         [AC_LANG_PROGRAM([dnl
1445       #include <stdint.h>
1446       typedef unsigned uint128_t __attribute__((mode(TI)));
1447   int func(uint64_t a, uint64_t b) {
1448            uint128_t c = ((uint128_t)a) * b;
1449            int ok = ((uint64_t)(c>>96)) == 522859 &&
1450              (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
1451                  (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
1452                  (((uint64_t)(c))&0xffffffffL) == 0;
1453            return ok;
1454       }
1455   ], [dnl
1456     int ok = func( ((uint64_t)2000000000) * 1000000000,
1457                  ((uint64_t)1234567890) << 24);
1458         return !ok;
1459       ])],
1460           [tor_cv_can_use_curve25519_donna_c64=cross],
1461       [tor_cv_can_use_curve25519_donna_c64=no])])])
1463 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
1464                   nacl/crypto_scalarmult_curve25519.h])
1466 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
1467   tor_cv_can_use_curve25519_nacl,
1468   [tor_saved_LIBS="$LIBS"
1469    LIBS="$LIBS -lnacl"
1470    AC_LINK_IFELSE(
1471      [AC_LANG_PROGRAM([dnl
1472        #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
1473        #include <crypto_scalarmult_curve25519.h>
1474    #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
1475    #include <nacl/crypto_scalarmult_curve25519.h>
1476    #endif
1477        #ifdef crypto_scalarmult_curve25519_ref_BYTES
1478    #error Hey, this is the reference implementation! That's not fast.
1479    #endif
1480      ], [
1481    unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
1482      ])], [tor_cv_can_use_curve25519_nacl=yes],
1483      [tor_cv_can_use_curve25519_nacl=no])
1484    LIBS="$tor_saved_LIBS" ])
1486  dnl Okay, now we need to figure out which one to actually use. Fall back
1487  dnl to curve25519-donna.c
1489  if test "x$tor_cv_can_use_curve25519_donna_c64" != "xno"; then
1490    build_curve25519_donna_c64=yes
1491    use_curve25519_donna=yes
1492  elif test "x$tor_cv_can_use_curve25519_nacl" = "xyes"; then
1493    use_curve25519_nacl=yes
1494    CURVE25519_LIBS=-lnacl
1495  else
1496    build_curve25519_donna=yes
1497    use_curve25519_donna=yes
1498  fi
1500 if test "x$use_curve25519_donna" = "xyes"; then
1501   AC_DEFINE(USE_CURVE25519_DONNA, 1,
1502             [Defined if we should use an internal curve25519_donna{,_c64} implementation])
1504 if test "x$use_curve25519_nacl" = "xyes"; then
1505   AC_DEFINE(USE_CURVE25519_NACL, 1,
1506             [Defined if we should use a curve25519 from nacl])
1508 AM_CONDITIONAL(BUILD_CURVE25519_DONNA,
1509   test "x$build_curve25519_donna" = "xyes")
1510 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64,
1511   test "x$build_curve25519_donna_c64" = "xyes")
1512 AC_SUBST(CURVE25519_LIBS)
1514 dnl Make sure to enable support for large off_t if available.
1515 AC_SYS_LARGEFILE
1517 AC_CHECK_HEADERS([errno.h \
1518                   fcntl.h \
1519                   signal.h \
1520                   string.h \
1521                   sys/capability.h \
1522                   sys/fcntl.h \
1523                   sys/stat.h \
1524                   sys/time.h \
1525                   sys/types.h \
1526                   time.h \
1527                   unistd.h \
1528                   arpa/inet.h \
1529                   crt_externs.h \
1530                   execinfo.h \
1531                   gnu/libc-version.h \
1532                   grp.h \
1533                   ifaddrs.h \
1534                   inttypes.h \
1535                   limits.h \
1536                   linux/types.h \
1537                   mach/vm_inherit.h \
1538                   machine/limits.h \
1539                   malloc.h \
1540                   malloc/malloc.h \
1541                   malloc_np.h \
1542                   netdb.h \
1543                   netinet/in.h \
1544                   netinet/in6.h \
1545                   pwd.h \
1546                   readpassphrase.h \
1547                   stdatomic.h \
1548                   sys/eventfd.h \
1549                   sys/file.h \
1550                   sys/ioctl.h \
1551                   sys/limits.h \
1552                   sys/mman.h \
1553                   sys/param.h \
1554                   sys/prctl.h \
1555                   sys/random.h \
1556                   sys/resource.h \
1557                   sys/select.h \
1558                   sys/socket.h \
1559                   sys/statvfs.h \
1560                   sys/syscall.h \
1561                   sys/sysctl.h \
1562                   sys/syslimits.h \
1563                   sys/time.h \
1564                   sys/types.h \
1565                   sys/un.h \
1566                   sys/utime.h \
1567                   sys/wait.h \
1568                   syslog.h \
1569                   utime.h])
1571 AC_CHECK_HEADERS(sys/param.h)
1573 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
1574 [#ifdef HAVE_SYS_TYPES_H
1575 #include <sys/types.h>
1576 #endif
1577 #ifdef HAVE_SYS_SOCKET_H
1578 #include <sys/socket.h>
1579 #endif])
1580 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
1581 [#ifdef HAVE_SYS_TYPES_H
1582 #include <sys/types.h>
1583 #endif
1584 #ifdef HAVE_SYS_SOCKET_H
1585 #include <sys/socket.h>
1586 #endif
1587 #ifdef HAVE_NET_IF_H
1588 #include <net/if.h>
1589 #endif
1590 #ifdef HAVE_NETINET_IN_H
1591 #include <netinet/in.h>
1592 #endif])
1594 AC_CHECK_HEADERS(linux/if.h,[],[],
1596 #ifdef HAVE_SYS_SOCKET_H
1597 #include <sys/socket.h>
1598 #endif
1601 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1602         linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1603 [#ifdef HAVE_SYS_TYPES_H
1604 #include <sys/types.h>
1605 #endif
1606 #ifdef HAVE_SYS_SOCKET_H
1607 #include <sys/socket.h>
1608 #endif
1609 #ifdef HAVE_LIMITS_H
1610 #include <limits.h>
1611 #endif
1612 #ifdef HAVE_LINUX_TYPES_H
1613 #include <linux/types.h>
1614 #endif
1615 #ifdef HAVE_NETINET_IN6_H
1616 #include <netinet/in6.h>
1617 #endif
1618 #ifdef HAVE_NETINET_IN_H
1619 #include <netinet/in.h>
1620 #endif])
1622 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1623         linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1624 [#ifdef HAVE_SYS_TYPES_H
1625 #include <sys/types.h>
1626 #endif
1627 #ifdef HAVE_SYS_SOCKET_H
1628 #include <sys/socket.h>
1629 #endif
1630 #ifdef HAVE_LIMITS_H
1631 #include <limits.h>
1632 #endif
1633 #ifdef HAVE_LINUX_TYPES_H
1634 #include <linux/types.h>
1635 #endif
1636 #ifdef HAVE_NETINET_IN6_H
1637 #include <netinet/in6.h>
1638 #endif
1639 #ifdef HAVE_NETINET_IN_H
1640 #include <netinet/in.h>
1641 #endif
1642 #ifdef HAVE_LINUX_IF_H
1643 #include <linux/if.h>
1644 #endif])
1646 transparent_ok=0
1647 if test "x$net_if_found" = "x1" && test "x$net_pfvar_found" = "x1"; then
1648   transparent_ok=1
1650 if test "x$linux_netfilter_ipv4" = "x1"; then
1651   transparent_ok=1
1653 if test "x$linux_netfilter_ipv6_ip6_tables" = "x1"; then
1654   transparent_ok=1
1656 if test "x$transparent_ok" = "x1"; then
1657   AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1658 else
1659   AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1662 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1663 [#ifdef HAVE_SYS_TYPES_H
1664 #include <sys/types.h>
1665 #endif
1666 #ifdef HAVE_SYS_TIME_H
1667 #include <sys/time.h>
1668 #endif])
1670 AC_CHECK_SIZEOF(char)
1671 AC_CHECK_SIZEOF(short)
1672 AC_CHECK_SIZEOF(int)
1673 AC_CHECK_SIZEOF(unsigned int)
1674 AC_CHECK_SIZEOF(long)
1675 AC_CHECK_SIZEOF(long long)
1676 AC_CHECK_SIZEOF(__int64)
1677 AC_CHECK_SIZEOF(void *)
1678 AC_CHECK_SIZEOF(time_t)
1679 AC_CHECK_SIZEOF(size_t)
1680 AC_CHECK_SIZEOF(pid_t)
1682 AC_CHECK_TYPES([uint, u_char, ssize_t])
1684 AC_PC_FROM_UCONTEXT([:])
1686 dnl used to include sockaddr_storage, but everybody has that.
1687 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1688 [#ifdef HAVE_SYS_TYPES_H
1689 #include <sys/types.h>
1690 #endif
1691 #ifdef HAVE_NETINET_IN_H
1692 #include <netinet/in.h>
1693 #endif
1694 #ifdef HAVE_NETINET_IN6_H
1695 #include <netinet/in6.h>
1696 #endif
1697 #ifdef HAVE_SYS_SOCKET_H
1698 #include <sys/socket.h>
1699 #endif
1700 #ifdef _WIN32
1701 #define _WIN32_WINNT 0x0501
1702 #define WIN32_LEAN_AND_MEAN
1703 #include <winsock2.h>
1704 #include <ws2tcpip.h>
1705 #endif
1707 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1708 [#ifdef HAVE_SYS_TYPES_H
1709 #include <sys/types.h>
1710 #endif
1711 #ifdef HAVE_NETINET_IN_H
1712 #include <netinet/in.h>
1713 #endif
1714 #ifdef HAVE_NETINET_IN6_H
1715 #include <netinet/in6.h>
1716 #endif
1717 #ifdef HAVE_SYS_SOCKET_H
1718 #include <sys/socket.h>
1719 #endif
1720 #ifdef _WIN32
1721 #define _WIN32_WINNT 0x0501
1722 #define WIN32_LEAN_AND_MEAN
1723 #include <winsock2.h>
1724 #include <ws2tcpip.h>
1725 #endif
1728 AC_CHECK_TYPES([rlim_t], , ,
1729 [#ifdef HAVE_SYS_TYPES_H
1730 #include <sys/types.h>
1731 #endif
1732 #ifdef HAVE_SYS_TIME_H
1733 #include <sys/time.h>
1734 #endif
1735 #ifdef HAVE_SYS_RESOURCE_H
1736 #include <sys/resource.h>
1737 #endif
1740 AX_CHECK_SIGN([time_t],
1741        [ : ],
1742        [ : ], [
1743 #ifdef HAVE_SYS_TYPES_H
1744 #include <sys/types.h>
1745 #endif
1746 #ifdef HAVE_SYS_TIME_H
1747 #include <sys/time.h>
1748 #endif
1749 #ifdef HAVE_TIME_H
1750 #include <time.h>
1751 #endif
1754 if test "$ax_cv_decl_time_t_signed" = "no"; then
1755   AC_MSG_ERROR([You have an unsigned time_t; Tor does not support that. Please tell the Tor developers about your interesting platform.])
1758 AX_CHECK_SIGN([size_t],
1759        [ tor_cv_size_t_signed=yes ],
1760        [ tor_cv_size_t_signed=no ], [
1761 #ifdef HAVE_SYS_TYPES_H
1762 #include <sys/types.h>
1763 #endif
1766 if test "$ax_cv_decl_size_t_signed" = "yes"; then
1767   AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1770 AX_CHECK_SIGN([enum always],
1771        [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1772        [ : ], [
1773  enum always { AAA, BBB, CCC };
1776 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1777 #ifdef HAVE_SYS_SOCKET_H
1778 #include <sys/socket.h>
1779 #endif
1782 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1784 AC_CHECK_SIZEOF(cell_t)
1786 # Let's see if stdatomic works. (There are some debian clangs that screw it
1787 # up; see Tor bug #26779 and debian bug 903709.)
1788 AC_CACHE_CHECK([whether C11 stdatomic.h actually works],
1789                tor_cv_stdatomic_works,
1790 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1791 #include <stdatomic.h>
1792 struct x { atomic_size_t y; };
1793 void try_atomic_init(struct x *xx)
1795   atomic_init(&xx->y, 99);
1796   atomic_fetch_add(&xx->y, 1);
1798 ]])], [tor_cv_stdatomic_works=yes], [tor_cv_stdatomic_works=no])])
1800 if test "$tor_cv_stdatomic_works" = "yes"; then
1801    AC_DEFINE(STDATOMIC_WORKS, 1, [Set to 1 if we can compile a simple stdatomic example.])
1802 elif test "$ac_cv_header_stdatomic_h" = "yes"; then
1803    AC_MSG_WARN([Your compiler provides the stdatomic.h header, but it doesn't seem to work.  I'll pretend it isn't there. If you are using Clang on Debian, maybe this is because of https://bugs.debian.org/903709 ])
1806 # Now make sure that NULL can be represented as zero bytes.
1807 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1808 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1809 [[#include <stdlib.h>
1810 #include <string.h>
1811 #include <stdio.h>
1812 #ifdef HAVE_STDDEF_H
1813 #include <stddef.h>
1814 #endif
1815 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1816 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1817        [tor_cv_null_is_zero=yes],
1818        [tor_cv_null_is_zero=no],
1819        [tor_cv_null_is_zero=cross])])
1821 if test "$tor_cv_null_is_zero" = "cross"; then
1822   # Cross-compiling; let's hope that the target isn't raving mad.
1823   AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1826 if test "$tor_cv_null_is_zero" != "no"; then
1827   AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1828             [Define to 1 iff memset(0) sets pointers to NULL])
1831 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1832 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1833 [[#include <stdlib.h>
1834 #include <string.h>
1835 #include <stdio.h>
1836 #ifdef HAVE_STDDEF_H
1837 #include <stddef.h>
1838 #endif
1839 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1840 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1841        [tor_cv_dbl0_is_zero=yes],
1842        [tor_cv_dbl0_is_zero=no],
1843        [tor_cv_dbl0_is_zero=cross])])
1845 if test "$tor_cv_dbl0_is_zero" = "cross"; then
1846   # Cross-compiling; let's hope that the target isn't raving mad.
1847   AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1850 if test "$tor_cv_dbl0_is_zero" != "no"; then
1851   AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1852             [Define to 1 iff memset(0) sets doubles to 0.0])
1855 # And what happens when we malloc zero?
1856 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1857 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1858 [[#include <stdlib.h>
1859 #include <string.h>
1860 #include <stdio.h>
1861 #ifdef HAVE_STDDEF_H
1862 #include <stddef.h>
1863 #endif
1864 int main () { return malloc(0)?0:1; }]])],
1865        [tor_cv_malloc_zero_works=yes],
1866        [tor_cv_malloc_zero_works=no],
1867        [tor_cv_malloc_zero_works=cross])])
1869 if test "$tor_cv_malloc_zero_works" = "cross"; then
1870   # Cross-compiling; let's hope that the target isn't raving mad.
1871   AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1874 if test "$tor_cv_malloc_zero_works" = "yes"; then
1875   AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1876             [Define to 1 iff malloc(0) returns a pointer])
1879 # whether we seem to be in a 2s-complement world.
1880 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1881 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1882 [[int main () { int problem = ((-99) != (~99)+1);
1883 return problem ? 1 : 0; }]])],
1884        [tor_cv_twos_complement=yes],
1885        [tor_cv_twos_complement=no],
1886        [tor_cv_twos_complement=cross])])
1888 if test "$tor_cv_twos_complement" = "cross"; then
1889   # Cross-compiling; let's hope that the target isn't raving mad.
1890   AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1893 if test "$tor_cv_twos_complement" != "no"; then
1894   AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1895             [Define to 1 iff we represent negative integers with
1896              two's complement])
1899 # What does shifting a negative value do?
1900 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1901 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1902 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1903        [tor_cv_sign_extend=yes],
1904        [tor_cv_sign_extend=no],
1905        [tor_cv_sign_extend=cross])])
1907 if test "$tor_cv_sign_extend" = "cross"; then
1908   # Cross-compiling; let's hope that the target isn't raving mad.
1909   AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1912 if test "$tor_cv_sign_extend" != "no"; then
1913   AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1914             [Define to 1 iff right-shifting a negative value performs sign-extension])
1917 # Is uint8_t the same type as unsigned char?
1918 AC_CACHE_CHECK([whether uint8_t is the same type as unsigned char], tor_cv_uint8_uchar,
1919 [AC_COMPILE_IFELSE([AC_LANG_SOURCE([[
1920 #include <stdint.h>
1921 extern uint8_t c;
1922 unsigned char c;]])],
1923        [tor_cv_uint8_uchar=yes],
1924        [tor_cv_uint8_uchar=no],
1925        [tor_cv_uint8_uchar=cross])])
1927 if test "$tor_cv_uint8_uchar" = "cross"; then
1928   AC_MSG_NOTICE([Cross-compiling: we'll assume that uint8_t is the same type as unsigned char])
1931 if test "$tor_cv_uint8_uchar" = "no"; then
1932   AC_MSG_ERROR([We assume that uint8_t is the same type as unsigned char, but your compiler disagrees.])
1935 AC_ARG_WITH(tcmalloc,
1936 AS_HELP_STRING(--with-tcmalloc, [use tcmalloc memory allocation library. Deprecated; see --with-malloc]))
1938 default_malloc=system
1940 if test "x$enable_openbsd_malloc" = "xyes" ; then
1941   AC_MSG_NOTICE([The --enable-openbsd-malloc argument is deprecated; use --with-malloc=openbsd instead.])
1942   default_malloc=openbsd
1945 if test "x$with_tcmalloc" = "xyes"; then
1946   AC_MSG_NOTICE([The --with-tcmalloc argument is deprecated; use --with-malloc=tcmalloc instead.])
1947   default_malloc=tcmalloc
1950 AC_ARG_WITH(malloc,
1951    AS_HELP_STRING([--with-malloc=[system,jemalloc,tcmalloc,openbsd]],
1952                   [select special malloc implementation [system]]),
1953    [ malloc="$with_malloc" ], [ malloc="$default_malloc" ])
1955 AS_CASE([$malloc],
1956   [tcmalloc], [
1957       PKG_CHECK_MODULES([TCMALLOC],
1958                         [libtcmalloc],
1959                         have_tcmalloc=yes,
1960                         have_tcmalloc=no)
1962       if test "x$have_tcmalloc" = "xno" ; then
1963           AC_MSG_ERROR([Unable to find tcmalloc requested by --with-malloc, $pkg_config_user_action, or set TCMALLOC_CFLAGS and TCMALLOC_LIBS.])
1964       fi
1966       CFLAGS="$CFLAGS $TCMALLOC_CFLAGS"
1967       LIBS="$TCMALLOC_LIBS $LIBS"
1968   ],
1970   [jemalloc], [
1971       PKG_CHECK_MODULES([JEMALLOC],
1972                         [jemalloc],
1973                         have_jemalloc=yes,
1974                         have_jemalloc=no)
1976       if test "x$have_jemalloc" = "xno" ; then
1977           AC_MSG_ERROR([Unable to find jemalloc requested by --with-malloc, $pkg_config_user_action, or set JEMALLOC_CFLAGS and JEMALLOC_LIBS.])
1978       fi
1980       CFLAGS="$CFLAGS $JEMALLOC_CFLAGS"
1981       LIBS="$JEMALLOC_LIBS $LIBS"
1982       using_custom_malloc=yes
1983   ],
1985   [openbsd], [
1986     AC_MSG_WARN([The openbsd malloc port is deprecated in Tor 0.3.5 and will be removed in a future version.])
1987     enable_openbsd_malloc=yes
1988   ],
1990   [system], [
1991      # handle this later, including the jemalloc fallback
1992     AC_CHECK_FUNCS(mallinfo)
1993   ],
1995   [AC_MSG_ERROR([--with-malloc=`$with_malloc' not supported, see --help])
1998 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test "x$enable_openbsd_malloc" = "xyes")
2000 if test "$malloc" != "system"; then
2001   # Tell the C compiler not to use the system allocator functions.
2002   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2004 if test "$using_custom_malloc" = "yes"; then
2005   # Tell the C compiler not to use the system allocator functions.
2006   TOR_CHECK_CFLAGS([-fno-builtin-malloc -fno-builtin-realloc -fno-builtin-calloc -fno-builtin-free])
2009 # By default, we're going to assume we don't have mlockall()
2010 # bionic and other platforms have various broken mlockall subsystems.
2011 # Some systems don't have a working mlockall, some aren't linkable,
2012 # and some have it but don't declare it.
2013 AC_CHECK_FUNCS(mlockall)
2014 AC_CHECK_DECLS([mlockall], , , [
2015 #ifdef HAVE_SYS_MMAN_H
2016 #include <sys/mman.h>
2017 #endif])
2019 # Allow user to specify an alternate syslog facility
2020 AC_ARG_WITH(syslog-facility,
2021 AS_HELP_STRING(--with-syslog-facility=LOG, [syslog facility to use (default=LOG_DAEMON)]),
2022 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
2023 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
2024 AC_SUBST(LOGFACILITY)
2026 # Check if we have getresuid and getresgid
2027 AC_CHECK_FUNCS(getresuid getresgid)
2029 # Check for gethostbyname_r in all its glorious incompatible versions.
2030 #   (This logic is based on that in Python's configure.in)
2031 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
2032   [Define this if you have any gethostbyname_r()])
2034 AC_CHECK_FUNC(gethostbyname_r, [
2035   AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
2036   OLD_CFLAGS=$CFLAGS
2037   CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
2038   AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2039 #include <netdb.h>
2040   ]], [[
2041     char *cp1, *cp2;
2042     struct hostent *h1, *h2;
2043     int i1, i2;
2044     (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
2045   ]])],[
2046     AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2047     AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
2048      [Define this if gethostbyname_r takes 6 arguments])
2049     AC_MSG_RESULT(6)
2050   ], [
2051     AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2052 #include <netdb.h>
2053     ]], [[
2054       char *cp1, *cp2;
2055       struct hostent *h1;
2056       int i1, i2;
2057       (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
2058     ]])], [
2059       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2060       AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
2061         [Define this if gethostbyname_r takes 5 arguments])
2062       AC_MSG_RESULT(5)
2063    ], [
2064       AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
2065 #include <netdb.h>
2066      ]], [[
2067        char *cp1;
2068        struct hostent *h1;
2069        struct hostent_data hd;
2070        (void) gethostbyname_r(cp1,h1,&hd);
2071      ]])], [
2072        AC_DEFINE(HAVE_GETHOSTBYNAME_R)
2073        AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
2074          [Define this if gethostbyname_r takes 3 arguments])
2075        AC_MSG_RESULT(3)
2076      ], [
2077        AC_MSG_RESULT(0)
2078      ])
2079   ])
2080  ])
2081  CFLAGS=$OLD_CFLAGS
2084 AC_CACHE_CHECK([whether the C compiler supports __func__],
2085   tor_cv_have_func_macro,
2086   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2087 #include <stdio.h>
2088 int main(int c, char **v) { puts(__func__); }])],
2089   tor_cv_have_func_macro=yes,
2090   tor_cv_have_func_macro=no))
2092 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
2093   tor_cv_have_FUNC_macro,
2094   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2095 #include <stdio.h>
2096 int main(int c, char **v) { puts(__FUNC__); }])],
2097   tor_cv_have_FUNC_macro=yes,
2098   tor_cv_have_FUNC_macro=no))
2100 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
2101   tor_cv_have_FUNCTION_macro,
2102   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2103 #include <stdio.h>
2104 int main(int c, char **v) { puts(__FUNCTION__); }])],
2105   tor_cv_have_FUNCTION_macro=yes,
2106   tor_cv_have_FUNCTION_macro=no))
2108 AC_CACHE_CHECK([whether we have extern char **environ already declared],
2109   tor_cv_have_environ_declared,
2110   AC_COMPILE_IFELSE([AC_LANG_SOURCE([
2111 #ifdef HAVE_UNISTD_H
2112 #include <unistd.h>
2113 #endif
2114 #include <stdlib.h>
2115 int main(int c, char **v) { char **t = environ; }])],
2116   tor_cv_have_environ_declared=yes,
2117   tor_cv_have_environ_declared=no))
2119 if test "$tor_cv_have_func_macro" = "yes"; then
2120   AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
2123 if test "$tor_cv_have_FUNC_macro" = "yes"; then
2124   AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
2127 if test "$tor_cv_have_FUNCTION_macro" = "yes"; then
2128   AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
2129            [Defined if the compiler supports __FUNCTION__])
2132 if test "$tor_cv_have_environ_declared" = "yes"; then
2133   AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
2134            [Defined if we have extern char **environ already declared])
2137 # $prefix stores the value of the --prefix command line option, or
2138 # NONE if the option wasn't set.  In the case that it wasn't set, make
2139 # it be the default, so that we can use it to expand directories now.
2140 if test "x$prefix" = "xNONE"; then
2141   prefix=$ac_default_prefix
2144 # and similarly for $exec_prefix
2145 if test "x$exec_prefix" = "xNONE"; then
2146   exec_prefix=$prefix
2149 if test "x$BUILDDIR" = "x"; then
2150   BUILDDIR=`pwd`
2152 AC_SUBST(BUILDDIR)
2153 AH_TEMPLATE([BUILDDIR],[tor's build directory])
2154 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
2156 if test "x$SRCDIR" = "x"; then
2157   SRCDIR=$(cd "$srcdir"; pwd)
2159 AH_TEMPLATE([SRCDIR],[tor's sourcedir directory])
2160 AC_DEFINE_UNQUOTED(SRCDIR,"$SRCDIR")
2162 if test "x$CONFDIR" = "x"; then
2163   CONFDIR=`eval echo $sysconfdir/tor`
2165 AC_SUBST(CONFDIR)
2166 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
2167 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
2169 BINDIR=`eval echo $bindir`
2170 AC_SUBST(BINDIR)
2171 LOCALSTATEDIR=`eval echo $localstatedir`
2172 AC_SUBST(LOCALSTATEDIR)
2174 if test "$bwin32" = "true"; then
2175   # Test if the linker supports the --nxcompat and --dynamicbase options
2176   # for Windows
2177   save_LDFLAGS="$LDFLAGS"
2178   LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
2179   AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
2180   AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
2181     [AC_MSG_RESULT([yes])]
2182     [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
2183     [AC_MSG_RESULT([no])]
2184   )
2185   LDFLAGS="$save_LDFLAGS"
2188 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
2189 # than autoconf's macros like.
2190 if test "$GCC" = "yes"; then
2191   # Disable GCC's strict aliasing checks.  They are an hours-to-debug
2192   # accident waiting to happen.
2193   CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
2194 else
2195   # Override optimization level for non-gcc compilers
2196   CFLAGS="$CFLAGS -O"
2197   enable_gcc_warnings=no
2198   enable_gcc_warnings_advisory=no
2201 # Warnings implies advisory-warnings and -Werror.
2202 if test "$enable_gcc_warnings" = "yes"; then
2203   enable_gcc_warnings_advisory=yes
2204   enable_fatal_warnings=yes
2207 # OS X Lion started deprecating the system openssl. Let's just disable
2208 # all deprecation warnings on OS X. Also, to potentially make the binary
2209 # a little smaller, let's enable dead_strip.
2210 case "$host_os" in
2212  darwin*)
2213     CFLAGS="$CFLAGS -Wno-deprecated-declarations"
2214     LDFLAGS="$LDFLAGS -dead_strip" ;;
2215 esac
2217 TOR_WARNING_FLAGS=""
2219 # Add some more warnings which we use in development but not in the
2220 # released versions.  (Some relevant gcc versions can't handle these.)
2222 # Note that we have to do this near the end  of the autoconf process, or
2223 # else we may run into problems when these warnings hit on the testing C
2224 # programs that autoconf wants to build.
2225 if test "x$enable_gcc_warnings_advisory" != "xno"; then
2227   case "$host" in
2228     *-*-openbsd* | *-*-bitrig*)
2229       # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
2230       # That's fine, except that the headers don't pass -Wredundant-decls.
2231       # Therefore, let's disable -Wsystem-headers when we're building
2232       # with maximal warnings on OpenBSD.
2233       CFLAGS="$CFLAGS -Wno-system-headers" ;;
2234   esac
2236   CFLAGS_NOWARNINGS="$CFLAGS"
2238   # GCC4.3 users once report trouble with -Wstrict-overflow=5.  GCC5 users
2239   # have it work better.
2240   # CFLAGS="$CFLAGS -Wstrict-overflow=1"
2242   # This warning was added in gcc 4.3, but it appears to generate
2243   # spurious warnings in gcc 4.4.  I don't know if it works in 4.5.
2244   #CFLAGS="$CFLAGS -Wlogical-op"
2246   m4_foreach_w([warning_flag], [
2247      -Waddress
2248      -Waddress-of-array-temporary
2249      -Waddress-of-temporary
2250      -Wambiguous-macro
2251      -Wanonymous-pack-parens
2252      -Warc
2253      -Warc-abi
2254      -Warc-bridge-casts-disallowed-in-nonarc
2255      -Warc-maybe-repeated-use-of-weak
2256      -Warc-performSelector-leaks
2257      -Warc-repeated-use-of-weak
2258      -Warray-bounds
2259      -Warray-bounds-pointer-arithmetic
2260      -Wasm
2261      -Wasm-operand-widths
2262      -Watomic-properties
2263      -Watomic-property-with-user-defined-accessor
2264      -Wauto-import
2265      -Wauto-storage-class
2266      -Wauto-var-id
2267      -Wavailability
2268      -Wbackslash-newline-escape
2269      -Wbad-array-new-length
2270      -Wbind-to-temporary-copy
2271      -Wbitfield-constant-conversion
2272      -Wbool-conversion
2273      -Wbool-conversions
2274      -Wbuiltin-requires-header
2275      -Wchar-align
2276      -Wcompare-distinct-pointer-types
2277      -Wcomplex-component-init
2278      -Wconditional-type-mismatch
2279      -Wconfig-macros
2280      -Wconstant-conversion
2281      -Wconstant-logical-operand
2282      -Wconstexpr-not-const
2283      -Wcustom-atomic-properties
2284      -Wdangling-field
2285      -Wdangling-initializer-list
2286      -Wdate-time
2287      -Wdelegating-ctor-cycles
2288      -Wdeprecated-implementations
2289      -Wdeprecated-register
2290      -Wdirect-ivar-access
2291      -Wdiscard-qual
2292      -Wdistributed-object-modifiers
2293      -Wdivision-by-zero
2294      -Wdollar-in-identifier-extension
2295      -Wdouble-promotion
2296      -Wduplicate-decl-specifier
2297      -Wduplicate-enum
2298      -Wduplicate-method-arg
2299      -Wduplicate-method-match
2300      -Wduplicated-cond
2301      -Wdynamic-class-memaccess
2302      -Wembedded-directive
2303      -Wempty-translation-unit
2304      -Wenum-conversion
2305      -Wexit-time-destructors
2306      -Wexplicit-ownership-type
2307      -Wextern-initializer
2308      -Wextra
2309      -Wextra-semi
2310      -Wextra-tokens
2311      -Wflexible-array-extensions
2312      -Wfloat-conversion
2313      -Wformat-non-iso
2314      -Wfour-char-constants
2315      -Wgcc-compat
2316      -Wglobal-constructors
2317      -Wgnu-array-member-paren-init
2318      -Wgnu-designator
2319      -Wgnu-static-float-init
2320      -Wheader-guard
2321      -Wheader-hygiene
2322      -Widiomatic-parentheses
2323      -Wignored-attributes
2324      -Wimplicit-atomic-properties
2325      -Wimplicit-conversion-floating-point-to-bool
2326      -Wimplicit-exception-spec-mismatch
2327      -Wimplicit-fallthrough
2328      -Wimplicit-fallthrough-per-function
2329      -Wimplicit-retain-self
2330      -Wimport-preprocessor-directive-pedantic
2331      -Wincompatible-library-redeclaration
2332      -Wincompatible-pointer-types-discards-qualifiers
2333      -Wincomplete-implementation
2334      -Wincomplete-module
2335      -Wincomplete-umbrella
2336      -Winit-self
2337      -Wint-conversions
2338      -Wint-to-void-pointer-cast
2339      -Winteger-overflow
2340      -Winvalid-constexpr
2341      -Winvalid-iboutlet
2342      -Winvalid-noreturn
2343      -Winvalid-pp-token
2344      -Winvalid-source-encoding
2345      -Winvalid-token-paste
2346      -Wknr-promoted-parameter
2347      -Wlarge-by-value-copy
2348      -Wliteral-conversion
2349      -Wliteral-range
2350      -Wlocal-type-template-args
2351      -Wlogical-op
2352      -Wloop-analysis
2353      -Wmain-return-type
2354      -Wmalformed-warning-check
2355      -Wmethod-signatures
2356      -Wmicrosoft
2357      -Wmicrosoft-exists
2358      -Wmismatched-parameter-types
2359      -Wmismatched-return-types
2360      -Wmissing-field-initializers
2361      -Wmissing-format-attribute
2362      -Wmissing-noreturn
2363      -Wmissing-selector-name
2364      -Wmissing-sysroot
2365      -Wmissing-variable-declarations
2366      -Wmodule-conflict
2367      -Wnested-anon-types
2368      -Wnewline-eof
2369      -Wnon-literal-null-conversion
2370      -Wnon-pod-varargs
2371      -Wnonportable-cfstrings
2372      -Wnormalized=nfkc
2373      -Wnull-arithmetic
2374      -Wnull-character
2375      -Wnull-conversion
2376      -Wnull-dereference
2377      -Wout-of-line-declaration
2378      -Wover-aligned
2379      -Woverlength-strings
2380      -Woverride-init
2381      -Woverriding-method-mismatch
2382      -Wpointer-type-mismatch
2383      -Wpredefined-identifier-outside-function
2384      -Wprotocol-property-synthesis-ambiguity
2385      -Wreadonly-iboutlet-property
2386      -Wreadonly-setter-attrs
2387      -Wreceiver-expr
2388      -Wreceiver-forward-class
2389      -Wreceiver-is-weak
2390      -Wreinterpret-base-class
2391      -Wrequires-super-attribute
2392      -Wreserved-user-defined-literal
2393      -Wreturn-stack-address
2394      -Wsection
2395      -Wselector-type-mismatch
2396      -Wsentinel
2397      -Wserialized-diagnostics
2398      -Wshadow
2399      -Wshift-count-negative
2400      -Wshift-count-overflow
2401      -Wshift-negative-value
2402      -Wshift-overflow=2
2403      -Wshift-sign-overflow
2404      -Wshorten-64-to-32
2405      -Wsizeof-array-argument
2406      -Wsource-uses-openmp
2407      -Wstatic-float-init
2408      -Wstatic-in-inline
2409      -Wstatic-local-in-inline
2410      -Wstrict-overflow=1
2411      -Wstring-compare
2412      -Wstring-conversion
2413      -Wstrlcpy-strlcat-size
2414      -Wstrncat-size
2415      -Wsuggest-attribute=format
2416      -Wsuggest-attribute=noreturn
2417      -Wsuper-class-method-mismatch
2418      -Wswitch-bool
2419      -Wsync-nand
2420      -Wtautological-constant-out-of-range-compare
2421      -Wtentative-definition-incomplete-type
2422      -Wtrampolines
2423      -Wtype-safety
2424      -Wtypedef-redefinition
2425      -Wtypename-missing
2426      -Wundefined-inline
2427      -Wundefined-internal
2428      -Wundefined-reinterpret-cast
2429      -Wunicode
2430      -Wunicode-whitespace
2431      -Wunknown-warning-option
2432      -Wunnamed-type-template-args
2433      -Wunneeded-member-function
2434      -Wunsequenced
2435      -Wunsupported-visibility
2436      -Wunused-but-set-parameter
2437      -Wunused-but-set-variable
2438      -Wunused-command-line-argument
2439      -Wunused-const-variable=2
2440      -Wunused-exception-parameter
2441      -Wunused-local-typedefs
2442      -Wunused-member-function
2443      -Wunused-sanitize-argument
2444      -Wunused-volatile-lvalue
2445      -Wuser-defined-literals
2446      -Wvariadic-macros
2447      -Wvector-conversion
2448      -Wvector-conversions
2449      -Wvexing-parse
2450      -Wvisibility
2451      -Wvla-extension
2452      -Wzero-length-array
2453   ], [ TOR_TRY_COMPILE_WITH_CFLAGS(warning_flag, [],
2454               [TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS warning_flag" CFLAGS="$CFLAGS warning_flag"], true)
2455      ])
2457 dnl    We should re-enable this in some later version.  Clang doesn't
2458 dnl    mind, but it causes trouble with GCC.
2459 dnl     -Wstrict-overflow=2
2461 dnl    These seem to require annotations that we don't currently use,
2462 dnl    and they give false positives in our pthreads wrappers. (Clang 4)
2463 dnl     -Wthread-safety
2464 dnl     -Wthread-safety-analysis
2465 dnl     -Wthread-safety-attributes
2466 dnl     -Wthread-safety-beta
2467 dnl     -Wthread-safety-precise
2469   W_FLAGS="$W_FLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
2470   W_FLAGS="$W_FLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
2471   W_FLAGS="$W_FLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
2472   W_FLAGS="$W_FLAGS -Wwrite-strings"
2473   W_FLAGS="$W_FLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
2474   W_FLAGS="$W_FLAGS -Waggregate-return -Wpacked -Wunused"
2475   W_FLAGS="$W_FLAGS -Wunused-parameter "
2476   # These interfere with building main() { return 0; }, which autoconf
2477   # likes to use as its default program.
2478   W_FLAGS="$W_FLAGS -Wold-style-definition -Wmissing-declarations"
2480   TOR_WARNING_FLAGS="$TOR_WARNING_FLAGS $W_FLAGS"
2481   CFLAGS="$CFLAGS $W_FLAGS"
2483   if test "$tor_cv_cflags__Wnull_dereference" = "yes"; then
2484     AC_DEFINE([HAVE_CFLAG_WNULL_DEREFERENCE], 1, [True if we have -Wnull-dereference])
2485   fi
2486   if test "$tor_cv_cflags__Woverlength_strings" = "yes"; then
2487     AC_DEFINE([HAVE_CFLAG_WOVERLENGTH_STRINGS], 1, [True if we have -Woverlength-strings])
2488   fi
2489   if test "$tor_cv_cflags__warn_unused_const_variable_2" = "yes"; then
2490     AC_DEFINE([HAVE_CFLAG_WUNUSED_CONST_VARIABLE], 1, [True if we have -Wunused-const-variable])
2491   fi
2493   CFLAGS="$CFLAGS_NOWARNINGS"
2495   if test "x$enable_fatal_warnings" = "xyes"; then
2496     # I'd like to use TOR_CHECK_CFLAGS here, but I can't, since the
2497     # default autoconf programs are full of errors.
2498     CFLAGS="$CFLAGS -Werror"
2499   fi
2503 AC_SUBST(TOR_WARNING_FLAGS)
2505 echo "$TOR_WARNING_FLAGS">warning_flags
2507 TOR_TRY_COMPILE_WITH_CFLAGS([@warning_flags], [],
2508                             CFLAGS="$CFLAGS @warning_flags",
2509                             CFLAGS="$CFLAGS $TOR_WARNING_FLAGS")
2511 if test "$enable_coverage" = "yes" && test "$have_clang" = "no"; then
2512    case "$host_os" in
2513     darwin*)
2514       AC_MSG_WARN([Tried to enable coverage on OSX without using the clang compiler. This might not work! If coverage fails, use CC=clang when configuring with --enable-coverage.])
2515    esac
2518 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
2520 AC_CONFIG_FILES([
2521         Doxyfile
2522         Makefile
2523         config.rust
2524         contrib/operator-tools/tor.logrotate
2525         contrib/dist/tor.service
2526         src/config/torrc.sample
2527         src/config/torrc.minimal
2528         src/rust/.cargo/config
2529         scripts/maint/checkOptionDocs.pl
2530         warning_flags
2533 if test "x$asciidoc" = "xtrue" && test "$ASCIIDOC" = "none"; then
2534   regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
2535   for file in $regular_mans ; do
2536     if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
2537       echo "==================================";
2538       echo;
2539       echo "Building Tor has failed since manpages cannot be built.";
2540       echo;
2541       echo "You need asciidoc installed to be able to build the manpages.";
2542       echo "To build without manpages, use the --disable-asciidoc argument";
2543       echo "when calling configure.";
2544       echo;
2545       echo "==================================";
2546       exit 1;
2547     fi
2548   done
2551 if test "$fragile_hardening" = "yes"; then
2552   AC_MSG_WARN([
2554 ============
2555 Warning!  Building Tor with --enable-fragile-hardening (also known as
2556 --enable-expensive-hardening) makes some kinds of attacks harder, but makes
2557 other kinds of attacks easier. A Tor instance build with this option will be
2558 somewhat less vulnerable to remote code execution, arithmetic overflow, or
2559 out-of-bounds read/writes... but at the cost of becoming more vulnerable to
2560 denial of service attacks. For more information, see
2561 https://trac.torproject.org/projects/tor/wiki/doc/TorFragileHardening
2562 ============
2563   ])
2566 AC_OUTPUT
2569 # Mini-report on what will be built.
2572 PPRINT_INIT
2573 PPRINT_SET_INDENT(1)
2574 PPRINT_SET_TS(65)
2576 AS_ECHO
2577 AS_ECHO("Tor Version: ${PPRINT_COLOR_BLDBLU}Tor $PACKAGE_VERSION $PPRINT_COLOR_RST")
2578 AS_ECHO
2580 PPRINT_SUBTITLE([Build Features])
2582 PPRINT_PROP_STRING([Compiler], [$CC])
2583 PPRINT_PROP_STRING([Host OS], [$host_os])
2584 AS_ECHO
2586 test "x$enable_gcc_warnings" = "xyes" && value=1 || value=0
2587 PPRINT_PROP_BOOL([Verbose Warnings (--enable-gcc-warnings)], $value)
2589 test "x$enable_fatal_warnings" = "xyes" && value=1 || value=0
2590 PPRINT_PROP_BOOL([Warnings are fatal (--enable-fatal-warnings)], $value)
2592 test "x$enable_rust" = "xyes" && value=1 || value=0
2593 PPRINT_PROP_BOOL([Rust support (--enable-rust)], $value)
2595 test "x$enable_android" = "xyes" && value=1 || value=0
2596 PPRINT_PROP_BOOL([Android support (--enable-android)], $value)
2598 test "x$enable_systemd" = "xyes" && value=1 || value=0
2599 PPRINT_PROP_BOOL([Systemd support (--enable-systemd)], $value)
2601 AS_ECHO
2602 PPRINT_SUBTITLE([Static Build])
2604 test "x$enable_static_tor" = "xyes" && value=1 || value=0
2605 PPRINT_PROP_BOOL([tor (--enable-static-tor)], $value)
2607 if test "x$enable_static_libevent" = "xyes"; then
2608   PPRINT_PROP_STRING([libevent], [$TOR_LIBDIR_libevent])
2609 else
2610   PPRINT_PROP_BOOL([libevent (--enable-static-libevent)], $value)
2613 if test "x$enable_static_openssl" = "xyes"; then
2614   PPRINT_PROP_STRING([libssl], [$TOR_LIBDIR_openssl])
2615 else
2616   PPRINT_PROP_BOOL([libssl (--enable-static-openssl)], $value)
2619 if test "x$enable_static_zlib" = "xyes"; then
2620   PPRINT_PROP_STRING([zlib1g], [$TOR_LIBDIR_zlib])
2621 else
2622   PPRINT_PROP_BOOL([zlib1g (--enable-static-zlib)], $value)
2625 AS_ECHO
2626 PPRINT_SUBTITLE([Optional Libraries])
2628 test "x$enable_nss" = "xyes" && value=1 || value=0
2629 PPRINT_PROP_BOOL([libnss (--enable-nss)], $value)
2631 test "x$enable_seccomp" != "xno" && value=1 || value=0
2632 PPRINT_PROP_BOOL([libseccomp (--disable-seccomp)], $value)
2634 test "x$enable_libscrypt" != "xno" && value=1 || value=0
2635 PPRINT_PROP_BOOL([libscrypt (--disable-libscrypt)], $value)
2637 AS_ECHO
2638 PPRINT_SUBTITLE([Hardening])
2640 test "x$enable_gcc_hardening" != "xno" && value=1 || value=0
2641 PPRINT_PROP_BOOL([Compiler Hardening (--disable-gcc-hardening)], $value)
2643 test "x$enable_linker_hardening" != "xno" && value=1 || value=0
2644 PPRINT_PROP_BOOL([Linker Hardening (--disable-linker-hardening)], $value)
2646 test "x$enable_fragile_hardening" = "xyes" && value=1 || value=0
2647 PPRINT_PROP_BOOL([Fragile Hardening (--enable-fragile-hardening, dev only)], $value)
2649 AS_ECHO
2650 PPRINT_SUBTITLE([Modules])
2652 test "x$enable_module_dirauth" != "xno" && value=1 || value=0
2653 PPRINT_PROP_BOOL([Directory Authority (--disable-module-dirauth)], $value)
2655 test "x$enable_module_relay" != "xno" && value=1 || value=0
2656 PPRINT_PROP_BOOL([Relay (--disable-module-relay)], $value)
2658 AS_ECHO
2659 PPRINT_SUBTITLE([Documentation])
2661 test "x$enable_manpage" != "xno" && value=1 || value=0
2662 PPRINT_PROP_BOOL([Man Pages (--disable-manpage)], $value)
2664 test "x$enable_html_manual" != "xno" && value=1 || value=0
2665 PPRINT_PROP_BOOL([HTML Manual (--disable-html-manual)], $value)
2667 AS_ECHO
2668 PPRINT_SUBTITLE([Tests])
2670 test "x$enable_unittests" != "xno" && value=1 || value=0
2671 PPRINT_PROP_BOOL([Unit tests (--disable-unittests)], $value)
2673 test "x$enable_asserts_in_tests" = "xno" && value=1 || value=0
2674 PPRINT_PROP_BOOL([assert()s disabled (--disable-asserts-in-tests, dev only)], $value)
2676 test "x$enable_coverage" = "xyes" && value=1 || value=0
2677 PPRINT_PROP_BOOL([Code Coverage (--enable-coverage)], $value)
2679 test "x$enable_libfuzzer" = "xyes" && value=1 || value=0
2680 PPRINT_PROP_BOOL([libFuzzer support (--enable-libfuzzer)], $value)
2682 test "x$enable_oss_fuzz" = "xyes" && value=1 || value=0
2683 PPRINT_PROP_BOOL([OSS-Fuzz support (--enable-oss-fuzz)], $value)
2685 AS_ECHO
2686 PPRINT_SUBTITLE([Install Directories])
2688 report_mandir="`eval eval echo $mandir`"
2689 PPRINT_PROP_STRING([Binaries], [$BINDIR])
2690 PPRINT_PROP_STRING([Configuration], [$CONFDIR])
2691 PPRINT_PROP_STRING([Man Pages], [$report_mandir])
2693 AS_ECHO
2694 AS_ECHO(["Configure Line: ./configure $configure_flags"])