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.0-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(--disable-buf-freelists, disable freelists for buffer RAM))
28 AC_ARG_ENABLE(openbsd-malloc,
29 AS_HELP_STRING(--enable-openbsd-malloc, Use malloc code from openbsd. Linux only))
30 AC_ARG_ENABLE(instrument-downloads,
31 AS_HELP_STRING(--enable-instrument-downloads, Instrument downloads of directory resources etc.))
32 AC_ARG_ENABLE(static-openssl,
33 AS_HELP_STRING(--enable-static-openssl, Link against a static openssl library. Requires --with-openssl-dir))
34 AC_ARG_ENABLE(static-libevent,
35 AS_HELP_STRING(--enable-static-libevent, Link against a static libevent library. Requires --with-libevent-dir))
36 AC_ARG_ENABLE(static-zlib,
37 AS_HELP_STRING(--enable-static-zlib, Link against a static zlib library. Requires --with-zlib-dir))
38 AC_ARG_ENABLE(static-tor,
39 AS_HELP_STRING(--enable-static-tor, Create an entirely static Tor binary. Requires --with-openssl-dir and --with-libevent-dir and --with-zlib-dir))
40 AC_ARG_ENABLE(curve25519,
41 AS_HELP_STRING(--disable-curve25519, Build Tor with no curve25519 elliptic-curve crypto support))
42 AC_ARG_ENABLE(unittests,
43 AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!]))
44 AC_ARG_ENABLE(coverage,
45 AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build]))
47 AM_CONDITIONAL(UNITTESTS_ENABLED, test x$enable_unittests != xno)
48 AM_CONDITIONAL(COVERAGE_ENABLED, test x$enable_coverage = xyes)
50 if test "$enable_static_tor" = "yes"; then
51 enable_static_libevent="yes";
52 enable_static_openssl="yes";
53 enable_static_zlib="yes";
54 CFLAGS="$CFLAGS -static"
57 if test x$enable_buf_freelists != xno; then
58 AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
59 [Defined if we try to use freelists for buffer RAM chunks])
61 AM_CONDITIONAL(USE_OPENBSD_MALLOC, test x$enable_openbsd_malloc = xyes)
62 if test x$enable_instrument_downloads = xyes; then
63 AC_DEFINE(INSTRUMENT_DOWNLOADS, 1,
64 [Defined if we want to keep track of how much of each kind of resource we download.])
67 AC_ARG_ENABLE(transparent,
68 AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
69 [case "${enableval}" in
70 yes) transparent=true ;;
71 no) transparent=false ;;
72 *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
73 esac], [transparent=true])
75 AC_ARG_ENABLE(asciidoc,
76 AS_HELP_STRING(--disable-asciidoc, don't use asciidoc (disables building of manpages)),
77 [case "${enableval}" in
80 *) AC_MSG_ERROR(bad value for --disable-asciidoc) ;;
81 esac], [asciidoc=true])
83 # By default, we're not ready to ship a NAT-PMP aware Tor
84 AC_ARG_ENABLE(nat-pmp,
85 AS_HELP_STRING(--enable-nat-pmp, enable NAT-PMP support),
86 [case "${enableval}" in
89 * ) AC_MSG_ERROR(bad value for --enable-nat-pmp) ;;
90 esac], [natpmp=false])
92 # By default, we're not ready to ship a UPnP aware Tor
94 AS_HELP_STRING(--enable-upnp, enable UPnP support),
95 [case "${enableval}" in
98 * ) AC_MSG_ERROR(bad value for --enable-upnp) ;;
102 AC_ARG_ENABLE(threads,
103 AS_HELP_STRING(--disable-threads, disable multi-threading support))
105 if test x$enable_threads = x; then
108 # Don't try multithreading on solaris -- cpuworkers seem to lock.
109 AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
110 cpu workers lock up here, so I will disable threads.])
111 enable_threads="no";;
113 enable_threads="yes";;
117 if test "$enable_threads" = "yes"; then
118 AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
123 AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
127 AC_ARG_ENABLE(gcc-warnings,
128 AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
129 AC_ARG_ENABLE(gcc-warnings-advisory,
130 AS_HELP_STRING(--enable-gcc-warnings-advisory, [enable verbose warnings, excluding -Werror]))
132 dnl Adam shostack suggests the following for Windows:
133 dnl -D_FORTIFY_SOURCE=2 -fstack-protector-all
134 dnl Others suggest '/gs /safeseh /nxcompat /dynamicbase' for non-gcc on Windows
135 dnl This requires that we use gcc and that we add -O2 to the CFLAGS.
136 AC_ARG_ENABLE(gcc-hardening,
137 AS_HELP_STRING(--disable-gcc-hardening, disable compiler security checks))
139 dnl Linker hardening options
140 dnl Currently these options are ELF specific - you can't use this with MacOSX
141 AC_ARG_ENABLE(linker-hardening,
142 AS_HELP_STRING(--disable-linker-hardening, disable linker security fixups))
144 AC_ARG_ENABLE(local-appdata,
145 AS_HELP_STRING(--enable-local-appdata, default to host local application data paths on Windows))
146 if test "$enable_local_appdata" = "yes"; then
147 AC_DEFINE(ENABLE_LOCAL_APPDATA, 1,
148 [Defined if we default to host local appdata paths on Windows])
152 AC_ARG_ENABLE(tor2web-mode,
153 AS_HELP_STRING(--enable-tor2web-mode, support tor2web non-anonymous mode),
154 [if test x$enableval = xyes; then
155 CFLAGS="$CFLAGS -D ENABLE_TOR2WEB_MODE=1"
158 AC_ARG_ENABLE(bufferevents,
159 AS_HELP_STRING(--enable-bufferevents, use Libevent's buffered IO.))
161 dnl check for the correct "ar" when cross-compiling
162 AN_MAKEVAR([AR], [AC_PROG_AR])
163 AN_PROGRAM([ar], [AC_PROG_AR])
164 AC_DEFUN([AC_PROG_AR], [AC_CHECK_TOOL([AR], [ar], [ar])])
172 dnl autoconf 2.59 appears not to support AC_PROG_SED
173 AC_CHECK_PROG([SED],[sed],[sed],[/bin/false])
175 dnl check for asciidoc and a2x
176 AC_PATH_PROG([ASCIIDOC], [asciidoc], none)
177 AC_PATH_PROG([A2X], [a2x], none)
179 AM_CONDITIONAL(USE_ASCIIDOC, test x$asciidoc = xtrue)
181 AM_CONDITIONAL(USE_FW_HELPER, test x$natpmp = xtrue || test x$upnp = xtrue)
182 AM_CONDITIONAL(NAT_PMP, test x$natpmp = xtrue)
183 AM_CONDITIONAL(MINIUPNPC, test x$upnp = xtrue)
186 ifdef([AC_C_FLEXIBLE_ARRAY_MEMBER], [
187 AC_C_FLEXIBLE_ARRAY_MEMBER
189 dnl Maybe we've got an old autoconf...
190 AC_CACHE_CHECK([for flexible array members],
194 struct abc { int a; char b[]; };
196 struct abc *def = malloc(sizeof(struct abc)+sizeof(char));
199 [tor_cv_c_flexarray=yes],
200 [tor_cv_c_flexarray=no])])
201 if test $tor_cv_flexarray = yes ; then
202 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
204 AC_DEFINE([FLEXIBLE_ARRAY_MEMBER], [1], [Define to nothing if C supports flexible array members, and to 1 if it does not.])
208 AC_PATH_PROG([SHA1SUM], [sha1sum], none)
209 AC_PATH_PROG([OPENSSL], [openssl], none)
212 AC_ARG_WITH(tor-user,
213 [ --with-tor-user=NAME Specify username for tor daemon ],
221 AC_ARG_WITH(tor-group,
222 [ --with-tor-group=NAME Specify group name for tor daemon ],
230 dnl If _WIN32 is defined and non-zero, we are building for win32
231 AC_MSG_CHECKING([for win32])
232 AC_RUN_IFELSE([AC_LANG_SOURCE([
233 int main(int c, char **v) {
244 bwin32=true; AC_MSG_RESULT([yes]),
245 bwin32=false; AC_MSG_RESULT([no]),
246 bwin32=cross; AC_MSG_RESULT([cross])
249 if test "$bwin32" = cross; then
250 AC_MSG_CHECKING([for win32 (cross)])
251 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
253 int main(int c, char **v) {return 0;}
256 int main(int c, char **v) {return x(y);}
259 bwin32=true; AC_MSG_RESULT([yes]),
260 bwin32=false; AC_MSG_RESULT([no]))
263 AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
265 dnl Enable C99 when compiling with MIPSpro
266 AC_MSG_CHECKING([for MIPSpro compiler])
267 AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [
268 #if (defined(__sgi) && defined(_COMPILER_VERSION))
273 bmipspro=false; AC_MSG_RESULT(no),
274 bmipspro=true; AC_MSG_RESULT(yes))
276 if test "$bmipspro" = true; then
277 CFLAGS="$CFLAGS -c99"
282 AC_SEARCH_LIBS(socket, [socket network])
283 AC_SEARCH_LIBS(gethostbyname, [nsl])
284 AC_SEARCH_LIBS(dlopen, [dl])
285 AC_SEARCH_LIBS(inet_aton, [resolv])
287 AC_SEARCH_LIBS([clock_gettime], [rt])
288 if test "$LIBS" != "$saved_LIBS"; then
289 # Looks like we need -lrt for clock_gettime().
293 if test "$enable_threads" = "yes"; then
294 AC_SEARCH_LIBS(pthread_create, [pthread])
295 AC_SEARCH_LIBS(pthread_detach, [pthread])
298 dnl -------------------------------------------------------------------
299 dnl Check for functions before libevent, since libevent-1.2 apparently
300 dnl exports strlcpy without defining it in a header.
334 if test "$enable_threads" = "yes"; then
335 AC_CHECK_HEADERS(pthread.h)
336 AC_CHECK_FUNCS(pthread_create)
339 dnl ------------------------------------------------------
340 dnl Where do you live, libevent? And how do we call you?
342 if test "$bwin32" = true; then
343 TOR_LIB_WS32=-lws2_32
344 TOR_LIB_IPHLPAPI=-liphlpapi
345 # Some of the cargo-cults recommend -lwsock32 as well, but I don't
346 # think it's actually necessary.
352 AC_SUBST(TOR_LIB_WS32)
353 AC_SUBST(TOR_LIB_GDI)
354 AC_SUBST(TOR_LIB_IPHLPAPI)
356 dnl We need to do this before we try our disgusting hack below.
357 AC_CHECK_HEADERS([sys/types.h])
359 dnl This is a disgusting hack so we safely include older libevent headers.
360 AC_CHECK_TYPE(u_int64_t, unsigned long long)
361 AC_CHECK_TYPE(u_int32_t, unsigned long)
362 AC_CHECK_TYPE(u_int16_t, unsigned short)
363 AC_CHECK_TYPE(u_int8_t, unsigned char)
365 tor_libevent_pkg_redhat="libevent"
366 tor_libevent_pkg_debian="libevent-dev"
367 tor_libevent_devpkg_redhat="libevent-devel"
368 tor_libevent_devpkg_debian="libevent-dev"
370 dnl On Gnu/Linux or any place we require it, we'll add librt to the Libevent
371 dnl linking for static builds.
372 STATIC_LIBEVENT_FLAGS=""
373 if test "$enable_static_libevent" = "yes"; then
374 if test "$have_rt" = yes; then
375 STATIC_LIBEVENT_FLAGS=" -lrt "
379 TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32], [
381 #include <winsock2.h>
384 #include <sys/time.h>
385 #include <sys/types.h>
386 #include <event.h>], [
388 #include <winsock2.h>
390 void exit(int); void *event_init(void);],
393 {WSADATA d; WSAStartup(0x101,&d); }
395 event_init(); exit(0);
396 ], [--with-libevent-dir], [/opt/libevent])
398 dnl Now check for particular libevent functions.
400 save_LDFLAGS="$LDFLAGS"
401 save_CPPFLAGS="$CPPFLAGS"
402 LIBS="-levent $STATIC_LIBEVENT_FLAGS $TOR_LIB_WS32 $LIBS"
403 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
404 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
405 AC_CHECK_FUNCS([event_get_version \
406 event_get_version_number \
408 event_set_log_callback \
409 evdns_set_outgoing_bind_address \
410 evutil_secure_rng_set_urandom_device_file \
411 event_base_loopexit])
412 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
416 AC_CHECK_HEADERS(event2/event.h event2/dns.h event2/bufferevent_ssl.h)
419 LDFLAGS="$save_LDFLAGS"
420 CPPFLAGS="$save_CPPFLAGS"
423 AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
425 if test "$enable_static_libevent" = "yes"; then
426 if test "$tor_cv_library_libevent_dir" = "(system)"; then
427 AC_MSG_ERROR("You must specify an explicit --with-libevent-dir=x option when using --enable-static-libevent")
429 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent.a $STATIC_LIBEVENT_FLAGS"
432 TOR_LIBEVENT_LIBS="-levent"
435 dnl This isn't the best test for Libevent 2.0.3-alpha. Once it's released,
436 dnl we can do much better.
437 if test "$enable_bufferevents" = "yes" ; then
438 if test "$ac_cv_header_event2_bufferevent_ssl_h" != "yes" ; then
439 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.])
442 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent"
444 # Check for the right version. First see if version detection works.
445 AC_MSG_CHECKING([whether we can detect the Libevent version])
446 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
447 #include <event2/event.h>
448 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 10
454 ])], [event_version_number_works=yes; AC_MSG_RESULT([yes]) ],
455 [event_version_number_works=no; AC_MSG_RESULT([no])])
456 if test "$event_version_number_works" != 'yes'; then
457 AC_MSG_WARN([Version detection on Libevent seems broken. Your Libevent installation is probably screwed up or very old.])
459 AC_MSG_CHECKING([whether Libevent is new enough for bufferevents])
460 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
461 #include <event2/event.h>
462 #if !defined(LIBEVENT_VERSION_NUMBER) || LIBEVENT_VERSION_NUMBER < 0x02000d00
468 ])], [ AC_MSG_RESULT([yes]) ],
469 [ AC_MSG_RESULT([no])
470 AC_MSG_ERROR([Libevent does not seem new enough to support bufferevents. We require 2.0.13-stable or later]) ] )
476 LDFLAGS="$save_LDFLAGS"
477 CPPFLAGS="$save_CPPFLAGS"
479 AM_CONDITIONAL(USE_BUFFEREVENTS, test "$enable_bufferevents" = "yes")
480 if test "$enable_bufferevents" = "yes"; then
481 AC_DEFINE(USE_BUFFEREVENTS, 1, [Defined if we're going to use Libevent's buffered IO API])
482 if test "$enable_static_libevent" = "yes"; then
483 TOR_LIBEVENT_LIBS="$TOR_LIBDIR_libevent/libevent_openssl.a $TOR_LIBEVENT_LIBS"
485 TOR_LIBEVENT_LIBS="-levent_openssl $TOR_LIBEVENT_LIBS"
488 AC_SUBST(TOR_LIBEVENT_LIBS)
490 dnl ------------------------------------------------------
491 dnl Where do you live, libm?
493 dnl On some platforms (Haiku/BeOS) the math library is
494 dnl part of libroot. In which case don't link against lm
497 AC_SEARCH_LIBS(pow, [m], , AC_MSG_ERROR([Could not find pow in libm or libc.]))
498 if test "$ac_cv_search_pow" != "none required"; then
499 TOR_LIB_MATH="$ac_cv_search_pow"
502 AC_SUBST(TOR_LIB_MATH)
504 dnl ------------------------------------------------------
505 dnl Where do you live, openssl? And how do we call you?
507 tor_openssl_pkg_redhat="openssl"
508 tor_openssl_pkg_debian="libssl-dev"
509 tor_openssl_devpkg_redhat="openssl-devel"
510 tor_openssl_devpkg_debian="libssl-dev"
512 ALT_openssl_WITHVAL=""
514 [ --with-ssl-dir=PATH Obsolete alias for --with-openssl-dir ],
516 if test "x$withval" != xno && test "x$withval" != "x" ; then
517 ALT_openssl_WITHVAL="$withval"
521 TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
522 [#include <openssl/rand.h>],
523 [void RAND_add(const void *buf, int num, double entropy);],
524 [RAND_add((void*)0,0,0); exit(0);], [],
525 [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
527 dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()
529 if test "$enable_static_openssl" = "yes"; then
530 if test "$tor_cv_library_openssl_dir" = "(system)"; then
531 AC_MSG_ERROR("You must specify an explicit --with-openssl-dir=x option when using --enable-static-openssl")
533 TOR_OPENSSL_LIBS="$TOR_LIBDIR_openssl/libssl.a $TOR_LIBDIR_openssl/libcrypto.a"
536 TOR_OPENSSL_LIBS="-lssl -lcrypto"
538 AC_SUBST(TOR_OPENSSL_LIBS)
540 dnl ------------------------------------------------------
541 dnl Where do you live, zlib? And how do we call you?
543 tor_zlib_pkg_redhat="zlib"
544 tor_zlib_pkg_debian="zlib1g"
545 tor_zlib_devpkg_redhat="zlib-devel"
546 tor_zlib_devpkg_debian="zlib1g-dev"
548 TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
550 [const char * zlibVersion(void);],
551 [zlibVersion(); exit(0);], [--with-zlib-dir],
554 if test "$enable_static_zlib" = "yes"; then
555 if test "$tor_cv_library_zlib_dir" = "(system)"; then
556 AC_MSG_ERROR("You must specify an explicit --with-zlib-dir=x option when
557 using --enable-static-zlib")
559 TOR_ZLIB_LIBS="$TOR_LIBDIR_zlib/libz.a"
564 AC_SUBST(TOR_ZLIB_LIBS)
566 dnl ---------------------------------------------------------------------
567 dnl Now that we know about our major libraries, we can check for compiler
568 dnl and linker hardening options. We need to do this with the libraries known,
569 dnl since sometimes the linker will like an option but not be willing to
570 dnl use it with a build of a library.
572 all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent"
573 all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI"
575 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
576 #if !defined(__clang__)
578 #endif])], have_clang=yes, have_clang=no)
580 if test x$enable_gcc_hardening != xno; then
581 CFLAGS="$CFLAGS -D_FORTIFY_SOURCE=2"
582 if test x$have_clang = xyes; then
583 TOR_CHECK_CFLAGS(-Qunused-arguments)
585 TOR_CHECK_CFLAGS(-fstack-protector-all)
586 TOR_CHECK_CFLAGS(-Wstack-protector)
587 TOR_CHECK_CFLAGS(-fwrapv)
588 TOR_CHECK_CFLAGS(--param ssp-buffer-size=1)
589 if test "$bwin32" = "false"; then
590 TOR_CHECK_CFLAGS(-fPIE)
591 TOR_CHECK_LDFLAGS(-pie, "$all_ldflags_for_check", "$all_libs_for_check")
595 if test x$enable_linker_hardening != xno; then
596 TOR_CHECK_LDFLAGS(-z relro -z now, "$all_ldflags_for_check", "$all_libs_for_check")
599 dnl ------------------------------------------------------
600 dnl Now see if we have a -fomit-frame-pointer compiler option.
602 saved_CFLAGS="$CFLAGS"
603 TOR_CHECK_CFLAGS(-fomit-frame-pointer)
604 if test "$saved_CFLAGS" != "$CFLAGS"; then
605 F_OMIT_FRAME_POINTER='-fomit-frame-pointer'
607 F_OMIT_FRAME_POINTER=''
609 CFLAGS="$saved_CFLAGS"
610 AC_SUBST(F_OMIT_FRAME_POINTER)
612 dnl ------------------------------------------------------
613 dnl Where do you live, libnatpmp? And how do we call you?
614 dnl There are no packages for Debian or Redhat as of this patch
616 if test "$natpmp" = "true"; then
617 AC_DEFINE(NAT_PMP, 1, [Define to 1 if we are building with nat-pmp.])
618 TOR_SEARCH_LIBRARY(libnatpmp, $trylibnatpmpdir, [-lnatpmp $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
619 [#include <natpmp.h>],
623 #include <natpmp.h>],
626 natpmpresp_t response;
627 r = initnatpmp(&natpmp, 0, 0);],
628 [printf("initnatpmp() returned %d (%s)\n", r, r?"FAILED":"SUCCESS");
630 [--with-libnatpmp-dir],
635 dnl ------------------------------------------------------
636 dnl Where do you live, libminiupnpc? And how do we call you?
637 dnl There are no packages for Debian or Redhat as of this patch
639 if test "$upnp" = "true"; then
640 AC_DEFINE(MINIUPNPC, 1, [Define to 1 if we are building with UPnP.])
642 dnl Before we call TOR_SEARCH_LIBRARY we'll do a quick compile test
643 dnl to see if we have miniupnpc-1.5 or -1.6
644 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([#include <miniupnpc/miniupnpc.h>],
645 [upnpDiscover(1, 0, 0, 0);exit(0);])],[miniupnpc15="true"],[miniupnpc15="false"])
647 if test "$miniupnpc15" = "true" ; then
648 AC_DEFINE([MINIUPNPC15],[1],[libminiupnpc version 1.5 found])
649 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
650 [#include <miniupnpc/miniwget.h>
651 #include <miniupnpc/miniupnpc.h>
652 #include <miniupnpc/upnpcommands.h>],
653 [void upnpDiscover(int delay, const char * multicastif,
654 const char * minissdpdsock, int sameport);],
655 [upnpDiscover(1, 0, 0, 0); exit(0);],
656 [--with-libminiupnpc-dir],
659 TOR_SEARCH_LIBRARY(libminiupnpc, $trylibminiupnpcdir, [-lminiupnpc $TOR_LIB_WS32 $TOR_LIB_IPHLPAPI],
660 [#include <miniupnpc/miniwget.h>
661 #include <miniupnpc/miniupnpc.h>
662 #include <miniupnpc/upnpcommands.h>],
663 [void upnpDiscover(int delay, const char * multicastif,
664 const char * minissdpdsock, int sameport, int ipv6, int * error);],
665 [upnpDiscover(1, 0, 0, 0, 0, 0); exit(0);],
666 [--with-libminiupnpc-dir],
671 dnl ============================================================
672 dnl Check for libseccomp
674 AC_CHECK_HEADERS([seccomp.h])
675 AC_SEARCH_LIBS(seccomp_init, [seccomp])
677 dnl ============================================================
678 dnl We need an implementation of curve25519.
680 dnl set these defaults.
682 build_curve25519_donna=no
683 build_curve25519_donna_c64=no
684 use_curve25519_donna=no
685 use_curve25519_nacl=no
688 if test x$enable_curve25519 != xno; then
690 dnl The best choice is using curve25519-donna-c64, but that requires
692 AC_CACHE_CHECK([whether we can use curve25519-donna-c64],
693 tor_cv_can_use_curve25519_donna_c64,
695 [AC_LANG_PROGRAM([dnl
697 typedef unsigned uint128_t __attribute__((mode(TI)));
698 int func(uint64_t a, uint64_t b) {
699 uint128_t c = ((uint128_t)a) * b;
700 int ok = ((uint64_t)(c>>96)) == 522859 &&
701 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
702 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
703 (((uint64_t)(c))&0xffffffffL) == 0;
707 int ok = func( ((uint64_t)2000000000) * 1000000000,
708 ((uint64_t)1234567890) << 24);
711 [tor_cv_can_use_curve25519_donna_c64=yes],
712 [tor_cv_can_use_curve25519_donna_c64=no],
714 [AC_LANG_PROGRAM([dnl
716 typedef unsigned uint128_t __attribute__((mode(TI)));
717 int func(uint64_t a, uint64_t b) {
718 uint128_t c = ((uint128_t)a) * b;
719 int ok = ((uint64_t)(c>>96)) == 522859 &&
720 (((uint64_t)(c>>64))&0xffffffffL) == 3604448702L &&
721 (((uint64_t)(c>>32))&0xffffffffL) == 2351960064L &&
722 (((uint64_t)(c))&0xffffffffL) == 0;
726 int ok = func( ((uint64_t)2000000000) * 1000000000,
727 ((uint64_t)1234567890) << 24);
730 [tor_cv_can_use_curve25519_donna_c64=cross],
731 [tor_cv_can_use_curve25519_donna_c64=no])])])
733 AC_CHECK_HEADERS([crypto_scalarmult_curve25519.h \
734 nacl/crypto_scalarmult_curve25519.h])
736 AC_CACHE_CHECK([for nacl compiled with a fast curve25519 implementation],
737 tor_cv_can_use_curve25519_nacl,
738 [tor_saved_LIBS="$LIBS"
741 [AC_LANG_PROGRAM([dnl
742 #ifdef HAVE_CRYPTO_SCALARMULT_CURVE25519_H
743 #include <crypto_scalarmult_curve25519.h>
744 #elif defined(HAVE_NACL_CRYPTO_SCALARMULT_CURVE25519_H)
745 #include <nacl/crypto_scalarmult_curve25519.h>
747 #ifdef crypto_scalarmult_curve25519_ref_BYTES
748 #error Hey, this is the reference implementation! That's not fast.
751 unsigned char *a, *b, *c; crypto_scalarmult_curve25519(a,b,c);
752 ])], [tor_cv_can_use_curve25519_nacl=yes],
753 [tor_cv_can_use_curve25519_nacl=no])
754 LIBS="$tor_saved_LIBS" ])
756 dnl Okay, now we need to figure out which one to actually use. Fall back
757 dnl to curve25519-donna.c
759 if test x$tor_cv_can_use_curve25519_donna_c64 != xno; then
760 build_curve25519_donna_c64=yes
761 use_curve25519_donna=yes
762 elif test x$tor_cv_can_use_curve25519_nacl = xyes; then
763 use_curve25519_nacl=yes
764 CURVE25519_LIBS=-lnacl
766 build_curve25519_donna=yes
767 use_curve25519_donna=yes
769 have_a_curve25519=yes
772 if test x$have_a_curve25519 = xyes; then
773 AC_DEFINE(CURVE25519_ENABLED, 1,
774 [Defined if we have a curve25519 implementation])
776 if test x$use_curve25519_donna = xyes; then
777 AC_DEFINE(USE_CURVE25519_DONNA, 1,
778 [Defined if we should use an internal curve25519_donna{,_c64} implementation])
780 if test x$use_curve25519_nacl = xyes; then
781 AC_DEFINE(USE_CURVE25519_NACL, 1,
782 [Defined if we should use a curve25519 from nacl])
784 AM_CONDITIONAL(BUILD_CURVE25519_DONNA, test x$build_curve25519_donna = xyes)
785 AM_CONDITIONAL(BUILD_CURVE25519_DONNA_C64, test x$build_curve25519_donna_c64 = xyes)
786 AM_CONDITIONAL(CURVE25519_ENABLED, test x$have_a_curve25519 = xyes)
787 AC_SUBST(CURVE25519_LIBS)
789 dnl Make sure to enable support for large off_t if available.
804 , , 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.))
806 dnl These headers are not essential
843 AC_CHECK_HEADERS(sys/param.h)
845 AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
846 [#ifdef HAVE_SYS_TYPES_H
847 #include <sys/types.h>
849 #ifdef HAVE_SYS_SOCKET_H
850 #include <sys/socket.h>
852 AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
853 [#ifdef HAVE_SYS_TYPES_H
854 #include <sys/types.h>
856 #ifdef HAVE_SYS_SOCKET_H
857 #include <sys/socket.h>
862 AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
863 linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
864 [#ifdef HAVE_SYS_TYPES_H
865 #include <sys/types.h>
867 #ifdef HAVE_SYS_SOCKET_H
868 #include <sys/socket.h>
873 #ifdef HAVE_LINUX_TYPES_H
874 #include <linux/types.h>
876 #ifdef HAVE_NETINET_IN6_H
877 #include <netinet/in6.h>
879 #ifdef HAVE_NETINET_IN_H
880 #include <netinet/in.h>
883 if test x$transparent = xtrue ; then
885 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
888 if test x$linux_netfilter_ipv4 = x1 ; then
891 if test x$transparent_ok = x1 ; then
892 AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
894 *-*-openbsd* | *-*-bitrig*)
895 AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
898 AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
902 AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
903 [#ifdef HAVE_SYS_TYPES_H
904 #include <sys/types.h>
906 #ifdef HAVE_SYS_TIME_H
907 #include <sys/time.h>
910 dnl In case we aren't given a working stdint.h, we'll need to grow our own.
913 AC_CHECK_SIZEOF(int8_t)
914 AC_CHECK_SIZEOF(int16_t)
915 AC_CHECK_SIZEOF(int32_t)
916 AC_CHECK_SIZEOF(int64_t)
917 AC_CHECK_SIZEOF(uint8_t)
918 AC_CHECK_SIZEOF(uint16_t)
919 AC_CHECK_SIZEOF(uint32_t)
920 AC_CHECK_SIZEOF(uint64_t)
921 AC_CHECK_SIZEOF(intptr_t)
922 AC_CHECK_SIZEOF(uintptr_t)
924 dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
926 AC_CHECK_SIZEOF(char)
927 AC_CHECK_SIZEOF(short)
929 AC_CHECK_SIZEOF(long)
930 AC_CHECK_SIZEOF(long long)
931 AC_CHECK_SIZEOF(__int64)
932 AC_CHECK_SIZEOF(void *)
933 AC_CHECK_SIZEOF(time_t)
934 AC_CHECK_SIZEOF(size_t)
935 AC_CHECK_SIZEOF(pid_t)
937 AC_CHECK_TYPES([uint, u_char, ssize_t])
939 dnl used to include sockaddr_storage, but everybody has that.
940 AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t], , ,
941 [#ifdef HAVE_SYS_TYPES_H
942 #include <sys/types.h>
944 #ifdef HAVE_NETINET_IN_H
945 #include <netinet/in.h>
947 #ifdef HAVE_NETINET_IN6_H
948 #include <netinet/in6.h>
950 #ifdef HAVE_SYS_SOCKET_H
951 #include <sys/socket.h>
954 #define _WIN32_WINNT 0x0501
955 #define WIN32_LEAN_AND_MEAN
956 #if defined(_MSC_VER) && (_MSC_VER < 1300)
959 #include <winsock2.h>
960 #include <ws2tcpip.h>
964 AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len], , ,
965 [#ifdef HAVE_SYS_TYPES_H
966 #include <sys/types.h>
968 #ifdef HAVE_NETINET_IN_H
969 #include <netinet/in.h>
971 #ifdef HAVE_NETINET_IN6_H
972 #include <netinet/in6.h>
974 #ifdef HAVE_SYS_SOCKET_H
975 #include <sys/socket.h>
978 #define _WIN32_WINNT 0x0501
979 #define WIN32_LEAN_AND_MEAN
980 #if defined(_MSC_VER) && (_MSC_VER < 1300)
983 #include <winsock2.h>
984 #include <ws2tcpip.h>
989 AC_CHECK_TYPES([rlim_t], , ,
990 [#ifdef HAVE_SYS_TYPES_H
991 #include <sys/types.h>
993 #ifdef HAVE_SYS_TIME_H
994 #include <sys/time.h>
996 #ifdef HAVE_SYS_RESOURCE_H
997 #include <sys/resource.h>
1001 AX_CHECK_SIGN([time_t],
1002 [ AC_DEFINE(TIME_T_IS_SIGNED, 1, [Define if time_t is signed]) ],
1004 #ifdef HAVE_SYS_TYPES_H
1005 #include <sys/types.h>
1007 #ifdef HAVE_SYS_TIME_H
1008 #include <sys/time.h>
1015 if test "$ax_cv_decl_time_t_signed" = no; then
1016 AC_MSG_WARN([You have an unsigned time_t; some things will probably break. Please tell the Tor developers about your interesting platform.])
1019 AX_CHECK_SIGN([size_t],
1020 [ tor_cv_size_t_signed=yes ],
1021 [ tor_cv_size_t_signed=no ], [
1022 #ifdef HAVE_SYS_TYPES_H
1023 #include <sys/types.h>
1027 if test "$ax_cv_decl_size_t_signed" = yes; then
1028 AC_MSG_ERROR([You have a signed size_t; that's grossly nonconformant.])
1031 AX_CHECK_SIGN([enum always],
1032 [ AC_DEFINE(ENUM_VALS_ARE_SIGNED, 1, [Define if enum is always signed]) ],
1034 enum always { AAA, BBB, CCC };
1037 AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
1038 #ifdef HAVE_SYS_SOCKET_H
1039 #include <sys/socket.h>
1043 # We want to make sure that we _don't_ have a cell_t defined, like IRIX does.
1045 AC_CHECK_SIZEOF(cell_t)
1047 # Now make sure that NULL can be represented as zero bytes.
1048 AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
1049 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1050 [[#include <stdlib.h>
1053 #ifdef HAVE_STDDEF_H
1056 int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
1057 return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
1058 [tor_cv_null_is_zero=yes],
1059 [tor_cv_null_is_zero=no],
1060 [tor_cv_null_is_zero=cross])])
1062 if test "$tor_cv_null_is_zero" = cross ; then
1063 # Cross-compiling; let's hope that the target isn't raving mad.
1064 AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
1067 if test "$tor_cv_null_is_zero" != no; then
1068 AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
1069 [Define to 1 iff memset(0) sets pointers to NULL])
1072 AC_CACHE_CHECK([whether memset(0) sets doubles to 0.0], tor_cv_dbl0_is_zero,
1073 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1074 [[#include <stdlib.h>
1077 #ifdef HAVE_STDDEF_H
1080 int main () { double d1,d2; d1=0; memset(&d2,0,sizeof(d2));
1081 return memcmp(&d1,&d2,sizeof(d1))?1:0; }]])],
1082 [tor_cv_dbl0_is_zero=yes],
1083 [tor_cv_dbl0_is_zero=no],
1084 [tor_cv_dbl0_is_zero=cross])])
1086 if test "$tor_cv_dbl0_is_zero" = cross ; then
1087 # Cross-compiling; let's hope that the target isn't raving mad.
1088 AC_MSG_NOTICE([Cross-compiling: we'll assume that 0.0 can be represented as a sequence of 0-valued bytes.])
1091 if test "$tor_cv_dbl0_is_zero" != no; then
1092 AC_DEFINE([DOUBLE_0_REP_IS_ZERO_BYTES], 1,
1093 [Define to 1 iff memset(0) sets doubles to 0.0])
1096 # And what happens when we malloc zero?
1097 AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
1098 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1099 [[#include <stdlib.h>
1102 #ifdef HAVE_STDDEF_H
1105 int main () { return malloc(0)?0:1; }]])],
1106 [tor_cv_malloc_zero_works=yes],
1107 [tor_cv_malloc_zero_works=no],
1108 [tor_cv_malloc_zero_works=cross])])
1110 if test "$tor_cv_malloc_zero_works" = cross; then
1111 # Cross-compiling; let's hope that the target isn't raving mad.
1112 AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
1115 if test "$tor_cv_malloc_zero_works" = yes; then
1116 AC_DEFINE([MALLOC_ZERO_WORKS], 1,
1117 [Define to 1 iff malloc(0) returns a pointer])
1120 # whether we seem to be in a 2s-complement world.
1121 AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
1122 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1123 [[int main () { int problem = ((-99) != (~99)+1);
1124 return problem ? 1 : 0; }]])],
1125 [tor_cv_twos_complement=yes],
1126 [tor_cv_twos_complement=no],
1127 [tor_cv_twos_complement=cross])])
1129 if test "$tor_cv_twos_complement" = cross ; then
1130 # Cross-compiling; let's hope that the target isn't raving mad.
1131 AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
1134 if test "$tor_cv_twos_complement" != no ; then
1135 AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
1136 [Define to 1 iff we represent negative integers with two's complement])
1139 # What does shifting a negative value do?
1140 AC_CACHE_CHECK([whether right-shift on negative values does sign-extension], tor_cv_sign_extend,
1141 [AC_RUN_IFELSE([AC_LANG_SOURCE(
1142 [[int main () { int okay = (-60 >> 8) == -1; return okay ? 0 : 1; }]])],
1143 [tor_cv_sign_extend=yes],
1144 [tor_cv_sign_extend=no],
1145 [tor_cv_sign_extend=cross])])
1147 if test "$tor_cv_sign_extend" = cross ; then
1148 # Cross-compiling; let's hope that the target isn't raving mad.
1149 AC_MSG_NOTICE([Cross-compiling: we'll assume that right-shifting negative integers causes sign-extension])
1152 if test "$tor_cv_sign_extend" != no ; then
1153 AC_DEFINE([RSHIFT_DOES_SIGN_EXTEND], 1,
1154 [Define to 1 iff right-shifting a negative value performs sign-extension])
1157 # Whether we should use the dmalloc memory allocation debugging library.
1158 AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
1159 AC_ARG_WITH(dmalloc,
1160 [ --with-dmalloc Use debug memory allocation library. ],
1161 [if [[ "$withval" = "yes" ]]; then
1167 fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
1170 if [[ $dmalloc -eq 1 ]]; then
1171 AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
1172 AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
1173 AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
1174 AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
1175 AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
1178 AC_ARG_WITH(tcmalloc,
1179 [ --with-tcmalloc Use tcmalloc memory allocation library. ],
1180 [ tcmalloc=yes ], [ tcmalloc=no ])
1182 if test x$tcmalloc = xyes ; then
1183 LDFLAGS="-ltcmalloc $LDFLAGS"
1186 using_custom_malloc=no
1187 if test x$enable_openbsd_malloc = xyes ; then
1188 using_custom_malloc=yes
1190 if test x$tcmalloc = xyes ; then
1191 using_custom_malloc=yes
1193 if test $using_custom_malloc = no ; then
1194 AC_CHECK_FUNCS(mallinfo)
1197 # By default, we're going to assume we don't have mlockall()
1198 # bionic and other platforms have various broken mlockall subsystems.
1199 # Some systems don't have a working mlockall, some aren't linkable,
1200 # and some have it but don't declare it.
1201 AC_CHECK_FUNCS(mlockall)
1202 AC_CHECK_DECLS([mlockall], , , [
1203 #ifdef HAVE_SYS_MMAN_H
1204 #include <sys/mman.h>
1207 # Allow user to specify an alternate syslog facility
1208 AC_ARG_WITH(syslog-facility,
1209 [ --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
1210 syslog_facility="$withval", syslog_facility="LOG_DAEMON")
1211 AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
1212 AC_SUBST(LOGFACILITY)
1214 # Check if we have getresuid and getresgid
1215 AC_CHECK_FUNCS(getresuid getresgid)
1217 # Check for gethostbyname_r in all its glorious incompatible versions.
1218 # (This logic is based on that in Python's configure.in)
1219 AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
1220 [Define this if you have any gethostbyname_r()])
1222 AC_CHECK_FUNC(gethostbyname_r, [
1223 AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
1225 CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
1226 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
1230 struct hostent *h1, *h2;
1232 (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
1234 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1235 AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
1236 [Define this if gethostbyname_r takes 6 arguments])
1245 (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
1247 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1248 AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
1249 [Define this if gethostbyname_r takes 5 arguments])
1257 struct hostent_data hd;
1258 (void) gethostbyname_r(cp1,h1,&hd);
1260 AC_DEFINE(HAVE_GETHOSTBYNAME_R)
1261 AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
1262 [Define this if gethostbyname_r takes 3 arguments])
1272 AC_CACHE_CHECK([whether the C compiler supports __func__],
1273 tor_cv_have_func_macro,
1274 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1276 int main(int c, char **v) { puts(__func__); }])],
1277 tor_cv_have_func_macro=yes,
1278 tor_cv_have_func_macro=no))
1280 AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
1281 tor_cv_have_FUNC_macro,
1282 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1284 int main(int c, char **v) { puts(__FUNC__); }])],
1285 tor_cv_have_FUNC_macro=yes,
1286 tor_cv_have_FUNC_macro=no))
1288 AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
1289 tor_cv_have_FUNCTION_macro,
1290 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1292 int main(int c, char **v) { puts(__FUNCTION__); }])],
1293 tor_cv_have_FUNCTION_macro=yes,
1294 tor_cv_have_FUNCTION_macro=no))
1296 AC_CACHE_CHECK([whether we have extern char **environ already declared],
1297 tor_cv_have_environ_declared,
1298 AC_COMPILE_IFELSE([AC_LANG_SOURCE([
1299 /* We define _GNU_SOURCE here because it is also defined in compat.c.
1300 * Without it environ doesn't get declared. */
1302 #ifdef HAVE_UNISTD_H
1306 int main(int c, char **v) { char **t = environ; }])],
1307 tor_cv_have_environ_declared=yes,
1308 tor_cv_have_environ_declared=no))
1310 if test "$tor_cv_have_func_macro" = 'yes'; then
1311 AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
1314 if test "$tor_cv_have_FUNC_macro" = 'yes'; then
1315 AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
1318 if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
1319 AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
1320 [Defined if the compiler supports __FUNCTION__])
1323 if test "$tor_cv_have_environ_declared" = 'yes'; then
1324 AC_DEFINE(HAVE_EXTERN_ENVIRON_DECLARED, 1,
1325 [Defined if we have extern char **environ already declared])
1328 # $prefix stores the value of the --prefix command line option, or
1329 # NONE if the option wasn't set. In the case that it wasn't set, make
1330 # it be the default, so that we can use it to expand directories now.
1331 if test "x$prefix" = "xNONE"; then
1332 prefix=$ac_default_prefix
1335 # and similarly for $exec_prefix
1336 if test "x$exec_prefix" = "xNONE"; then
1340 if test "x$BUILDDIR" = "x"; then
1344 AH_TEMPLATE([BUILDDIR],[tor's build directory])
1345 AC_DEFINE_UNQUOTED(BUILDDIR,"$BUILDDIR")
1347 if test "x$CONFDIR" = "x"; then
1348 CONFDIR=`eval echo $sysconfdir/tor`
1351 AH_TEMPLATE([CONFDIR],[tor's configuration directory])
1352 AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")
1354 BINDIR=`eval echo $bindir`
1356 LOCALSTATEDIR=`eval echo $localstatedir`
1357 AC_SUBST(LOCALSTATEDIR)
1359 if test "$bwin32" = true; then
1360 # Test if the linker supports the --nxcompat and --dynamicbase options
1362 save_LDFLAGS="$LDFLAGS"
1363 LDFLAGS="-Wl,--nxcompat -Wl,--dynamicbase"
1364 AC_MSG_CHECKING([whether the linker supports DllCharacteristics])
1365 AC_LINK_IFELSE([AC_LANG_PROGRAM([])],
1366 [AC_MSG_RESULT([yes])]
1367 [save_LDFLAGS="$save_LDFLAGS $LDFLAGS"],
1368 [AC_MSG_RESULT([no])]
1370 LDFLAGS="$save_LDFLAGS"
1373 # Set CFLAGS _after_ all the above checks, since our warnings are stricter
1374 # than autoconf's macros like.
1375 if test "$GCC" = yes; then
1376 # Disable GCC's strict aliasing checks. They are an hours-to-debug
1377 # accident waiting to happen.
1378 CFLAGS="$CFLAGS -Wall -fno-strict-aliasing"
1380 # Autoconf sets -g -O2 by default. Override optimization level
1381 # for non-gcc compilers
1383 enable_gcc_warnings=no
1384 enable_gcc_warnings_advisory=no
1387 # OS X Lion started deprecating the system openssl. Let's just disable
1388 # all deprecation warnings on OS X. Also, to potentially make the binary
1389 # a little smaller, let's enable dead_strip.
1393 CFLAGS="$CFLAGS -Wno-deprecated-declarations"
1394 LDFLAGS="$LDFLAGS -dead_strip" ;;
1397 # Add some more warnings which we use in development but not in the
1398 # released versions. (Some relevant gcc versions can't handle these.)
1399 if test x$enable_gcc_warnings = xyes || test x$enable_gcc_warnings_advisory = xyes; then
1401 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1402 #if !defined(__GNUC__) || (__GNUC__ < 4)
1404 #endif])], have_gcc4=yes, have_gcc4=no)
1406 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1407 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
1409 #endif])], have_gcc42=yes, have_gcc42=no)
1411 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
1412 #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 3)
1414 #endif])], have_gcc43=yes, have_gcc43=no)
1416 save_CFLAGS="$CFLAGS"
1417 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1418 AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [])], have_shorten64_flag=yes,
1419 have_shorten64_flag=no)
1420 CFLAGS="$save_CFLAGS"
1423 *-*-openbsd* | *-*-bitrig*)
1424 # Some OpenBSD versions (like 4.8) have -Wsystem-headers by default.
1425 # That's fine, except that the headers don't pass -Wredundant-decls.
1426 # Therefore, let's disable -Wsystem-headers when we're building
1427 # with maximal warnings on OpenBSD.
1428 CFLAGS="$CFLAGS -Wno-system-headers" ;;
1431 CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith"
1432 CFLAGS="$CFLAGS -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings"
1433 CFLAGS="$CFLAGS -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2"
1434 CFLAGS="$CFLAGS -Wwrite-strings -Wmissing-declarations -Wredundant-decls"
1435 CFLAGS="$CFLAGS -Wnested-externs -Wbad-function-cast -Wswitch-enum"
1437 if test x$enable_gcc_warnings = xyes; then
1438 CFLAGS="$CFLAGS -Werror"
1441 # Disabled, so we can use mallinfo(): -Waggregate-return
1443 if test x$have_gcc4 = xyes ; then
1444 # These warnings break gcc 3.3.5 and work on gcc 4.0.2
1445 CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
1448 if test x$have_gcc42 = xyes ; then
1449 # These warnings break gcc 4.0.2 and work on gcc 4.2
1450 # XXXX020 See if any of these work with earlier versions.
1451 CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wstrict-overflow=1"
1453 # We used to use -Wstrict-overflow=5, but that breaks us heavily under 4.3.
1456 if test x$have_gcc42 = xyes && test x$have_clang = xno; then
1457 # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
1458 CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
1461 if test x$have_gcc43 = xyes ; then
1462 # These warnings break gcc 4.2 and work on gcc 4.3
1463 # XXXX020 See if any of these work with earlier versions.
1464 CFLAGS="$CFLAGS -Wextra -Warray-bounds"
1467 if test x$have_shorten64_flag = xyes ; then
1468 CFLAGS="$CFLAGS -Wshorten-64-to-32"
1471 ##This will break the world on some 64-bit architectures
1472 # CFLAGS="$CFLAGS -Winline"
1475 if test "$enable_coverage" = yes && test "$have_clang" = "no"; then
1478 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.])
1482 CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"
1488 contrib/tor.logrotate
1491 src/config/torrc.sample
1494 if test x$asciidoc = xtrue && test "$ASCIIDOC" = "none" ; then
1495 regular_mans="doc/tor doc/tor-gencert doc/tor-resolve doc/torify"
1496 for file in $regular_mans ; do
1497 if ! [[ -f "$srcdir/$file.1.in" ]] || ! [[ -f "$srcdir/$file.html.in" ]] ; then
1498 echo "==================================";
1500 echo "You need asciidoc installed to be able to build the manpage.";
1501 echo "To build without manpages, use the --disable-asciidoc argument";
1502 echo "when calling configure.";
1504 echo "==================================";
1512 if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
1513 ./contrib/updateVersions.pl