| dnl configure.in for libevent |
| dnl Dug Song <dugsong@monkey.org> |
| AC_INIT(event.c) |
| |
| AM_INIT_AUTOMAKE(libevent,1.4.15) |
| AM_CONFIG_HEADER(config.h) |
| dnl AM_MAINTAINER_MODE |
| |
| AC_CONFIG_MACRO_DIR([m4]) |
| |
| AC_CANONICAL_HOST |
| |
| AC_DEFINE(NUMERIC_VERSION, 0x01040f00, [Numeric representation of the version]) |
| |
| dnl Initialize prefix. |
| if test "$prefix" = "NONE"; then |
| prefix="/usr/local" |
| fi |
| |
| dnl Checks for programs. |
| AC_PROG_CC |
| AC_PROG_INSTALL |
| AC_PROG_LN_S |
| |
| AC_PROG_GCC_TRADITIONAL |
| if test "$GCC" = yes ; then |
| CFLAGS="$CFLAGS -Wall" |
| # And disable the strict-aliasing optimization, since it breaks |
| # our sockaddr-handling code in strange ways. |
| CFLAGS="$CFLAGS -fno-strict-aliasing" |
| fi |
| |
| dnl Libevent 1.4 isn't multithreaded, but some of its functions are |
| dnl documented to be reentrant. If you don't define the right macros |
| dnl on some platforms, you get non-reentrant versions of the libc |
| dnl functinos (like an errno that's shared by all threads). |
| AC_MSG_CHECKING([whether we need extra flags to make libc reentrant]) |
| case $host in |
| *solaris* | *-osf* | *-hpux* ) |
| AC_MSG_RESULT([-D_REENTRANT]) |
| CFLAGS="$CFLAGS -D_REENTRANT" |
| ;; |
| *-aix* | *-freebsd* | *-darwin* ) |
| AC_MSG_RESULT([-D_THREAD_SAFE]) |
| CFLAGS="$CFLAGS -D_THREAD_SAFE" |
| ;; |
| *) |
| AC_MSG_RESULT(no) |
| ;; |
| esac |
| |
| AC_ARG_ENABLE(gcc-warnings, |
| AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings with GCC)) |
| |
| AC_PROG_LIBTOOL |
| |
| dnl Uncomment "AC_DISABLE_SHARED" to make shared librraries not get |
| dnl built by default. You can also turn shared libs on and off from |
| dnl the command line with --enable-shared and --disable-shared. |
| dnl AC_DISABLE_SHARED |
| AC_SUBST(LIBTOOL_DEPS) |
| |
| dnl Checks for libraries. |
| AC_CHECK_LIB(socket, socket) |
| AC_CHECK_LIB(resolv, inet_aton) |
| AC_CHECK_LIB(rt, clock_gettime) |
| AC_CHECK_LIB(nsl, inet_ntoa) |
| |
| dnl Checks for header files. |
| AC_HEADER_STDC |
| AC_CHECK_HEADERS(fcntl.h stdarg.h inttypes.h stdint.h poll.h signal.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/in6.h sys/socket.h) |
| if test "x$ac_cv_header_sys_queue_h" = "xyes"; then |
| AC_MSG_CHECKING(for TAILQ_FOREACH in sys/queue.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #include <sys/queue.h> |
| #ifdef TAILQ_FOREACH |
| yes |
| #endif |
| ], [AC_MSG_RESULT(yes) |
| AC_DEFINE(HAVE_TAILQFOREACH, 1, |
| [Define if TAILQ_FOREACH is defined in <sys/queue.h>])], |
| AC_MSG_RESULT(no) |
| ) |
| fi |
| |
| if test "x$ac_cv_header_sys_time_h" = "xyes"; then |
| AC_MSG_CHECKING(for timeradd in sys/time.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #include <sys/time.h> |
| #ifdef timeradd |
| yes |
| #endif |
| ], [ AC_DEFINE(HAVE_TIMERADD, 1, |
| [Define if timeradd is defined in <sys/time.h>]) |
| AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no) |
| ) |
| fi |
| |
| if test "x$ac_cv_header_sys_time_h" = "xyes"; then |
| AC_MSG_CHECKING(for timercmp in sys/time.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #include <sys/time.h> |
| #ifdef timercmp |
| yes |
| #endif |
| ], [ AC_DEFINE(HAVE_TIMERCMP, 1, |
| [Define if timercmp is defined in <sys/time.h>]) |
| AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no) |
| ) |
| fi |
| |
| if test "x$ac_cv_header_sys_time_h" = "xyes"; then |
| AC_MSG_CHECKING(for timerclear in sys/time.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #include <sys/time.h> |
| #ifdef timerclear |
| yes |
| #endif |
| ], [ AC_DEFINE(HAVE_TIMERCLEAR, 1, |
| [Define if timerclear is defined in <sys/time.h>]) |
| AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no) |
| ) |
| fi |
| |
| if test "x$ac_cv_header_sys_time_h" = "xyes"; then |
| AC_MSG_CHECKING(for timerisset in sys/time.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #include <sys/time.h> |
| #ifdef timerisset |
| yes |
| #endif |
| ], [ AC_DEFINE(HAVE_TIMERISSET, 1, |
| [Define if timerisset is defined in <sys/time.h>]) |
| AC_MSG_RESULT(yes)] ,AC_MSG_RESULT(no) |
| ) |
| fi |
| |
| dnl - check if the macro WIN32 is defined on this compiler. |
| dnl - (this is how we check for a windows version of GCC) |
| AC_MSG_CHECKING(for WIN32) |
| AC_TRY_COMPILE(, |
| [ |
| #ifndef WIN32 |
| die horribly |
| #endif |
| ], |
| bwin32=true; AC_MSG_RESULT(yes), |
| bwin32=false; AC_MSG_RESULT(no), |
| ) |
| |
| AM_CONDITIONAL(BUILD_WIN32, test x$bwin32 = xtrue) |
| |
| dnl Checks for typedefs, structures, and compiler characteristics. |
| AC_C_CONST |
| AC_C_INLINE |
| AC_HEADER_TIME |
| |
| dnl Checks for library functions. |
| AC_CHECK_FUNCS(gettimeofday vasprintf fcntl clock_gettime strtok_r strsep getaddrinfo getnameinfo strlcpy inet_ntop signal sigaction strtoll issetugid geteuid getegid) |
| |
| AC_CHECK_SIZEOF(long) |
| |
| if test "x$ac_cv_func_clock_gettime" = "xyes"; then |
| AC_DEFINE(DNS_USE_CPU_CLOCK_FOR_ID, 1, [Define if clock_gettime is available in libc]) |
| else |
| AC_DEFINE(DNS_USE_GETTIMEOFDAY_FOR_ID, 1, [Define is no secure id variant is available]) |
| fi |
| |
| AC_MSG_CHECKING(for F_SETFD in fcntl.h) |
| AC_EGREP_CPP(yes, |
| [ |
| #define _GNU_SOURCE |
| #include <fcntl.h> |
| #ifdef F_SETFD |
| yes |
| #endif |
| ], [ AC_DEFINE(HAVE_SETFD, 1, |
| [Define if F_SETFD is defined in <fcntl.h>]) |
| AC_MSG_RESULT(yes) ], AC_MSG_RESULT(no)) |
| |
| needsignal=no |
| haveselect=no |
| AC_CHECK_FUNCS(select, [haveselect=yes], ) |
| if test "x$haveselect" = "xyes" ; then |
| AC_LIBOBJ(select) |
| needsignal=yes |
| fi |
| |
| havepoll=no |
| AC_CHECK_FUNCS(poll, [havepoll=yes], ) |
| if test "x$havepoll" = "xyes" ; then |
| AC_LIBOBJ(poll) |
| needsignal=yes |
| fi |
| |
| haveepoll=no |
| AC_CHECK_FUNCS(epoll_ctl, [haveepoll=yes], ) |
| if test "x$haveepoll" = "xyes" ; then |
| AC_DEFINE(HAVE_EPOLL, 1, |
| [Define if your system supports the epoll system calls]) |
| AC_LIBOBJ(epoll) |
| needsignal=yes |
| fi |
| |
| havedevpoll=no |
| if test "x$ac_cv_header_sys_devpoll_h" = "xyes"; then |
| AC_DEFINE(HAVE_DEVPOLL, 1, |
| [Define if /dev/poll is available]) |
| AC_LIBOBJ(devpoll) |
| fi |
| |
| havekqueue=no |
| if test "x$ac_cv_header_sys_event_h" = "xyes"; then |
| AC_CHECK_FUNCS(kqueue, [havekqueue=yes], ) |
| if test "x$havekqueue" = "xyes" ; then |
| AC_MSG_CHECKING(for working kqueue) |
| AC_TRY_RUN( |
| #include <sys/types.h> |
| #include <sys/time.h> |
| #include <sys/event.h> |
| #include <stdio.h> |
| #include <unistd.h> |
| #include <fcntl.h> |
| |
| int |
| main(int argc, char **argv) |
| { |
| int kq; |
| int n; |
| int fd[[2]]; |
| struct kevent ev; |
| struct timespec ts; |
| char buf[[8000]]; |
| |
| if (pipe(fd) == -1) |
| exit(1); |
| if (fcntl(fd[[1]], F_SETFL, O_NONBLOCK) == -1) |
| exit(1); |
| |
| while ((n = write(fd[[1]], buf, sizeof(buf))) == sizeof(buf)) |
| ; |
| |
| if ((kq = kqueue()) == -1) |
| exit(1); |
| |
| memset(&ev, 0, sizeof(ev)); |
| ev.ident = fd[[1]]; |
| ev.filter = EVFILT_WRITE; |
| ev.flags = EV_ADD | EV_ENABLE; |
| n = kevent(kq, &ev, 1, NULL, 0, NULL); |
| if (n == -1) |
| exit(1); |
| |
| read(fd[[0]], buf, sizeof(buf)); |
| |
| ts.tv_sec = 0; |
| ts.tv_nsec = 0; |
| n = kevent(kq, NULL, 0, &ev, 1, &ts); |
| if (n == -1 || n == 0) |
| exit(1); |
| |
| exit(0); |
| }, [AC_MSG_RESULT(yes) |
| AC_DEFINE(HAVE_WORKING_KQUEUE, 1, |
| [Define if kqueue works correctly with pipes]) |
| AC_LIBOBJ(kqueue)], AC_MSG_RESULT(no), AC_MSG_RESULT(no)) |
| fi |
| fi |
| |
| haveepollsyscall=no |
| if test "x$ac_cv_header_sys_epoll_h" = "xyes"; then |
| if test "x$haveepoll" = "xno" ; then |
| AC_MSG_CHECKING(for epoll system call) |
| AC_TRY_RUN( |
| #include <stdint.h> |
| #include <sys/param.h> |
| #include <sys/types.h> |
| #include <sys/syscall.h> |
| #include <sys/epoll.h> |
| #include <unistd.h> |
| |
| int |
| epoll_create(int size) |
| { |
| return (syscall(__NR_epoll_create, size)); |
| } |
| |
| int |
| main(int argc, char **argv) |
| { |
| int epfd; |
| |
| epfd = epoll_create(256); |
| exit (epfd == -1 ? 1 : 0); |
| }, [AC_MSG_RESULT(yes) |
| AC_DEFINE(HAVE_EPOLL, 1, |
| [Define if your system supports the epoll system calls]) |
| needsignal=yes |
| AC_LIBOBJ(epoll_sub) |
| AC_LIBOBJ(epoll)], AC_MSG_RESULT(no), AC_MSG_RESULT(no)) |
| fi |
| fi |
| |
| haveeventports=no |
| AC_CHECK_FUNCS(port_create, [haveeventports=yes], ) |
| if test "x$haveeventports" = "xyes" ; then |
| AC_DEFINE(HAVE_EVENT_PORTS, 1, |
| [Define if your system supports event ports]) |
| AC_LIBOBJ(evport) |
| needsignal=yes |
| fi |
| if test "x$bwin32" = "xtrue"; then |
| needsignal=yes |
| fi |
| if test "x$bwin32" = "xtrue"; then |
| needsignal=yes |
| fi |
| if test "x$needsignal" = "xyes" ; then |
| AC_LIBOBJ(signal) |
| fi |
| |
| AC_TYPE_PID_T |
| AC_TYPE_SIZE_T |
| AC_CHECK_TYPES([uint64_t, uint32_t, uint16_t, uint8_t], , , |
| [#ifdef HAVE_STDINT_H |
| #include <stdint.h> |
| #elif defined(HAVE_INTTYPES_H) |
| #include <inttypes.h> |
| #endif |
| #ifdef HAVE_SYS_TYPES_H |
| #include <sys/types.h> |
| #endif]) |
| AC_CHECK_TYPES([fd_mask], , , |
| [#ifdef HAVE_SYS_TYPES_H |
| #include <sys/types.h> |
| #endif |
| #ifdef HAVE_SELECT_H |
| #include <select.h> |
| #endif]) |
| |
| AC_CHECK_SIZEOF(long long) |
| AC_CHECK_SIZEOF(int) |
| AC_CHECK_SIZEOF(short) |
| AC_CHECK_TYPES([struct in6_addr], , , |
| [#ifdef WIN32 |
| #include <winsock2.h> |
| #else |
| #include <sys/types.h> |
| #include <netinet/in.h> |
| #include <sys/socket.h> |
| #endif |
| #ifdef HAVE_NETINET_IN6_H |
| #include <netinet/in6.h> |
| #endif]) |
| |
| AC_MSG_CHECKING([for socklen_t]) |
| AC_TRY_COMPILE([ |
| #include <sys/types.h> |
| #include <sys/socket.h>], |
| [socklen_t x;], |
| AC_MSG_RESULT([yes]), |
| [AC_MSG_RESULT([no]) |
| AC_DEFINE(socklen_t, unsigned int, |
| [Define to unsigned int if you dont have it])] |
| ) |
| |
| AC_MSG_CHECKING([whether our compiler supports __func__]) |
| AC_TRY_COMPILE([], |
| [ const char *cp = __func__; ], |
| AC_MSG_RESULT([yes]), |
| AC_MSG_RESULT([no]) |
| AC_MSG_CHECKING([whether our compiler supports __FUNCTION__]) |
| AC_TRY_COMPILE([], |
| [ const char *cp = __FUNCTION__; ], |
| AC_MSG_RESULT([yes]) |
| AC_DEFINE(__func__, __FUNCTION__, |
| [Define to appropriate substitue if compiler doesnt have __func__]), |
| AC_MSG_RESULT([no]) |
| AC_DEFINE(__func__, __FILE__, |
| [Define to appropriate substitue if compiler doesnt have __func__]))) |
| |
| |
| # Add some more warnings which we use in development but not in the |
| # released versions. (Some relevant gcc versions can't handle these.) |
| if test x$enable_gcc_warnings = xyes; then |
| |
| AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ |
| #if !defined(__GNUC__) || (__GNUC__ < 4) |
| #error |
| #endif]), have_gcc4=yes, have_gcc4=no) |
| |
| AC_COMPILE_IFELSE(AC_LANG_PROGRAM([], [ |
| #if !defined(__GNUC__) || (__GNUC__ < 4) || (__GNUC__ == 4 && __GNUC_MINOR__ < 2) |
| #error |
| #endif]), have_gcc42=yes, have_gcc42=no) |
| |
| 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" |
| CFLAGS="$CFLAGS -Wno-unused-parameter -Wno-sign-compare -Wstrict-aliasing" |
| |
| 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" |
| #CFLAGS="$CFLAGS -Wold-style-definition" |
| fi |
| |
| if test x$have_gcc42 = xyes ; then |
| # These warnings break gcc 4.0.2 and work on gcc 4.2 |
| CFLAGS="$CFLAGS -Waddress -Wnormalized=id -Woverride-init" |
| fi |
| |
| ##This will break the world on some 64-bit architectures |
| # CFLAGS="$CFLAGS -Winline" |
| |
| fi |
| |
| AC_OUTPUT(Makefile test/Makefile sample/Makefile) |