configure.in 21.8 KB
Newer Older
Nick Mathewson's avatar
Nick Mathewson committed
1
dnl $Id$
Roger Dingledine's avatar
Roger Dingledine committed
2
dnl Copyright (c) 2001-2004, Roger Dingledine
3
4
dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
dnl Copyright (c) 2007-2008, The Tor Project, Inc.
Nick Mathewson's avatar
Nick Mathewson committed
5
dnl See LICENSE for licensing information
6
7

AC_INIT
Roger Dingledine's avatar
Roger Dingledine committed
8
AM_INIT_AUTOMAKE(tor, 0.2.0.19-alpha-dev)
9
AM_CONFIG_HEADER(orconfig.h)
10

11
12
AC_CANONICAL_HOST

13
if test -f /etc/redhat-release ; then
14
  if test -f /usr/kerberos/include ; then
15
    CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include"
16
  fi
17
fi
18

19
20
21
22
# Not a no-op; we want to make sure that CPPFLAGS is set before we use
# the += operator on it in src/or/Makefile.am
CPPFLAGS="$CPPFLAGS -I../common"

23
AC_ARG_ENABLE(debug,
24
 AS_HELP_STRING(--enable-debug, compile with debugging info),
25
[if test x$enableval = xyes; then
26
    CFLAGS="$CFLAGS -g"
27
28
fi])

29
30
31
32
33
34
#XXXX ideally, we should make this into a no-op, and detect whether we're
#compiling for the iphone by using $target.
AC_ARG_ENABLE(iphone,
 AS_HELP_STRING(--enable-iphone, compile with iPhone support),
 [if test x$enableval = xyes ; then
   tor_cv_iphone=true
35
   CFLAGS="$CFLAGS -D__DARWIN_UNIX03 -DIPHONE"
36
37
  fi])

38
#XXXX020 We should make these enabled or not, before 0.2.0.x-final
39
40
AC_ARG_ENABLE(cell-pool,
     AS_HELP_STRING(--disable-cell-pool, disable pool allocator for cells))
41
42
AC_ARG_ENABLE(buf-freelists,
   AS_HELP_STRING(--disable-buf-freelists, disable freelists for buffer RAM))
43
44
45
46
47

if test x$enable_cell_pool != xno; then
  AC_DEFINE(ENABLE_CELL_POOL, 1,
            [Defined if we try to use the pool allocator for queued cells])
fi
48
49
50
51
if test x$enable_buf_freelists != xno; then
  AC_DEFINE(ENABLE_BUF_FREELISTS, 1,
            [Defined if we try to use freelists for buffer RAM chunks])
fi
52

53
AC_ARG_ENABLE(transparent,
54
     AS_HELP_STRING(--disable-transparent, disable transparent proxy support),
55
56
57
58
59
60
     [case "${enableval}" in
        yes) transparent=true ;;
        no)  transparent=false ;;
        *) AC_MSG_ERROR(bad value for --enable-transparent) ;;
      esac], [transparent=true])

Nick Mathewson's avatar
Nick Mathewson committed
61
AC_ARG_ENABLE(threads,
62
     AS_HELP_STRING(--disable-threads, disable multi-threading support))
Nick Mathewson's avatar
Nick Mathewson committed
63
64

if test x$enable_threads = x; then
65
   case $host in
66
67
68
69
70
    *-*-solaris* )
     # Don't try multithreading on solaris -- cpuworkers seem to lock.
     AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes
cpu workers lock up here, so I will disable threads.])
     enable_threads="no";;
Nick Mathewson's avatar
Nick Mathewson committed
71
72
73
74
75
    *)
     enable_threads="yes";;
   esac
fi

76
if test "$enable_threads" = "yes"; then
Nick Mathewson's avatar
Nick Mathewson committed
77
78
79
  AC_DEFINE(ENABLE_THREADS, 1, [Defined if we will try to use multithreading])
fi

80
81
82
83
84
85
case $host in
   *-*-solaris* )
     AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h])
     ;;
esac

86
AC_ARG_ENABLE(gcc-warnings,
87
     AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
88

89
AC_PROG_CC
90
AC_PROG_CPP
91
92
93
AC_PROG_MAKE_SET
AC_PROG_RANLIB

94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
TORUSER=_tor
AC_ARG_WITH(tor-user,
        [  --with-tor-user=NAME    Specify username for tor daemon ],
        [
           TORUSER=$withval
        ]
)
AC_SUBST(TORUSER)

TORGROUP=_tor
AC_ARG_WITH(tor-group,
        [  --with-tor-group=NAME   Specify group name for tor daemon ],
        [
           TORGROUP=$withval
        ]
)
AC_SUBST(TORGROUP)

112
113
114

dnl If WIN32 is defined and non-zero, we are building for win32
AC_MSG_CHECKING([for win32])
115
116
AC_RUN_IFELSE([
int main(int c, char **v) {
117
118
119
120
121
122
123
124
125
126
127
#ifdef WIN32
#if WIN32
  return 0;
#else
  return 1;
#endif
#else
  return 2;
#endif
}],
bwin32=true; AC_MSG_RESULT([yes]),
128
129
bwin32=false; AC_MSG_RESULT([no]),
bwin32=cross; AC_MSG_RESULT([cross])
130
131
)

132
if test "$bwin32" = cross; then
133
134
135
136
137
138
139
140
141
142
143
144
145
AC_MSG_CHECKING([for win32 (cross)])
AC_COMPILE_IFELSE([
#ifdef WIN32
int main(int c, char **v) {return 0;}
#else
#error
int main(int c, char **v) {return x(y);}
#endif
],
bwin32=true; AC_MSG_RESULT([yes]),
bwin32=false; AC_MSG_RESULT([no]))
fi

146
if test "$bwin32" = true; then
147
148
AC_DEFINE(MS_WINDOWS, 1, [Define to 1 if we are building for Windows.])
fi
149
AM_CONDITIONAL(BUILD_NT_SERVICES, test x$bwin32 = xtrue)
150

151
152
dnl Enable C99 when compiling with MIPSpro
AC_MSG_CHECKING([for MIPSpro compiler])
153
AC_COMPILE_IFELSE(AC_LANG_PROGRAM(, [
154
155
156
157
#if (defined(__sgi) && defined(_COMPILER_VERSION))
#error
  return x(y);
#endif
158
159
160
]),
bmipspro=false; AC_MSG_RESULT(no),
bmipspro=true; AC_MSG_RESULT(yes))
161

162
if test "$bmipspro" = true; then
163
164
165
  CFLAGS="$CFLAGS -c99"
fi

166
167
AC_C_BIGENDIAN

168
AC_SEARCH_LIBS(socket, [socket])
169
AC_SEARCH_LIBS(gethostbyname, [nsl])
170
AC_SEARCH_LIBS(dlopen, [dl])
171
AC_SEARCH_LIBS(inet_aton, [resolv])
172

173
if test "$enable_threads" = "yes"; then
174
175
176
  AC_SEARCH_LIBS(pthread_create, [pthread])
  AC_SEARCH_LIBS(pthread_detach, [pthread])
fi
177

178
179
180
181
dnl -------------------------------------------------------------------
dnl Check for functions before libevent, since libevent-1.2 apparently
dnl exports strlcpy without defining it in a header.

182
AC_CHECK_FUNCS(gettimeofday ftime socketpair uname inet_aton strptime getrlimit strlcat strlcpy strtoull ftello getaddrinfo localtime_r gmtime_r memmem strtok_r inet_pton inet_ntop mallinfo malloc_good_size malloc_usable_size)
183

184
if test "$enable_threads" = "yes"; then
185
186
187
188
  AC_CHECK_HEADERS(pthread.h)
  AC_CHECK_FUNCS(pthread_create)
fi

189
dnl ------------------------------------------------------
190
dnl Where do you live, libevent?  And how do we call you?
191

192
if test "$bwin32" = true; then
193
194
195
  TOR_LIB_WS32=-lws2_32
  # Some of the cargo-cults recommend -lwsock32 as well, but I don't
  # think it's actually necessary.
196
  TOR_LIB_GDI=-lgdi32
Nick Mathewson's avatar
   
Nick Mathewson committed
197
else
198
199
  TOR_LIB_WS32=
  TOR_LIB_GDI=
Nick Mathewson's avatar
   
Nick Mathewson committed
200
fi
201
202
AC_SUBST(TOR_LIB_WS32)
AC_SUBST(TOR_LIB_GDI)
Nick Mathewson's avatar
   
Nick Mathewson committed
203

204
205
206
207
dnl We need to do this before we try our disgusting hack below.
AC_CHECK_HEADERS([sys/types.h])

dnl This is a disgusting hack so we safely include older libevent headers.
208
209
210
211
212
AC_CHECK_TYPE(u_int64_t, unsigned long long)
AC_CHECK_TYPE(u_int32_t, unsigned long)
AC_CHECK_TYPE(u_int16_t, unsigned short)
AC_CHECK_TYPE(u_int8_t, unsigned char)

213
tor_libevent_pkg_redhat="libevent"
214
tor_libevent_pkg_debian="libevent-dev"
215
216
217
tor_libevent_devpkg_redhat="libevent-devel"
tor_libevent_devpkg_debian="libevent-dev"

218
TOR_SEARCH_LIBRARY(libevent, $trylibeventdir, [-levent $TOR_LIB_WS32], [
219
#include <stdlib.h>
220
#include <sys/time.h>
Roger Dingledine's avatar
Roger Dingledine committed
221
#include <sys/types.h>
222
#include <event.h>], [void exit(int); void *event_init(void);],
223
    [event_init(); exit(0);], [--with-libevent-dir], [/opt/libevent])
224

225
dnl Now check for particular libevent functions.
226
227
save_LIBS="$LIBS"
save_LDFLAGS="$LDFLAGS"
228
save_CPPFLAGS="$CPPFLAGS"
229
LIBS="-levent $TOR_LIB_WS32 $LIBS"
230
LDFLAGS="$TOR_LDFLAGS_libevent $LIBS"
231
CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
232
AC_CHECK_FUNCS(event_get_version event_get_method event_set_log_callback)
233
234
LIBS="$save_LIBS"
LDFLAGS="$save_LDFLAGS"
235
CPPFLAGS="$save_CPPFLAGS"
236

237
dnl ------------------------------------------------------
238
dnl Where do you live, openssl?  And how do we call you?
239

240
241
242
243
244
tor_openssl_pkg_redhat="openssl"
tor_openssl_pkg_debian="libssl"
tor_openssl_devpkg_redhat="openssl-devel"
tor_openssl_devpkg_debian="libssl-dev"

245
TOR_SEARCH_LIBRARY(openssl, $tryssldir, [-lssl -lcrypto $TOR_LIB_GDI],
246
247
248
249
    [#include <openssl/rand.h>],
    [void RAND_add(const void *buf, int num, double entropy);],
    [RAND_add((void*)0,0,0); exit(0);], [--with-ssl-dir],
    [/usr/local/openssl /usr/lib/openssl /usr/local/ssl /usr/lib/ssl /usr/local /usr/athena /opt/openssl])
250

251
252
dnl XXXX check for OPENSSL_VERSION_NUMBER == SSLeay()

253
254
255
256
257
258
259
260
261
262
263
264
265
266
dnl ------------------------------------------------------
dnl Where do you live, zlib?  And how do we call you?

tor_openssl_pkg_redhat="zlib"
tor_openssl_pkg_debian="zlib1g"
tor_openssl_devpkg_redhat="zlib-devel"
tor_openssl_devpkg_debian="zlib1g-dev"

TOR_SEARCH_LIBRARY(zlib, $tryzlibdir, [-lz],
    [#include <zlib.h>],
    [const char * zlibVersion(void);],
    [zlibVersion(); exit(0);], [--with-zlib-dir],
    [/opt/zlib])

Roger Dingledine's avatar
Roger Dingledine committed
267
dnl Make sure to enable support for large off_t if available.
268

269
270
AC_SYS_LARGEFILE

271
AC_CHECK_HEADERS(unistd.h string.h signal.h ctype.h sys/stat.h sys/types.h fcntl.h sys/fcntl.h sys/time.h errno.h assert.h time.h, , 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.))
272

273
AC_CHECK_HEADERS(netdb.h sys/ioctl.h sys/socket.h arpa/inet.h netinet/in.h pwd.h grp.h sys/un.h)
274

275
276
dnl These headers are not essential

277
AC_CHECK_HEADERS(stdint.h sys/types.h inttypes.h sys/param.h sys/wait.h limits.h sys/limits.h netinet/in.h arpa/inet.h machine/limits.h syslog.h sys/time.h sys/resource.h inttypes.h utime.h sys/utime.h sys/mman.h netintet/in.h netinet/in6.h malloc.h sys/syslimits.h malloc/malloc.h)
278

279
280
281
282
283
284
285
286
TOR_CHECK_PROTOTYPE(malloc_good_size, HAVE_MALLOC_GOOD_SIZE_PROTOTYPE,
[#ifdef HAVE_MALLOC_H
#include <malloc.h>
#endif
#ifdef HAVE_MALLOC_MALLOC_H
#include <malloc/malloc.h>
#endif])

287
AC_CHECK_HEADERS(net/if.h, net_if_found=1, net_if_found=0,
288
289
290
291
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
292
293
#include <sys/socket.h>
#endif])
294
AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0,
295
296
297
298
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
299
#include <sys/socket.h>
300
301
302
#endif
#ifdef HAVE_NET_IF_H
#include <net/if.h>
303
#endif])
304
AC_CHECK_HEADERS(linux/netfilter_ipv4.h,
305
        linux_netfilter_ipv4=1, linux_netfilter_ipv4=0,
306
307
308
309
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
310
311
#include <sys/socket.h>
#endif])
312
313
314

if test x$transparent = xtrue ; then
   transparent_ok=0
315
   if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then
316
317
318
319
320
     transparent_ok=1
   fi
   if test x$linux_netfilter_ipv4 = x1 ; then
     transparent_ok=1
   fi
321
   if test x$transparent_ok = x1 ; then
322
323
324
325
326
327
328
329
330
331
     AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support")
     case $host in
       *-*-openbsd*)
         AC_DEFINE(OPENBSD, 1, "Define to handle pf on OpenBSD properly") ;;
     esac
   else
     AC_MSG_NOTICE([Transparent proxy support enabled, but missing headers.])
   fi
fi

332
AC_FUNC_FSEEKO
333

334
335
336
337
338
339
340
AC_CHECK_MEMBERS([struct timeval.tv_sec], , ,
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif])
341

342
343
344
dnl In case we aren't given a working stdint.h, we'll need to grow our own.
dnl Watch out.

345
346
347
348
349
350
351
352
AC_CHECK_SIZEOF(int8_t)
AC_CHECK_SIZEOF(int16_t)
AC_CHECK_SIZEOF(int32_t)
AC_CHECK_SIZEOF(int64_t)
AC_CHECK_SIZEOF(uint8_t)
AC_CHECK_SIZEOF(uint16_t)
AC_CHECK_SIZEOF(uint32_t)
AC_CHECK_SIZEOF(uint64_t)
353
354
AC_CHECK_SIZEOF(intptr_t)
AC_CHECK_SIZEOF(uintptr_t)
355

356
dnl AC_CHECK_TYPES([int8_t, int16_t, int32_t, int64_t, uint8_t, uint16_t, uint32_t, uint64_t, intptr_t, uintptr_t])
357

358
359
360
361
362
363
AC_CHECK_SIZEOF(char)
AC_CHECK_SIZEOF(short)
AC_CHECK_SIZEOF(int)
AC_CHECK_SIZEOF(long)
AC_CHECK_SIZEOF(long long)
AC_CHECK_SIZEOF(__int64)
364
AC_CHECK_SIZEOF(void *)
365
AC_CHECK_SIZEOF(time_t)
366
AC_CHECK_SIZEOF(size_t)
367

368
369
AC_CHECK_TYPES([uint, u_char])

370
AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, struct sockaddr_storage, sa_family_t], , ,
371
372
373
374
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
375
376
377
378
379
380
381
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IN6_H
#include <netinet/in6.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
382
383
384
385
386
387
388
389
390
391
392
393
394
#endif
#ifdef MS_WINDOWS
#define WIN32_WINNT 0x400
#define _WIN32_WINNT 0x400
#define WIN32_LEAN_AND_MEAN
#if defined(_MSC_VER) && (_MSC_VER < 1300)
#include <winsock.h>
#else
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
#endif
])
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16], , ,
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_NETINET_IN_H
#include <netinet/in.h>
#endif
#ifdef HAVE_NETINET_IN6_H
#include <netinet/in6.h>
#endif
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
#ifdef MS_WINDOWS
#define WIN32_WINNT 0x400
#define _WIN32_WINNT 0x400
#define WIN32_LEAN_AND_MEAN
#if defined(_MSC_VER) && (_MSC_VER < 1300)
#include <winsock.h>
#else
#include <winsock2.h>
#include <ws2tcpip.h>
#endif
#endif
])
420

421
AC_CHECK_TYPES([rlim_t], , ,
422
423
424
[#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
425
426
427
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
428
#ifdef HAVE_SYS_RESOURCE_H
429
430
431
432
#include <sys/resource.h>
#endif
])

433
AC_CACHE_CHECK([whether time_t is signed], tor_cv_time_t_signed, [
434
AC_RUN_IFELSE(AC_LANG_SOURCE([
435
436
437
438
439
440
441
442
443
#ifdef HAVE_SYS_TYPES_H
#include <sys/types.h>
#endif
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
#ifdef HAVE_TIME_H
#include <time.h>
#endif
444
int main(int c, char**v) { if (((time_t)-1)<0) return 1; else return 0; }]),
445
  tor_cv_time_t_signed=no, tor_cv_time_t_signed=yes, tor_cv_time_t_signed=cross)
446
])
447
448

if test "$tor_cv_time_t_signed" = cross; then
449
450
  AC_MSG_NOTICE([Cross compiling: assuming that time_t is signed.])
fi
451

452
if test "$tor_cv_time_t_signed" != no; then
453
454
455
456
  AC_DEFINE([TIME_T_IS_SIGNED], 1,
            [Define to 1 iff time_t is signed])
fi

457
458
459
460
461
AC_CHECK_SIZEOF(socklen_t, , [AC_INCLUDES_DEFAULT()
#ifdef HAVE_SYS_SOCKET_H
#include <sys/socket.h>
#endif
])
462

463
464
465
466
# We want to make sure that we _don't_ have a cell_t defined, like IRIX does.

AC_CHECK_SIZEOF(cell_t)

467
468
469
470
# Now make sure that NULL can be represented as zero bytes.
AC_CACHE_CHECK([whether memset(0) sets pointers to NULL], tor_cv_null_is_zero,
[AC_RUN_IFELSE([AC_LANG_SOURCE(
[[#include <stdlib.h>
471
#include <string.h>
472
473
474
475
#include <stdio.h>
#ifdef HAVE_STDDEF_H
#include <stddef.h>
#endif
476
int main () { char *p1,*p2; p1=NULL; memset(&p2,0,sizeof(p2));
477
return memcmp(&p1,&p2,sizeof(char*))?1:0; }]])],
478
479
480
481
       [tor_cv_null_is_zero=yes],
       [tor_cv_null_is_zero=no],
       [tor_cv_null_is_zero=cross])])

482
if test "$tor_cv_null_is_zero" = cross ; then
483
484
485
486
  # Cross-compiling; let's hope that the target isn't raving mad.
  AC_MSG_NOTICE([Cross-compiling: we'll assume that NULL is represented as a sequence of 0-valued bytes.])
fi

487
if test "$tor_cv_null_is_zero" != no; then
488
489
490
491
  AC_DEFINE([NULL_REP_IS_ZERO_BYTES], 1,
            [Define to 1 iff memset(0) sets pointers to NULL])
fi

492
493
494
495
496
497
498
499
500
501
502
503
504
505
# And what happens when we malloc zero?
AC_CACHE_CHECK([whether we can malloc(0) safely.], tor_cv_malloc_zero_works,
[AC_RUN_IFELSE([AC_LANG_SOURCE(
[[#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#ifdef HAVE_STDDEF_H
#include <stddef.h>
#endif
int main () { return malloc(0)?0:1; }]])],
       [tor_cv_malloc_zero_works=yes],
       [tor_cv_malloc_zero_works=no],
       [tor_cv_malloc_zero_works=cross])])

506
if test "$tor_cv_malloc_zero_works" = cross; then
507
508
509
510
  # Cross-compiling; let's hope that the target isn't raving mad.
  AC_MSG_NOTICE([Cross-compiling: we'll assume that we need to check malloc() arguments for 0.])
fi

511
if test "$tor_cv_malloc_zero_works" = yes; then
512
513
514
515
  AC_DEFINE([MALLOC_ZERO_WORKS], 1,
            [Define to 1 iff malloc(0) returns a pointer])
fi

516
517
518
519
520
521
522
523
524
# whether we seem to be in a 2s-complement world.
AC_CACHE_CHECK([whether we are using 2s-complement arithmetic], tor_cv_twos_complement,
[AC_RUN_IFELSE([AC_LANG_SOURCE(
[[int main () { int problem = ((-99) != (~99)+1);
return problem ? 1 : 0; }]])],
       [tor_cv_twos_complement=yes],
       [tor_cv_twos_complement=no],
       [tor_cv_twos_complement=cross])])

525
if test "$tor_cv_twos_complement" = cross ; then
526
  # Cross-compiling; let's hope that the target isn't raving mad.
527
  AC_MSG_NOTICE([Cross-compiling: we'll assume that negative integers are represented with two's complement.])
528
529
fi

530
if test "$tor_cv_twos_complement" != no ; then
531
532
533
534
  AC_DEFINE([USING_TWOS_COMPLEMENT], 1,
            [Define to 1 iff we represent negative integers with two's complement])
fi

535
# Whether we should use the dmalloc memory allocation debugging library.
Roger Dingledine's avatar
Roger Dingledine committed
536
AC_MSG_CHECKING(whether to use dmalloc (debug memory allocation library))
537
AC_ARG_WITH(dmalloc,
538
[  --with-dmalloc          Use debug memory allocation library. ],
539
540
541
542
543
544
545
546
547
548
[if [[ "$withval" = "yes" ]]; then
  dmalloc=1
  AC_MSG_RESULT(yes)
else
  dmalloc=1
  AC_MSG_RESULT(no)
fi], [ dmalloc=0; AC_MSG_RESULT(no) ]
)

if [[ $dmalloc -eq 1 ]]; then
Peter Palfrader's avatar
Peter Palfrader committed
549
  AC_CHECK_HEADERS(dmalloc.h, , AC_MSG_ERROR(dmalloc header file not found. Do you have the development files for dmalloc installed?))
550
  AC_SEARCH_LIBS(dmalloc_malloc, [dmallocth dmalloc], , AC_MSG_ERROR(Libdmalloc library not found. If you enable it you better have it installed.))
551
552
  AC_DEFINE(USE_DMALLOC, 1, [Debug memory allocation library])
  AC_DEFINE(DMALLOC_FUNC_CHECK, 1, [Enable dmalloc's malloc function check])
553
  AC_CHECK_FUNCS(dmalloc_strdup dmalloc_strndup)
554
555
fi

556
557
558
559
560
561
562
# Allow user to specify an alternate syslog facility
AC_ARG_WITH(syslog-facility,
[  --with-syslog-facility=LOG syslog facility to use (default=LOG_DAEMON)],
syslog_facility="$withval", syslog_facility="LOG_DAEMON")
AC_DEFINE_UNQUOTED(LOGFACILITY,$syslog_facility,[name of the syslog facility])
AC_SUBST(LOGFACILITY)

563
564
565
566
567
568
569
570
571
# Check for gethostbyname_r in all its glorious incompatible versions.
#   (This logic is based on that in Python's configure.in)
AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
  [Define this if you have any gethostbyname_r()])

AC_CHECK_FUNC(gethostbyname_r, [
  AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
  OLD_CFLAGS=$CFLAGS
  CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
572
  AC_COMPILE_IFELSE(AC_LANG_PROGRAM([
573
#include <netdb.h>
574
  ], [[
575
576
577
578
    char *cp1, *cp2;
    struct hostent *h1, *h2;
    int i1, i2;
    (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
579
  ]]),[
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
    AC_DEFINE(HAVE_GETHOSTBYNAME_R)
    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
     [Define this if gethostbyname_r takes 6 arguments])
    AC_MSG_RESULT(6)
  ], [
    AC_TRY_COMPILE([
#include <netdb.h>
    ], [
      char *cp1, *cp2;
      struct hostent *h1;
      int i1, i2;
      (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
    ], [
      AC_DEFINE(HAVE_GETHOSTBYNAME_R)
      AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
        [Define this if gethostbyname_r takes 5 arguments])
      AC_MSG_RESULT(5)
   ], [
      AC_TRY_COMPILE([
#include <netdb.h>
     ], [
       char *cp1;
       struct hostent *h1;
       struct hostent_data hd;
       (void) gethostbyname_r(cp1,h1,&hd);
     ], [
       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
         [Define this if gethostbyname_r takes 3 arguments])
       AC_MSG_RESULT(3)
     ], [
       AC_MSG_RESULT(0)
     ])
  ])
 ])
 CFLAGS=$OLD_CFLAGS
])

618
AC_CACHE_CHECK([whether the C compiler supports __func__],
619
  tor_cv_have_func_macro,
620
621
622
  AC_COMPILE_IFELSE([
#include <stdio.h>
int main(int c, char **v) { puts(__func__); }],
623
624
  tor_cv_have_func_macro=yes,
  tor_cv_have_func_macro=no))
625
626

AC_CACHE_CHECK([whether the C compiler supports __FUNC__],
627
  tor_cv_have_FUNC_macro,
628
629
630
  AC_COMPILE_IFELSE([
#include <stdio.h>
int main(int c, char **v) { puts(__FUNC__); }],
631
632
  tor_cv_have_FUNC_macro=yes,
  tor_cv_have_FUNC_macro=no))
633
634

AC_CACHE_CHECK([whether the C compiler supports __FUNCTION__],
635
  tor_cv_have_FUNCTION_macro,
636
637
638
  AC_COMPILE_IFELSE([
#include <stdio.h>
int main(int c, char **v) { puts(__FUNCTION__); }],
639
640
  tor_cv_have_FUNCTION_macro=yes,
  tor_cv_have_FUNCTION_macro=no))
641

642
if test "$tor_cv_have_func_macro" = 'yes'; then
643
644
645
  AC_DEFINE(HAVE_MACRO__func__, 1, [Defined if the compiler supports __func__])
fi

646
if test "$tor_cv_have_FUNC_macro" = 'yes'; then
647
648
649
  AC_DEFINE(HAVE_MACRO__FUNC__, 1, [Defined if the compiler supports __FUNC__])
fi

650
if test "$tor_cv_have_FUNCTION_macro" = 'yes'; then
651
652
653
654
  AC_DEFINE(HAVE_MACRO__FUNCTION__, 1,
           [Defined if the compiler supports __FUNCTION__])
fi

655
656
657
658
659
660
661
662
663
664
665
666
# $prefix stores the value of the --prefix command line option, or
# NONE if the option wasn't set.  In the case that it wasn't set, make
# it be the default, so that we can use it to expand directories now.
if test "x$prefix" = "xNONE"; then
  prefix=$ac_default_prefix
fi

# and similarly for $exec_prefix
if test "x$exec_prefix" = "xNONE"; then
  exec_prefix=$prefix
fi

667
668
669
if test "x$CONFDIR" = "x"; then
  CONFDIR=`eval echo $sysconfdir/tor`
fi
670
AC_SUBST(CONFDIR)
671
AH_TEMPLATE([CONFDIR],[tor's configuration directory])
672
673
AC_DEFINE_UNQUOTED(CONFDIR,"$CONFDIR")

674
675
676
677
678
BINDIR=`eval echo $bindir`
AC_SUBST(BINDIR)
LOCALSTATEDIR=`eval echo $localstatedir`
AC_SUBST(LOCALSTATEDIR)

679
680
# Set CFLAGS _after_ all the above checks, since our warnings are stricter
# than autoconf's macros like.
681
if test "$ac_cv_c_compiler_gnu" = yes; then
682
683
684
  CFLAGS="$CFLAGS -Wall -g -O2"
else
  CFLAGS="$CFLAGS -g -O"
685
  enable_gcc_warnings=no
686
fi
687

688
# Add some more warnings which we use in development but not in the
689
# released versions.  (Some relevant gcc versions can't handle these.)
690
if test x$enable_gcc_warnings = xyes; then
691

692
  AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
693
694
#if !defined(__GNUC__) || (__GNUC__ < 4)
#error
695
#endif]), have_gcc4=yes, have_gcc4=no)
696

697
  AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [
698
#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
699
700
701
#error
#endif]), have_gcc42=yes, have_gcc42=no)

702
703
  CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat=2 -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror"
  # Disabled, so we can use mallinfo(): -Waggregate-return
704
705
706
707
708

  if test x$have_gcc4 = xyes ; then 
    # These warnings break gcc 3.3.5 and work on gcc 4.0.2
    CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement -Wold-style-definition"
  fi
709

710
711
712
713
  if test x$have_gcc42 = xyes ; then 
    # These warnings break gcc 4.0.2 and work on gcc 4.2
    # XXXX020 Use -fstack-protector.
    # XXXX020 See if any of these work with earlier versions.
714
    CFLAGS="$CFLAGS -Waddress -Wmissing-noreturn -Wnormalized=id -Woverride-init -Wstrict-overflow=5"
715
716
  fi

717
718
719
##This will break the world on some 64-bit architectures
# CFLAGS="$CFLAGS -Winline"

720
fi
721

722
723
CPPFLAGS="$CPPFLAGS $TOR_CPPFLAGS_libevent $TOR_CPPFLAGS_openssl $TOR_CPPFLAGS_zlib"

724
AC_CONFIG_FILES([Makefile tor.spec Doxyfile contrib/tor.sh contrib/torctl contrib/torify contrib/tor.logrotate contrib/Makefile contrib/osx/Makefile contrib/osx/TorBundleDesc.plist contrib/osx/TorBundleInfo.plist contrib/osx/TorDesc.plist contrib/osx/TorInfo.plist contrib/osx/TorStartupDesc.plist src/config/torrc.sample doc/tor.1 src/Makefile doc/Makefile doc/design-paper/Makefile doc/spec/Makefile src/config/Makefile src/common/Makefile src/or/Makefile src/win32/Makefile src/tools/Makefile contrib/suse/Makefile contrib/suse/tor.sh])
725
AC_OUTPUT
726
727
728
729
730

if test -x /usr/bin/perl && test -x ./contrib/updateVersions.pl ; then
  ./contrib/updateVersions.pl
fi