1 dnl Copyright (c) 2001-2004, Roger Dingledine
2 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
3 dnl Copyright (c) 2007-2013, The Tor Project, Inc.
4 dnl See LICENSE for licensing information
6 AC_INIT([tor],[0.2.5.4-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])
15 if test -f /etc/redhat-release ; then
16 if test -f /usr/kerberos/include ; then
17 CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
21 # Not a no-op; we want to make sure that CPPFLAGS is set before we use
22 # the += operator on it in src/or/Makefile.am
23 CPPFLAGS="$CPPFLAGS -I\${top_srcdir}/src/common"
25 #XXXX020 We should make these enabled or not, before 0.2.0.x-final
26 AC_ARG_ENABLE(buf-freelists,
27 AS_HELP_STRING(--enable-buf-freelists, enable freelists for buffer RAM))
28 AC_ARG_ENABLE(mempools,
29 AS_HELP_STRING(--enable-mempools, enable mempools for relay cells))
30 AC_ARG_ENABLE(openbsd-malloc,
31 AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
32 AC_ARG_ENABLE(instrument-downloads,
33 AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
34 AC_ARG_ENABLE(static-openssl,
35 AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
36 AC_ARG_ENABLE(static-libevent,
37 AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
38 AC_ARG_ENABLE(static-zlib,
39 AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
40 AC_ARG_ENABLE(static-tor,
41 AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
42 AC_ARG_ENABLE(curve25519,
43 AS_HELP_STRING(--disable-curve25519, Build Tor with no curve25519 elliptic-curve crypto support))
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) ;;
111 AC_ARG_ENABLE(threads,
112 AS_HELP_STRING(--disable-threads, disable multi-threading support))
114 if test x$enable_threads = x; then
117 # Don't try multithreading on solaris -- cpuworkers seem to lock.
118 AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
119 cpu workers lock up here, so I will disable threads.])
120 enable_threads="no";;
122 enable_threads="yes";;
126 if test "$enable_threads" = "yes"; then
127 AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
132 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
136 AC_ARG_ENABLE(gcc-warnings,
137 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
138 AC_ARG_ENABLE(gcc-warnings-advisory,
139 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
141 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
142 AC_ARG_ENABLE(gcc-hardening,
143 AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
145 AC_ARG_ENABLE(expensive-hardening,
146 AS_HELP_STRING(--enable-expensive-hardening, enable more expensive compiler hardening; makes Tor slower))
148 dnl Linker hardening options
149 dnl Currently these options are ELF specific - you can't use this with MacOSX
150 AC_ARG_ENABLE(linker-hardening,
151 AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
153 AC_ARG_ENABLE(local-appdata,
154 AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
155 if test "$enable_local_appdata" = "yes"; then
156 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
157 [Defined if we default to host local appdata paths on Windows])
161 AC_ARG_ENABLE(tor2web-mode,
162 AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
163 [if test x$enableval = xyes; then
164 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
167 AC_ARG_ENABLE(bufferevents,
168 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
170 AC_ARG_ENABLE(tool-name-check,
171 AS_HELP_STRING(--disable-tool-name-check, check for sanely named toolchain when cross-compiling))
173 AC_ARG_ENABLE(seccomp,
174 AS_HELP_STRING(--disable-seccomp, do not attempt to use libseccomp))
176 dnl check for the correct "ar" when cross-compiling
177 AN_MAKEVAR([AR], [AC_PROG_AR])
178 AN_PROGRAM([ar], [AC_PROG_AR])
179 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
182 dnl Check whether the above macro has settled for a simply named tool even
183 dnl though we're cross compiling. We must do this before running AC_PROG_CC,
184 dnl because that will find any cc on the system, not only the cross-compiler,
185 dnl and then verify that a binary built with this compiler runs on the
186 dnl build system. It will then come to the false conclusion that we're not
188 if test x$enable_tool_name_check != xno; then
189 if test x$ac_tool_warned = xyes; then
190 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.)])
191 elif test "x$ac_ct_AR" != x -a x$cross_compiling = xmaybe; then
192 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.)])
201 dnl autoconf 2.59 appears not to support AC_PROG_SED
202 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
204 dnl check for asciidoc and a2x
205 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
206 AC_PATH_PROGS([A2X], [a2x a2x.py], none)
208 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
210 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
211 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
212 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
216 AC_CHECK_PROGS(PYTHON, [python python2 python2.7 python3 python3.3])
217 if test "x$PYTHON" = "x"; then
218 AC_MSG_WARN([Python unavailable; some tests will not be run.])
220 AM_CONDITIONAL(USEPYTHON, [test "x$PYTHON" != "x"])
222 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
223 AC_C_FLEXIBLE_ARRAY_MEMBER
225 dnl Maybe we've got an old autoconf...
226 AC_CACHE_CHECK([for flexible array members],
230 struct abc { int a; char b[]; };
232 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
235 [tor_cv_c_flexarray=yes],
236 [tor_cv_c_flexarray=no])])
237 if test $tor_cv_flexarray = yes ; then
238 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
240 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
244 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
245 AC_PATH_PROG([OPENSSL], [openssl], none)
248 AC_ARG_WITH(tor-user,
249 [ --with-tor-user=NAME Specify username for tor daemon ],
257 AC_ARG_WITH(tor-group,
258 [ --with-tor-group=NAME Specify group name for tor daemon ],
266 dnl If _WIN32 is defined and non-zero, we are building for win32
267 AC_MSG_CHECKING([for win32])
268 AC_RUN_IFELSE([AC_LANG_SOURCE([
269 int main(int c, char **v) {
280 bwin32=true; AC_MSG_RESULT([yes]),
281 bwin32=false; AC_MSG_RESULT([no]),
282 bwin32=cross; AC_MSG_RESULT([cross])
285 if test "$bwin32" = cross; then
286 AC_MSG_CHECKING([for win32 (cross)])
287 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
289 int main(int c, char **v) {return 0;}
292 int main(int c, char **v) {return x(y);}
295 bwin32=true; AC_MSG_RESULT([yes]),
296 bwin32=false; AC_MSG_RESULT([no]))
299 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
301 dnl Enable C99 when compiling with MIPSpro
302 AC_MSG_CHECKING([for MIPSpro compiler])
303 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
304 #if (defined(__sgi) && defined(_COMPILER_VERSION))
309 bmipspro=false; AC_MSG_RESULT(no),
310 bmipspro=true; AC_MSG_RESULT(yes))
312 if test "$bmipspro" = true; then
313 CFLAGS="$CFLAGS -c99"
318 AC_SEARCH_LIBS(socket, [socket network])
319 AC_SEARCH_LIBS(gethostbyname, [nsl])
320 AC_SEARCH_LIBS(dlopen, [dl])
321 AC_SEARCH_LIBS(inet_aton, [resolv])
323 AC_SEARCH_LIBS([clock_gettime], [rt])
324 if test "$LIBS" != "$saved_LIBS"; then
325 # Looks like we need -lrt for clock_gettime().
329 if test "$enable_threads" = "yes"; then
330 AC_SEARCH_LIBS(pthread_create, [pthread])
331 AC_SEARCH_LIBS(pthread_detach, [pthread])
334 dnl -------------------------------------------------------------------
335 dnl Check for functions before libevent, since libevent-1.2 apparently
336 dnl exports strlcpy without defining it in a header.
342 backtrace_symbols_fd \
374 if test "$enable_threads" = "yes"; then
375 AC_CHECK_HEADERS(pthread.h)
376 AC_CHECK_FUNCS(pthread_create)
379 dnl ------------------------------------------------------
380 dnl Where do you live, libevent? And how do we call you?
382 if test "$bwin32" = true; then
383 TOR_LIB_WS32=-lws2_32
384 TOR_LIB_IPHLPAPI=-liphlpapi
385 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
386 # think it's actually necessary.
392 AC_SUBST(TOR_LIB_WS32)
393 AC_SUBST(TOR_LIB_GDI)
394 AC_SUBST(TOR_LIB_IPHLPAPI)
396 dnl We need to do this before we try our disgusting hack below.
397 AC_CHECK_HEADERS([sys/types.h])
399 dnl This is a disgusting hack so we safely include older libevent headers.
400 AC_CHECK_TYPE(u_int64_t, unsigned long long)
401 AC_CHECK_TYPE(u_int32_t, unsigned long)
402 AC_CHECK_TYPE(u_int16_t, unsigned short)
403 AC_CHECK_TYPE(u_int8_t, unsigned char)
405 tor_libevent_pkg_redhat="libevent"
406 tor_libevent_pkg_debian="libevent-dev"
407 tor_libevent_devpkg_redhat="libevent-devel"
408 tor_libevent_devpkg_debian="libevent-dev"
410 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
411 dnl linking for static builds.
412 STATIC_LIBEVENT_FLAGS=""
413 if test "$enable_static_libevent" = "yes"; then
414 if test "$have_rt" = yes; then
415 STATIC_LIBEVENT_FLAGS=" -lrt "
419 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
421 #include <winsock2.h>
424 #include <sys/time.h>
425 #include <sys/types.h>
426 #include <event.h>], [
428 #include <winsock2.h>
430 void exit(int); void *event_init(void);],
433 {WSADATA d; WSAStartup(0x101,&d); }
435 event_init(); exit(0);
436 ], [--with-libevent-dir], [/opt/libevent])
438 dnl Now check for particular libevent functions.
440 save_LDFLAGS="$LDFLAGS"
441 save_CPPFLAGS="$CPPFLAGS"
442 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
443 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
444 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
445 AC_CHECK_FUNCS([event_get_version \
446 event_get_version_number \
448 event_set_log_callback \
449 evutil_secure_rng_set_urandom_device_file \
450 evutil_secure_rng_init \
451 event_base_loopexit])
452 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
456 AC_CHECK_HEADERS(event2/event.h event2/dns.h)
459 LDFLAGS="$save_LDFLAGS"
460 CPPFLAGS="$save_CPPFLAGS"
463 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
465 if test "$enable_static_libevent" = "yes"; then
466 if test "$tor_cv_library_libevent_dir" = "(system)"; then
467 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
469 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
472 TOR_LIBEVENT_LIBS="-levent"
475 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
476 dnl we can do much better.
477 if test "$enable_bufferevents" = "yes" ; then
478 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
479 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.])
482 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
484 # Check for the right version. First see if version detection works.
485 AC_MSG_CHECKING([whether we can detect the Libevent version])
486 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
487 #include <event2/event.h>
488 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
494 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
495 [event_version_number_works=no; AC_MSG_RESULT([no])])
496 if test "$event_version_number_works" != 'yes'; then
497 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
499 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
500 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
501 #include <event2/event.h>
502 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
508 ])], [ AC_MSG_RESULT([yes]) ],
509 [ AC_MSG_RESULT([no])
510 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
516 LDFLAGS="$save_LDFLAGS"
517 CPPFLAGS="$save_CPPFLAGS"
519 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
520 if test "$enable_bufferevents" = "yes"; then
521 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
522 if test "$enable_static_libevent" = "yes"; then
523 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
525 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
528 AC_SUBST(TOR_LIBEVENT_LIBS)
530 dnl ------------------------------------------------------
531 dnl Where do you live, libm?
533 dnl On some platforms (Haiku/BeOS) the math library is
534 dnl part of libroot. In which case don't link against lm
537 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
538 if test "$ac_cv_search_pow" != "none required"; then
539 TOR_LIB_MATH="$ac_cv_search_pow"
542 AC_SUBST(TOR_LIB_MATH)
544 dnl ------------------------------------------------------
545 dnl Where do you live, openssl? And how do we call you?
547 tor_openssl_pkg_redhat="openssl"
548 tor_openssl_pkg_debian="libssl-dev"
549 tor_openssl_devpkg_redhat="openssl-devel"
550 tor_openssl_devpkg_debian="libssl-dev"
552 ALT_openssl_WITHVAL=""
554 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
556 if test "x$withval" != xno && test "x$withval" != "x" ; then
557 ALT_openssl_WITHVAL="$withval"
561 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
562 [#include <openssl/rand.h>],
563 [void RAND_add(const void *buf, int num, double entropy);],
564 [RAND_add((void*)0,0,0); exit(0);], [],
565 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
567 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
569 if test "$enable_static_openssl" = "yes"; then
570 if test "$tor_cv_library_openssl_dir" = "(system)"; then
571 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
573 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
576 TOR_OPENSSL_LIBS="-lssl -lcrypto"
578 AC_SUBST(TOR_OPENSSL_LIBS)
580 dnl ------------------------------------------------------
581 dnl Where do you live, zlib? And how do we call you?
583 tor_zlib_pkg_redhat="zlib"
584 tor_zlib_pkg_debian="zlib1g"
585 tor_zlib_devpkg_redhat="zlib-devel"
586 tor_zlib_devpkg_debian="zlib1g-dev"
588 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
590 [const char * zlibVersion(void);],
591 [zlibVersion(); exit(0);], [--with-zlib-dir],
594 if test "$enable_static_zlib" = "yes"; then
595 if test "$tor_cv_library_zlib_dir" = "(system)"; then
596 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
597 using --enable-static-zlib")
599 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
604 AC_SUBST(TOR_ZLIB_LIBS)
606 dnl ---------------------------------------------------------------------
607 dnl Now that we know about our major libraries, we can check for compiler
608 dnl and linker hardening options. We need to do this with the libraries known,
609 dnl since sometimes the linker will like an option but not be willing to
610 dnl use it with a build of a library.
612 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
613 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
615 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
616 #if !defined(__clang__)
618 #endif])], have_clang=yes, have_clang=no)
620 if test x$enable_gcc_hardening != xno; then
621 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
622 if test x$have_clang = xyes; then
623 TOR_CHECK_CFLAGS(-Qunused-arguments)
625 TOR_CHECK_CFLAGS(-fstack-protector-all, also_link)
626 AS_VAR_PUSHDEF([can_compile], [tor_cv_cflags_-fstack-protector-all])
627 AS_VAR_PUSHDEF([can_link], [tor_can_link_-fstack-protector-all])
628 AS_VAR_IF(can_compile, [yes],
629 AS_VAR_IF(can_link, [yes],
631 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.)]))
633 AS_VAR_POPDEF([can_link])
634 AS_VAR_POPDEF([can_compile])
635 TOR_CHECK_CFLAGS(-Wstack-protector)
636 TOR_CHECK_CFLAGS(-fwrapv)
637 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
638 if test "$bwin32" = "false"; then
639 TOR_CHECK_CFLAGS(-fPIE)
640 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
644 if test x$enable_expensive_hardening = xyes ; then
645 TOR_CHECK_CFLAGS([-fsanitize=address])
646 TOR_CHECK_CFLAGS([-fsanitize=undefined])
647 TOR_CHECK_CFLAGS([-fno-omit-frame-pointer])
650 if test x$enable_linker_hardening != xno; then
651 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
654 # For backtrace support
655 TOR_CHECK_LDFLAGS(-rdynamic)
657 dnl ------------------------------------------------------
658 dnl Now see if we have a -fomit-frame-pointer compiler option.
660 saved_CFLAGS="$CFLAGS"
661 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
662 F_OMIT_FRAME_POINTER=''
663 if test "$saved_CFLAGS" != "$CFLAGS"; then
664 if test x$enable_expensive_hardening != xyes ; then
665 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
668 CFLAGS="$saved_CFLAGS"
669 AC_SUBST(F_OMIT_FRAME_POINTER)
671 dnl ------------------------------------------------------
672 dnl If we are adding -fomit-frame-pointer (or if the compiler's doing it
673 dnl for us, as GCC 4.6 and later do at many optimization levels), then
674 dnl we should try to add -fasynchronous-unwind-tables so that our backtrace
676 TOR_CHECK_CFLAGS(-fasynchronous-unwind-tables)
678 dnl ------------------------------------------------------
679 dnl Where do you live, libnatpmp? And how do we call you?
680 dnl There are no packages for Debian or Redhat as of this patch
682 if test "$natpmp" = "true"; then
683 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
684 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
685 [#include <natpmp.h>],
689 #include <natpmp.h>],
692 natpmpresp_t response;
693 r = initnatpmp(&natpmp, 0, 0);],
694 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
696 [--with-libnatpmp-dir],
701 dnl ------------------------------------------------------
702 dnl Where do you live, libminiupnpc? And how do we call you?
703 dnl There are no packages for Debian or Redhat as of this patch
705 if test "$upnp" = "true"; then
706 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
708 dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
709 dnl to see if we have miniupnpc-1.5 or -1.6
710 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
711 [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
713 if test "$miniupnpc15" = "true" ; then
714 AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
715 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
716 [#include <miniupnpc/miniwget.h>
717 #include <miniupnpc/miniupnpc.h>
718 #include <miniupnpc/upnpcommands.h>],
719 [void upnpDiscover(int delay, const char * multicastif,
720 const char * minissdpdsock, int sameport);],
721 [upnpDiscover(1, 0, 0, 0); exit(0);],
722 [--with-libminiupnpc-dir],
725 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
726 [#include <miniupnpc/miniwget.h>
727 #include <miniupnpc/miniupnpc.h>
728 #include <miniupnpc/upnpcommands.h>],
729 [void upnpDiscover(int delay, const char * multicastif,
730 const char * minissdpdsock, int sameport, int ipv6, int * error);],
731 [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
732 [--with-libminiupnpc-dir],
737 dnl ============================================================
738 dnl Check for libseccomp
740 if test "x$enable_seccomp" != "xno"; then
741 AC_CHECK_HEADERS([seccomp.h])
742 AC_SEARCH_LIBS(seccomp_init, [seccomp])
745 dnl ============================================================
746 dnl We need an implementation of curve25519.
748 dnl set these defaults.
750 build_curve25519_donna=no
751 build_curve25519_donna_c64=no
752 use_curve25519_donna=no
753 use_curve25519_nacl=no
756 if test x$enable_curve25519 != xno; then
758 dnl The best choice is using curve25519-donna-c64, but that requires
760 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
761 tor_cv_can_use_curve25519_donna_c64,
763 [AC_LANG_PROGRAM([dnl
765 typedef unsigned uint128_t __attribute__((mode(TI)));
766 int func(uint64_t a, uint64_t b) {
767 uint128_t c = ((uint128_t)a) * b;
768 int ok = ((uint64_t)(c>>96)) == 522859 &&
769 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
770 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
771 (((uint64_t)(c))&0xffffffffL) == 0;
775 int ok = func( ((uint64_t)2000000000) * 1000000000,
776 ((uint64_t)1234567890) << 24);
779 [tor_cv_can_use_curve25519_donna_c64=yes],
780 [tor_cv_can_use_curve25519_donna_c64=no],
782 [AC_LANG_PROGRAM([dnl
784 typedef unsigned uint128_t __attribute__((mode(TI)));
785 int func(uint64_t a, uint64_t b) {
786 uint128_t c = ((uint128_t)a) * b;
787 int ok = ((uint64_t)(c>>96)) == 522859 &&
788 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
789 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
790 (((uint64_t)(c))&0xffffffffL) == 0;
794 int ok = func( ((uint64_t)2000000000) * 1000000000,
795 ((uint64_t)1234567890) << 24);
798 [tor_cv_can_use_curve25519_donna_c64=cross],
799 [tor_cv_can_use_curve25519_donna_c64=no])])])
801 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
802 nacl/crypto_scalarmult_curve25519.h])
804 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
805 tor_cv_can_use_curve25519_nacl,
806 [tor_saved_LIBS="$LIBS"
809 [AC_LANG_PROGRAM([dnl
810 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
811 #include <crypto_scalarmult_curve25519.h>
812 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
813 #include <nacl/crypto_scalarmult_curve25519.h>
815 #ifdef crypto_scalarmult_curve25519_ref_BYTES
816 #error Hey, this is the reference implementation! That's not fast.
819 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
820 ])], [tor_cv_can_use_curve25519_nacl=yes],
821 [tor_cv_can_use_curve25519_nacl=no])
822 LIBS="$tor_saved_LIBS" ])
824 dnl Okay, now we need to figure out which one to actually use. Fall back
825 dnl to curve25519-donna.c
827 if test x$tor_cv_can_use_curve25519_donna_c64 != xno; then
828 build_curve25519_donna_c64=yes
829 use_curve25519_donna=yes
830 elif test x$tor_cv_can_use_curve25519_nacl = xyes; then
831 use_curve25519_nacl=yes
832 CURVE25519_LIBS=-lnacl
834 build_curve25519_donna=yes
835 use_curve25519_donna=yes
837 have_a_curve25519=yes
840 if test x$have_a_curve25519 = xyes; then
841 AC_DEFINE(CURVE25519_ENABLED, 1,
842 [Defined if we have a curve25519 implementation])
844 if test x$use_curve25519_donna = xyes; then
845 AC_DEFINE(USE_CURVE25519_DONNA, 1,
846 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
848 if test x$use_curve25519_nacl = xyes; then
849 AC_DEFINE(USE_CURVE25519_NACL, 1,
850 [Defined if we should use a curve25519 from nacl])
852 AM_CONDITIONAL(BUILD_CURVE25519_DONNA, test x$build_curve25519_donna = xyes)
853 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, test x$build_curve25519_donna_c64 = xyes)
854 AM_CONDITIONAL(CURVE25519_ENABLED, test x$have_a_curve25519 = xyes)
855 AC_SUBST(CURVE25519_LIBS)
857 dnl Make sure to enable support for large off_t if available.
872 , , 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.))
874 dnl These headers are not essential
913 AC_CHECK_HEADERS(sys/param.h)
915 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
916 [#ifdef HAVE_SYS_TYPES_H
917 #include <sys/types.h>
919 #ifdef HAVE_SYS_SOCKET_H
920 #include <sys/socket.h>
922 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
923 [#ifdef HAVE_SYS_TYPES_H
924 #include <sys/types.h>
926 #ifdef HAVE_SYS_SOCKET_H
927 #include <sys/socket.h>
932 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
933 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
934 [#ifdef HAVE_SYS_TYPES_H
935 #include <sys/types.h>
937 #ifdef HAVE_SYS_SOCKET_H
938 #include <sys/socket.h>
943 #ifdef HAVE_LINUX_TYPES_H
944 #include <linux/types.h>
946 #ifdef HAVE_NETINET_IN6_H
947 #include <netinet/in6.h>
949 #ifdef HAVE_NETINET_IN_H
950 #include <netinet/in.h>
953 if test x$transparent = xtrue ; then
955 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
958 if test x$linux_netfilter_ipv4 = x1 ; then
961 if test x$transparent_ok = x1 ; then
962 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
964 *-*-openbsd* | *-*-bitrig*)
965 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
968 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
972 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
973 [#ifdef HAVE_SYS_TYPES_H
974 #include <sys/types.h>
976 #ifdef HAVE_SYS_TIME_H
977 #include <sys/time.h>
980 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
983 AC_CHECK_SIZEOF(int8_t)
984 AC_CHECK_SIZEOF(int16_t)
985 AC_CHECK_SIZEOF(int32_t)
986 AC_CHECK_SIZEOF(int64_t)
987 AC_CHECK_SIZEOF(uint8_t)
988 AC_CHECK_SIZEOF(uint16_t)
989 AC_CHECK_SIZEOF(uint32_t)
990 AC_CHECK_SIZEOF(uint64_t)
991 AC_CHECK_SIZEOF(intptr_t)
992 AC_CHECK_SIZEOF(uintptr_t)
994 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
996 AC_CHECK_SIZEOF(char)
997 AC_CHECK_SIZEOF(short)
999 AC_CHECK_SIZEOF(long)
1000 AC_CHECK_SIZEOF(long long)
1001 AC_CHECK_SIZEOF(__int64)
1002 AC_CHECK_SIZEOF(void *)
1003 AC_CHECK_SIZEOF(time_t)
1004 AC_CHECK_SIZEOF(size_t)
1005 AC_CHECK_SIZEOF(pid_t)
1007 AC_CHECK_TYPES([uint, u_char, ssize_t])
1009 AC_PC_FROM_UCONTEXT([/bin/true])
1011 dnl used to include sockaddr_storage, but everybody has that.
1012 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
1013 [#ifdef HAVE_SYS_TYPES_H
1014 #include <sys/types.h>
1016 #ifdef HAVE_NETINET_IN_H
1017 #include <netinet/in.h>
1019 #ifdef HAVE_NETINET_IN6_H
1020 #include <netinet/in6.h>
1022 #ifdef HAVE_SYS_SOCKET_H
1023 #include <sys/socket.h>
1026 #define _WIN32_WINNT 0x0501
1027 #define WIN32_LEAN_AND_MEAN
1028 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1029 #include <winsock.h>
1031 #include <winsock2.h>
1032 #include <ws2tcpip.h>
1036 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
1037 [#ifdef HAVE_SYS_TYPES_H
1038 #include <sys/types.h>
1040 #ifdef HAVE_NETINET_IN_H
1041 #include <netinet/in.h>
1043 #ifdef HAVE_NETINET_IN6_H
1044 #include <netinet/in6.h>
1046 #ifdef HAVE_SYS_SOCKET_H
1047 #include <sys/socket.h>
1050 #define _WIN32_WINNT 0x0501
1051 #define WIN32_LEAN_AND_MEAN
1052 #if defined(_MSC_VER) && (_MSC_VER < 1300)
1053 #include <winsock.h>
1055 #include <winsock2.h>
1056 #include <ws2tcpip.h>
1061 AC_CHECK_TYPES([rlim_t], , ,
1062 [#ifdef HAVE_SYS_TYPES_H
1063 #include <sys/types.h>
1065 #ifdef HAVE_SYS_TIME_H
1066 #include <sys/time.h>
1068 #ifdef HAVE_SYS_RESOURCE_H
1069 #include <sys/resource.h>
1073 AX_CHECK_SIGN([time_t],
1074 [ AC_DEFINE(TIME_T_IS_SIGNED, 1, [Define if time_t is signed]) ],
1076 #ifdef HAVE_SYS_TYPES_H
1077 #include <sys/types.h>
1079 #ifdef HAVE_SYS_TIME_H
1080 #include <sys/time.h>
1087 if test "$ax_cv_decl_time_t_signed" = no; then
1088 AC_MSG_WARN([You have an unsigned time_t; some things will probably break. Please tell the Tor developers about your interesting platform.])
1091 AX_CHECK_SIGN([size_t],
1092 [ tor_cv_size_t_signed=yes ],
1093 [ tor_cv_size_t_signed=no ], [
1094 #ifdef HAVE_SYS_TYPES_H
1095 #include <sys/types.h>
1099 if test "$ax_cv_decl_size_t_signed" = yes; then
1100 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1103 AX_CHECK_SIGN([enum always],
1104 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1106 enum always { AAA, BBB, CCC };
1109 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1110 #ifdef HAVE_SYS_SOCKET_H
1111 #include <sys/socket.h>
1115 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1117 AC_CHECK_SIZEOF(cell_t)
1119 # Now make sure that NULL can be represented as zero bytes.
1120 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1121 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1122 [[#include <stdlib.h>
1125 #ifdef HAVE_STDDEF_H
1128 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1129 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1130 [tor_cv_null_is_zero=yes],
1131 [tor_cv_null_is_zero=no],
1132 [tor_cv_null_is_zero=cross])])
1134 if test "$tor_cv_null_is_zero" = cross ; then
1135 # Cross-compiling; let's hope that the target isn't raving mad.
1136 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1139 if test "$tor_cv_null_is_zero" != no; then
1140 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1141 [Define to 1 iff memset(0) sets pointers to NULL])
1144 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1145 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1146 [[#include <stdlib.h>
1149 #ifdef HAVE_STDDEF_H
1152 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1153 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1154 [tor_cv_dbl0_is_zero=yes],
1155 [tor_cv_dbl0_is_zero=no],
1156 [tor_cv_dbl0_is_zero=cross])])
1158 if test "$tor_cv_dbl0_is_zero" = cross ; then
1159 # Cross-compiling; let's hope that the target isn't raving mad.
1160 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1163 if test "$tor_cv_dbl0_is_zero" != no; then
1164 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1165 [Define to 1 iff memset(0) sets doubles to 0.0])
1168 # And what happens when we malloc zero?
1169 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1170 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1171 [[#include <stdlib.h>
1174 #ifdef HAVE_STDDEF_H
1177 int main () { return malloc(0)?0:1; }]])],
1178 [tor_cv_malloc_zero_works=yes],
1179 [tor_cv_malloc_zero_works=no],
1180 [tor_cv_malloc_zero_works=cross])])
1182 if test "$tor_cv_malloc_zero_works" = cross; then
1183 # Cross-compiling; let's hope that the target isn't raving mad.
1184 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1187 if test "$tor_cv_malloc_zero_works" = yes; then
1188 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1189 [Define to 1 iff malloc(0) returns a pointer])
1192 # whether we seem to be in a 2s-complement world.
1193 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1194 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1195 [[int main () { int problem = ((-99) != (~99)+1);
1196 return problem ? 1 : 0; }]])],
1197 [tor_cv_twos_complement=yes],
1198 [tor_cv_twos_complement=no],
1199 [tor_cv_twos_complement=cross])])
1201 if test "$tor_cv_twos_complement" = cross ; then
1202 # Cross-compiling; let's hope that the target isn't raving mad.
1203 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1206 if test "$tor_cv_twos_complement" != no ; then
1207 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1208 [Define to 1 iff we represent negative integers with two's complement])
1211 # What does shifting a negative value do?
1212 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1213 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1214 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1215 [tor_cv_sign_extend=yes],
1216 [tor_cv_sign_extend=no],
1217 [tor_cv_sign_extend=cross])])
1219 if test "$tor_cv_sign_extend" = cross ; then
1220 # Cross-compiling; let's hope that the target isn't raving mad.
1221 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1224 if test "$tor_cv_sign_extend" != no ; then
1225 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1226 [Define to 1 iff right-shifting a negative value performs sign-extension])
1229 # Whether we should use the dmalloc memory allocation debugging library.
1230 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1231 AC_ARG_WITH(dmalloc,
1232 [ --with-dmalloc Use debug memory allocation library. ],
1233 [if [[ "$withval" = "yes" ]]; then
1239 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1242 if [[ $dmalloc -eq 1 ]]; then
1243 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1244 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1245 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1246 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1249 AC_ARG_WITH(tcmalloc,
1250 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
1251 [ tcmalloc=yes ], [ tcmalloc=no ])
1253 if test x$tcmalloc = xyes ; then
1254 LDFLAGS="-ltcmalloc $LDFLAGS"
1257 using_custom_malloc=no
1258 if test x$enable_openbsd_malloc = xyes ; then
1259 using_custom_malloc=yes
1261 if test x$tcmalloc = xyes ; then
1262 using_custom_malloc=yes
1264 if test $using_custom_malloc = no ; then
1265 AC_CHECK_FUNCS(mallinfo)
1268 # By default, we're going to assume we don't have mlockall()
1269 # bionic and other platforms have various broken mlockall subsystems.
1270 # Some systems don't have a working mlockall, some aren't linkable,
1271 # and some have it but don't declare it.
1272 AC_CHECK_FUNCS(mlockall)
1273 AC_CHECK_DECLS([mlockall], , , [
1274 #ifdef HAVE_SYS_MMAN_H
1275 #include <sys/mman.h>
1278 # Allow user to specify an alternate syslog facility
1279 AC_ARG_WITH(syslog-facility,
1280 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1281 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1282 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1283 AC_SUBST(LOGFACILITY)
1285 # Check if we have getresuid and getresgid
1286 AC_CHECK_FUNCS(getresuid getresgid)
1288 # Check for gethostbyname_r in all its glorious incompatible versions.
1289 # (This logic is based on that in Python's configure.in)
1290 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1291 [Define this if you have any gethostbyname_r()])
1293 AC_CHECK_FUNC(gethostbyname_r, [
1294 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1296 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1297 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1301 struct hostent *h1, *h2;
1303 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1305 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1306 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1307 [Define this if gethostbyname_r takes 6 arguments])
1316 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1318 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1319 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1320 [Define this if gethostbyname_r takes 5 arguments])
1328 struct hostent_data hd;
1329 (void) gethostbyname_r(cp1,h1,&hd);
1331 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1332 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1333 [Define this if gethostbyname_r takes 3 arguments])
1343 AC_CACHE_CHECK([whether the C compiler supports __func__],
1344 tor_cv_have_func_macro,
1345 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1347 int main(int c, char **v) { puts(__func__); }])],
1348 tor_cv_have_func_macro=yes,
1349 tor_cv_have_func_macro=no))
1351 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1352 tor_cv_have_FUNC_macro,
1353 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1355 int main(int c, char **v) { puts(__FUNC__); }])],
1356 tor_cv_have_FUNC_macro=yes,
1357 tor_cv_have_FUNC_macro=no))
1359 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1360 tor_cv_have_FUNCTION_macro,
1361 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1363 int main(int c, char **v) { puts(__FUNCTION__); }])],
1364 tor_cv_have_FUNCTION_macro=yes,
1365 tor_cv_have_FUNCTION_macro=no))
1367 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1368 tor_cv_have_environ_declared,
1369 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1370 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1371 * Without it environ doesn't get declared. */
1373 #ifdef HAVE_UNISTD_H
1377 int main(int c, char **v) { char **t = environ; }])],
1378 tor_cv_have_environ_declared=yes,
1379 tor_cv_have_environ_declared=no))
1381 if test "$tor_cv_have_func_macro" = 'yes'; then
1382 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1385 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1386 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1389 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1390 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1391 [Defined if the compiler supports __FUNCTION__])
1394 if test "$tor_cv_have_environ_declared" = 'yes'; then
1395 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1396 [Defined if we have extern char **environ already declared])
1399 # $prefix stores the value of the --prefix command line option, or
1400 # NONE if the option wasn't set. In the case that it wasn't set, make
1401 # it be the default, so that we can use it to expand directories now.
1402 if test "x$prefix" = "xNONE"; then
1403 prefix=$ac_default_prefix
1406 # and similarly for $exec_prefix
1407 if test "x$exec_prefix" = "xNONE"; then
1411 if test "x$BUILDDIR" = "x"; then
1415 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1416 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1418 if test "x$CONFDIR" = "x"; then
1419 CONFDIR=`eval echo $sysconfdir/tor`
1422 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1423 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1425 BINDIR=`eval echo $bindir`
1427 LOCALSTATEDIR=`eval echo $localstatedir`
1428 AC_SUBST(LOCALSTATEDIR)
1430 if test "$bwin32" = true; then
1431 # Test if the linker supports the --nxcompat and --dynamicbase options
1433 save_LDFLAGS="$LDFLAGS"
1434 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1435 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1436 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1437 [AC_MSG_RESULT([yes])]
1438 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1439 [AC_MSG_RESULT([no])]
1441 LDFLAGS="$save_LDFLAGS"
1444 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1445 # than autoconf's macros like.
1446 if test "$GCC" = yes; then
1447 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1448 # accident waiting to happen.
1449 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1451 # Autoconf sets -g -O2 by default. Override optimization level
1452 # for non-gcc compilers
1454 enable_gcc_warnings=no
1455 enable_gcc_warnings_advisory=no
1458 # OS X Lion started deprecating the system openssl. Let's just disable
1459 # all deprecation warnings on OS X. Also, to potentially make the binary
1460 # a little smaller, let's enable dead_strip.
1464 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1465 LDFLAGS="$LDFLAGS -dead_strip" ;;
1468 # Add some more warnings which we use in development but not in the
1469 # released versions. (Some relevant gcc versions can't handle these.)
1470 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1472 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1473 #if !defined(__GNUC__) || (__GNUC__ < 4)
1475 #endif])], have_gcc4=yes, have_gcc4=no)
1477 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1478 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1480 #endif])], have_gcc42=yes, have_gcc42=no)
1482 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1483 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1485 #endif])], have_gcc43=yes, have_gcc43=no)
1487 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1488 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 6)
1490 #endif])], have_gcc46=yes, have_gcc46=no)
1493 save_CFLAGS="$CFLAGS"
1494 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1495 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1496 have_shorten64_flag=no)
1497 CFLAGS="$save_CFLAGS"
1500 *-*-openbsd* | *-*-bitrig*)
1501 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1502 # That's fine, except that the headers don't pass -Wredundant-decls.
1503 # Therefore, let's disable -Wsystem-headers when we're building
1504 # with maximal warnings on OpenBSD.
1505 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1508 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1509 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1510 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1511 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1512 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1514 if test x$enable_gcc_warnings = xyes; then
1515 CFLAGS="$CFLAGS -Werror"
1518 # Disabled, so we can use mallinfo(): -Waggregate-return
1520 if test x$have_gcc4 = xyes ; then
1521 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1522 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1525 if test x$have_gcc42 = xyes ; then
1526 # These warnings break gcc 4.0.2 and work on gcc 4.2
1527 # XXXX020 See if any of these work with earlier versions.
1528 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1530 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1533 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1534 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1535 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1538 if test x$have_gcc43 = xyes ; then
1539 # These warnings break gcc 4.2 and work on gcc 4.3
1540 # XXXX020 See if any of these work with earlier versions.
1541 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1544 if test x$have_gcc46 = xyes ; then
1545 # This warning was added in gcc 4.3, but it appears to generate
1546 # spurious warnings in gcc 4.4. I don't know if it works in 4.5.
1547 CFLAGS="$CFLAGS -Wlogical-op"
1550 if test x$have_shorten64_flag = xyes ; then
1551 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1556 ##This will break the world on some 64-bit architectures
1557 # CFLAGS="$CFLAGS -Winline"
1560 if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
1563 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.])
1567 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1572 contrib/dist/suse/tor.sh
1573 contrib/operator-tools/tor.logrotate
1576 contrib/dist/tor.service
1577 src/config/torrc.sample
1580 if test x$asciidoc = xtrue && test "$ASCIIDOC" = "none" ; then
1581 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1582 for file in $regular_mans ; do
1583 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1584 echo "==================================";
1586 echo "You need asciidoc installed to be able to build the manpage.";
1587 echo "To build without manpages, use the --disable-asciidoc argument";
1588 echo "when calling configure.";
1590 echo "==================================";
1598 if test -x /usr/bin/perl && test -x ./scripts/maint/updateVersions.pl ; then
1599 ./scripts/maint/updateVersions.pl