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