1dnl configure.in for libevent
2dnl Copyright 2000-2007 Niels Provos
3dnl Copyright 2007-2012 Niels Provos and Nick Mathewson
4dnl
5dnl See LICENSE for copying information.
6dnl
7dnl Original version Dug Song <dugsong@monkey.org>
8
9AC_PREREQ(2.59)
10AC_INIT(event.c)
11
12AC_CONFIG_MACRO_DIR([m4])
13
14AM_INIT_AUTOMAKE(libevent,2.0.22-stable)
15AC_CONFIG_HEADERS(config.h)
16AC_DEFINE(NUMERIC_VERSION, 0x02001600, [Numeric representation of the version])
17
18dnl Initialize prefix.
19if test "$prefix" = "NONE"; then
20   prefix="/usr/local"
21fi
22
23AC_CANONICAL_BUILD
24AC_CANONICAL_HOST
25dnl the 'build' machine is where we run configure and compile
26dnl the 'host' machine is where the resulting stuff runs.
27
28case "$host_os" in
29
30 osf5*)
31    CFLAGS="$CFLAGS -D_OSF_SOURCE"
32    ;;
33esac
34
35dnl Checks for programs.
36AC_PROG_CC
37AM_PROG_CC_C_O
38AC_PROG_INSTALL
39AC_PROG_LN_S
40# AC_PROG_MKDIR_P - $(MKDIR_P) should be defined by AM_INIT_AUTOMAKE
41
42# AC_PROG_SED is only available in Autoconf >= 2.59b; workaround for older
43# versions
44ifdef([AC_PROG_SED], [AC_PROG_SED], [
45AC_CHECK_PROGS(SED, [gsed sed])
46])
47
48AC_PROG_GCC_TRADITIONAL
49
50# We need to test for at least gcc 2.95 here, because older versions don't
51# have -fno-strict-aliasing
52AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
53#if !defined(__GNUC__) || (__GNUC__ < 2) || (__GNUC__ == 2 && __GNUC_MINOR__ < 95)
54#error
55#endif])], have_gcc295=yes, have_gcc295=no)
56
57if test "$GCC" = "yes" ; then
58        # Enable many gcc warnings by default...
59        CFLAGS="$CFLAGS -Wall"
60	# And disable the strict-aliasing optimization, since it breaks
61	# our sockaddr-handling code in strange ways.
62	if test x$have_gcc295 = xyes; then
63		CFLAGS="$CFLAGS -fno-strict-aliasing"
64	fi
65fi
66
67# OS X Lion started deprecating the system openssl. Let's just disable
68# all deprecation warnings on OS X.
69case "$host_os" in
70
71 darwin*)
72    CFLAGS="$CFLAGS -Wno-deprecated-declarations"
73    ;;
74esac
75
76AC_ARG_ENABLE(gcc-warnings,
77     AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings with GCC))
78AC_ARG_ENABLE(thread-support,
79     AS_HELP_STRING(--disable-thread-support, disable support for threading),
80	[], [enable_thread_support=yes])
81AC_ARG_ENABLE(malloc-replacement,
82     AS_HELP_STRING(--disable-malloc-replacement, disable support for replacing the memory mgt functions),
83        [], [enable_malloc_replacement=yes])
84AC_ARG_ENABLE(openssl,
85     AS_HELP_STRING(--disable-openssl, disable support for openssl encryption),
86        [], [enable_openssl=yes])
87AC_ARG_ENABLE(debug-mode,
88     AS_HELP_STRING(--disable-debug-mode, disable support for running in debug mode),
89        [], [enable_debug_mode=yes])
90AC_ARG_ENABLE([libevent-install],
91     AS_HELP_STRING([--disable-libevent-install, disable installation of libevent]),
92	[], [enable_libevent_install=yes])
93AC_ARG_ENABLE([libevent-regress],
94     AS_HELP_STRING([--disable-libevent-regress, skip regress in make check]),
95	[], [enable_libevent_regress=yes])
96AC_ARG_ENABLE([function-sections],
97     AS_HELP_STRING([--enable-function-sections, make static library allow smaller binaries with --gc-sections]),
98	[], [enable_function_sections=no])
99
100
101AC_PROG_LIBTOOL
102
103dnl   Uncomment "AC_DISABLE_SHARED" to make shared librraries not get
104dnl   built by default.  You can also turn shared libs on and off from
105dnl   the command line with --enable-shared and --disable-shared.
106dnl AC_DISABLE_SHARED
107AC_SUBST(LIBTOOL_DEPS)
108
109AM_CONDITIONAL([BUILD_REGRESS], [test "$enable_libevent_regress" = "yes"])
110
111dnl Checks for libraries.
112AC_SEARCH_LIBS([inet_ntoa], [nsl])
113AC_SEARCH_LIBS([socket], [socket])
114AC_SEARCH_LIBS([inet_aton], [resolv])
115AC_SEARCH_LIBS([clock_gettime], [rt])
116AC_SEARCH_LIBS([sendfile], [sendfile])
117
118dnl - check if the macro WIN32 is defined on this compiler.
119dnl - (this is how we check for a windows version of GCC)
120AC_MSG_CHECKING(for WIN32)
121AC_TRY_COMPILE(,
122	[
123#ifndef WIN32
124die horribly
125#endif
126	],
127	bwin32=true; AC_MSG_RESULT(yes),
128	bwin32=false; AC_MSG_RESULT(no),
129)
130
131dnl - check if the macro __CYGWIN__ is defined on this compiler.
132dnl - (this is how we check for a cygwin version of GCC)
133AC_MSG_CHECKING(for CYGWIN)
134AC_TRY_COMPILE(,
135	[
136#ifndef __CYGWIN__
137die horribly
138#endif
139	],
140	cygwin=true; AC_MSG_RESULT(yes),
141	cygwin=false; AC_MSG_RESULT(no),
142)
143
144AC_CHECK_HEADERS([zlib.h])
145
146if test "x$ac_cv_header_zlib_h" = "xyes"; then
147dnl Determine if we have zlib for regression tests
148dnl Don't put this one in LIBS
149save_LIBS="$LIBS"
150LIBS=""
151ZLIB_LIBS=""
152have_zlib=no
153AC_SEARCH_LIBS([inflateEnd], [z],
154	[have_zlib=yes
155	ZLIB_LIBS="$LIBS"
156	AC_DEFINE(HAVE_LIBZ, 1, [Define if the system has zlib])])
157LIBS="$save_LIBS"
158AC_SUBST(ZLIB_LIBS)
159fi
160AM_CONDITIONAL(ZLIB_REGRESS, [test "$have_zlib" = "yes"])
161
162dnl See if we have openssl.  This doesn't go in LIBS either.
163if test "$bwin32" = true; then
164  EV_LIB_WS32=-lws2_32
165  EV_LIB_GDI=-lgdi32
166else
167  EV_LIB_WS32=
168  EV_LIB_GDI=
169fi
170AC_SUBST(EV_LIB_WS32)
171AC_SUBST(EV_LIB_GDI)
172AC_SUBST(OPENSSL_LIBADD)
173
174AC_CHECK_HEADERS([openssl/bio.h])
175
176if test "$enable_openssl" = "yes"; then
177save_LIBS="$LIBS"
178LIBS=""
179OPENSSL_LIBS=""
180have_openssl=no
181AC_SEARCH_LIBS([SSL_new], [ssl],
182	[have_openssl=yes
183	OPENSSL_LIBS="$LIBS -lcrypto $EV_LIB_GDI $EV_LIB_WS32 $OPENSSL_LIBADD"
184	AC_DEFINE(HAVE_OPENSSL, 1, [Define if the system has openssl])],
185	[have_openssl=no],
186	[-lcrypto $EV_LIB_GDI $EV_LIB_WS32 $OPENSSL_LIBADD])
187LIBS="$save_LIBS"
188AC_SUBST(OPENSSL_LIBS)
189fi
190
191dnl Checks for header files.
192AC_HEADER_STDC
193AC_CHECK_HEADERS([fcntl.h stdarg.h inttypes.h stdint.h stddef.h poll.h unistd.h sys/epoll.h sys/time.h sys/queue.h sys/event.h sys/param.h sys/ioctl.h sys/select.h sys/devpoll.h port.h netinet/in.h netinet/in6.h sys/socket.h sys/uio.h arpa/inet.h sys/eventfd.h sys/mman.h sys/sendfile.h sys/wait.h netdb.h])
194AC_CHECK_HEADERS([sys/stat.h])
195AC_CHECK_HEADERS(sys/sysctl.h, [], [], [
196#ifdef HAVE_SYS_PARAM_H
197#include <sys/param.h>
198#endif
199])
200if test "x$ac_cv_header_sys_queue_h" = "xyes"; then
201	AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h)
202	AC_EGREP_CPP(yes,
203[
204#include <sys/queue.h>
205#ifdef TAILQ_FOREACH
206 yes
207#endif
208],	[AC_MSG_RESULT(yes)
209	 AC_DEFINE(HAVE_TAILQFOREACH, 1,
210		[Define if TAILQ_FOREACH is defined in <sys/queue.h>])],
211	AC_MSG_RESULT(no)
212	)
213fi
214
215if test "x$ac_cv_header_sys_time_h" = "xyes"; then
216	AC_MSG_CHECKING(for timeradd in sys/time.h)
217	AC_EGREP_CPP(yes,
218[
219#include <sys/time.h>
220#ifdef timeradd
221 yes
222#endif
223],	[ AC_DEFINE(HAVE_TIMERADD, 1,
224		[Define if timeradd is defined in <sys/time.h>])
225	  AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
226)
227fi
228
229if test "x$ac_cv_header_sys_time_h" = "xyes"; then
230	AC_MSG_CHECKING(for timercmp in sys/time.h)
231	AC_EGREP_CPP(yes,
232[
233#include <sys/time.h>
234#ifdef timercmp
235 yes
236#endif
237],	[ AC_DEFINE(HAVE_TIMERCMP, 1,
238		[Define if timercmp is defined in <sys/time.h>])
239	  AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
240)
241fi
242
243if test "x$ac_cv_header_sys_time_h" = "xyes"; then
244	AC_MSG_CHECKING(for timerclear in sys/time.h)
245	AC_EGREP_CPP(yes,
246[
247#include <sys/time.h>
248#ifdef timerclear
249 yes
250#endif
251],	[ AC_DEFINE(HAVE_TIMERCLEAR, 1,
252		[Define if timerclear is defined in <sys/time.h>])
253	  AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
254)
255fi
256
257if test "x$ac_cv_header_sys_time_h" = "xyes"; then
258	AC_MSG_CHECKING(for timerisset in sys/time.h)
259	AC_EGREP_CPP(yes,
260[
261#include <sys/time.h>
262#ifdef timerisset
263 yes
264#endif
265],	[ AC_DEFINE(HAVE_TIMERISSET, 1,
266		[Define if timerisset is defined in <sys/time.h>])
267	  AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no)
268)
269fi
270
271if test "x$ac_cv_header_sys_sysctl_h" = "xyes"; then
272	AC_CHECK_DECLS([CTL_KERN, KERN_RANDOM, RANDOM_UUID, KERN_ARND], [], [],
273	   [[#include <sys/types.h>
274	     #include <sys/sysctl.h>]]
275	)
276fi
277
278AM_CONDITIONAL(BUILD_WIN32, test x$bwin32 = xtrue)
279AM_CONDITIONAL(BUILD_CYGWIN, test x$cygwin = xtrue)
280AM_CONDITIONAL(BUILD_WITH_NO_UNDEFINED, test x$bwin32 = xtrue || test x$cygwin = xtrue)
281
282if test x$bwin32 = xtrue; then
283   AC_SEARCH_LIBS([getservbyname],[ws2_32])
284fi
285
286dnl Checks for typedefs, structures, and compiler characteristics.
287AC_C_CONST
288AC_C_INLINE
289AC_HEADER_TIME
290
291dnl Checks for library functions.
292AC_CHECK_FUNCS([gettimeofday vasprintf fcntl clock_gettime strtok_r strsep])
293AC_CHECK_FUNCS([getnameinfo strlcpy inet_ntop inet_pton signal sigaction strtoll inet_aton pipe eventfd sendfile mmap splice arc4random arc4random_buf issetugid geteuid getegid getprotobynumber setenv unsetenv putenv sysctl])
294AC_CHECK_FUNCS([umask])
295
296AC_CACHE_CHECK(
297    [for getaddrinfo],
298    [libevent_cv_getaddrinfo],
299    [AC_LINK_IFELSE(
300	[AC_LANG_PROGRAM(
301	    [[
302		#ifdef HAVE_NETDB_H
303		#include <netdb.h>
304		#endif
305	    ]],
306	    [[
307		getaddrinfo;
308	    ]]
309	)],
310	[libevent_cv_getaddrinfo=yes],
311	[libevent_cv_getaddrinfo=no]
312    )]
313)
314if test "$libevent_cv_getaddrinfo" = "yes" ; then
315    AC_DEFINE([HAVE_GETADDRINFO], [1], [Do we have getaddrinfo()?])
316else
317
318AC_CHECK_FUNCS([getservbyname])
319# Check for gethostbyname_r in all its glorious incompatible versions.
320#   (This is cut-and-pasted from Tor, which based its logic on
321#   Python's configure.in.)
322AH_TEMPLATE(HAVE_GETHOSTBYNAME_R,
323  [Define this if you have any gethostbyname_r()])
324
325AC_CHECK_FUNC(gethostbyname_r, [
326  AC_MSG_CHECKING([how many arguments gethostbyname_r() wants])
327  OLD_CFLAGS=$CFLAGS
328  CFLAGS="$CFLAGS $MY_CPPFLAGS $MY_THREAD_CPPFLAGS $MY_CFLAGS"
329  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([
330#include <netdb.h>
331  ], [[
332    char *cp1, *cp2;
333    struct hostent *h1, *h2;
334    int i1, i2;
335    (void)gethostbyname_r(cp1,h1,cp2,i1,&h2,&i2);
336  ]])],[
337    AC_DEFINE(HAVE_GETHOSTBYNAME_R)
338    AC_DEFINE(HAVE_GETHOSTBYNAME_R_6_ARG, 1,
339     [Define this if gethostbyname_r takes 6 arguments])
340    AC_MSG_RESULT(6)
341  ], [
342    AC_TRY_COMPILE([
343#include <netdb.h>
344    ], [
345      char *cp1, *cp2;
346      struct hostent *h1;
347      int i1, i2;
348      (void)gethostbyname_r(cp1,h1,cp2,i1,&i2);
349    ], [
350      AC_DEFINE(HAVE_GETHOSTBYNAME_R)
351      AC_DEFINE(HAVE_GETHOSTBYNAME_R_5_ARG, 1,
352        [Define this if gethostbyname_r takes 5 arguments])
353      AC_MSG_RESULT(5)
354   ], [
355      AC_TRY_COMPILE([
356#include <netdb.h>
357     ], [
358       char *cp1;
359       struct hostent *h1;
360       struct hostent_data hd;
361       (void) gethostbyname_r(cp1,h1,&hd);
362     ], [
363       AC_DEFINE(HAVE_GETHOSTBYNAME_R)
364       AC_DEFINE(HAVE_GETHOSTBYNAME_R_3_ARG, 1,
365         [Define this if gethostbyname_r takes 3 arguments])
366       AC_MSG_RESULT(3)
367     ], [
368       AC_MSG_RESULT(0)
369     ])
370  ])
371 ])
372 CFLAGS=$OLD_CFLAGS
373])
374
375fi
376
377AC_CHECK_SIZEOF(long)
378
379AC_MSG_CHECKING(for F_SETFD in fcntl.h)
380AC_EGREP_CPP(yes,
381[
382#define _GNU_SOURCE
383#include <fcntl.h>
384#ifdef F_SETFD
385yes
386#endif
387],	[ AC_DEFINE(HAVE_SETFD, 1,
388	      [Define if F_SETFD is defined in <fcntl.h>])
389	  AC_MSG_RESULT(yes) ], AC_MSG_RESULT(no))
390
391needsignal=no
392haveselect=no
393if test x$bwin32 != xtrue; then
394    AC_CHECK_FUNCS(select, [haveselect=yes], )
395    if test "x$haveselect" = "xyes" ; then
396 	needsignal=yes
397    fi
398fi
399AM_CONDITIONAL(SELECT_BACKEND, [test "x$haveselect" = "xyes"])
400
401havepoll=no
402AC_CHECK_FUNCS(poll, [havepoll=yes], )
403if test "x$havepoll" = "xyes" ; then
404	needsignal=yes
405fi
406AM_CONDITIONAL(POLL_BACKEND, [test "x$havepoll" = "xyes"])
407
408havedevpoll=no
409if test "x$ac_cv_header_sys_devpoll_h" = "xyes"; then
410	AC_DEFINE(HAVE_DEVPOLL, 1,
411		    [Define if /dev/poll is available])
412fi
413AM_CONDITIONAL(DEVPOLL_BACKEND, [test "x$ac_cv_header_sys_devpoll_h" = "xyes"])
414
415havekqueue=no
416if test "x$ac_cv_header_sys_event_h" = "xyes"; then
417	AC_CHECK_FUNCS(kqueue, [havekqueue=yes], )
418	if test "x$havekqueue" = "xyes" ; then
419		AC_MSG_CHECKING(for working kqueue)
420		AC_TRY_RUN(
421#include <sys/types.h>
422#include <sys/time.h>
423#include <sys/event.h>
424#include <stdio.h>
425#include <unistd.h>
426#include <fcntl.h>
427
428int
429main(int argc, char **argv)
430{
431	int kq;
432	int n;
433	int fd[[2]];
434	struct kevent ev;
435	struct timespec ts;
436	char buf[[8000]];
437
438	if (pipe(fd) == -1)
439		exit(1);
440	if (fcntl(fd[[1]], F_SETFL, O_NONBLOCK) == -1)
441		exit(1);
442
443	while ((n = write(fd[[1]], buf, sizeof(buf))) == sizeof(buf))
444		;
445
446        if ((kq = kqueue()) == -1)
447		exit(1);
448
449	memset(&ev, 0, sizeof(ev));
450	ev.ident = fd[[1]];
451	ev.filter = EVFILT_WRITE;
452	ev.flags = EV_ADD | EV_ENABLE;
453	n = kevent(kq, &ev, 1, NULL, 0, NULL);
454	if (n == -1)
455		exit(1);
456
457	read(fd[[0]], buf, sizeof(buf));
458
459	ts.tv_sec = 0;
460	ts.tv_nsec = 0;
461	n = kevent(kq, NULL, 0, &ev, 1, &ts);
462	if (n == -1 || n == 0)
463		exit(1);
464
465	exit(0);
466}, [AC_MSG_RESULT(yes)
467    AC_DEFINE(HAVE_WORKING_KQUEUE, 1,
468		[Define if kqueue works correctly with pipes])
469    havekqueue=yes
470    ], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
471	fi
472fi
473AM_CONDITIONAL(KQUEUE_BACKEND, [test "x$havekqueue" = "xyes"])
474
475haveepollsyscall=no
476haveepoll=no
477AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], )
478if test "x$haveepoll" = "xyes" ; then
479	AC_DEFINE(HAVE_EPOLL, 1,
480		[Define if your system supports the epoll system calls])
481	needsignal=yes
482fi
483if test "x$ac_cv_header_sys_epoll_h" = "xyes"; then
484	if test "x$haveepoll" = "xno" ; then
485		AC_MSG_CHECKING(for epoll system call)
486		AC_TRY_RUN(
487#include <stdint.h>
488#include <sys/param.h>
489#include <sys/types.h>
490#include <sys/syscall.h>
491#include <sys/epoll.h>
492#include <unistd.h>
493
494int
495epoll_create(int size)
496{
497	return (syscall(__NR_epoll_create, size));
498}
499
500int
501main(int argc, char **argv)
502{
503	int epfd;
504
505	epfd = epoll_create(256);
506	exit (epfd == -1 ? 1 : 0);
507}, [AC_MSG_RESULT(yes)
508    AC_DEFINE(HAVE_EPOLL, 1,
509	[Define if your system supports the epoll system calls])
510    needsignal=yes
511    have_epoll=yes
512    AC_LIBOBJ(epoll_sub)
513    ], AC_MSG_RESULT(no), AC_MSG_RESULT(no))
514	fi
515fi
516AM_CONDITIONAL(EPOLL_BACKEND, [test "x$haveepoll" = "xyes"])
517
518haveeventports=no
519AC_CHECK_FUNCS(port_create, [haveeventports=yes], )
520if test "x$haveeventports" = "xyes" ; then
521	AC_DEFINE(HAVE_EVENT_PORTS, 1,
522		[Define if your system supports event ports])
523	needsignal=yes
524fi
525AM_CONDITIONAL(EVPORT_BACKEND, [test "x$haveeventports" = "xyes"])
526
527if test "x$bwin32" = "xtrue"; then
528	needsignal=yes
529fi
530
531AM_CONDITIONAL(SIGNAL_SUPPORT, [test "x$needsignal" = "xyes"])
532
533AC_TYPE_PID_T
534AC_TYPE_SIZE_T
535AC_TYPE_SSIZE_T
536
537AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t, uintptr_t], , ,
538[#ifdef HAVE_STDINT_H
539#include <stdint.h>
540#elif defined(HAVE_INTTYPES_H)
541#include <inttypes.h>
542#endif
543#ifdef HAVE_SYS_TYPES_H
544#include <sys/types.h>
545#endif])
546
547AC_CHECK_TYPES([fd_mask], , ,
548[#ifdef HAVE_SYS_TYPES_H
549#include <sys/types.h>
550#endif
551#ifdef HAVE_SYS_SELECT_H
552#include <sys/select.h>
553#endif])
554
555AC_CHECK_SIZEOF(long long)
556AC_CHECK_SIZEOF(long)
557AC_CHECK_SIZEOF(int)
558AC_CHECK_SIZEOF(short)
559AC_CHECK_SIZEOF(size_t)
560AC_CHECK_SIZEOF(void *)
561AC_CHECK_SIZEOF(off_t)
562
563AC_CHECK_TYPES([struct in6_addr, struct sockaddr_in6, sa_family_t, struct addrinfo, struct sockaddr_storage], , ,
564[#define _GNU_SOURCE
565#include <sys/types.h>
566#ifdef HAVE_NETINET_IN_H
567#include <netinet/in.h>
568#endif
569#ifdef HAVE_NETINET_IN6_H
570#include <netinet/in6.h>
571#endif
572#ifdef HAVE_SYS_SOCKET_H
573#include <sys/socket.h>
574#endif
575#ifdef HAVE_NETDB_H
576#include <netdb.h>
577#endif
578#ifdef WIN32
579#define WIN32_WINNT 0x400
580#define _WIN32_WINNT 0x400
581#define WIN32_LEAN_AND_MEAN
582#if defined(_MSC_VER) && (_MSC_VER < 1300)
583#include <winsock.h>
584#else
585#include <winsock2.h>
586#include <ws2tcpip.h>
587#endif
588#endif
589])
590AC_CHECK_MEMBERS([struct in6_addr.s6_addr32, struct in6_addr.s6_addr16, struct sockaddr_in.sin_len, struct sockaddr_in6.sin6_len, struct sockaddr_storage.ss_family, struct sockaddr_storage.__ss_family], , ,
591[#include <sys/types.h>
592#ifdef HAVE_NETINET_IN_H
593#include <netinet/in.h>
594#endif
595#ifdef HAVE_NETINET_IN6_H
596#include <netinet/in6.h>
597#endif
598#ifdef HAVE_SYS_SOCKET_H
599#include <sys/socket.h>
600#endif
601#ifdef WIN32
602#define WIN32_WINNT 0x400
603#define _WIN32_WINNT 0x400
604#define WIN32_LEAN_AND_MEAN
605#if defined(_MSC_VER) && (_MSC_VER < 1300)
606#include <winsock.h>
607#else
608#include <winsock2.h>
609#include <ws2tcpip.h>
610#endif
611#endif
612])
613
614AC_MSG_CHECKING([for socklen_t])
615AC_TRY_COMPILE([
616 #include <sys/types.h>
617 #include <sys/socket.h>],
618  [socklen_t x;],
619  AC_MSG_RESULT([yes]),
620  [AC_MSG_RESULT([no])
621  AC_DEFINE(socklen_t, unsigned int,
622	[Define to unsigned int if you dont have it])]
623)
624
625AC_MSG_CHECKING([whether our compiler supports __func__])
626AC_TRY_COMPILE([],
627 [ const char *cp = __func__; ],
628 AC_MSG_RESULT([yes]),
629 AC_MSG_RESULT([no])
630 AC_MSG_CHECKING([whether our compiler supports __FUNCTION__])
631 AC_TRY_COMPILE([],
632   [ const char *cp = __FUNCTION__; ],
633   AC_MSG_RESULT([yes])
634   AC_DEFINE(__func__, __FUNCTION__,
635         [Define to appropriate substitue if compiler doesnt have __func__]),
636   AC_MSG_RESULT([no])
637   AC_DEFINE(__func__, __FILE__,
638         [Define to appropriate substitue if compiler doesnt have __func__])))
639
640
641# check if we can compile with pthreads
642have_pthreads=no
643if test x$bwin32 != xtrue && test "$enable_thread_support" != "no"; then
644  ACX_PTHREAD([
645	AC_DEFINE(HAVE_PTHREADS, 1,
646		[Define if we have pthreads on this system])
647	have_pthreads=yes])
648  CFLAGS="$CFLAGS $PTHREAD_CFLAGS"
649  AC_CHECK_SIZEOF(pthread_t, ,
650     [AC_INCLUDES_DEFAULT()
651      #include <pthread.h> ]
652  )
653fi
654AM_CONDITIONAL(PTHREADS, [test "$have_pthreads" != "no" && test "$enable_thread_support" != "no"])
655
656# check if we should compile locking into the library
657if test x$enable_thread_support = xno; then
658   AC_DEFINE(DISABLE_THREAD_SUPPORT, 1,
659	[Define if libevent should not be compiled with thread support])
660fi
661
662# check if we should hard-code the mm functions.
663if test x$enable_malloc_replacement = xno; then
664  AC_DEFINE(DISABLE_MM_REPLACEMENT, 1,
665        [Define if libevent should not allow replacing the mm functions])
666fi
667
668# check if we should hard-code debugging out
669if test x$enable_debug_mode = xno; then
670  AC_DEFINE(DISABLE_DEBUG_MODE, 1,
671        [Define if libevent should build without support for a debug mode])
672fi
673
674# check if we have and should use openssl
675AM_CONDITIONAL(OPENSSL, [test "$enable_openssl" != "no" && test "$have_openssl" = "yes"])
676
677# Add some more warnings which we use in development but not in the
678# released versions.  (Some relevant gcc versions can't handle these.)
679if test x$enable_gcc_warnings = xyes && test "$GCC" = "yes"; then
680
681  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
682#if !defined(__GNUC__) || (__GNUC__ < 4)
683#error
684#endif])], have_gcc4=yes, have_gcc4=no)
685
686  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
687#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2)
688#error
689#endif])], have_gcc42=yes, have_gcc42=no)
690
691  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
692#if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 5)
693#error
694#endif])], have_gcc45=yes, have_gcc45=no)
695
696  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [
697#if !defined(__clang__)
698#error
699#endif])], have_clang=yes, have_clang=no)
700
701  CFLAGS="$CFLAGS -W -Wfloat-equal -Wundef -Wpointer-arith -Wstrict-prototypes -Wmissing-prototypes -Wwrite-strings -Wredundant-decls -Wchar-subscripts -Wcomment -Wformat -Wwrite-strings -Wmissing-declarations -Wredundant-decls -Wnested-externs -Wbad-function-cast -Wswitch-enum -Werror"
702  CFLAGS="$CFLAGS -Wno-unused-parameter -Wstrict-aliasing"
703
704  if test x$have_gcc4 = xyes ; then
705    # These warnings break gcc 3.3.5 and work on gcc 4.0.2
706    CFLAGS="$CFLAGS -Winit-self -Wmissing-field-initializers -Wdeclaration-after-statement"
707    #CFLAGS="$CFLAGS -Wold-style-definition"
708  fi
709
710  if test x$have_gcc42 = xyes ; then
711    # These warnings break gcc 4.0.2 and work on gcc 4.2
712    CFLAGS="$CFLAGS -Waddress"
713  fi
714
715  if test x$have_gcc42 = xyes && test x$have_clang = xno; then
716    # These warnings break gcc 4.0.2 and clang, but work on gcc 4.2
717    CFLAGS="$CFLAGS -Wnormalized=id -Woverride-init"
718  fi
719
720  if test x$have_gcc45 = xyes ; then
721    # These warnings work on gcc 4.5
722    CFLAGS="$CFLAGS -Wlogical-op"
723  fi
724
725  if test x$have_clang = xyes; then
726    # Disable the unused-function warnings, because these trigger
727    # for minheap-internal.h related code.
728    CFLAGS="$CFLAGS -Wno-unused-function"
729
730    # clang on macosx emits warnigns for each directory specified which
731    # isn't "used" generating a lot of build noise (typically 3 warnings
732    # per file
733    case "$host_os" in
734        darwin*)
735            CFLAGS="$CFLAGS -Qunused-arguments"
736        ;;
737    esac
738  fi
739
740##This will break the world on some 64-bit architectures
741# CFLAGS="$CFLAGS -Winline"
742
743fi
744
745LIBEVENT_GC_SECTIONS=
746if test "$GCC" = yes && test "$enable_function_sections" = yes ; then
747    AC_CACHE_CHECK(
748	[if linker supports omitting unused code and data],
749	[libevent_cv_gc_sections_runs],
750	[
751	    dnl  NetBSD will link but likely not run with --gc-sections
752	    dnl  http://bugs.ntp.org/1844
753	    dnl  http://gnats.netbsd.org/40401
754	    dnl  --gc-sections causes attempt to load as linux elf, with
755	    dnl  wrong syscalls in place.  Test a little gauntlet of
756	    dnl  simple stdio read code checking for errors, expecting
757	    dnl  enough syscall differences that the NetBSD code will
758	    dnl  fail even with Linux emulation working as designed.
759	    dnl  A shorter test could be refined by someone with access
760	    dnl  to a NetBSD host with Linux emulation working.
761	    origCFLAGS="$CFLAGS"
762	    CFLAGS="$CFLAGS -Wl,--gc-sections"
763	    AC_LINK_IFELSE(
764		[AC_LANG_PROGRAM(
765		    [[
766			#include <stdlib.h>
767			#include <stdio.h>
768		    ]],
769		    [[
770			FILE *	fpC;
771			char	buf[32];
772			size_t	cch;
773			int	read_success_once;
774
775			fpC = fopen("conftest.c", "r");
776			if (NULL == fpC)
777				exit(1);
778			do {
779				cch = fread(buf, sizeof(buf), 1, fpC);
780				read_success_once |= (0 != cch);
781			} while (0 != cch);
782			if (!read_success_once)
783				exit(2);
784			if (!feof(fpC))
785				exit(3);
786			if (0 != fclose(fpC))
787				exit(4);
788
789			exit(EXIT_SUCCESS);
790		    ]]
791		)],
792		[
793                    dnl We have to do this invocation manually so that we can
794                    dnl get the output of conftest.err to make sure it doesn't
795                    dnl mention gc-sections.
796		    if test "X$cross_compiling" = "Xyes" || grep gc-sections conftest.err ; then
797			libevent_cv_gc_sections_runs=no
798		    else
799			libevent_cv_gc_sections_runs=no
800			./conftest >/dev/null 2>&1 && libevent_cv_gc_sections_runs=yes
801		    fi
802		],
803		[libevent_cv_gc_sections_runs=no]
804	    )
805	    CFLAGS="$origCFLAGS"
806	    AS_UNSET([origCFLAGS])
807	]
808    )
809    case "$libevent_cv_gc_sections_runs" in
810     yes)
811	CFLAGS="-ffunction-sections -fdata-sections $CFLAGS"
812	LIBEVENT_GC_SECTIONS="-Wl,--gc-sections"
813	;;
814    esac
815fi
816AC_SUBST([LIBEVENT_GC_SECTIONS])
817
818AM_CONDITIONAL([INSTALL_LIBEVENT], [test "$enable_libevent_install" = "yes"])
819
820AC_CONFIG_FILES( [libevent.pc libevent_openssl.pc libevent_pthreads.pc] )
821AC_OUTPUT(Makefile include/Makefile test/Makefile sample/Makefile)
822