2 # Libevent CMake project
4 # Based on initial work by:
18 # cmake -G "Visual Studio 10" ..
22 cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
25 cmake_policy(SET CMP0054 NEW)
28 cmake_policy(SET CMP0074 NEW)
31 cmake_policy(SET CMP0075 NEW)
34 if(NOT CMAKE_BUILD_TYPE)
35 set(CMAKE_BUILD_TYPE Release
36 CACHE STRING "Set build type to Debug o Release (default Release)" FORCE)
38 string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
40 # get rid of the extra default configurations
41 # what? why would you get id of other useful build types? - Ellzey
42 set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Limited configurations" FORCE)
44 set(EVENT__LIBRARY_TYPE DEFAULT CACHE STRING
45 "Set library type to SHARED/STATIC/BOTH (default SHARED for MSVC, otherwise BOTH)")
49 set(CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
50 string(REGEX MATCH "SunOS" SOLARIS "${CMAKE_SYSTEM_NAME}")
53 include(CheckTypeSize)
54 include(CheckFunctionExistsEx)
55 include(CheckFileOffsetBits)
56 include(CheckFunctionExists)
57 include(CheckIncludeFile)
58 include(CheckIncludeFiles)
59 include(CheckVariableExists)
60 include(CheckSymbolExists)
61 include(CheckStructHasMember)
62 include(CheckCSourceCompiles)
63 include(CheckPrototypeDefinition)
64 include(CheckFunctionKeywords)
65 include(CheckConstExists)
66 include(AddCompilerFlags)
67 include(VersionViaGit)
69 event_fuzzy_version_from_git()
71 set(EVENT_VERSION_MAJOR ${EVENT_GIT___VERSION_MAJOR})
72 set(EVENT_VERSION_MINOR ${EVENT_GIT___VERSION_MINOR})
73 set(EVENT_VERSION_PATCH ${EVENT_GIT___VERSION_PATCH})
74 set(EVENT_VERSION_STAGE ${EVENT_GIT___VERSION_STAGE})
77 set(EVENT_ABI_MAJOR ${EVENT_VERSION_MAJOR})
78 set(EVENT_ABI_MINOR ${EVENT_VERSION_MINOR})
79 set(EVENT_ABI_PATCH ${EVENT_VERSION_PATCH})
81 set(EVENT_ABI_LIBVERSION
82 "${EVENT_ABI_MAJOR}.${EVENT_ABI_MINOR}.${EVENT_ABI_PATCH}")
84 set(EVENT_PACKAGE_VERSION
85 "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}")
87 set(EVENT_NUMERIC_VERSION 0x02010a00)
89 # only a subset of names can be used, defaults to "beta"
90 set(EVENT_STAGE_NAME ${EVENT_VERSION_STAGE})
92 # a list that defines what can set for EVENT_STAGE_VERSION
93 set(EVENT__ALLOWED_STAGE_NAMES
102 FIND EVENT__ALLOWED_STAGE_NAMES
103 "${EVENT_STAGE_NAME}"
106 if (EVENT__STAGE_RET EQUAL -1)
108 "stage ${EVENT_STAGE_NAME} is not allowed, reset to beta")
109 set(EVENT_STAGE_NAME beta)
113 "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}-${EVENT_STAGE_NAME}")
115 option(EVENT__DISABLE_DEBUG_MODE
116 "Define if libevent should build without support for a debug mode" OFF)
118 option(EVENT__ENABLE_VERBOSE_DEBUG
119 "Enables verbose debugging" OFF)
121 option(EVENT__DISABLE_MM_REPLACEMENT
122 "Define if libevent should not allow replacing the mm functions" OFF)
124 option(EVENT__DISABLE_THREAD_SUPPORT
125 "Define if libevent should not be compiled with thread support" OFF)
127 option(EVENT__DISABLE_OPENSSL
128 "Define if libevent should build without support for OpenSSL encryption" OFF)
130 option(EVENT__DISABLE_BENCHMARK
131 "Defines if libevent should build without the benchmark executables" OFF)
133 option(EVENT__DISABLE_TESTS
134 "If tests should be compiled or not" OFF)
136 option(EVENT__DISABLE_REGRESS
137 "Disable the regress tests" OFF)
139 option(EVENT__DISABLE_SAMPLES
140 "Disable sample files" OFF)
142 option(EVENT__DISABLE_CLOCK_GETTIME
143 "Do not use clock_gettime even if it is available" OFF)
145 option(EVENT__FORCE_KQUEUE_CHECK
146 "When crosscompiling forces running a test program that verifies that Kqueue works with pipes. Note that this requires you to manually run the test program on the cross compilation target to verify that it works. See cmake documentation for try_run for more details" OFF)
148 # TODO: Add --disable-largefile omit support for large files
149 option(EVENT__COVERAGE
150 "Enable running gcov to get a test coverage report (only works with GCC/CLang). Make sure to enable -DCMAKE_BUILD_TYPE=Debug as well." OFF)
152 # Put the libaries and binaries that get built into directories at the
153 # top of the build tree rather than in hard-to-find leaf directories.
154 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
155 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
156 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
158 if (EVENT__ENABLE_VERBOSE_DEBUG)
159 add_definitions(-DUSE_DEBUG=1)
162 # make it colorful under ninja-build
163 if ("${CMAKE_GENERATOR}" STREQUAL "Ninja")
164 add_compiler_flags(-fdiagnostics-color=always)
167 # Setup compiler flags for coverage.
169 if (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "debug")
170 message(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
173 message(STATUS "Setting coverage compiler flags")
175 set(CMAKE_REQUIRED_LIBRARIES "--coverage")
176 add_compiler_flags(-g -O0 --coverage)
177 set(CMAKE_REQUIRED_LIBRARIES "")
183 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") OR
184 ("${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang"))
187 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR (${CLANG}))
190 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR (${CLANG}))
194 # Detect library type
195 set(EVENT_LIBRARY_TYPE)
196 if ("${EVENT__LIBRARY_TYPE}" STREQUAL "DEFAULT")
198 set(EVENT_LIBRARY_TYPE SHARED)
200 set(EVENT_LIBRARY_TYPE BOTH)
203 string(TOUPPER "${EVENT__LIBRARY_TYPE}" EVENT_LIBRARY_TYPE)
205 if ((${MSVC}) AND ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH"))
207 "Building SHARED and STATIC is not supported for MSVC "
208 "(due to conflicts in library name"
209 " between STATIC library and IMPORTED library for SHARED libraries)")
211 set(EVENT_LIBRARY_STATIC OFF)
212 set(EVENT_LIBRARY_SHARED OFF)
213 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH")
214 set(EVENT_LIBRARY_STATIC ON)
215 set(EVENT_LIBRARY_SHARED ON)
216 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
217 set(EVENT_LIBRARY_STATIC ON)
218 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "SHARED")
219 set(EVENT_LIBRARY_SHARED ON)
221 message(FATAL_ERROR "${EVENT_LIBRARY_TYPE} is not supported")
225 set(msvc_static_runtime OFF)
226 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
227 set(msvc_static_runtime ON)
231 # - https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2017
232 # - https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime
233 option(EVENT__MSVC_STATIC_RUNTIME
234 "Link static runtime libraries"
235 ${msvc_static_runtime})
237 if (EVENT__MSVC_STATIC_RUNTIME)
241 CMAKE_C_FLAGS_RELEASE
242 CMAKE_C_FLAGS_MINSIZEREL
243 CMAKE_C_FLAGS_RELWITHDEBINFO
245 if (${flag_var} MATCHES "/MD")
246 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
252 # GNUC specific options.
254 option(EVENT__DISABLE_GCC_WARNINGS "Disable verbose warnings with GCC" OFF)
255 option(EVENT__ENABLE_GCC_HARDENING "Enable compiler security checks" OFF)
256 option(EVENT__ENABLE_GCC_FUNCTION_SECTIONS "Enable gcc function sections" OFF)
257 option(EVENT__ENABLE_GCC_WARNINGS "Make all GCC warnings into errors" OFF)
259 set(GCC_V ${CMAKE_C_COMPILER_VERSION})
262 -Wall -Wextra -Wno-unused-parameter -Wstrict-aliasing -Wstrict-prototypes
264 -fno-strict-aliasing # gcc 2.9.5+
269 -Wmissing-field-initializers
270 -Wdeclaration-after-statement
284 list(APPEND __FLAGS -Wno-unused-function)
287 if (EVENT__DISABLE_GCC_WARNINGS)
288 list(APPEND __FLAGS -w)
291 if (EVENT__ENABLE_GCC_HARDENING)
293 -fstack-protector-all
297 "--param ssp-buffer-size=1")
299 add_definitions(-D_FORTIFY_SOURCE=2)
302 if (EVENT__ENABLE_GCC_FUNCTION_SECTIONS)
303 list(APPEND __FLAGS -ffunction-sections)
304 # TODO: Add --gc-sections support. We need some checks for NetBSD to ensure this works.
307 if (EVENT__ENABLE_GCC_WARNINGS)
308 list(APPEND __FLAGS -Werror)
311 add_compiler_flags(${__FLAGS})
315 # Get rid of deprecated warnings for OpenSSL on OSX 10.7 and greater.
317 -Wno-error=deprecated-declarations
324 set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h ws2tcpip.h)
325 set(CMAKE_REQUIRED_LIBRARIES ws2_32.lib)
326 set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h)
329 set(CMAKE_REQUIRED_LIBRARIES socket nsl)
332 # Check if _GNU_SOURCE is available.
333 if (NOT DEFINED _GNU_SOURCE)
334 CHECK_SYMBOL_EXISTS(__GNU_LIBRARY__ "features.h" _GNU_SOURCE)
337 unset(_GNU_SOURCE CACHE)
338 CHECK_SYMBOL_EXISTS(_GNU_SOURCE "features.h" _GNU_SOURCE)
343 add_definitions(-D_GNU_SOURCE=1)
346 CHECK_INCLUDE_FILE(sys/types.h EVENT__HAVE_SYS_TYPES_H)
347 if(EVENT__HAVE_SYS_TYPES_H)
348 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/types.h)
351 CHECK_INCLUDE_FILE(sys/socket.h EVENT__HAVE_SYS_SOCKET_H)
352 if(EVENT__HAVE_SYS_SOCKET_H)
353 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
356 CHECK_INCLUDE_FILE(netinet/in.h EVENT__HAVE_NETINET_IN_H)
357 if(EVENT__HAVE_NETINET_IN_H)
358 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netinet/in.h)
361 CHECK_INCLUDE_FILE(sys/un.h EVENT__HAVE_SYS_UN_H)
362 if(EVENT__HAVE_SYS_UN_H)
363 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/un.h)
367 CHECK_INCLUDE_FILE(afunix.h EVENT__HAVE_AFUNIX_H)
368 if(EVENT__HAVE_AFUNIX_H)
369 list(APPEND CMAKE_EXTRA_INCLUDE_FILES afunix.h)
372 CHECK_TYPE_SIZE("struct sockaddr_un" EVENT__HAVE_STRUCT_SOCKADDR_UN)
374 CHECK_INCLUDE_FILE(netinet/in6.h EVENT__HAVE_NETINET_IN6_H)
375 if(EVENT__HAVE_NETINET_IN6_H)
376 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netinet/in6.h)
379 CHECK_INCLUDE_FILE(unistd.h EVENT__HAVE_UNISTD_H)
380 CHECK_INCLUDE_FILE(netdb.h EVENT__HAVE_NETDB_H)
381 CHECK_INCLUDE_FILE(dlfcn.h EVENT__HAVE_DLFCN_H)
382 CHECK_INCLUDE_FILE(arpa/inet.h EVENT__HAVE_ARPA_INET_H)
383 CHECK_INCLUDE_FILE(fcntl.h EVENT__HAVE_FCNTL_H)
384 if(EVENT__HAVE_FCNTL_H)
385 list(APPEND CMAKE_EXTRA_INCLUDE_FILES fcntl.h)
387 CHECK_INCLUDE_FILE(inttypes.h EVENT__HAVE_INTTYPES_H)
388 CHECK_INCLUDE_FILE(memory.h EVENT__HAVE_MEMORY_H)
389 CHECK_INCLUDE_FILE(poll.h EVENT__HAVE_POLL_H)
390 CHECK_INCLUDE_FILE(port.h EVENT__HAVE_PORT_H)
391 if(EVENT__HAVE_PORT_H)
392 list(APPEND CMAKE_EXTRA_INCLUDE_FILES port.h)
394 CHECK_INCLUDE_FILE(signal.h EVENT__HAVE_SIGNAL_H)
395 CHECK_INCLUDE_FILE(stdarg.h EVENT__HAVE_STDARG_H)
396 CHECK_INCLUDE_FILE(stddef.h EVENT__HAVE_STDDEF_H)
397 CHECK_INCLUDE_FILE(stdint.h EVENT__HAVE_STDINT_H)
398 CHECK_INCLUDE_FILE(stdlib.h EVENT__HAVE_STDLIB_H)
399 CHECK_INCLUDE_FILE(strings.h EVENT__HAVE_STRINGS_H)
400 CHECK_INCLUDE_FILE(string.h EVENT__HAVE_STRING_H)
401 CHECK_INCLUDE_FILE(sys/devpoll.h EVENT__HAVE_DEVPOLL)
402 CHECK_INCLUDE_FILE(sys/epoll.h EVENT__HAVE_SYS_EPOLL_H)
403 CHECK_INCLUDE_FILE(sys/eventfd.h EVENT__HAVE_SYS_EVENTFD_H)
404 CHECK_INCLUDE_FILE(sys/event.h EVENT__HAVE_SYS_EVENT_H)
405 CHECK_INCLUDE_FILE(sys/ioctl.h EVENT__HAVE_SYS_IOCTL_H)
406 CHECK_INCLUDE_FILE(sys/mman.h EVENT__HAVE_SYS_MMAN_H)
407 CHECK_INCLUDE_FILE(sys/param.h EVENT__HAVE_SYS_PARAM_H)
408 CHECK_INCLUDE_FILE(sys/queue.h EVENT__HAVE_SYS_QUEUE_H)
409 CHECK_INCLUDE_FILE(sys/select.h EVENT__HAVE_SYS_SELECT_H)
410 CHECK_INCLUDE_FILE(sys/sendfile.h EVENT__HAVE_SYS_SENDFILE_H)
411 CHECK_INCLUDE_FILE(sys/stat.h EVENT__HAVE_SYS_STAT_H)
412 CHECK_INCLUDE_FILE(sys/time.h EVENT__HAVE_SYS_TIME_H)
413 if(EVENT__HAVE_SYS_TIME_H)
414 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/time.h)
416 CHECK_INCLUDE_FILE(sys/uio.h EVENT__HAVE_SYS_UIO_H)
417 CHECK_INCLUDE_FILES("sys/types.h;ifaddrs.h" EVENT__HAVE_IFADDRS_H)
418 CHECK_INCLUDE_FILE(mach/mach_time.h EVENT__HAVE_MACH_MACH_TIME_H)
419 CHECK_INCLUDE_FILE(netinet/tcp.h EVENT__HAVE_NETINET_TCP_H)
420 CHECK_INCLUDE_FILE(sys/wait.h EVENT__HAVE_SYS_WAIT_H)
421 CHECK_INCLUDE_FILE(sys/resource.h EVENT__HAVE_SYS_RESOURCE_H)
422 CHECK_INCLUDE_FILE(sys/sysctl.h EVENT__HAVE_SYS_SYSCTL_H)
423 CHECK_INCLUDE_FILE(sys/timerfd.h EVENT__HAVE_SYS_TIMERFD_H)
424 CHECK_INCLUDE_FILE(errno.h EVENT__HAVE_ERRNO_H)
427 CHECK_FUNCTION_EXISTS_EX(epoll_create EVENT__HAVE_EPOLL)
428 CHECK_FUNCTION_EXISTS_EX(epoll_ctl EVENT__HAVE_EPOLL_CTL)
429 CHECK_FUNCTION_EXISTS_EX(eventfd EVENT__HAVE_EVENTFD)
430 if(NOT EVENT__DISABLE_CLOCK_GETTIME)
431 CHECK_FUNCTION_EXISTS_EX(clock_gettime EVENT__HAVE_CLOCK_GETTIME)
433 CHECK_FUNCTION_EXISTS_EX(fcntl EVENT__HAVE_FCNTL)
434 CHECK_FUNCTION_EXISTS_EX(getaddrinfo EVENT__HAVE_GETADDRINFO)
435 CHECK_FUNCTION_EXISTS_EX(getnameinfo EVENT__HAVE_GETNAMEINFO)
436 CHECK_FUNCTION_EXISTS_EX(gettimeofday EVENT__HAVE_GETTIMEOFDAY)
437 CHECK_FUNCTION_EXISTS_EX(getprotobynumber EVENT__HAVE_GETPROTOBYNUMBER)
438 CHECK_FUNCTION_EXISTS_EX(getservbyname EVENT__HAVE_GETSERVBYNAME)
439 CHECK_FUNCTION_EXISTS_EX(inet_ntop EVENT__HAVE_INET_NTOP)
440 CHECK_FUNCTION_EXISTS_EX(inet_pton EVENT__HAVE_INET_PTON)
441 CHECK_FUNCTION_EXISTS_EX(kqueue EVENT__HAVE_KQUEUE)
442 CHECK_FUNCTION_EXISTS_EX(mmap EVENT__HAVE_MMAP)
443 CHECK_FUNCTION_EXISTS_EX(pipe EVENT__HAVE_PIPE)
444 CHECK_FUNCTION_EXISTS_EX(pipe2 EVENT__HAVE_PIPE2)
445 CHECK_FUNCTION_EXISTS_EX(poll EVENT__HAVE_POLL)
446 CHECK_FUNCTION_EXISTS_EX(port_create EVENT__HAVE_PORT_CREATE)
447 CHECK_FUNCTION_EXISTS_EX(sendfile EVENT__HAVE_SENDFILE)
448 CHECK_FUNCTION_EXISTS_EX(sigaction EVENT__HAVE_SIGACTION)
449 CHECK_FUNCTION_EXISTS_EX(signal EVENT__HAVE_SIGNAL)
450 CHECK_FUNCTION_EXISTS_EX(splice EVENT__HAVE_SPLICE)
451 CHECK_FUNCTION_EXISTS_EX(strlcpy EVENT__HAVE_STRLCPY)
452 CHECK_FUNCTION_EXISTS_EX(strsep EVENT__HAVE_STRSEP)
453 CHECK_FUNCTION_EXISTS_EX(strtok_r EVENT__HAVE_STRTOK_R)
454 CHECK_FUNCTION_EXISTS_EX(strtoll EVENT__HAVE_STRTOLL)
455 CHECK_FUNCTION_EXISTS_EX(vasprintf EVENT__HAVE_VASPRINTF)
456 CHECK_FUNCTION_EXISTS_EX(sysctl EVENT__HAVE_SYSCTL)
457 CHECK_FUNCTION_EXISTS_EX(accept4 EVENT__HAVE_ACCEPT4)
458 CHECK_FUNCTION_EXISTS_EX(arc4random EVENT__HAVE_ARC4RANDOM)
459 CHECK_FUNCTION_EXISTS_EX(arc4random_buf EVENT__HAVE_ARC4RANDOM_BUF)
460 CHECK_FUNCTION_EXISTS_EX(arc4random_addrandom EVENT__HAVE_ARC4RANDOM_ADDRANDOM)
461 CHECK_FUNCTION_EXISTS_EX(epoll_create1 EVENT__HAVE_EPOLL_CREATE1)
462 CHECK_FUNCTION_EXISTS_EX(getegid EVENT__HAVE_GETEGID)
463 CHECK_FUNCTION_EXISTS_EX(geteuid EVENT__HAVE_GETEUID)
464 CHECK_FUNCTION_EXISTS_EX(getifaddrs EVENT__HAVE_GETIFADDRS)
465 CHECK_FUNCTION_EXISTS_EX(issetugid EVENT__HAVE_ISSETUGID)
466 CHECK_FUNCTION_EXISTS_EX(mach_absolute_time EVENT__HAVE_MACH_ABSOLUTE_TIME)
467 CHECK_FUNCTION_EXISTS_EX(nanosleep EVENT__HAVE_NANOSLEEP)
468 CHECK_FUNCTION_EXISTS_EX(usleep EVENT__HAVE_USLEEP)
469 CHECK_FUNCTION_EXISTS_EX(timeradd EVENT__HAVE_TIMERADD)
470 CHECK_FUNCTION_EXISTS_EX(timerclear EVENT__HAVE_TIMERCLEAR)
471 CHECK_FUNCTION_EXISTS_EX(timercmp EVENT__HAVE_TIMERCMP)
472 CHECK_FUNCTION_EXISTS_EX(timerfd_create EVENT__HAVE_TIMERFD_CREATE)
473 CHECK_FUNCTION_EXISTS_EX(timerisset EVENT__HAVE_TIMERISSET)
474 CHECK_FUNCTION_EXISTS_EX(putenv EVENT__HAVE_PUTENV)
475 CHECK_FUNCTION_EXISTS_EX(setenv EVENT__HAVE_SETENV)
476 CHECK_FUNCTION_EXISTS_EX(setrlimit EVENT__HAVE_SETRLIMIT)
477 CHECK_FUNCTION_EXISTS_EX(umask EVENT__HAVE_UMASK)
478 CHECK_FUNCTION_EXISTS_EX(unsetenv EVENT__HAVE_UNSETENV)
480 # Get the gethostbyname_r prototype.
481 CHECK_FUNCTION_EXISTS_EX(gethostbyname_r EVENT__HAVE_GETHOSTBYNAME_R)
483 if(EVENT__HAVE_GETHOSTBYNAME_R)
484 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
485 "int gethostbyname_r(const char *name, struct hostent *hp, struct hostent_data *hdata)"
488 EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)
490 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
491 "struct hostent *gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, int *herr)"
494 EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)
496 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
497 "int gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, struct hostent **result, int *herr)"
500 EVENT__HAVE_GETHOSTBYNAME_R_6_ARG)
503 if(HAVE_PORT_H AND HAVE_PORT_CREATE)
504 set(EVENT__HAVE_EVENT_PORTS 1)
508 CHECK_FUNCTION_EXISTS_EX(select EVENT__HAVE_SELECT)
511 CHECK_TYPE_SIZE("uint8_t" EVENT__HAVE_UINT8_T)
512 CHECK_TYPE_SIZE("uint16_t" EVENT__HAVE_UINT16_T)
513 CHECK_TYPE_SIZE("uint32_t" EVENT__HAVE_UINT32_T)
514 CHECK_TYPE_SIZE("uint64_t" EVENT__HAVE_UINT64_T)
515 CHECK_TYPE_SIZE("short" EVENT__SIZEOF_SHORT BUILTIN_TYPES_ONLY)
516 CHECK_TYPE_SIZE("int" EVENT__SIZEOF_INT BUILTIN_TYPES_ONLY)
517 CHECK_TYPE_SIZE("unsigned" EVENT__SIZEOF_UNSIGNED BUILTIN_TYPES_ONLY)
518 CHECK_TYPE_SIZE("unsigned int" EVENT__SIZEOF_UNSIGNED_INT BUILTIN_TYPES_ONLY)
519 CHECK_TYPE_SIZE("long" EVENT__SIZEOF_LONG BUILTIN_TYPES_ONLY)
520 CHECK_TYPE_SIZE("long long" EVENT__SIZEOF_LONG_LONG BUILTIN_TYPES_ONLY)
523 # These aren't available until Windows Vista.
524 # But you can still link them. They just won't be found when running the exe.
525 set(EVENT__HAVE_INET_NTOP 0)
526 set(EVENT__HAVE_INET_PTON 0)
529 # Check for different inline keyword versions.
530 check_function_keywords("inline" "__inline" "__inline__")
533 set(EVENT__inline inline)
534 elseif (HAVE___INLINE)
535 set(EVENT__inline __inline)
536 elseif(HAVE___INLINE__)
537 set(EVENT__inline __inline__)
542 # __func__/__FUNCTION__ is not a macros in general
543 CHECK_SYMBOL_EXISTS("__func__" "" EVENT__HAVE___func__)
544 CHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__)
546 CHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH)
547 CHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN)
548 CHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND)
549 CHECK_CONST_EXISTS(KERN_RANDOM sys/sysctl.h EVENT__HAVE_DECL_KERN_RANDOM)
550 CHECK_CONST_EXISTS(RANDOM_UUID sys/sysctl.h EVENT__HAVE_DECL_RANDOM_UUID)
551 CHECK_SYMBOL_EXISTS(F_SETFD fcntl.h EVENT__HAVE_SETFD)
553 CHECK_TYPE_SIZE(fd_mask EVENT__HAVE_FD_MASK)
555 CHECK_TYPE_SIZE(size_t EVENT__SIZEOF_SIZE_T)
556 if(NOT EVENT__SIZEOF_SIZE_T)
557 set(EVENT__size_t "unsigned")
558 set(EVENT__SIZEOF_SIZE_T ${EVENT__SIZEOF_UNSIGNED})
560 set(EVENT__size_t size_t)
563 CHECK_TYPE_SIZE("off_t" EVENT__SIZEOF_OFF_T LANGUAGE C)
566 # XXX we should functionalize these size and type sets. --elley
570 list(APPEND CMAKE_EXTRA_INCLUDE_FILES BaseTsd.h)
572 CHECK_TYPE_SIZE("ssize_t" EVENT__SIZEOF_SSIZE_T_LOWER LANGUAGE C)
573 CHECK_TYPE_SIZE("SSIZE_T" EVENT__SIZEOF_SSIZE_T_UPPER LANGUAGE C)
575 if (EVENT__SIZEOF_SSIZE_T_LOWER)
576 set(EVENT__ssize_t "ssize_t")
577 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_LOWER})
578 elseif (EVENT__SIZEOF_SSIZE_T_UPPER)
579 set(EVENT__ssize_t "SSIZE_T")
580 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_UPPER})
582 set(EVENT__ssize_t "int")
583 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_INT})
586 CHECK_TYPE_SIZE(socklen_t EVENT__SIZEOF_SOCKLEN_T)
587 if(NOT EVENT__SIZEOF_SOCKLEN_T)
588 set(EVENT__socklen_t "unsigned int")
589 set(EVENT__SIZEOF_SOCKLEN_T ${EVENT__SIZEOF_UNSIGNED_INT})
591 set(EVENT__socklen_t "socklen_t")
594 CHECK_TYPE_SIZE(pid_t EVENT__SIZEOF_PID_T)
595 if(NOT EVENT__SIZEOF_PID_T)
596 set(EVENT__SIZEOF_PID_T ${EVENT__SIZEOF_INT})
598 set(EVENT__SIZEOF_PID_T EVENT__SIZEOF_PID_T)
601 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
603 list(APPEND CMAKE_EXTRA_INCLUDE_FILES pthread.h)
605 CHECK_TYPE_SIZE(pthread_t EVENT__SIZEOF_PTHREAD_T)
608 if(EVENT__HAVE_CLOCK_GETTIME)
609 set(EVENT__DNS_USE_CPU_CLOCK_FOR_ID 1)
612 # we're just getting lazy now.
613 CHECK_TYPE_SIZE("uintptr_t" EVENT__HAVE_UINTPTR_T)
614 CHECK_TYPE_SIZE("void *" EVENT__SIZEOF_VOID_P)
615 CHECK_TYPE_SIZE("time_t" EVENT__SIZEOF_TIME_T)
617 # Tests file offset bits.
618 # TODO: Add AIX test for if -D_LARGE_FILES is needed.
620 # XXX: Why is this here? we don't even use it. Well, we don't even use it
621 # on top of that, why is it set in the config.h?! IT_MAKES_NO_SENSE
622 # I'm commenting it out for now.
625 #CHECK_FILE_OFFSET_BITS()
627 # Verify kqueue works with pipes.
628 if (EVENT__HAVE_KQUEUE)
629 if (CMAKE_CROSSCOMPILING AND NOT EVENT__FORCE_KQUEUE_CHECK)
630 message(WARNING "Cannot check if kqueue works with pipes when crosscompiling, use EVENT__FORCE_KQUEUE_CHECK to be sure (this requires manually running a test program on the cross compilation target)")
631 set(EVENT__HAVE_WORKING_KQUEUE 1)
633 message(STATUS "Checking if kqueue works with pipes...")
634 include(CheckWorkingKqueue)
638 if(EVENT__HAVE_NETDB_H)
639 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netdb.h)
640 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
642 list(APPEND CMAKE_EXTRA_INCLUDE_FILES ws2tcpip.h)
643 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
646 # Check for sockaddr structure sizes.
647 set(SOCKADDR_HEADERS)
649 set(CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
650 if (_MSC_VER LESS 1300)
651 set(SOCKADDR_HEADERS winsock.h)
653 set(SOCKADDR_HEADERS winsock2.h ws2tcpip.h)
656 if (EVENT__HAVE_NETINET_IN_H)
657 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in.h)
660 if (EVENT__HAVE_NETINET_IN6_H)
661 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in6.h)
664 if (EVENT__HAVE_SYS_SOCKET_H)
665 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} sys/socket.h)
668 if (EVENT__HAVE_NETDB_H)
669 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netdb.h)
673 CHECK_TYPE_SIZE("struct in6_addr" EVENT__HAVE_STRUCT_IN6_ADDR)
674 if(EVENT__HAVE_STRUCT_IN6_ADDR)
675 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
676 s6_addr16 "${SOCKADDR_HEADERS}"
677 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16)
679 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
680 s6_addr32 "${SOCKADDR_HEADERS}"
681 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32)
684 CHECK_TYPE_SIZE("sa_family_t" EVENT__HAVE_SA_FAMILY_T)
685 CHECK_TYPE_SIZE("struct sockaddr_in6" EVENT__HAVE_STRUCT_SOCKADDR_IN6)
687 if(EVENT__HAVE_STRUCT_SOCKADDR_IN6)
688 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
689 sin6_len "${SOCKADDR_HEADERS}"
690 EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
692 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
693 sin_len "${SOCKADDR_HEADERS}"
694 EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
697 CHECK_TYPE_SIZE("struct sockaddr_storage" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
698 if(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
699 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
700 ss_family "${SOCKADDR_HEADERS}"
701 EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
703 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
704 __ss_family "${SOCKADDR_HEADERS}" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY)
707 CHECK_TYPE_SIZE("struct linger" EVENT__HAVE_STRUCT_LINGER)
709 # Group the source files.
711 bufferevent-internal.h
712 changelist-internal.h
714 epolltable-internal.h
742 include/event2/buffer.h
743 include/event2/bufferevent.h
744 include/event2/bufferevent_compat.h
745 include/event2/bufferevent_struct.h
746 include/event2/buffer_compat.h
748 include/event2/dns_compat.h
749 include/event2/dns_struct.h
750 include/event2/event.h
751 include/event2/event_compat.h
752 include/event2/event_struct.h
753 include/event2/http.h
754 include/event2/http_compat.h
755 include/event2/http_struct.h
756 include/event2/keyvalq_struct.h
757 include/event2/listener.h
759 include/event2/rpc_compat.h
760 include/event2/rpc_struct.h
762 include/event2/tag_compat.h
763 include/event2/thread.h
764 include/event2/util.h
765 include/event2/visibility.h
766 ${PROJECT_BINARY_DIR}/include/event2/event-config.h)
773 bufferevent_ratelim.c
786 if(EVENT__HAVE_SELECT)
787 list(APPEND SRC_CORE select.c)
791 list(APPEND SRC_CORE poll.c)
794 if(EVENT__HAVE_KQUEUE)
795 list(APPEND SRC_CORE kqueue.c)
798 if(EVENT__HAVE_DEVPOLL)
799 list(APPEND SRC_CORE devpoll.c)
802 if(EVENT__HAVE_EPOLL)
803 list(APPEND SRC_CORE epoll.c)
806 if(EVENT__HAVE_EVENT_PORTS)
807 list(APPEND SRC_CORE evport.c)
810 if (NOT EVENT__DISABLE_OPENSSL)
811 find_package(OpenSSL REQUIRED)
813 set(EVENT__HAVE_OPENSSL 1)
815 message(STATUS "OpenSSL include: ${OPENSSL_INCLUDE_DIR}")
816 message(STATUS "OpenSSL lib: ${OPENSSL_LIBRARIES}")
818 include_directories(${OPENSSL_INCLUDE_DIR})
820 list(APPEND SRC_OPENSSL bufferevent_openssl.c)
821 list(APPEND HDR_PUBLIC include/event2/bufferevent_ssl.h)
822 list(APPEND LIB_APPS ${OPENSSL_LIBRARIES})
825 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
827 list(APPEND SRC_CORE evthread_win32.c)
829 find_package(Threads REQUIRED)
830 if (NOT CMAKE_USE_PTHREADS_INIT)
832 "Failed to find Pthreads, set EVENT__DISABLE_THREAD_SUPPORT to disable")
835 set(EVENT__HAVE_PTHREADS 1)
836 list(APPEND LIB_APPS ${CMAKE_THREAD_LIBS_INIT})
840 if (NOT EVENT__DISABLE_TESTS)
841 # Zlib is only used for testing.
844 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
845 include_directories(${ZLIB_INCLUDE_DIRS})
847 set(EVENT__HAVE_LIBZ 1)
848 list(APPEND LIB_APPS ${ZLIB_LIBRARIES})
858 add_definitions(-DHAVE_CONFIG_H)
860 # We use BEFORE here so we don't accidentally look in system directories
861 # first for some previous versions of the headers that are installed.
862 include_directories(BEFORE ${PROJECT_SOURCE_DIR}
863 ${PROJECT_SOURCE_DIR}/compat
864 ${PROJECT_SOURCE_DIR}/include)
873 list(APPEND HDR_PRIVATE WIN32-Code/getopt.h)
875 set(EVENT__DNS_USE_FTIME_FOR_ID 1)
876 set(LIB_PLATFORM ws2_32)
878 -D_CRT_SECURE_NO_WARNINGS
879 -D_CRT_NONSTDC_NO_DEPRECATE)
881 include_directories(./WIN32-Code)
885 list(APPEND LIB_PLATFORM socket nsl)
888 source_group("Headers Private" FILES ${HDR_PRIVATE})
889 source_group("Header Compat" FILES ${HDR_COMPAT})
890 source_group("Headers Public" FILES ${HDR_PUBLIC})
891 source_group("Source Core" FILES ${SRC_CORE})
892 source_group("Source Extra" FILES ${SRC_EXTRA})
894 # Generate the configure headers.
895 # (Place them in the build dir so we don't polute the source tree with generated files).
896 include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include)
899 set(EVENT_SHARED_FLAGS -fvisibility=hidden)
900 elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro")
901 set(EVENT_SHARED_FLAGS -xldscope=hidden)
905 ${CMAKE_CURRENT_SOURCE_DIR}/event-config.h.cmake
906 ${CMAKE_CURRENT_BINARY_DIR}/include/event2/event-config.h
910 ${CMAKE_CURRENT_SOURCE_DIR}/evconfig-private.h.cmake
911 ${CMAKE_CURRENT_BINARY_DIR}/include/evconfig-private.h)
914 # Create the libraries.
916 include(AddEventLibrary)
917 add_event_library(event_core SOURCES ${SRC_CORE})
918 add_event_library(event_extra
919 LIBRARIES event_core_shared
920 SOURCES ${SRC_EXTRA})
922 if (NOT EVENT__DISABLE_OPENSSL)
923 add_event_library(event_openssl
924 LIBRARIES event_core_shared ${OPENSSL_LIBRARIES}
925 SOURCES ${SRC_OPENSSL})
928 if (CMAKE_USE_PTHREADS_INIT)
929 set(SRC_PTHREADS evthread_pthread.c)
930 add_event_library(event_pthreads
931 LIBRARIES event_core_shared
932 SOURCES ${SRC_PTHREADS})
935 # library exists for historical reasons; it contains the contents of
936 # both libevent_core and libevent_extra. You shouldn’t use it; it may
937 # go away in a future version of Libevent.
938 add_event_library(event SOURCES ${SRC_CORE} ${SRC_EXTRA})
942 list(APPEND WIN32_GETOPT
944 WIN32-Code/getopt_long.c)
950 macro(add_sample_prog ssl name)
951 add_executable(${name} ${ARGN})
953 target_link_libraries(${name}
960 target_link_libraries(${name} event_openssl)
963 if (NOT EVENT__DISABLE_SAMPLES)
971 foreach(SAMPLE ${SAMPLES})
972 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c)
975 if (NOT EVENT__DISABLE_OPENSSL)
976 add_sample_prog(ON https-client
977 sample/https-client.c
978 sample/openssl_hostname_validation.c
980 add_sample_prog(ON le-proxy
988 foreach (SAMPLE ${SAMPLES_WOPT})
989 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c ${WIN32_GETOPT})
996 macro(add_bench_prog prog)
997 add_executable(${prog} ${ARGN})
998 target_link_libraries(${prog}
1004 if (NOT EVENT__DISABLE_BENCHMARK)
1005 foreach (BENCHMARK bench_http bench_httpclient)
1006 add_bench_prog(${BENCHMARK} test/${BENCHMARK}.c)
1009 add_bench_prog(bench test/bench.c ${WIN32_GETOPT})
1010 add_bench_prog(bench_cascade test/bench_cascade.c ${WIN32_GETOPT})
1016 macro(add_test_prog prog)
1017 add_executable(${prog} test/${prog}.c)
1018 target_link_libraries(${prog}
1025 if (NOT EVENT__DISABLE_TESTS)
1027 # Generate Regress tests.
1029 if (NOT EVENT__DISABLE_REGRESS)
1030 # (We require python to generate the regress tests)
1031 find_package(PythonInterp 3)
1033 if (PYTHONINTERP_FOUND)
1034 set(__FOUND_USABLE_PYTHON 1)
1036 find_package(PythonInterp 2)
1037 if (PYTHONINTERP_FOUND)
1038 set(__FOUND_USABLE_PYTHON 1)
1040 message(ERROR "No suitable Python version found, bailing...")
1044 if (__FOUND_USABLE_PYTHON)
1045 message(STATUS "Generating regress tests...")
1047 add_definitions(-DTINYTEST_LOCAL)
1051 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.c
1052 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.h
1056 COMMAND ${PYTHON_EXECUTABLE} ../event_rpcgen.py regress.rpc
1057 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test)
1059 list(APPEND SRC_REGRESS
1063 test/regress_buffer.c
1064 test/regress_bufferevent.c
1067 test/regress_finalize.c
1069 test/regress_listener.c
1071 test/regress_minheap.c
1073 test/regress_testutils.c
1074 test/regress_testutils.h
1079 list(APPEND SRC_REGRESS test/regress_iocp.c)
1080 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
1081 list(APPEND SRC_REGRESS test/regress_thread.c)
1083 elseif (CMAKE_USE_PTHREADS_INIT)
1084 list(APPEND SRC_REGRESS test/regress_thread.c)
1087 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
1088 list(APPEND SRC_REGRESS test/regress_zlib.c)
1091 if (NOT EVENT__DISABLE_OPENSSL)
1092 list(APPEND SRC_REGRESS test/regress_ssl.c)
1095 add_executable(regress ${SRC_REGRESS})
1097 target_link_libraries(regress
1102 if (NOT EVENT__DISABLE_OPENSSL)
1103 target_link_libraries(regress event_openssl)
1105 if (CMAKE_USE_PTHREADS_INIT)
1106 target_link_libraries(regress event_pthreads)
1109 message(WARNING "No suitable Python interpreter found, cannot generate regress tests!")
1116 # all of these, including the cmakelists.txt should be moved
1117 # into the dirctory 'tests' first.
1119 # doing this, we can remove all the DISABLE_TESTS stuff, and simply
1120 # do something like:
1122 # add_custom_targets(tests)
1123 # add_executable(... EXCLUDE_FROM_ALL ...c)
1124 # add_dependencis(tests testa testb testc)
1127 # then you can just run 'make tests' instead of them all
1128 # auto-compile|running
1130 set(TESTPROGS test-changelist
1137 foreach (TESTPROG ${TESTPROGS} test-dumpevents)
1138 add_test_prog(${TESTPROG})
1141 add_test_prog(test-ratelim m)
1143 add_test_prog(test-ratelim)
1153 # We run all tests with the different backends turned on one at a time.
1156 # Add event backends based on system introspection result.
1159 if (EVENT__HAVE_EPOLL)
1160 list(APPEND BACKENDS EPOLL)
1163 if (EVENT__HAVE_SELECT)
1164 list(APPEND BACKENDS SELECT)
1167 if (EVENT__HAVE_POLL)
1168 list(APPEND BACKENDS POLL)
1171 if (EVENT__HAVE_KQUEUE)
1172 list(APPEND BACKENDS KQUEUE)
1175 if (EVENT__HAVE_EVENT_PORTS)
1176 list(APPEND BACKENDS EVPORT)
1179 if (EVENT__HAVE_DEVPOLL)
1180 list(APPEND BACKENDS DEVPOLL)
1184 list(APPEND BACKENDS WIN32)
1188 # Default environment variables turns off all event systems,
1189 # then we enable each one, one at a time when creating the tests.
1190 set(DEFAULT_TEST_ENV_VARS "EVENT_SHOW_METHOD=1;")
1191 foreach(BACKEND ${BACKENDS})
1192 set(BACKEND_ENV_VAR "EVENT_NO${BACKEND}=1")
1193 list(APPEND DEFAULT_TEST_ENV_VARS "${BACKEND_ENV_VAR}")
1196 # Macro that creates the ctest test for a backend.
1197 macro(add_backend_test BACKEND_TEST_NAME ENV_VARS)
1200 foreach (TESTPROG ${TESTPROGS})
1201 set(TEST_NAME ${TESTPROG}__${BACKEND_TEST_NAME})
1203 add_test(${TEST_NAME}
1204 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TESTPROG})
1206 list(APPEND TEST_NAMES ${TEST_NAME})
1208 set_tests_properties(${TEST_NAME}
1209 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1213 if (__FOUND_USABLE_PYTHON)
1214 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME})
1216 add_test(${TEST_NAME}
1217 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents |
1218 ${PYTHON_EXECUTABLE}
1219 ${CMAKE_CURRENT_SOURCE_DIR}/test/check-dumpevents.py)
1221 set_tests_properties(${TEST_NAME}
1222 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1224 message(WARNING "test-dumpevents will be run without output check since python was not found!")
1225 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME}_no_check)
1227 add_test(${TEST_NAME}
1228 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents)
1230 set_tests_properties(${TEST_NAME}
1231 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1235 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1236 set(TEST_NAME regress__${BACKEND_TEST_NAME})
1238 add_test(${TEST_NAME}
1239 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress)
1241 set_tests_properties(${TEST_NAME}
1242 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1244 add_test(${TEST_NAME}_debug
1245 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress)
1247 set_tests_properties(${TEST_NAME}_debug
1248 PROPERTIES ENVIRONMENT "${ENV_VARS};EVENT_DEBUG_MODE=1")
1252 # Add the tests for each backend.
1253 foreach(BACKEND ${BACKENDS})
1254 # Enable this backend only.
1255 set(BACKEND_ENV_VARS ${DEFAULT_TEST_ENV_VARS})
1256 list(REMOVE_ITEM BACKEND_ENV_VARS EVENT_NO${BACKEND}=1)
1258 # Epoll has some extra settings.
1259 if (${BACKEND} STREQUAL "EPOLL")
1260 add_backend_test(timerfd_${BACKEND}
1261 "${BACKEND_ENV_VARS};EVENT_PRECISE_TIMER=1")
1263 add_backend_test(changelist_${BACKEND}
1264 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes")
1266 add_backend_test(timerfd_changelist_${BACKEND}
1267 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes;EVENT_PRECISE_TIMER=1")
1269 add_backend_test(${BACKEND} "${BACKEND_ENV_VARS}")
1274 # Rate limiter tests.
1277 # Group limits, no connection limit.
1278 set(RL_BIN ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-ratelim)
1280 add_test(test-ratelim__group_lim
1285 --check-grouplimit 1000
1288 # Connection limit, no group limit.
1289 add_test(test-ratelim__con_lim
1294 --check-connlimit 50
1297 # Connection limit and group limit.
1298 add_test(test-ratelim__group_con_lim
1304 --check-grouplimit 1000
1305 --check-connlimit 50
1308 # Connection limit and group limit with independent drain.
1309 add_test(test-ratelim__group_con_lim_drain
1316 --check-grouplimit 1000
1317 --check-connlimit 50
1320 # Add a "make verify" target, same as for autoconf.
1321 # (Important! This will unset all EVENT_NO* environment variables.
1322 # If they are set in the shell the tests are running using simply "ctest" or "make test" will fail)
1324 # Windows doesn't have "unset". But you can use "set VAR=" instead.
1325 # We need to guard against the possibility taht EVENT_NOWIN32 is set, and all test failing
1326 # since no event backend being available.
1327 file(TO_NATIVE_PATH ${CMAKE_CTEST_COMMAND} WINDOWS_CTEST_COMMAND)
1329 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1332 \"${WINDOWS_CTEST_COMMAND}\"
1335 message(STATUS "${WINDOWS_CTEST_COMMAND}")
1337 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1338 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1345 WORLD_READ WORLD_EXECUTE)
1348 "${CMAKE_CURRENT_BINARY_DIR}/verify_tests.bat" VERIFY_PATH)
1350 add_custom_target(verify COMMAND "${VERIFY_PATH}"
1351 DEPENDS event ${ALL_TESTPROGS})
1353 # On some platforms doing exec(unset) as CMake does won't work, so make sure
1354 # we run the unset command in a shell instead.
1355 # First we write the script contents.
1356 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1359 unset EVENT_NOEPOLL; unset EVENT_NOPOLL; unset EVENT_NOSELECT; unset EVENT_NOWIN32; unset EVENT_NOEVPORT; unset EVENT_NOKQUEUE; unset EVENT_NODEVPOLL
1360 ${CMAKE_CTEST_COMMAND}
1363 # Then we copy the file (this allows us to set execute permission on it)
1364 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1365 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1375 # Create the target that runs the script.
1376 add_custom_target(verify
1377 COMMAND ${CMAKE_CURRENT_BINARY_DIR}/verify_tests.sh
1378 DEPENDS event ${ALL_TESTPROGS})
1381 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1382 add_dependencies(verify regress)
1385 if (EVENT__COVERAGE)
1386 include(CodeCoverage)
1388 setup_target_for_coverage(
1389 verify_coverage # Coverage target name "make verify_coverage"
1391 coverage # Output directory.
1392 verify) # Arguments passed to test runner. "make verify"
1401 # Installation preparation.
1404 if(WIN32 AND NOT CYGWIN)
1405 set(DEF_INSTALL_CMAKE_DIR cmake)
1407 set(DEF_INSTALL_CMAKE_DIR lib/cmake/libevent)
1410 set(EVENT_INSTALL_CMAKE_DIR
1411 "${CMAKE_INSTALL_PREFIX}/${DEF_INSTALL_CMAKE_DIR}"
1412 CACHE PATH "Installation directory for CMake files")
1414 export(PACKAGE libevent)
1416 # Generate the config file for the build-tree.
1417 set(EVENT__INCLUDE_DIRS
1418 "${PROJECT_SOURCE_DIR}/include"
1419 "${PROJECT_BINARY_DIR}/include")
1421 set(LIBEVENT_INCLUDE_DIRS
1422 ${EVENT__INCLUDE_DIRS}
1423 CACHE PATH "Libevent include directories")
1425 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigBuildTree.cmake.in
1426 ${PROJECT_BINARY_DIR}/LibeventConfig.cmake
1429 # Generate the config file for the installation tree.
1430 # Calculate the relative directory from the Cmake dir.
1433 "${EVENT_INSTALL_CMAKE_DIR}"
1434 "${CMAKE_INSTALL_PREFIX}/include")
1436 # Note the LIBEVENT_CMAKE_DIR is defined in LibeventConfig.cmake.in,
1437 # we escape it here so it's evaluated when it is included instead
1438 # so that the include dirs are given relative to where the
1439 # config file is located.
1440 set(EVENT_INSTALL_INCLUDE_DIR "\${LIBEVENT_CMAKE_DIR}/${REL_INCLUDE_DIR}")
1442 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfig.cmake.in
1443 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
1446 # Generate version info for both build-tree and install-tree.
1447 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigVersion.cmake.in
1448 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1451 # Install compat headers
1452 install(FILES ${HDR_COMPAT}
1453 DESTINATION "include"
1456 # Install the configs.
1458 ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
1459 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1460 DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1463 # Install exports for the install-tree.
1464 install(EXPORT LibeventTargets
1465 DESTINATION "${DEF_INSTALL_CMAKE_DIR}"
1469 message(STATUS " ---( Libevent " ${EVENT_VERSION} " )---")
1471 message(STATUS "Available event backends: ${BACKENDS}")
1472 message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
1473 message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
1474 message(STATUS "CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
1475 message(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
1476 message(STATUS "PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
1477 message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
1478 message(STATUS "CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
1479 message(STATUS "CMAKE_COMMAND: ${CMAKE_COMMAND}")
1480 message(STATUS "CMAKE_ROOT: ${CMAKE_ROOT}")
1481 message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
1482 message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
1483 message(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
1484 message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
1485 message(STATUS "CMAKE_SKIP_RPATH: ${CMAKE_SKIP_RPATH}")
1486 message(STATUS "CMAKE_VERBOSE_MAKEFILE: ${CMAKE_VERBOSE_MAKEFILE}")
1487 message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
1488 message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
1489 message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER} (id ${CMAKE_C_COMPILER_ID}, clang ${CLANG}, GNUC ${GNUC})")
1490 message(STATUS "CMAKE_AR: ${CMAKE_AR}")
1491 message(STATUS "CMAKE_RANLIB: ${CMAKE_RANLIB}")