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