1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2015, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.6.2-alpha-dev])
7 AC_CONFIG_SRCDIR([src/or/main.c])
8 AC_CONFIG_MACRO_DIR([m4])
10 m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])
11 AC_CONFIG_HEADERS([orconfig.h])
17 if test -f /etc/redhat-release ; then
18 if test -f /usr/kerberos/include ; then
19 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
23 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
24 # the += operator on it in src/or/Makefile.am
25 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
27 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
28 AC_ARG_ENABLE(buf-freelists,
29 AS_HELP_STRING(--enable-buf-freelists, enable freelists for buffer RAM))
30 AC_ARG_ENABLE(mempools,
31 AS_HELP_STRING(--enable-mempools, enable mempools for relay cells))
32 AC_ARG_ENABLE(openbsd-malloc,
33 AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
34 AC_ARG_ENABLE(instrument-downloads,
35 AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
36 AC_ARG_ENABLE(static-openssl,
37 AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
38 AC_ARG_ENABLE(static-libevent,
39 AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
40 AC_ARG_ENABLE(static-zlib,
41 AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
42 AC_ARG_ENABLE(static-tor,
43 AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
44 AC_ARG_ENABLE(unittests,
45 AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!]))
46 AC_ARG_ENABLE(coverage,
47 AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build]))
49 AM_CONDITIONAL(UNITTESTS_ENABLED, test x$enable_unittests != xno)
50 AM_CONDITIONAL(COVERAGE_ENABLED, test x$enable_coverage = xyes)
52 if test "$enable_static_tor" = "yes"; then
53 enable_static_libevent="yes";
54 enable_static_openssl="yes";
55 enable_static_zlib="yes";
56 CFLAGS="$CFLAGS -static"
59 if test x$enable_buf_freelists = xyes; then
60 AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
61 [Defined if we try to use freelists for buffer RAM chunks])
64 AM_CONDITIONAL(USE_MEMPOOLS, test x$enable_mempools = xyes)
65 if test x$enable_mempools = xyes; then
66 AC_DEFINE(ENABLE_MEMPOOLS, 1,
67 [Defined if we try to use mempools for cells being relayed])
70 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
71 if test x$enable_instrument_downloads = xyes; then
72 AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
73 [Defined if we want to keep track of how much of each kind of resource we download.])
76 AC_ARG_ENABLE(transparent,
77 AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
78 [case "${enableval}" in
79 yes) transparent=true ;;
80 no) transparent=false ;;
81 *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
82 esac], [transparent=true])
84 AC_ARG_ENABLE(asciidoc,
85 AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
86 [case "${enableval}" in
89 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
90 esac], [asciidoc=true])
92 # By default, we're not ready to ship a NAT-PMP aware Tor
93 AC_ARG_ENABLE(nat-pmp,
94 AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
95 [case "${enableval}" in
98 * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
99 esac], [natpmp=false])
101 # By default, we're not ready to ship a UPnP aware Tor
103 AS_HELP_STRING(--enable-upnp, enable UPnP support),
104 [case "${enableval}" in
107 * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
110 # systemd notify support
111 AC_ARG_ENABLE(systemd,
112 AS_HELP_STRING(--enable-systemd, enable systemd notification support),
113 [case "${enableval}" in
116 * ) AC_MSG_ERROR(bad value for --enable-systemd) ;;
117 esac], [systemd=auto])
122 if test x$enable_systemd = xfalse ; then
125 PKG_CHECK_MODULES(SYSTEMD,
131 if test x$have_systemd = xyes; then
132 AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd])
133 CFLAGS="${CFLAGS} ${SYSTEMD_CFLAGS}"
134 TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}"
136 AC_SUBST(TOR_SYSTEMD_LIBS)
138 if test x$enable_systemd = xyes -a x$have_systemd != xyes ; then
139 AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found])
142 AC_ARG_ENABLE(threads,
143 AS_HELP_STRING(--disable-threads, disable multi-threading support))
145 if test x$enable_threads = x; then
148 # Don't try multithreading on solaris -- cpuworkers seem to lock.
149 AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
150 cpu workers lock up here, so I will disable threads.])
151 enable_threads="no";;
153 enable_threads="yes";;
157 ifdef([HAVE_SYSTEMD], [
158 AC_SEARCH_LIBS([sd_watchdog_enabled], [systemd-daemon],
159 [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], [])
164 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
168 AC_ARG_ENABLE(gcc-warnings,
169 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
170 AC_ARG_ENABLE(gcc-warnings-advisory,
171 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
173 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
174 AC_ARG_ENABLE(gcc-hardening,
175 AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
177 AC_ARG_ENABLE(expensive-hardening,
178 AS_HELP_STRING(--enable-expensive-hardening, enable more expensive compiler hardening; makes Tor slower))
180 dnl Linker hardening options
181 dnl Currently these options are ELF specific - you can't use this with MacOSX
182 AC_ARG_ENABLE(linker-hardening,
183 AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
185 AC_ARG_ENABLE(local-appdata,
186 AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
187 if test "$enable_local_appdata" = "yes"; then
188 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
189 [Defined if we default to host local appdata paths on Windows])
193 AC_ARG_ENABLE(tor2web-mode,
194 AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
195 [if test x$enableval = xyes; then
196 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
199 AC_ARG_ENABLE(bufferevents,
200 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
202 AC_ARG_ENABLE(tool-name-check,
203 AS_HELP_STRING(--disable-tool-name-check, check for sanely named toolchain when cross-compiling))
205 AC_ARG_ENABLE(seccomp,
206 AS_HELP_STRING(--disable-seccomp, do not attempt to use libseccomp))
208 AC_ARG_ENABLE(libscrypt,
209 AS_HELP_STRING(--disable-libscrypt, do not attempt to use libscrypt))
211 dnl check for the correct "ar" when cross-compiling
212 AN_MAKEVAR([AR], [AC_PROG_AR])
213 AN_PROGRAM([ar], [AC_PROG_AR])
214 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
217 dnl Check whether the above macro has settled for a simply named tool even
218 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
219 dnl because that will find any cc on the system, not only the cross-compiler,
220 dnl and then verify that a binary built with this compiler runs on the
221 dnl build system. It will then come to the false conclusion that we're not
223 if test x$enable_tool_name_check != xno; then
224 if test x$ac_tool_warned = xyes; then
225 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.)])
226 elif test "x$ac_ct_AR" != x -a x$cross_compiling = xmaybe; then
227 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.)])
236 dnl autoconf 2.59 appears not to support AC_PROG_SED
237 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
239 dnl check for asciidoc and a2x
240 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
241 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
243 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
245 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
246 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
247 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
252 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
253 if test "x$PYTHON" = "x"; then
254 AC_MSG_WARN([Python unavailable; some tests will not be run.])
256 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
258 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
259 AC_C_FLEXIBLE_ARRAY_MEMBER
261 dnl Maybe we've got an old autoconf...
262 AC_CACHE_CHECK([for flexible array members],
266 struct abc { int a; char b[]; };
268 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
271 [tor_cv_c_flexarray=yes],
272 [tor_cv_c_flexarray=no])])
273 if test $tor_cv_flexarray = yes ; then
274 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
276 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
280 AC_CACHE_CHECK([for working C99 mid-block declaration syntax],
283 [AC_LANG_PROGRAM([], [int x; x = 3; int y; y = 4 + x;])],
284 [tor_cv_c_c99_decl=yes],
285 [tor_cv_c_c99_decl=no] )])
286 if test "$tor_cv_c_c99_decl" != "yes"; then
287 AC_MSG_ERROR([Your compiler doesn't support c99 mid-block declarations. This is required as of Tor 0.2.6.x])
290 AC_CACHE_CHECK([for working C99 designated initializers],
291 tor_cv_c_c99_designated_init,
293 [AC_LANG_PROGRAM([struct s { int a; int b; };],
294 [[ struct s ss = { .b = 5, .a = 6 }; ]])],
295 [tor_cv_c_c99_designated_init=yes],
296 [tor_cv_c_c99_designated_init=no] )])
298 if test "$tor_cv_c_c99_designated_init" != "yes"; then
299 AC_MSG_ERROR([Your compiler doesn't support c99 designated initializers. This is required as of Tor 0.2.6.x])
302 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
303 AC_PATH_PROG([OPENSSL], [openssl], none)
306 AC_ARG_WITH(tor-user,
307 [ --with-tor-user=NAME Specify username for tor daemon ],
315 AC_ARG_WITH(tor-group,
316 [ --with-tor-group=NAME Specify group name for tor daemon ],
324 dnl If _WIN32 is defined and non-zero, we are building for win32
325 AC_MSG_CHECKING([for win32])
326 AC_RUN_IFELSE([AC_LANG_SOURCE([
327 int main(int c, char **v) {
338 bwin32=true; AC_MSG_RESULT([yes]),
339 bwin32=false; AC_MSG_RESULT([no]),
340 bwin32=cross; AC_MSG_RESULT([cross])
343 if test "$bwin32" = cross; then
344 AC_MSG_CHECKING([for win32 (cross)])
345 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
347 int main(int c, char **v) {return 0;}
350 int main(int c, char **v) {return x(y);}
353 bwin32=true; AC_MSG_RESULT([yes]),
354 bwin32=false; AC_MSG_RESULT([no]))
357 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
359 dnl Enable C99 when compiling with MIPSpro
360 AC_MSG_CHECKING([for MIPSpro compiler])
361 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
362 #if (defined(__sgi) && defined(_COMPILER_VERSION))
367 bmipspro=false; AC_MSG_RESULT(no),
368 bmipspro=true; AC_MSG_RESULT(yes))
370 if test "$bmipspro" = true; then
371 CFLAGS="$CFLAGS -c99"
376 AC_SEARCH_LIBS(socket, [socket network])
377 AC_SEARCH_LIBS(gethostbyname, [nsl])
378 AC_SEARCH_LIBS(dlopen, [dl])
379 AC_SEARCH_LIBS(inet_aton, [resolv])
381 AC_SEARCH_LIBS([clock_gettime], [rt])
382 if test "$LIBS" != "$saved_LIBS"; then
383 # Looks like we need -lrt for clock_gettime().
387 AC_SEARCH_LIBS(pthread_create, [pthread])
388 AC_SEARCH_LIBS(pthread_detach, [pthread])
390 dnl -------------------------------------------------------------------
391 dnl Check for functions before libevent, since libevent-1.2 apparently
392 dnl exports strlcpy without defining it in a header.
398 backtrace_symbols_fd \
432 if test "$bwin32" != true; then
433 AC_CHECK_HEADERS(pthread.h)
434 AC_CHECK_FUNCS(pthread_create)
437 dnl ------------------------------------------------------
438 dnl Where do you live, libevent? And how do we call you?
440 if test "$bwin32" = true; then
441 TOR_LIB_WS32=-lws2_32
442 TOR_LIB_IPHLPAPI=-liphlpapi
443 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
444 # think it's actually necessary.
450 AC_SUBST(TOR_LIB_WS32)
451 AC_SUBST(TOR_LIB_GDI)
452 AC_SUBST(TOR_LIB_IPHLPAPI)
454 dnl We need to do this before we try our disgusting hack below.
455 AC_CHECK_HEADERS([sys/types.h])
457 dnl This is a disgusting hack so we safely include older libevent headers.
458 AC_CHECK_TYPE(u_int64_t, unsigned long long)
459 AC_CHECK_TYPE(u_int32_t, unsigned long)
460 AC_CHECK_TYPE(u_int16_t, unsigned short)
461 AC_CHECK_TYPE(u_int8_t, unsigned char)
463 tor_libevent_pkg_redhat="libevent"
464 tor_libevent_pkg_debian="libevent-dev"
465 tor_libevent_devpkg_redhat="libevent-devel"
466 tor_libevent_devpkg_debian="libevent-dev"
468 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
469 dnl linking for static builds.
470 STATIC_LIBEVENT_FLAGS=""
471 if test "$enable_static_libevent" = "yes"; then
472 if test "$have_rt" = yes; then
473 STATIC_LIBEVENT_FLAGS=" -lrt "
477 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
479 #include <winsock2.h>
482 #include <sys/time.h>
483 #include <sys/types.h>
484 #include <event.h>], [
486 #include <winsock2.h>
488 void exit(int); void *event_init(void);],
491 {WSADATA d; WSAStartup(0x101,&d); }
493 event_init(); exit(0);
494 ], [--with-libevent-dir], [/opt/libevent])
496 dnl Now check for particular libevent functions.
498 save_LDFLAGS="$LDFLAGS"
499 save_CPPFLAGS="$CPPFLAGS"
500 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
501 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
502 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
503 AC_CHECK_FUNCS([event_get_version \
504 event_get_version_number \
506 event_set_log_callback \
507 evutil_secure_rng_set_urandom_device_file \
508 evutil_secure_rng_init \
509 event_base_loopexit])
510 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
514 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
517 LDFLAGS="$save_LDFLAGS"
518 CPPFLAGS="$save_CPPFLAGS"
521 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
523 if test "$enable_static_libevent" = "yes"; then
524 if test "$tor_cv_library_libevent_dir" = "(system)"; then
525 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
527 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
530 TOR_LIBEVENT_LIBS="-levent"
533 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
534 dnl we can do much better.
535 if test "$enable_bufferevents" = "yes" ; then
536 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
537 AC_MSG_ERROR([You've asked for bufferevent support, but you're using a version of Libevent without SSL support. This won't work. We need Libevent 2.0.8-rc or later, and you don't seem to even have Libevent 2.0.3-alpha.])
540 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
542 # Check for the right version. First see if version detection works.
543 AC_MSG_CHECKING([whether we can detect the Libevent version])
544 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
545 #include <event2/event.h>
546 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
552 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
553 [event_version_number_works=no; AC_MSG_RESULT([no])])
554 if test "$event_version_number_works" != 'yes'; then
555 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
557 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
558 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
559 #include <event2/event.h>
560 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
566 ])], [ AC_MSG_RESULT([yes]) ],
567 [ AC_MSG_RESULT([no])
568 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
574 LDFLAGS="$save_LDFLAGS"
575 CPPFLAGS="$save_CPPFLAGS"
577 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
578 if test "$enable_bufferevents" = "yes"; then
579 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
580 if test "$enable_static_libevent" = "yes"; then
581 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
583 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
586 AC_SUBST(TOR_LIBEVENT_LIBS)
588 dnl ------------------------------------------------------
589 dnl Where do you live, libm?
591 dnl On some platforms (Haiku/BeOS) the math library is
592 dnl part of libroot. In which case don't link against lm
595 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
596 if test "$ac_cv_search_pow" != "none required"; then
597 TOR_LIB_MATH="$ac_cv_search_pow"
600 AC_SUBST(TOR_LIB_MATH)
602 dnl ------------------------------------------------------
603 dnl Where do you live, openssl? And how do we call you?
605 tor_openssl_pkg_redhat="openssl"
606 tor_openssl_pkg_debian="libssl-dev"
607 tor_openssl_devpkg_redhat="openssl-devel"
608 tor_openssl_devpkg_debian="libssl-dev"
610 ALT_openssl_WITHVAL=""
612 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
614 if test "x$withval" != xno && test "x$withval" != "x" ; then
615 ALT_openssl_WITHVAL="$withval"
619 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
620 [#include <openssl/rand.h>],
621 [void RAND_add(const void *buf, int num, double entropy);],
622 [RAND_add((void*)0,0,0); exit(0);], [],
623 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
625 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
627 if test "$enable_static_openssl" = "yes"; then
628 if test "$tor_cv_library_openssl_dir" = "(system)"; then
629 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
631 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
634 TOR_OPENSSL_LIBS="-lssl -lcrypto"
636 AC_SUBST(TOR_OPENSSL_LIBS)
638 AC_CHECK_MEMBERS([struct ssl_method_st.get_cipher_by_char], , ,
639 [#include <openssl/ssl.h>
642 dnl ------------------------------------------------------
643 dnl Where do you live, zlib? And how do we call you?
645 tor_zlib_pkg_redhat="zlib"
646 tor_zlib_pkg_debian="zlib1g"
647 tor_zlib_devpkg_redhat="zlib-devel"
648 tor_zlib_devpkg_debian="zlib1g-dev"
650 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
652 [const char * zlibVersion(void);],
653 [zlibVersion(); exit(0);], [--with-zlib-dir],
656 if test "$enable_static_zlib" = "yes"; then
657 if test "$tor_cv_library_zlib_dir" = "(system)"; then
658 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
659 using --enable-static-zlib")
661 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
666 AC_SUBST(TOR_ZLIB_LIBS)
668 dnl ---------------------------------------------------------------------
669 dnl Now that we know about our major libraries, we can check for compiler
670 dnl and linker hardening options. We need to do this with the libraries known,
671 dnl since sometimes the linker will like an option but not be willing to
672 dnl use it with a build of a library.
674 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
675 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"
677 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
678 #if !defined(__clang__)
680 #endif])], have_clang=yes, have_clang=no)
682 if test x$enable_gcc_hardening != xno; then
683 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
684 if test x$have_clang = xyes; then
685 TOR_CHECK_CFLAGS(-Qunused-arguments)
687 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
688 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
689 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
690 m4_ifdef([AS_VAR_IF],[
691 AS_VAR_IF(can_compile, [yes],
692 AS_VAR_IF(can_link, [yes],
694 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.)]))
696 AS_VAR_POPDEF([can_link])
697 AS_VAR_POPDEF([can_compile])
698 TOR_CHECK_CFLAGS(-Wstack-protector)
699 TOR_CHECK_CFLAGS(-fwrapv)
700 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
701 if test "$bwin32" = "false"; then
702 TOR_CHECK_CFLAGS(-fPIE)
703 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
707 if test x$enable_expensive_hardening = xyes ; then
708 TOR_CHECK_CFLAGS([-fsanitize=address])
709 TOR_CHECK_CFLAGS([-fsanitize=undefined])
710 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
713 if test x$enable_linker_hardening != xno; then
714 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
717 # For backtrace support
718 TOR_CHECK_LDFLAGS(-rdynamic)
720 dnl ------------------------------------------------------
721 dnl Now see if we have a -fomit-frame-pointer compiler option.
723 saved_CFLAGS="$CFLAGS"
724 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
725 F_OMIT_FRAME_POINTER=''
726 if test "$saved_CFLAGS" != "$CFLAGS"; then
727 if test x$enable_expensive_hardening != xyes ; then
728 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
731 CFLAGS="$saved_CFLAGS"
732 AC_SUBST(F_OMIT_FRAME_POINTER)
734 dnl ------------------------------------------------------
735 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
736 dnl for us, as GCC 4.6 and later do at many optimization levels), then
737 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
739 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
741 dnl ------------------------------------------------------
742 dnl Where do you live, libnatpmp? And how do we call you?
743 dnl There are no packages for Debian or Redhat as of this patch
745 if test "$natpmp" = "true"; then
746 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
747 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
748 [#include <natpmp.h>],
752 #include <natpmp.h>],
755 natpmpresp_t response;
756 r = initnatpmp(&natpmp, 0, 0);],
757 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
759 [--with-libnatpmp-dir],
764 dnl ------------------------------------------------------
765 dnl Where do you live, libminiupnpc? And how do we call you?
766 dnl There are no packages for Debian or Redhat as of this patch
768 if test "$upnp" = "true"; then
769 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
771 dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
772 dnl to see if we have miniupnpc-1.5 or -1.6
773 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
774 [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
776 if test "$miniupnpc15" = "true" ; then
777 AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
778 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
779 [#include <miniupnpc/miniwget.h>
780 #include <miniupnpc/miniupnpc.h>
781 #include <miniupnpc/upnpcommands.h>],
782 [void upnpDiscover(int delay, const char * multicastif,
783 const char * minissdpdsock, int sameport);],
784 [upnpDiscover(1, 0, 0, 0); exit(0);],
785 [--with-libminiupnpc-dir],
788 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
789 [#include <miniupnpc/miniwget.h>
790 #include <miniupnpc/miniupnpc.h>
791 #include <miniupnpc/upnpcommands.h>],
792 [void upnpDiscover(int delay, const char * multicastif,
793 const char * minissdpdsock, int sameport, int ipv6, int * error);],
794 [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
795 [--with-libminiupnpc-dir],
800 dnl ============================================================
801 dnl Check for libseccomp
803 if test "x$enable_seccomp" != "xno"; then
804 AC_CHECK_HEADERS([seccomp.h])
805 AC_SEARCH_LIBS(seccomp_init, [seccomp])
808 dnl ============================================================
809 dnl Check for libscrypt
811 if test "x$enable_libscrypt" != "xno"; then
812 AC_CHECK_HEADERS([libscrypt.h])
813 AC_SEARCH_LIBS(libscrypt_scrypt, [scrypt])
816 dnl ============================================================
817 dnl We need an implementation of curve25519.
819 dnl set these defaults.
820 build_curve25519_donna=no
821 build_curve25519_donna_c64=no
822 use_curve25519_donna=no
823 use_curve25519_nacl=no
826 dnl The best choice is using curve25519-donna-c64, but that requires
828 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
829 tor_cv_can_use_curve25519_donna_c64,
831 [AC_LANG_PROGRAM([dnl
833 typedef unsigned uint128_t __attribute__((mode(TI)));
834 int func(uint64_t a, uint64_t b) {
835 uint128_t c = ((uint128_t)a) * b;
836 int ok = ((uint64_t)(c>>96)) == 522859 &&
837 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
838 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
839 (((uint64_t)(c))&0xffffffffL) == 0;
843 int ok = func( ((uint64_t)2000000000) * 1000000000,
844 ((uint64_t)1234567890) << 24);
847 [tor_cv_can_use_curve25519_donna_c64=yes],
848 [tor_cv_can_use_curve25519_donna_c64=no],
850 [AC_LANG_PROGRAM([dnl
852 typedef unsigned uint128_t __attribute__((mode(TI)));
853 int func(uint64_t a, uint64_t b) {
854 uint128_t c = ((uint128_t)a) * b;
855 int ok = ((uint64_t)(c>>96)) == 522859 &&
856 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
857 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
858 (((uint64_t)(c))&0xffffffffL) == 0;
862 int ok = func( ((uint64_t)2000000000) * 1000000000,
863 ((uint64_t)1234567890) << 24);
866 [tor_cv_can_use_curve25519_donna_c64=cross],
867 [tor_cv_can_use_curve25519_donna_c64=no])])])
869 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
870 nacl/crypto_scalarmult_curve25519.h])
872 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
873 tor_cv_can_use_curve25519_nacl,
874 [tor_saved_LIBS="$LIBS"
877 [AC_LANG_PROGRAM([dnl
878 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
879 #include <crypto_scalarmult_curve25519.h>
880 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
881 #include <nacl/crypto_scalarmult_curve25519.h>
883 #ifdef crypto_scalarmult_curve25519_ref_BYTES
884 #error Hey, this is the reference implementation! That's not fast.
887 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
888 ])], [tor_cv_can_use_curve25519_nacl=yes],
889 [tor_cv_can_use_curve25519_nacl=no])
890 LIBS="$tor_saved_LIBS" ])
892 dnl Okay, now we need to figure out which one to actually use. Fall back
893 dnl to curve25519-donna.c
895 if test x$tor_cv_can_use_curve25519_donna_c64 != xno; then
896 build_curve25519_donna_c64=yes
897 use_curve25519_donna=yes
898 elif test x$tor_cv_can_use_curve25519_nacl = xyes; then
899 use_curve25519_nacl=yes
900 CURVE25519_LIBS=-lnacl
902 build_curve25519_donna=yes
903 use_curve25519_donna=yes
906 if test x$use_curve25519_donna = xyes; then
907 AC_DEFINE(USE_CURVE25519_DONNA, 1,
908 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
910 if test x$use_curve25519_nacl = xyes; then
911 AC_DEFINE(USE_CURVE25519_NACL, 1,
912 [Defined if we should use a curve25519 from nacl])
914 AM_CONDITIONAL(BUILD_CURVE25519_DONNA, test x$build_curve25519_donna = xyes)
915 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, test x$build_curve25519_donna_c64 = xyes)
916 AC_SUBST(CURVE25519_LIBS)
918 dnl Make sure to enable support for large off_t if available.
933 , , AC_MSG_WARN(Some headers were not found, compilation may fail. If compilation succeeds, please send your orconfig.h to the developers so we can fix this warning.))
935 dnl These headers are not essential
975 AC_CHECK_HEADERS(sys/param.h)
977 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
978 [#ifdef HAVE_SYS_TYPES_H
979 #include <sys/types.h>
981 #ifdef HAVE_SYS_SOCKET_H
982 #include <sys/socket.h>
984 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
985 [#ifdef HAVE_SYS_TYPES_H
986 #include <sys/types.h>
988 #ifdef HAVE_SYS_SOCKET_H
989 #include <sys/socket.h>
995 AC_CHECK_HEADERS(linux/if.h,[],[],
997 #ifdef HAVE_SYS_SOCKET_H
998 #include <sys/socket.h>
1002 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
1003 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
1004 [#ifdef HAVE_SYS_TYPES_H
1005 #include <sys/types.h>
1007 #ifdef HAVE_SYS_SOCKET_H
1008 #include <sys/socket.h>
1010 #ifdef HAVE_LIMITS_H
1013 #ifdef HAVE_LINUX_TYPES_H
1014 #include <linux/types.h>
1016 #ifdef HAVE_NETINET_IN6_H
1017 #include <netinet/in6.h>
1019 #ifdef HAVE_NETINET_IN_H
1020 #include <netinet/in.h>
1023 AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h,
1024 linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0,
1025 [#ifdef HAVE_SYS_TYPES_H
1026 #include <sys/types.h>
1028 #ifdef HAVE_SYS_SOCKET_H
1029 #include <sys/socket.h>
1031 #ifdef HAVE_LIMITS_H
1034 #ifdef HAVE_LINUX_TYPES_H
1035 #include <linux/types.h>
1037 #ifdef HAVE_NETINET_IN6_H
1038 #include <netinet/in6.h>
1040 #ifdef HAVE_NETINET_IN_H
1041 #include <netinet/in.h>
1043 #ifdef HAVE_LINUX_IF_H
1044 #include <linux/if.h>
1047 if test x$transparent = xtrue ; then
1049 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
1052 if test x$linux_netfilter_ipv4 = x1 ; then
1055 if test x$linux_netfilter_ipv6_ip6_tables = x1 ; then
1058 if test x$transparent_ok = x1 ; then
1059 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
1061 *-*-openbsd* | *-*-bitrig*)
1062 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
1065 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
1069 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
1070 [#ifdef HAVE_SYS_TYPES_H
1071 #include <sys/types.h>
1073 #ifdef HAVE_SYS_TIME_H
1074 #include <sys/time.h>
1077 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
1080 AC_CHECK_SIZEOF(int8_t)
1081 AC_CHECK_SIZEOF(int16_t)
1082 AC_CHECK_SIZEOF(int32_t)
1083 AC_CHECK_SIZEOF(int64_t)
1084 AC_CHECK_SIZEOF(uint8_t)
1085 AC_CHECK_SIZEOF(uint16_t)
1086 AC_CHECK_SIZEOF(uint32_t)
1087 AC_CHECK_SIZEOF(uint64_t)
1088 AC_CHECK_SIZEOF(intptr_t)
1089 AC_CHECK_SIZEOF(uintptr_t)
1091 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
1093 AC_CHECK_SIZEOF(char)
1094 AC_CHECK_SIZEOF(short)
1095 AC_CHECK_SIZEOF(int)
1096 AC_CHECK_SIZEOF(long)
1097 AC_CHECK_SIZEOF(long long)
1098 AC_CHECK_SIZEOF(__int64)
1099 AC_CHECK_SIZEOF(void *)
1100 AC_CHECK_SIZEOF(time_t)
1101 AC_CHECK_SIZEOF(size_t)
1102 AC_CHECK_SIZEOF(pid_t)
1104 AC_CHECK_TYPES([uint, u_char, ssize_t])
1106 AC_PC_FROM_UCONTEXT([/bin/true])
1108 dnl used to include sockaddr_storage, but everybody has that.
1109 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1110 [#ifdef HAVE_SYS_TYPES_H
1111 #include <sys/types.h>
1113 #ifdef HAVE_NETINET_IN_H
1114 #include <netinet/in.h>
1116 #ifdef HAVE_NETINET_IN6_H
1117 #include <netinet/in6.h>
1119 #ifdef HAVE_SYS_SOCKET_H
1120 #include <sys/socket.h>
1123 #define _WIN32_WINNT 0x0501
1124 #define WIN32_LEAN_AND_MEAN
1125 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1126 #include <winsock.h>
1128 #include <winsock2.h>
1129 #include <ws2tcpip.h>
1133 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1134 [#ifdef HAVE_SYS_TYPES_H
1135 #include <sys/types.h>
1137 #ifdef HAVE_NETINET_IN_H
1138 #include <netinet/in.h>
1140 #ifdef HAVE_NETINET_IN6_H
1141 #include <netinet/in6.h>
1143 #ifdef HAVE_SYS_SOCKET_H
1144 #include <sys/socket.h>
1147 #define _WIN32_WINNT 0x0501
1148 #define WIN32_LEAN_AND_MEAN
1149 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1150 #include <winsock.h>
1152 #include <winsock2.h>
1153 #include <ws2tcpip.h>
1158 AC_CHECK_TYPES([rlim_t], , ,
1159 [#ifdef HAVE_SYS_TYPES_H
1160 #include <sys/types.h>
1162 #ifdef HAVE_SYS_TIME_H
1163 #include <sys/time.h>
1165 #ifdef HAVE_SYS_RESOURCE_H
1166 #include <sys/resource.h>
1170 AX_CHECK_SIGN([time_t],
1171 [ AC_DEFINE(TIME_T_IS_SIGNED, 1, [Define if time_t is signed]) ],
1173 #ifdef HAVE_SYS_TYPES_H
1174 #include <sys/types.h>
1176 #ifdef HAVE_SYS_TIME_H
1177 #include <sys/time.h>
1184 if test "$ax_cv_decl_time_t_signed" = no; then
1185 AC_MSG_WARN([You have an unsigned time_t; some things will probably break. Please tell the Tor developers about your interesting platform.])
1188 AX_CHECK_SIGN([size_t],
1189 [ tor_cv_size_t_signed=yes ],
1190 [ tor_cv_size_t_signed=no ], [
1191 #ifdef HAVE_SYS_TYPES_H
1192 #include <sys/types.h>
1196 if test "$ax_cv_decl_size_t_signed" = yes; then
1197 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1200 AX_CHECK_SIGN([enum always],
1201 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1203 enum always { AAA, BBB, CCC };
1206 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1207 #ifdef HAVE_SYS_SOCKET_H
1208 #include <sys/socket.h>
1212 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1214 AC_CHECK_SIZEOF(cell_t)
1216 # Now make sure that NULL can be represented as zero bytes.
1217 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1218 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1219 [[#include <stdlib.h>
1222 #ifdef HAVE_STDDEF_H
1225 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1226 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1227 [tor_cv_null_is_zero=yes],
1228 [tor_cv_null_is_zero=no],
1229 [tor_cv_null_is_zero=cross])])
1231 if test "$tor_cv_null_is_zero" = cross ; then
1232 # Cross-compiling; let's hope that the target isn't raving mad.
1233 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1236 if test "$tor_cv_null_is_zero" != no; then
1237 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1238 [Define to 1 iff memset(0) sets pointers to NULL])
1241 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1242 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1243 [[#include <stdlib.h>
1246 #ifdef HAVE_STDDEF_H
1249 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1250 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1251 [tor_cv_dbl0_is_zero=yes],
1252 [tor_cv_dbl0_is_zero=no],
1253 [tor_cv_dbl0_is_zero=cross])])
1255 if test "$tor_cv_dbl0_is_zero" = cross ; then
1256 # Cross-compiling; let's hope that the target isn't raving mad.
1257 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1260 if test "$tor_cv_dbl0_is_zero" != no; then
1261 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1262 [Define to 1 iff memset(0) sets doubles to 0.0])
1265 # And what happens when we malloc zero?
1266 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1267 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1268 [[#include <stdlib.h>
1271 #ifdef HAVE_STDDEF_H
1274 int main () { return malloc(0)?0:1; }]])],
1275 [tor_cv_malloc_zero_works=yes],
1276 [tor_cv_malloc_zero_works=no],
1277 [tor_cv_malloc_zero_works=cross])])
1279 if test "$tor_cv_malloc_zero_works" = cross; then
1280 # Cross-compiling; let's hope that the target isn't raving mad.
1281 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1284 if test "$tor_cv_malloc_zero_works" = yes; then
1285 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1286 [Define to 1 iff malloc(0) returns a pointer])
1289 # whether we seem to be in a 2s-complement world.
1290 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1291 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1292 [[int main () { int problem = ((-99) != (~99)+1);
1293 return problem ? 1 : 0; }]])],
1294 [tor_cv_twos_complement=yes],
1295 [tor_cv_twos_complement=no],
1296 [tor_cv_twos_complement=cross])])
1298 if test "$tor_cv_twos_complement" = cross ; then
1299 # Cross-compiling; let's hope that the target isn't raving mad.
1300 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1303 if test "$tor_cv_twos_complement" != no ; then
1304 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1305 [Define to 1 iff we represent negative integers with two's complement])
1308 # What does shifting a negative value do?
1309 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1310 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1311 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1312 [tor_cv_sign_extend=yes],
1313 [tor_cv_sign_extend=no],
1314 [tor_cv_sign_extend=cross])])
1316 if test "$tor_cv_sign_extend" = cross ; then
1317 # Cross-compiling; let's hope that the target isn't raving mad.
1318 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1321 if test "$tor_cv_sign_extend" != no ; then
1322 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1323 [Define to 1 iff right-shifting a negative value performs sign-extension])
1326 # Whether we should use the dmalloc memory allocation debugging library.
1327 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1328 AC_ARG_WITH(dmalloc,
1329 [ --with-dmalloc Use debug memory allocation library. ],
1330 [if [[ "$withval" = "yes" ]]; then
1336 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1339 if [[ $dmalloc -eq 1 ]]; then
1340 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1341 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1342 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1343 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1346 AC_ARG_WITH(tcmalloc,
1347 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
1348 [ tcmalloc=yes ], [ tcmalloc=no ])
1350 if test x$tcmalloc = xyes ; then
1351 LDFLAGS="-ltcmalloc $LDFLAGS"
1354 using_custom_malloc=no
1355 if test x$enable_openbsd_malloc = xyes ; then
1356 using_custom_malloc=yes
1358 if test x$tcmalloc = xyes ; then
1359 using_custom_malloc=yes
1361 if test $using_custom_malloc = no ; then
1362 AC_CHECK_FUNCS(mallinfo)
1365 # By default, we're going to assume we don't have mlockall()
1366 # bionic and other platforms have various broken mlockall subsystems.
1367 # Some systems don't have a working mlockall, some aren't linkable,
1368 # and some have it but don't declare it.
1369 AC_CHECK_FUNCS(mlockall)
1370 AC_CHECK_DECLS([mlockall], , , [
1371 #ifdef HAVE_SYS_MMAN_H
1372 #include <sys/mman.h>
1375 # Allow user to specify an alternate syslog facility
1376 AC_ARG_WITH(syslog-facility,
1377 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1378 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1379 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1380 AC_SUBST(LOGFACILITY)
1382 # Check if we have getresuid and getresgid
1383 AC_CHECK_FUNCS(getresuid getresgid)
1385 # Check for gethostbyname_r in all its glorious incompatible versions.
1386 # (This logic is based on that in Python's configure.in)
1387 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1388 [Define this if you have any gethostbyname_r()])
1390 AC_CHECK_FUNC(gethostbyname_r, [
1391 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1393 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1394 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1398 struct hostent *h1, *h2;
1400 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1402 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1403 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1404 [Define this if gethostbyname_r takes 6 arguments])
1413 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1415 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1416 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1417 [Define this if gethostbyname_r takes 5 arguments])
1425 struct hostent_data hd;
1426 (void) gethostbyname_r(cp1,h1,&hd);
1428 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1429 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1430 [Define this if gethostbyname_r takes 3 arguments])
1440 AC_CACHE_CHECK([whether the C compiler supports __func__],
1441 tor_cv_have_func_macro,
1442 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1444 int main(int c, char **v) { puts(__func__); }])],
1445 tor_cv_have_func_macro=yes,
1446 tor_cv_have_func_macro=no))
1448 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1449 tor_cv_have_FUNC_macro,
1450 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1452 int main(int c, char **v) { puts(__FUNC__); }])],
1453 tor_cv_have_FUNC_macro=yes,
1454 tor_cv_have_FUNC_macro=no))
1456 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1457 tor_cv_have_FUNCTION_macro,
1458 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1460 int main(int c, char **v) { puts(__FUNCTION__); }])],
1461 tor_cv_have_FUNCTION_macro=yes,
1462 tor_cv_have_FUNCTION_macro=no))
1464 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1465 tor_cv_have_environ_declared,
1466 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1467 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1468 * Without it environ doesn't get declared. */
1470 #ifdef HAVE_UNISTD_H
1474 int main(int c, char **v) { char **t = environ; }])],
1475 tor_cv_have_environ_declared=yes,
1476 tor_cv_have_environ_declared=no))
1478 if test "$tor_cv_have_func_macro" = 'yes'; then
1479 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1482 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1483 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1486 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1487 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1488 [Defined if the compiler supports __FUNCTION__])
1491 if test "$tor_cv_have_environ_declared" = 'yes'; then
1492 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1493 [Defined if we have extern char **environ already declared])
1496 # $prefix stores the value of the --prefix command line option, or
1497 # NONE if the option wasn't set. In the case that it wasn't set, make
1498 # it be the default, so that we can use it to expand directories now.
1499 if test "x$prefix" = "xNONE"; then
1500 prefix=$ac_default_prefix
1503 # and similarly for $exec_prefix
1504 if test "x$exec_prefix" = "xNONE"; then
1508 if test "x$BUILDDIR" = "x"; then
1512 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1513 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1515 if test "x$CONFDIR" = "x"; then
1516 CONFDIR=`eval echo $sysconfdir/tor`
1519 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1520 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1522 BINDIR=`eval echo $bindir`
1524 LOCALSTATEDIR=`eval echo $localstatedir`
1525 AC_SUBST(LOCALSTATEDIR)
1527 if test "$bwin32" = true; then
1528 # Test if the linker supports the --nxcompat and --dynamicbase options
1530 save_LDFLAGS="$LDFLAGS"
1531 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1532 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1533 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1534 [AC_MSG_RESULT([yes])]
1535 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1536 [AC_MSG_RESULT([no])]
1538 LDFLAGS="$save_LDFLAGS"
1541 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1542 # than autoconf's macros like.
1543 if test "$GCC" = yes; then
1544 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1545 # accident waiting to happen.
1546 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing -g -O2"
1548 # Override optimization level for non-gcc compilers
1550 enable_gcc_warnings=no
1551 enable_gcc_warnings_advisory=no
1554 # OS X Lion started deprecating the system openssl. Let's just disable
1555 # all deprecation warnings on OS X. Also, to potentially make the binary
1556 # a little smaller, let's enable dead_strip.
1560 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1561 LDFLAGS="$LDFLAGS -dead_strip" ;;
1564 # Add some more warnings which we use in development but not in the
1565 # released versions. (Some relevant gcc versions can't handle these.)
1566 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1568 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1569 #if !defined(__GNUC__) || (__GNUC__ < 4)
1571 #endif])], have_gcc4=yes, have_gcc4=no)
1573 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1574 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1576 #endif])], have_gcc42=yes, have_gcc42=no)
1578 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1579 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1581 #endif])], have_gcc43=yes, have_gcc43=no)
1583 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1584 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1586 #endif])], have_gcc46=yes, have_gcc46=no)
1589 save_CFLAGS="$CFLAGS"
1590 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1591 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1592 have_shorten64_flag=no)
1593 CFLAGS="$save_CFLAGS"
1596 *-*-openbsd* | *-*-bitrig*)
1597 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1598 # That's fine, except that the headers don't pass -Wredundant-decls.
1599 # Therefore, let's disable -Wsystem-headers when we're building
1600 # with maximal warnings on OpenBSD.
1601 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1604 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1605 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1606 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1607 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1608 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1610 if test x$enable_gcc_warnings = xyes; then
1611 CFLAGS="$CFLAGS -Werror"
1614 # Disabled, so we can use mallinfo(): -Waggregate-return
1616 if test x$have_gcc4 = xyes ; then
1617 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1618 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wold-style-definition"
1621 if test x$have_gcc42 = xyes ; then
1622 # These warnings break gcc 4.0.2 and work on gcc 4.2
1623 # XXXX020 See if any of these work with earlier versions.
1624 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1626 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1629 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1630 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1631 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1634 if test x$have_gcc43 = xyes ; then
1635 # These warnings break gcc 4.2 and work on gcc 4.3
1636 # XXXX020 See if any of these work with earlier versions.
1637 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1640 if test x$have_gcc46 = xyes ; then
1641 # This warning was added in gcc 4.3, but it appears to generate
1642 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1643 CFLAGS="$CFLAGS -Wlogical-op"
1646 if test x$have_shorten64_flag = xyes ; then
1647 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1652 ##This will break the world on some 64-bit architectures
1653 # CFLAGS="$CFLAGS -Winline"
1656 if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
1659 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-profiling.])
1663 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1668 contrib/dist/suse/tor.sh
1669 contrib/operator-tools/tor.logrotate
1672 contrib/dist/tor.service
1673 src/config/torrc.sample
1674 src/config/torrc.minimal
1677 if test x$asciidoc = xtrue && test "$ASCIIDOC" = "none" ; then
1678 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1679 for file in $regular_mans ; do
1680 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1681 echo "==================================";
1683 echo "Building Tor has failed since manpages cannot be built.";
1685 echo "You need asciidoc installed to be able to build the manpages.";
1686 echo "To build without manpages, use the --disable-asciidoc argument";
1687 echo "when calling configure.";
1689 echo "==================================";
1697 if test -x /usr/bin/perl && test -x ./scripts/maint/updateVersions.pl ; then
1698 ./scripts/maint/updateVersions.pl