configure.ac 92.6 KB
Newer Older
Roger Dingledine's avatar
Roger Dingledine committed
1
dnl Copyright (c) 2001-2004, Roger Dingledine
2
dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
Nick Mathewson's avatar
Nick Mathewson committed
3
dnl Copyright (c) 2007-2019, The Tor Project, Inc.
Nick Mathewson's avatar
Nick Mathewson committed
4
dnl See LICENSE for licensing information
5

6
AC_PREREQ([2.63])
Nick Mathewson's avatar
Nick Mathewson committed
7
AC_INIT([tor],[0.4.5.1-alpha-dev])
8
AC_CONFIG_SRCDIR([src/app/main/tor_main.c])
9
AC_CONFIG_MACRO_DIR([m4])
10

11
12
configure_flags="$*"

13
14
15
16
17
18
# DO NOT EDIT THIS DEFINITION BY HAND UNLESS YOU KNOW WHAT YOU'RE DOING.
#
# The update_versions.py script updates this definition when the
# version number changes.  Tor uses it to make sure that it
# only shuts down for missing "required protocols" when those protocols
# are listed as required by a consensus after this date.
Nick Mathewson's avatar
Nick Mathewson committed
19
AC_DEFINE(APPROX_RELEASE_DATE, ["2020-11-01"], # for 0.4.5.1-alpha-dev
20
21
          [Approximate date when this software was released. (Updated when the version changes.)])

22
23
24
# "foreign" means we don't follow GNU package layout standards
# "1.11" means we require automake version 1.11 or newer
# "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])
26

27
28
29
30
31
tor_ac_n_warnings=0
tor_incr_n_warnings() {
  tor_ac_n_warnings=`expr $tor_ac_n_warnings + 1`
}

32
m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
33
AC_CONFIG_HEADERS([orconfig.h])
34

35
AC_USE_SYSTEM_EXTENSIONS
36
37
AC_CANONICAL_HOST

38
PKG_PROG_PKG_CONFIG
39
if test "x$PKG_CONFIG" = "x" ; then
40
    pkg_config_user_action="install pkg-config, and check the PKG_CONFIG_PATH environment variable"
41
    AC_MSG_NOTICE([Some libraries need pkg-config, including systemd, nss, lzma, zstd, and custom mallocs.])
42
    AC_MSG_NOTICE([To use those libraries, $pkg_config_user_action.])
43
else
44
    pkg_config_user_action="check the PKG_CONFIG_PATH environment variable"
45
fi
46

47
48
49
50
51
if test "x$PKG_CONFIG_PATH" = "x" && test "x$prefix" != "xNONE" && test "$host" != "$build"; then
   export PKG_CONFIG_PATH=$prefix/lib/pkgconfig
   AC_MSG_NOTICE([set PKG_CONFIG_PATH=$PKG_CONFIG_PATH to support cross-compiling])
fi

52
AC_ARG_ENABLE(openbsd-malloc,
53
   AS_HELP_STRING(--enable-openbsd-malloc, [use malloc code from OpenBSD.  Linux only. Deprecated: see --with-malloc]))
54
AC_ARG_ENABLE(static-openssl,
55
   AS_HELP_STRING(--enable-static-openssl, [link against a static openssl library. Requires --with-openssl-dir]))
56
AC_ARG_ENABLE(static-libevent,
57
   AS_HELP_STRING(--enable-static-libevent, [link against a static libevent library. Requires --with-libevent-dir]))
58
AC_ARG_ENABLE(static-zlib,
59
   AS_HELP_STRING(--enable-static-zlib, [link against a static zlib library. Requires --with-zlib-dir]))
60
AC_ARG_ENABLE(static-tor,
61
   AS_HELP_STRING(--enable-static-tor, [create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir]))
62
AC_ARG_ENABLE(unittests,
63
   AS_HELP_STRING(--disable-unittests, [don't build unit tests for Tor. Risky!]))
64
AC_ARG_ENABLE(coverage,
65
   AS_HELP_STRING(--enable-coverage, [enable coverage support in the unit-test build]))
66
67
AC_ARG_ENABLE(asserts-in-tests,
   AS_HELP_STRING(--disable-asserts-in-tests, [disable tor_assert() calls in the unit tests, for branch coverage]))
68
AC_ARG_ENABLE(system-torrc,
69
   AS_HELP_STRING(--disable-system-torrc, [don't look for a system-wide torrc file]))
Nick Mathewson's avatar
Nick Mathewson committed
70
AC_ARG_ENABLE(libfuzzer,
71
72
73
   AS_HELP_STRING(--enable-libfuzzer, [build extra fuzzers based on 'libfuzzer']))
AC_ARG_ENABLE(oss-fuzz,
   AS_HELP_STRING(--enable-oss-fuzz, [build extra fuzzers based on 'oss-fuzz' environment]))
74
75
AC_ARG_ENABLE(memory-sentinels,
   AS_HELP_STRING(--disable-memory-sentinels, [disable code that tries to prevent some kinds of memory access bugs. For fuzzing only.]))
76
77
AC_ARG_ENABLE(rust,
   AS_HELP_STRING(--enable-rust, [enable rust integration]))
78
79
AC_ARG_ENABLE(cargo-online-mode,
   AS_HELP_STRING(--enable-cargo-online-mode, [Allow cargo to make network requests to fetch crates. For builds with rust only.]))
80
81
AC_ARG_ENABLE(restart-debugging,
   AS_HELP_STRING(--enable-restart-debugging, [Build Tor with support for debugging in-process restart. Developers only.]))
82
83
AC_ARG_ENABLE(zstd-advanced-apis,
   AS_HELP_STRING(--disable-zstd-advanced-apis, [Build without support for zstd's "static-only" APIs.]))
84
85
AC_ARG_ENABLE(nss,
   AS_HELP_STRING(--enable-nss, [Use Mozilla's NSS TLS library. (EXPERIMENTAL)]))
86
87
AC_ARG_ENABLE(pic,
   AS_HELP_STRING(--enable-pic, [Build Tor's binaries as position-independent code, suitable to link as a library.]))
88

89
AC_ARG_ENABLE(missing-doc-warnings,
90
   AS_HELP_STRING(--enable-missing-doc-warnings, [Tell doxygen to warn about missing documentation. Makes doxygen warnings nonfatal.]))
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106

if test "$enable_missing_doc_warnings" = "yes"; then
   DOXYGEN_FATAL_WARNINGS=NO
   DOXYGEN_WARN_ON_MISSING=YES
elif test "$enable_fatal_warnings" = "yes"; then
   # Fatal warnings from doxygen are nice, but not if we're warning about
   # missing documentation.
   DOXYGEN_FATAL_WARNINGS=YES
   DOXYGEN_WARN_ON_MISSING=NO
else
   DOXYGEN_FATAL_WARNINGS=NO
   DOXYGEN_WARN_ON_MISSING=NO
fi
AC_SUBST(DOXYGEN_FATAL_WARNINGS)
AC_SUBST(DOXYGEN_WARN_ON_MISSING)

107
if test "x$enable_coverage" != "xyes" -a "x$enable_asserts_in_tests" = "xno" ; then
108
109
110
    AC_MSG_ERROR([Can't disable assertions outside of coverage build])
fi

111
112
113
AM_CONDITIONAL(UNITTESTS_ENABLED, test "x$enable_unittests" != "xno")
AM_CONDITIONAL(COVERAGE_ENABLED, test "x$enable_coverage" = "xyes")
AM_CONDITIONAL(DISABLE_ASSERTS_IN_UNIT_TESTS, test "x$enable_asserts_in_tests" = "xno")
Nick Mathewson's avatar
Nick Mathewson committed
114
AM_CONDITIONAL(LIBFUZZER_ENABLED, test "x$enable_libfuzzer" = "xyes")
115
AM_CONDITIONAL(OSS_FUZZ_ENABLED, test "x$enable_oss_fuzz" = "xyes")
116
AM_CONDITIONAL(USE_RUST, test "x$enable_rust" = "xyes")
117
AM_CONDITIONAL(USE_NSS, test "x$enable_nss" = "xyes")
118
AM_CONDITIONAL(USE_OPENSSL, test "x$enable_nss" != "xyes")
119
120
121

if test "x$enable_nss" = "xyes"; then
  AC_DEFINE(ENABLE_NSS, 1,
122
  	    [Defined if we're building with NSS.])
123
124
125
else
  AC_DEFINE(ENABLE_OPENSSL, 1,
            [Defined if we're building with OpenSSL or LibreSSL])
126
fi
127

128
129
130
131
132
133
if test "$enable_static_tor" = "yes"; then
  enable_static_libevent="yes";
  enable_static_openssl="yes";
  enable_static_zlib="yes";
  CFLAGS="$CFLAGS -static"
fi
134

135
136
137
138
139
if test "$enable_system_torrc" = "no"; then
  AC_DEFINE(DISABLE_SYSTEM_TORRC, 1,
            [Defined if we're not going to look for a torrc in SYSCONF])
fi

140
141
142
143
144
if test "$enable_memory_sentinels" = "no"; then
  AC_DEFINE(DISABLE_MEMORY_SENTINELS, 1,
           [Defined if we're turning off memory safety code to look for bugs])
fi

145
146
147
148
149
150
AC_ARG_ENABLE(manpage,
              AS_HELP_STRING(--disable-manpage, [Disable manpage generation.]))

AC_ARG_ENABLE(html-manual,
              AS_HELP_STRING(--disable-html-manual, [Disable HTML documentation.]))

151
AC_ARG_ENABLE(asciidoc,
152
     AS_HELP_STRING(--disable-asciidoc, [don't use asciidoc (disables building of manpages)]),
153
     [case "${enableval}" in
154
155
        "yes") asciidoc=true ;;
        "no")  asciidoc=false ;;
156
157
158
        *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
      esac], [asciidoc=true])

159
160
# systemd notify support
AC_ARG_ENABLE(systemd,
161
      AS_HELP_STRING(--enable-systemd, [enable systemd notification support]),
162
      [case "${enableval}" in
163
164
        "yes") systemd=true ;;
        "no")  systemd=false ;;
165
166
167
        * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
      esac], [systemd=auto])

168
169
170
171
if test "$enable_restart_debugging" = "yes"; then
  AC_DEFINE(ENABLE_RESTART_DEBUGGING, 1,
            [Defined if we're building with support for in-process restart debugging.])
fi
172

173
174
175
176
if test "$enable_zstd_advanced_apis" != "no"; then
   AC_DEFINE(ENABLE_ZSTD_ADVANCED_APIS, 1,
             [Defined if we're going to try to use zstd's "static-only" APIs.])
fi
177
178

# systemd support
179
if test "x$enable_systemd" = "xno"; then
180
181
182
183
184
185
    have_systemd=no;
else
    PKG_CHECK_MODULES(SYSTEMD,
        [libsystemd-daemon],
        have_systemd=yes,
        have_systemd=no)
186
    if test "x$have_systemd" = "xno"; then
187
188
189
190
191
192
        AC_MSG_NOTICE([Okay, checking for systemd a different way...])
        PKG_CHECK_MODULES(SYSTEMD,
            [libsystemd],
            have_systemd=yes,
            have_systemd=no)
    fi
193
194
fi

195
if test "x$have_systemd" = "xyes"; then
196
    AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
197
    TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}"
198
    TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
199
    PKG_CHECK_MODULES(LIBSYSTEMD209, [libsystemd >= 209],
200
         [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or greater])], [])
201
fi
202
AC_SUBST(TOR_SYSTEMD_CFLAGS)
203
204
AC_SUBST(TOR_SYSTEMD_LIBS)

205
if test "x$enable_systemd" = "xyes" -a "x$have_systemd" != "xyes" ; then
206
    AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found, $pkg_config_user_action, or set SYSTEMD_CFLAGS and SYSTEMD_LIBS.])
207
208
fi

209
case "$host" in
210
211
212
213
214
   *-*-solaris* )
     AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
     ;;
esac

215
AC_ARG_ENABLE(gcc-warnings,
216
217
218
     AS_HELP_STRING(--enable-gcc-warnings, [deprecated alias for enable-fatal-warnings]))
AC_ARG_ENABLE(fatal-warnings,
     AS_HELP_STRING(--enable-fatal-warnings, [tell the compiler to treat all warnings as errors.]))
219
AC_ARG_ENABLE(gcc-warnings-advisory,
220
     AS_HELP_STRING(--disable-gcc-warnings-advisory, [disable the regular verbose warnings]))
221

222
223
dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
AC_ARG_ENABLE(gcc-hardening,
224
    AS_HELP_STRING(--disable-gcc-hardening, [disable compiler security checks]))
225

226
dnl Deprecated --enable-expensive-hardening but keep it for now for backward compat.
227
AC_ARG_ENABLE(expensive-hardening,
228
229
230
231
232
    AS_HELP_STRING(--enable-expensive-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
AC_ARG_ENABLE(fragile-hardening,
    AS_HELP_STRING(--enable-fragile-hardening, [enable more fragile and expensive compiler hardening; makes Tor slower]))
if test "x$enable_expensive_hardening" = "xyes" || test "x$enable_fragile_hardening" = "xyes"; then
  fragile_hardening="yes"
233
  AC_DEFINE(DEBUG_SMARTLIST, 1, [Enable smartlist debugging])
234
fi
235

236
237
238
239
240
241
242
AC_ARG_ENABLE(all-bugs-are-fatal,
   AS_HELP_STRING(--enable-all-bugs-are-fatal, [force all soft asserts in Tor codebase (tor_assert_nonfatal(), BUG(), etc.) to act as hard asserts (tor_assert() and equivalents); makes Tor fragile; only recommended for dev builds]))

if test "x$enable_all_bugs_are_fatal" = "xyes"; then
  AC_DEFINE(ALL_BUGS_ARE_FATAL, 1, [All assert failures are fatal])
fi

243
244
245
dnl Linker hardening options
dnl Currently these options are ELF specific - you can't use this with MacOSX
AC_ARG_ENABLE(linker-hardening,
246
    AS_HELP_STRING(--disable-linker-hardening, [disable linker security fixups]))
247

248
AC_ARG_ENABLE(local-appdata,
249
   AS_HELP_STRING(--enable-local-appdata, [default to host local application data paths on Windows]))
250
251
252
253
254
if test "$enable_local_appdata" = "yes"; then
  AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
            [Defined if we default to host local appdata paths on Windows])
fi

255
AC_ARG_ENABLE(tool-name-check,
256
     AS_HELP_STRING(--disable-tool-name-check, [check for sanely named toolchain when cross-compiling]))
257

258
AC_ARG_ENABLE(seccomp,
259
     AS_HELP_STRING(--disable-seccomp, [do not attempt to use libseccomp]))
260

261
AC_ARG_ENABLE(libscrypt,
262
     AS_HELP_STRING(--disable-libscrypt, [do not attempt to use libscrypt]))
263

264
dnl --- Tracing Options. ---
265

266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
TOR_TRACE_LIBS=

dnl LTTng instrumentation option.
AC_ARG_ENABLE(tracing-instrumentation-lttng,
              AS_HELP_STRING([--enable-tracing-instrumentation-lttng],
                             [build with LTTng-UST instrumentation]))
AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_LTTNG],
               [test "x$enable_tracing_instrumentation_lttng" = "xyes"])

if test "x$enable_tracing_instrumentation_lttng" = "xyes"; then
  AC_CHECK_HEADERS([lttng/tracepoint.h], [],
                   [AC_MSG_ERROR([LTTng instrumentation headers not found.
                                  On Debian, apt install liblttng-ust-dev"])], [])
  AC_DEFINE([USE_TRACING_INSTRUMENTATION_LTTNG], [1], [Using LTTng instrumentation])
  TOR_TRACE_LIBS="-llttng-ust -ldl"
281
  have_tracing=1
282
283
fi

284
285
286
287
288
289
290
291
292
293
294
dnl USDT instrumentation option.
AC_ARG_ENABLE(tracing-instrumentation-usdt,
              AS_HELP_STRING([--enable-tracing-instrumentation-usdt],
                             [build with tracing USDT instrumentation]))
AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_USDT],
               [test "x$enable_tracing_instrumentation_usdt" = "xyes"])

if test "x$enable_tracing_instrumentation_usdt" = "xyes"; then
  AC_CHECK_HEADERS([sys/sdt.h], [],
                   [AC_MSG_ERROR([USDT instrumentation requires sys/sdt.h header.
                                  On Debian, apt install systemtap-sdt-dev])], [])
295
296
297
  dnl LTTng generates USDT probes if the UST library was built with
  dnl --with-sdt. There is unfortunately no way to check that so we always
  dnl build the USDT probes even though LTTng instrumentation was requested.
298
  AC_DEFINE([USE_TRACING_INSTRUMENTATION_USDT], [1], [Using USDT instrumentation])
299
  have_tracing=1
300
301
fi

302
303
304
305
306
307
308
309
dnl Tracepoints event to debug logs.
AC_ARG_ENABLE(tracing-instrumentation-log-debug,
     AS_HELP_STRING([--enable-tracing-instrumentation-log-debug],
                    [build with tracing event to debug log]),
     AC_DEFINE([USE_TRACING_INSTRUMENTATION_LOG_DEBUG], [1],
               [Tracepoints to log debug]), [])
AM_CONDITIONAL([USE_TRACING_INSTRUMENTATION_LOG_DEBUG],
               [test "x$enable_tracing_instrumentation_log_debug" = "xyes"])
310
311
312
if test "x$enable_tracing_instrumentation_log_debug" = "xyes"; then
  have_tracing=1
fi
313

314
dnl Define that tracing is supported if any instrumentation is used.
315
316
AM_COND_IF([USE_TRACING_INSTRUMENTATION_LOG_DEBUG],
           AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
317
318
AM_COND_IF([USE_TRACING_INSTRUMENTATION_USDT],
           AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
319
320
AM_COND_IF([USE_TRACING_INSTRUMENTATION_LTTNG],
           AC_DEFINE([HAVE_TRACING], [1], [Compiled with tracing support]))
321
AM_CONDITIONAL([USE_TRACING], [test "x$have_tracing" = x1 ])
322
323
324

dnl Finally, define the trace libs.
AC_SUBST([TOR_TRACE_LIBS])
325
326

dnl -- End Tracing Options. --
327

328
329
330
331
332
333
334
335
336
337
dnl Enable Android only features.
AC_ARG_ENABLE(android,
     AS_HELP_STRING(--enable-android, [build with Android features enabled]))
AM_CONDITIONAL([USE_ANDROID], [test "x$enable_android" = "xyes"])

if test "x$enable_android" = "xyes"; then
  AC_DEFINE([USE_ANDROID], [1], [Compile with Android specific features enabled])

fi

338
339
340
341
dnl ---
dnl Tor modules options. These options are namespaced with --disable-module-XXX
dnl ---

342
dnl All our modules.
Nick Mathewson's avatar
Nick Mathewson committed
343
m4_define(MODULES, relay dirauth dircache)
344
345
346
347

dnl Relay module.
AC_ARG_ENABLE([module-relay],
              AS_HELP_STRING([--disable-module-relay],
348
                             [Build tor without the Relay modules: tor can not run as a relay, bridge, or authority. Implies --disable-module-dirauth]))
349
350
351
352
AM_CONDITIONAL(BUILD_MODULE_RELAY, [test "x$enable_module_relay" != "xno"])
AM_COND_IF(BUILD_MODULE_RELAY,
           AC_DEFINE([HAVE_MODULE_RELAY], [1],
                     [Compile with Relay feature support]))
353

Nick Mathewson's avatar
Nick Mathewson committed
354
dnl Dircache module.  (This cannot be enabled or disabled independently of
355
dnl the relay module.  It is not listed by --list-modules for this reason.)
Nick Mathewson's avatar
Nick Mathewson committed
356
357
358
359
360
361
AM_CONDITIONAL(BUILD_MODULE_DIRCACHE,
               [test "x$enable_module_relay" != "xno"])
AM_COND_IF(BUILD_MODULE_DIRCACHE,
           AC_DEFINE([HAVE_MODULE_DIRCACHE], [1],
                     [Compile with directory cache support]))

362
363
364
dnl Directory Authority module.
AC_ARG_ENABLE([module-dirauth],
              AS_HELP_STRING([--disable-module-dirauth],
365
                             [Build tor without the Directory Authority module: tor can not run as a directory authority or bridge authority]))
366
AM_CONDITIONAL(BUILD_MODULE_DIRAUTH,[test "x$enable_module_dirauth" != "xno" && test "x$enable_module_relay" != "xno"])
367
368
369
AM_COND_IF(BUILD_MODULE_DIRAUTH,
           AC_DEFINE([HAVE_MODULE_DIRAUTH], [1],
                     [Compile with Directory Authority feature support]))
370

371
372
373
374
375
376
377
378
379
dnl Helper variables.
TOR_MODULES_ALL_ENABLED=
AC_DEFUN([ADD_MODULE], [
    MODULE=m4_toupper($1)
    TOR_MODULES_ALL_ENABLED="${TOR_MODULES_ALL_ENABLED} -DHAVE_MODULE_${MODULE}=1"
])
m4_foreach_w([module], MODULES, [ADD_MODULE([module])])
AC_SUBST(TOR_MODULES_ALL_ENABLED)

380
381
382
383
384
385
386
387
388
dnl check for the correct "ar" when cross-compiling.
dnl   (AM_PROG_AR was new in automake 1.11.2, which we do not yet require,
dnl    so kludge up a replacement for the case where it isn't there yet.)
m4_ifdef([AM_PROG_AR],
         [AM_PROG_AR],
         [AN_MAKEVAR([AR], [AC_PROG_AR])
          AN_PROGRAM([ar], [AC_PROG_AR])
          AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [:])])
          AC_PROG_AR])
389

390
391
392
393
394
395
dnl Check whether the above macro has settled for a simply named tool even
dnl though we're cross compiling. We must do this before running AC_PROG_CC,
dnl because that will find any cc on the system, not only the cross-compiler,
dnl and then verify that a binary built with this compiler runs on the
dnl build system. It will then come to the false conclusion that we're not
dnl cross-compiling.
396
397
if test "x$enable_tool_name_check" != "xno"; then
    if test "x$ac_tool_warned" = "xyes"; then
398
        AC_MSG_ERROR([We are cross compiling but could not find a properly named toolchain. Do you have your cross-compiling toolchain in PATH? (You can --disable-tool-name-check to ignore this.)])
399
	elif test "x$ac_ct_AR" != "x" -a "x$cross_compiling" = "xmaybe"; then
400
401
402
403
		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.)])
	fi
fi

404
AC_PROG_CC
405
AC_PROG_CPP
406
407
AC_PROG_MAKE_SET
AC_PROG_RANLIB
408
AC_PROG_SED
409

410
411
412
AC_ARG_VAR([PERL], [path to Perl binary])
AC_CHECK_PROGS([PERL], [perl])
AM_CONDITIONAL(USE_PERL, [test "x$ac_cv_prog_PERL" != "x"])
413

414
415
dnl check for asciidoc and a2x
AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
416
AC_PATH_PROGS([A2X], [a2x a2x.py], none)
417

418
AM_CONDITIONAL(USE_ASCIIDOC, test "x$asciidoc" = "xtrue")
419
420
AM_CONDITIONAL(BUILD_MANPAGE, [test "x$enable_manpage" != "xno"])
AM_CONDITIONAL(BUILD_HTML_DOCS, [test "x$enable_html_manual" != "xno"])
421

422
AM_PROG_CC_C_O
423
AC_PROG_CC_C99
424

Nick Mathewson's avatar
Nick Mathewson committed
425
426
AC_CACHE_CHECK([for Python 3], [tor_cv_PYTHON],
   [AC_PATH_PROGS_FEATURE_CHECK([PYTHON], [ \
427
428
	python3 \
	python3.8 python3.7 python3.6 python3.5 python3.4 \
Nick Mathewson's avatar
Nick Mathewson committed
429
430
431
432
433
434
	python ],
   [["$ac_path_PYTHON" -c 'import sys; sys.exit(sys.version_info[0]<3)' && tor_cv_PYTHON="$ac_path_PYTHON" ac_path_PYTHON_found=:]] )])
AC_SUBST([PYTHON], [$tor_cv_PYTHON])

PYTHON="$tor_cv_PYTHON"

435
if test "x$PYTHON" = "x"; then
436
  tor_incr_n_warnings
Nick Mathewson's avatar
Nick Mathewson committed
437
  AC_MSG_WARN([Python 3 unavailable; some tests will not be run.])
438
fi
Nick Mathewson's avatar
Nick Mathewson committed
439

440
441
AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])

442
dnl List all external rust crates we depend on here. Include the version
443
444
445
446
rust_crates=" \
    digest-0.7.2 \
    libc-0.2.39 \
"
447
AC_SUBST(rust_crates)
448

449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
AC_C_FLEXIBLE_ARRAY_MEMBER
], [
 dnl Maybe we've got an old autoconf...
 AC_CACHE_CHECK([for flexible array members],
     tor_cv_c_flexarray,
     [AC_COMPILE_IFELSE(
       AC_LANG_PROGRAM([
 struct abc { int a; char b[]; };
], [
 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
 def->b[0] = 33;
]),
  [tor_cv_c_flexarray=yes],
  [tor_cv_c_flexarray=no])])
464
 if test "$tor_cv_flexarray" = "yes"; then
465
   AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
466
 else
467
   AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
468
469
470
 fi
])

471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
      tor_cv_c_c99_decl,
      [AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
	 [tor_cv_c_c99_decl=yes],
	 [tor_cv_c_c99_decl=no] )])
if test "$tor_cv_c_c99_decl" != "yes"; then
  AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
fi

AC_CACHE_CHECK([for working C99 designated initializers],
      tor_cv_c_c99_designated_init,
      [AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM([struct s { int a; int b; };],
  	       [[ struct s ss = { .b = 5, .a = 6 }; ]])],
	 [tor_cv_c_c99_designated_init=yes],
	 [tor_cv_c_c99_designated_init=no] )])

if test "$tor_cv_c_c99_designated_init" != "yes"; then
  AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
fi

Nick Mathewson's avatar
Nick Mathewson committed
493
494
495
496
497
498
499
500
501
502
503
504
saved_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -Werror"
AC_CACHE_CHECK([for __attribute__((fallthrough))],
      tor_cv_c_attr_fallthrough,
      [AC_COMPILE_IFELSE(
         [AC_LANG_PROGRAM([extern int x; void fn(void) ;],
	       [[ switch (x) { case 1: fn(); __attribute__((fallthrough));
                               case 2: fn(); break; } ]])],
	 [tor_cv_c_attr_fallthrough=yes],
	 [tor_cv_c_attr_fallthrough=no] )])
CFLAGS="$saved_CFLAGS"

505
if test "$tor_cv_c_attr_fallthrough" = "yes"; then
Nick Mathewson's avatar
Nick Mathewson committed
506
507
508
  AC_DEFINE(HAVE_ATTR_FALLTHROUGH, [1], [defined if we have the fallthrough attribute.])
fi

509
510
TORUSER=_tor
AC_ARG_WITH(tor-user,
511
        AS_HELP_STRING(--with-tor-user=NAME, [specify username for tor daemon]),
512
513
514
515
516
517
518
519
        [
           TORUSER=$withval
        ]
)
AC_SUBST(TORUSER)

TORGROUP=_tor
AC_ARG_WITH(tor-group,
520
        AS_HELP_STRING(--with-tor-group=NAME, [specify group name for tor daemon]),
521
522
523
524
525
526
        [
           TORGROUP=$withval
        ]
)
AC_SUBST(TORGROUP)

527

528
dnl If _WIN32 is defined and non-zero, we are building for win32
529
AC_MSG_CHECKING([for win32])
530
AC_RUN_IFELSE([AC_LANG_SOURCE([
531
int main(int c, char **v) {
532
533
#ifdef _WIN32
#if _WIN32
534
535
536
537
538
539
540
  return 0;
#else
  return 1;
#endif
#else
  return 2;
#endif
541
}])],
542
bwin32=true; AC_MSG_RESULT([yes]),
543
544
bwin32=false; AC_MSG_RESULT([no]),
bwin32=cross; AC_MSG_RESULT([cross])
545
546
)

547
if test "$bwin32" = "cross"; then
548
AC_MSG_CHECKING([for win32 (cross)])
549
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
550
#ifdef _WIN32
551
552
553
554
555
int main(int c, char **v) {return 0;}
#else
#error
int main(int c, char **v) {return x(y);}
#endif
556
])],
557
558
559
560
bwin32=true; AC_MSG_RESULT([yes]),
bwin32=false; AC_MSG_RESULT([no]))
fi

561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
AH_BOTTOM([
#ifdef _WIN32
/* Defined to access windows functions and definitions for >=WinXP */
# ifndef WINVER
#  define WINVER 0x0501
# endif

/* Defined to access _other_ windows functions and definitions for >=WinXP */
# ifndef _WIN32_WINNT
#  define _WIN32_WINNT 0x0501
# endif

/* Defined to avoid including some windows headers as part of Windows.h */
# ifndef WIN32_LEAN_AND_MEAN
#  define WIN32_LEAN_AND_MEAN 1
# endif
#endif
])

580
AM_CONDITIONAL(WIN32, test "x$bwin32" = "xtrue")
581
AM_CONDITIONAL(BUILD_NT_SERVICES, test "x$bwin32" = "xtrue")
582
AM_CONDITIONAL(BUILD_LIBTORRUNNER, test "x$bwin32" != "xtrue")
583

584
585
dnl Enable C99 when compiling with MIPSpro
AC_MSG_CHECKING([for MIPSpro compiler])
586
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
587
588
589
590
#if (defined(__sgi) && defined(_COMPILER_VERSION))
#error
  return x(y);
#endif
591
])],
592
bmipspro=false; AC_MSG_RESULT(no),
593
bmipspro=true; AC_MSG_RESULT(yes))
594

595
if test "$bmipspro" = "true"; then
596
597
598
  CFLAGS="$CFLAGS -c99"
fi

599
600
AC_C_BIGENDIAN

Alex Xu's avatar
Alex Xu committed
601
602
AC_ARG_VAR([TOR_RUST_TARGET], [Rust target, must be specified when cross-compiling (HOST != BUILD). example: i686-pc-windows-gnu])

603
604
605
606
607
608
609
610
611
612
613
614
615
616
if test "x$enable_rust" = "xyes"; then
  AC_ARG_VAR([RUSTC], [path to the rustc binary])
  AC_CHECK_PROG([RUSTC], [rustc], [rustc],[no])
  if test "x$RUSTC" = "xno"; then
    AC_MSG_ERROR([rustc unavailable but rust integration requested.])
  fi

  AC_ARG_VAR([CARGO], [path to the cargo binary])
  AC_CHECK_PROG([CARGO], [cargo], [cargo],[no])
  if test "x$CARGO" = "xno"; then
    AC_MSG_ERROR([cargo unavailable but rust integration requested.])
  fi

  AC_DEFINE([HAVE_RUST], 1, [have Rust])
617
618
619
620
621
  if test "x$enable_fatal_warnings" = "xyes"; then
    RUST_WARN=
  else
    RUST_WARN=#
  fi
622
623
624
625
626
627
628
629
630
631
  if test "x$enable_cargo_online_mode" = "xyes"; then
    CARGO_ONLINE=
    RUST_DL=#
  else
    CARGO_ONLINE=--frozen
    RUST_DL=

    dnl When we're not allowed to touch the network, we need crate dependencies
    dnl locally available.
    AC_MSG_CHECKING([rust crate dependencies])
632
633
    AC_ARG_VAR([TOR_RUST_DEPENDENCIES], [path to directory with local crate mirror])
    if test "x$TOR_RUST_DEPENDENCIES" = "x"; then
634
      TOR_RUST_DEPENDENCIES="${srcdir}/src/ext/rust/crates"
635
    fi
636
    dnl Check whether the path exists before we try to cd into it.
637
638
    if test ! -d "$TOR_RUST_DEPENDENCIES"; then
      AC_MSG_ERROR([Rust dependency directory $TOR_RUST_DEPENDENCIES does not exist. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
639
      ERRORED=1
640
    fi
641
642
643
644
    dnl Make the path absolute, since we'll be using it from within a
    dnl subdirectory.
    TOR_RUST_DEPENDENCIES=$(cd "$TOR_RUST_DEPENDENCIES" ; pwd)

645
    for dep in $rust_crates; do
646
647
      if test ! -d "$TOR_RUST_DEPENDENCIES"/"$dep"; then
        AC_MSG_ERROR([Failure to find rust dependency $TOR_RUST_DEPENDENCIES/$dep. Specify a dependency directory using the TOR_RUST_DEPENDENCIES variable or allow cargo to fetch crates using --enable-cargo-online-mode.])
648
        ERRORED=1
649
650
      fi
    done
651
652
653
    if test "x$ERRORED" = "x"; then
      AC_MSG_RESULT([yes])
    fi
654
655
656
657
658
  fi

  dnl For now both MSVC and MinGW rust libraries will output static libs with
  dnl the MSVC naming convention.
  if test "$bwin32" = "true"; then
Alex Xu's avatar
Alex Xu committed
659
    tor_rust_static_name=tor_rust.lib
660
  else
Alex Xu's avatar
Alex Xu committed
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
    tor_rust_static_name=libtor_rust.a
  fi

  AC_CANONICAL_BUILD

  if test -n "$TOR_RUST_TARGET"; then
    if test "$host" = "$build"; then
      AC_MSG_ERROR([HOST = BUILD is invalid if TOR_RUST_TARGET is specified, see configure --help for more information.])
    fi
    RUST_TARGET_PROP="target = '$TOR_RUST_TARGET'"
    TOR_RUST_LIB_PATH="src/rust/target/$TOR_RUST_TARGET/release/$tor_rust_static_name"
  else
    if test "$host" != "$build"; then
      AC_MSG_ERROR([TOR_RUST_TARGET must be specified when cross-compiling with Rust enabled.])
    fi
    RUST_TARGET_PROP=
    TOR_RUST_LIB_PATH="src/rust/target/release/$tor_rust_static_name"
678
679
  fi

Alex Xu's avatar
Alex Xu committed
680
681
  AC_SUBST(RUST_TARGET_PROP)
  AC_SUBST(TOR_RUST_LIB_PATH)
682
  AC_SUBST(CARGO_ONLINE)
683
  AC_SUBST(RUST_WARN)
684
685
686
687
  AC_SUBST(RUST_DL)

  dnl Let's check the rustc version, too
  AC_MSG_CHECKING([rust version])
688
  RUSTC_VERSION=`$RUSTC --version`
689
690
691
692
693
  RUSTC_VERSION_MAJOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 1`
  RUSTC_VERSION_MINOR=`$RUSTC --version | cut -d ' ' -f 2 | cut -d '.' -f 2`
  if test "x$RUSTC_VERSION_MAJOR" = "x" -o "x$RUSTC_VERSION_MINOR" = "x"; then
    AC_MSG_ERROR([rustc version couldn't be identified])
  fi
694
695
  if test "$RUSTC_VERSION_MAJOR" -lt 2 -a "$RUSTC_VERSION_MINOR" -lt 31; then
    AC_MSG_ERROR([rustc must be at least version 1.31.0])
696
  fi
697
  AC_MSG_RESULT([$RUSTC_VERSION])
698
699
fi

700
AC_SEARCH_LIBS(socket, [socket network])
701
AC_SEARCH_LIBS(gethostbyname, [nsl])
702
AC_SEARCH_LIBS(dlopen, [dl])
703
AC_SEARCH_LIBS(inet_aton, [resolv])
704
AC_SEARCH_LIBS(backtrace, [execinfo])
705
706
707
708
709
710
saved_LIBS="$LIBS"
AC_SEARCH_LIBS([clock_gettime], [rt])
if test "$LIBS" != "$saved_LIBS"; then
   # Looks like we need -lrt for clock_gettime().
   have_rt=yes
fi
711

712
713
714
715
if test "$bwin32" = "false"; then
  AC_SEARCH_LIBS(pthread_create, [pthread])
  AC_SEARCH_LIBS(pthread_detach, [pthread])
fi
716

717
718
AM_CONDITIONAL(THREADS_WIN32, test "$bwin32" = "true")
AM_CONDITIONAL(THREADS_PTHREADS, test "$bwin32" = "false")
719

720
AC_CHECK_FUNCS(
Nick Mathewson's avatar
Nick Mathewson committed
721
	_NSGetEnviron \
722
723
	RtlSecureZeroMemory \
	SecureZeroMemory \
Nick Mathewson's avatar
Nick Mathewson committed
724
725
726
	accept4 \
	backtrace \
	backtrace_symbols_fd \
727
	eventfd \
728
	explicit_bzero \
729
	timingsafe_memcmp \
Nick Mathewson's avatar
Nick Mathewson committed
730
	flock \
731
	fsync \
Nick Mathewson's avatar
Nick Mathewson committed
732
733
734
	ftime \
	get_current_dir_name \
	getaddrinfo \
735
	getdelim \
Nick Mathewson's avatar
Nick Mathewson committed
736
	getifaddrs \
737
	getline \
Nick Mathewson's avatar
Nick Mathewson committed
738
739
740
	getrlimit \
	gettimeofday \
	gmtime_r \
741
	gnu_get_libc_version \
Nick Mathewson's avatar
Nick Mathewson committed
742
743
744
745
746
747
	inet_aton \
	ioctl \
	issetugid \
	llround \
	localtime_r \
	lround \
748
	madvise \
Nick Mathewson's avatar
Nick Mathewson committed
749
750
	memmem \
	memset_s \
751
	minherit \
Nick Mathewson's avatar
Nick Mathewson committed
752
	mmap \
753
754
	pipe \
	pipe2 \
Nick Mathewson's avatar
Nick Mathewson committed
755
	prctl \
756
	readpassphrase \
Nick Mathewson's avatar
Nick Mathewson committed
757
758
759
	rint \
	sigaction \
	socketpair \
760
	statvfs \
Nick Mathewson's avatar
Nick Mathewson committed
761
762
763
764
	strncasecmp \
	strcasecmp \
	strlcat \
	strlcpy \
765
	strnlen \
Nick Mathewson's avatar
Nick Mathewson committed
766
767
768
769
	strptime \
	strtok_r \
	strtoull \
	sysconf \
770
	sysctl \
Nick Mathewson's avatar
Nick Mathewson committed
771
	truncate \
Nick Mathewson's avatar
Nick Mathewson committed
772
	uname \
773
	usleep \
Nick Mathewson's avatar
Nick Mathewson committed
774
	vasprintf \
775
	_vscprintf
776
)
777

778
# Apple messed up when they added some functions: they
779
# forgot to decorate them with appropriate AVAILABLE_MAC_OS_VERSION
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
# checks.

# We should only probe for these functions if we are sure that we
# are not targeting OS X 10.9 or earlier.
AC_MSG_CHECKING([for a pre-Yosemite OS X build target])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#ifdef __APPLE__
#  include <AvailabilityMacros.h>
#  ifndef MAC_OS_X_VERSION_10_10
#    define MAC_OS_X_VERSION_10_10 101000
#  endif
#  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
#    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_10
#      error "Running on Mac OS X 10.9 or earlier"
#    endif
#  endif
#endif
]], [[]])],
   [on_macos_pre_10_10=no ; AC_MSG_RESULT([no])],
   [on_macos_pre_10_10=yes; AC_MSG_RESULT([yes])])

if test "$on_macos_pre_10_10" = "no"; then
  AC_CHECK_FUNCS(
        mach_approximate_time \
  )
fi

# We should only probe for these functions if we are sure that we
808
# are not targeting OSX 10.11 or earlier.
809
AC_MSG_CHECKING([for a pre-Sierra OSX build target])
810
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
811
812
#ifdef __APPLE__
#  include <AvailabilityMacros.h>
813
814
#  ifndef MAC_OS_X_VERSION_10_12
#    define MAC_OS_X_VERSION_10_12 101200
815
816
#  endif
#  if defined(MAC_OS_X_VERSION_MIN_REQUIRED)
817
#    if MAC_OS_X_VERSION_MIN_REQUIRED < MAC_OS_X_VERSION_10_12
818
819
820
821
#      error "Running on Mac OSX 10.11 or earlier"
#    endif
#  endif
#endif
822
]], [[]])],
823
824
825
826
827
828
829
830
831
832
   [on_macos_pre_10_12=no ; AC_MSG_RESULT([no])],
   [on_macos_pre_10_12=yes; AC_MSG_RESULT([yes])])

if test "$on_macos_pre_10_12" = "no"; then
  AC_CHECK_FUNCS(
        clock_gettime \
        getentropy \
  )
fi

833
if test "$bwin32" != "true"; then
834
835
  AC_CHECK_HEADERS(pthread.h)
  AC_CHECK_FUNCS(pthread_create)
836
  AC_CHECK_FUNCS(pthread_condattr_setclock)
837
838
fi

839
if test "$bwin32" = "true"; then
840
841
842
843
844
845
846
  AC_CHECK_DECLS([SecureZeroMemory, _getwch], , , [
#include <windows.h>
#include <conio.h>
#include <wchar.h>
                 ])
fi

847
848
AM_CONDITIONAL(BUILD_READPASSPHRASE_C,
  test "x$ac_cv_func_readpassphrase" = "xno" && test "$bwin32" = "false")
849

850
851
AC_CHECK_FUNCS(glob)

852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
AC_MSG_CHECKING([whether free(NULL) works])
AC_RUN_IFELSE([AC_LANG_PROGRAM([
  #include <stdlib.h>
], [
char *p = NULL;
free(p);
])],
[free_null_ok=true; AC_MSG_RESULT(yes)],
[free_null_ok=false; AC_MSG_RESULT(no)],
[free_null_ok=cross; AC_MSG_RESULT(cross)])

if test "$free_null_ok" = "false"; then
   AC_MSG_ERROR([Your libc implementation doesn't allow free(NULL), as required by C99.])
fi

867
dnl ------------------------------------------------------
868
dnl Where do you live, libevent?  And how do we call you?
869

870
if test "$bwin32" = "true"; then
871
  TOR_LIB_WS32=-lws2_32
872
  TOR_LIB_IPHLPAPI=-liphlpapi
873
  TOR_LIB_SHLWAPI=-lshlwapi
874
875
  # Some of the cargo-cults recommend -lwsock32 as well, but I don't
  # think it's actually necessary.
876
  TOR_LIB_GDI=-lgdi32
877
  TOR_LIB_USERENV=-luserenv
Nick Mathewson's avatar
   
Nick Mathewson committed
878
else
879
880
  TOR_LIB_WS32=
  TOR_LIB_GDI=
881
  TOR_LIB_USERENV=
Nick Mathewson's avatar
   
Nick Mathewson committed
882
fi
883
884
AC_SUBST(TOR_LIB_WS32)
AC_SUBST(TOR_LIB_GDI)
885
AC_SUBST(TOR_LIB_IPHLPAPI)
886
AC_SUBST(TOR_LIB_SHLWAPI)
887
AC_SUBST(TOR_LIB_USERENV)
Nick Mathewson's avatar
   
Nick Mathewson committed
888

889
tor_libevent_pkg_redhat="libevent"
890
tor_libevent_pkg_debian="libevent-dev"
891
892
893
tor_libevent_devpkg_redhat="libevent-devel"
tor_libevent_devpkg_debian="libevent-dev"

894
895
896
897
dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
dnl linking for static builds.
STATIC_LIBEVENT_FLAGS=""
if test "$enable_static_libevent" = "yes"; then
898
    if test "$have_rt" = "yes"; then
899
900
901
902
903
      STATIC_LIBEVENT_FLAGS=" -lrt "
    fi
fi

TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
904
#ifdef _WIN32
905
906
#include <winsock2.h>
#endif
907
#include <sys/time.h>
Roger Dingledine's avatar
Roger Dingledine committed
908
#include <sys/types.h>
909
#include <event2/event.h>], [
910
#ifdef _WIN32
911
912
#include <winsock2.h>
#endif
913
struct event_base;
914
915
struct event_base *event_base_new(void);
void event_base_free(struct event_base *);],
916
    [
917
#ifdef _WIN32
918
{WSADATA d; WSAStartup(0x101,&d); }
919
#endif
Alex Xu's avatar
Alex Xu committed
920
event_base_free(event_base_new());
921
], [--with-libevent-dir], [/opt/libevent])
922

923
dnl Determine the incantation needed to link libevent.
924
925
save_LIBS="$LIBS"
save_LDFLAGS="$LDFLAGS"
926
save_CPPFLAGS="$CPPFLAGS"
927
928

LIBS="$STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $save_LIBS"
929
LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
930
CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
931

932
933
AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)

934
935
936
937
if test "$enable_static_libevent" = "yes"; then
   if test "$tor_cv_library_libevent_dir" = "(system)"; then
     AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
   else
938
     TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
939
940
   fi
else
941
     if test "x$ac_cv_header_event2_event_h" = "xyes"; then
Nick Mathewson's avatar
Nick Mathewson committed
942
943
       AC_SEARCH_LIBS(event_new, [event event_core], , AC_MSG_ERROR("libevent2 is installed but linking it failed while searching for event_new"))
       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"))
944

945
       if test "$ac_cv_search_event_new" != "none required"; then
946
947
         TOR_LIBEVENT_LIBS="$ac_cv_search_event_new"
       fi
948
       if test "$ac_cv_search_evdns_base_new" != "none required"; then
949
950
951
         TOR_LIBEVENT_LIBS="$ac_cv_search_evdns_base_new $TOR_LIBEVENT_LIBS"
       fi
     else
952
       AC_MSG_ERROR("libevent2 is required but the headers could not be found")
953
     fi
954
955
fi

956
957
958
dnl Now check for particular libevent functions.
AC_CHECK_FUNCS([evutil_secure_rng_set_urandom_device_file \
                evutil_secure_rng_add_bytes \
959
960
                evdns_base_get_nameserver_addr \

961
962
])

963
964
965
966
LIBS="$save_LIBS"
LDFLAGS="$save_LDFLAGS"
CPPFLAGS="$save_CPPFLAGS"

967
968
969
970
971
dnl Check that libevent is at least at version 2.0.10, the first stable
dnl release of its series
CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
AC_MSG_CHECKING([whether Libevent is new enough])
AC_COMPILE_IFELSE([AC_LANG_SOURCE([
972
#include <event2/event.h>
973
#if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000a00
974
975
976
977
978
#error
int x = y(zz);
#else
int x = 1;
#endif
979
980
981
982
983
984
985
986
])], [ AC_MSG_RESULT([yes]) ],
   [ AC_MSG_RESULT([no])
     AC_MSG_ERROR([Libevent is not new enough.  We require 2.0.10-stable or later]) ] )

LIBS="$save_LIBS"
LDFLAGS="$save_LDFLAGS"
CPPFLAGS="$save_CPPFLAGS"

987
AC_SUBST(TOR_LIBEVENT_LIBS)
988

989
990
991
992
993
994
995
dnl ------------------------------------------------------
dnl Where do you live, libm?

dnl On some platforms (Haiku/BeOS) the math library is
dnl part of libroot. In which case don't link against lm
TOR_LIB_MATH=""
save_LIBS="$LIBS"
996
997
998
AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
if test "$ac_cv_search_pow" != "none required"; then
    TOR_LIB_MATH="$ac_cv_search_pow"
999
1000
1001
1002
fi
LIBS="$save_LIBS"
AC_SUBST(TOR_LIB_MATH)

1003
1004
1005
1006
1007
1008
dnl ------------------------------------------------------
dnl Hello, NSS.  You're new around here.
if test "x$enable_nss" = "xyes"; then
  PKG_CHECK_MODULES(NSS,
     [nss],
     [have_nss=yes],
1009
     [have_nss=no; AC_MSG_ERROR([You asked for NSS but I can't find it, $pkg_config_user_action, or set NSS_CFLAGS and NSS_LIBS.])])
1010
1011
1012
1013
  AC_SUBST(NSS_CFLAGS)
  AC_SUBST(NSS_LIBS)
fi

1014
dnl ------------------------------------------------------
1015
dnl Where do you live, openssl?  And how do we call you?
1016

1017
1018
if test "x$enable_nss" != "xyes"; then

1019
tor_openssl_pkg_redhat="openssl"
1020
tor_openssl_pkg_debian="libssl-dev"
1021
1022
1023
tor_openssl_devpkg_redhat="openssl-devel"
tor_openssl_devpkg_debian="libssl-dev"

1024
1025
ALT_openssl_WITHVAL=""
AC_ARG_WITH(ssl-dir,
1026
  AS_HELP_STRING(--with-ssl-dir=PATH, [obsolete alias for --with-openssl-dir]),
1027
  [
1028
      if test "x$withval" != "xno" && test "x$withval" != "x"; then
1029
1030
1031
1032
         ALT_openssl_WITHVAL="$withval"
      fi
  ])

1033
AC_MSG_NOTICE([Now, we'll look for OpenSSL >= 1.0.1])
1034
TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI $TOR_LIB_WS32],
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
    [#include <openssl/ssl.h>
     char *getenv(const char *);],
    [struct ssl_cipher_st;
     unsigned SSL_CIPHER_get_id(const struct ssl_cipher_st *);
     char *getenv(const char *);],
    dnl This funny-looking test program calls getenv, so that the compiler
    dnl will neither make code that call SSL_CIPHER_get_id(NULL) [producing
    dnl a crash], nor optimize out the call to SSL_CIPHER_get_id().
    dnl We look for SSL_cipher_get_id() because it is present in
    dnl OpenSSL >=1.0.1, because it is not deprecated, and because Tor
    dnl depends on it.
    [if (getenv("THIS_SHOULDNT_BE_SET_X201803")) SSL_CIPHER_get_id((void *)0);], [],
1047
    [/usr/local/opt/openssl /usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /opt/openssl])
1048

1049
1050
1051
1052
if test "$enable_static_openssl" = "yes"; then
   if test "$tor_cv_library_openssl_dir" = "(system)"; then
     AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
   else
1053
     TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
1054
1055
   fi
else
1056
     TOR_OPENSSL_LIBS="-lssl -lcrypto"
1057
1058
1059
fi
AC_SUBST(TOR_OPENSSL_LIBS)

1060
dnl Now validate openssl, and check for particular openssl functions.
1061
1062
1063
1064
1065
1066
save_LIBS="$LIBS"
save_LDFLAGS="$LDFLAGS"
save_CPPFLAGS="$CPPFLAGS"
LIBS="$TOR_OPENSSL_LIBS $LIBS"
LDFLAGS="$TOR_LDFLAGS_openssl $LDFLAGS"
CPPFLAGS="$TOR_CPPFLAGS_openssl $CPPFLAGS"
1067

1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
dnl Tor currently uses a number of APIs that are deprecated in OpenSSL 3.0.0
dnl and later.  We want to migrate away from them, but that will be a lot of
dnl work. (See ticket tor#40166.)  For now, we disable the deprecation
dnl warnings.

AC_MSG_CHECKING([for OpenSSL >= 3.0.0])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
#include <openssl/opensslv.h>
#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER <= 0x30000000L
#error "you_have_version_3"
#endif
   ]], [[]])],
   [ AC_MSG_RESULT([no]) ],
   [ AC_MSG_RESULT([yes]);
     AC_DEFINE(OPENSSL_SUPPRESS_DEPRECATED, 1, [disable openssl deprecated-function warnings]) ])

AC_MSG_CHECKING([for OpenSSL < 1.0.1])
1085
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1086
#include <openssl/opensslv.h>
1087
#if !defined(LIBRESSL_VERSION_NUMBER) && OPENSSL_VERSION_NUMBER < 0x1000100fL
1088
1089
#error "too old"
#endif
1090
   ]], [[]])],
1091
   [ AC_MSG_RESULT([no]) ],
1092
   [ 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.]) ])
1093

1094
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[
1095
1096
1097
1098
1099
1100
1101
1102
#include <openssl/opensslv.h>
#include <openssl/evp.h>
#if defined(OPENSSL_NO_EC) || defined(OPENSSL_NO_ECDH) || defined(OPENSSL_NO_ECDSA)
#error "no ECC"
#endif
#if !defined(NID_X9_62_prime256v1) || !defined(NID_secp224r1)
#error "curves unavailable"
#endif
1103
   ]], [[]])],