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 0x02010b00)
88 # equals to VERSION_INFO in Makefile.am
89 set(EVENT_ABI_LIBVERSION_CURRENT 7)
90 set(EVENT_ABI_LIBVERSION_REVISION 0)
91 set(EVENT_ABI_LIBVERSION_AGE 0)
93 # equals to RELEASE in Makefile.am
94 set(EVENT_PACKAGE_RELEASE 2.1)
96 # only a subset of names can be used, defaults to "beta"
97 set(EVENT_STAGE_NAME ${EVENT_VERSION_STAGE})
99 # a list that defines what can set for EVENT_STAGE_VERSION
100 set(EVENT__ALLOWED_STAGE_NAMES
109 FIND EVENT__ALLOWED_STAGE_NAMES
110 "${EVENT_STAGE_NAME}"
113 if (EVENT__STAGE_RET EQUAL -1)
115 "stage ${EVENT_STAGE_NAME} is not allowed, reset to beta")
116 set(EVENT_STAGE_NAME beta)
120 "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}-${EVENT_STAGE_NAME}")
122 option(EVENT__DISABLE_DEBUG_MODE
123 "Define if libevent should build without support for a debug mode" OFF)
125 option(EVENT__ENABLE_VERBOSE_DEBUG
126 "Enables verbose debugging" OFF)
128 option(EVENT__DISABLE_MM_REPLACEMENT
129 "Define if libevent should not allow replacing the mm functions" OFF)
131 option(EVENT__DISABLE_THREAD_SUPPORT
132 "Define if libevent should not be compiled with thread support" OFF)
134 option(EVENT__DISABLE_OPENSSL
135 "Define if libevent should build without support for OpenSSL encryption" OFF)
137 option(EVENT__DISABLE_BENCHMARK
138 "Defines if libevent should build without the benchmark executables" OFF)
140 option(EVENT__DISABLE_TESTS
141 "If tests should be compiled or not" OFF)
143 option(EVENT__DISABLE_REGRESS
144 "Disable the regress tests" OFF)
146 option(EVENT__DISABLE_SAMPLES
147 "Disable sample files" OFF)
149 option(EVENT__DISABLE_CLOCK_GETTIME
150 "Do not use clock_gettime even if it is available" OFF)
152 option(EVENT__FORCE_KQUEUE_CHECK
153 "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)
155 # TODO: Add --disable-largefile omit support for large files
156 option(EVENT__COVERAGE
157 "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)
159 # Put the libaries and binaries that get built into directories at the
160 # top of the build tree rather than in hard-to-find leaf directories.
161 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
162 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
163 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
165 if (EVENT__ENABLE_VERBOSE_DEBUG)
166 add_definitions(-DUSE_DEBUG=1)
169 # make it colorful under ninja-build
170 if ("${CMAKE_GENERATOR}" STREQUAL "Ninja")
171 add_compiler_flags(-fdiagnostics-color=always)
174 # Setup compiler flags for coverage.
176 if (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "debug")
177 message(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
180 message(STATUS "Setting coverage compiler flags")
182 set(CMAKE_REQUIRED_LIBRARIES "--coverage")
183 add_compiler_flags(-g -O0 --coverage)
184 set(CMAKE_REQUIRED_LIBRARIES "")
190 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") OR
191 ("${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang"))
194 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR (${CLANG}))
197 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR (${CLANG}))
201 # Detect library type
202 set(EVENT_LIBRARY_TYPE)
203 if ("${EVENT__LIBRARY_TYPE}" STREQUAL "DEFAULT")
205 set(EVENT_LIBRARY_TYPE SHARED)
207 set(EVENT_LIBRARY_TYPE BOTH)
210 string(TOUPPER "${EVENT__LIBRARY_TYPE}" EVENT_LIBRARY_TYPE)
212 if ((${MSVC}) AND ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH"))
214 "Building SHARED and STATIC is not supported for MSVC "
215 "(due to conflicts in library name"
216 " between STATIC library and IMPORTED library for SHARED libraries)")
218 set(EVENT_LIBRARY_STATIC OFF)
219 set(EVENT_LIBRARY_SHARED OFF)
220 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH")
221 set(EVENT_LIBRARY_STATIC ON)
222 set(EVENT_LIBRARY_SHARED ON)
223 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
224 set(EVENT_LIBRARY_STATIC ON)
225 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "SHARED")
226 set(EVENT_LIBRARY_SHARED ON)
228 message(FATAL_ERROR "${EVENT_LIBRARY_TYPE} is not supported")
232 set(msvc_static_runtime OFF)
233 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
234 set(msvc_static_runtime ON)
238 # - https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2017
239 # - https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime
240 option(EVENT__MSVC_STATIC_RUNTIME
241 "Link static runtime libraries"
242 ${msvc_static_runtime})
244 if (EVENT__MSVC_STATIC_RUNTIME)
248 CMAKE_C_FLAGS_RELEASE
249 CMAKE_C_FLAGS_MINSIZEREL
250 CMAKE_C_FLAGS_RELWITHDEBINFO
252 if (${flag_var} MATCHES "/MD")
253 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
259 # GNUC specific options.
261 option(EVENT__DISABLE_GCC_WARNINGS "Disable verbose warnings with GCC" OFF)
262 option(EVENT__ENABLE_GCC_HARDENING "Enable compiler security checks" OFF)
263 option(EVENT__ENABLE_GCC_FUNCTION_SECTIONS "Enable gcc function sections" OFF)
264 option(EVENT__ENABLE_GCC_WARNINGS "Make all GCC warnings into errors" OFF)
266 set(GCC_V ${CMAKE_C_COMPILER_VERSION})
269 -Wall -Wextra -Wno-unused-parameter -Wstrict-aliasing -Wstrict-prototypes
271 -fno-strict-aliasing # gcc 2.9.5+
276 -Wmissing-field-initializers
277 -Wdeclaration-after-statement
291 list(APPEND __FLAGS -Wno-unused-function)
294 if (EVENT__DISABLE_GCC_WARNINGS)
295 list(APPEND __FLAGS -w)
298 if (EVENT__ENABLE_GCC_HARDENING)
300 -fstack-protector-all
304 "--param ssp-buffer-size=1")
306 add_definitions(-D_FORTIFY_SOURCE=2)
309 if (EVENT__ENABLE_GCC_FUNCTION_SECTIONS)
310 list(APPEND __FLAGS -ffunction-sections)
311 # TODO: Add --gc-sections support. We need some checks for NetBSD to ensure this works.
314 if (EVENT__ENABLE_GCC_WARNINGS)
315 list(APPEND __FLAGS -Werror)
318 add_compiler_flags(${__FLAGS})
322 # Get rid of deprecated warnings for OpenSSL on OSX 10.7 and greater.
324 -Wno-error=deprecated-declarations
331 set(CMAKE_EXTRA_INCLUDE_FILES winsock2.h ws2tcpip.h)
332 set(CMAKE_REQUIRED_LIBRARIES ws2_32.lib shell32.lib advapi32.lib)
333 set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h)
336 set(CMAKE_REQUIRED_LIBRARIES socket nsl)
339 # Check if _GNU_SOURCE is available.
340 if (NOT DEFINED _GNU_SOURCE)
341 CHECK_SYMBOL_EXISTS(__GNU_LIBRARY__ "features.h" _GNU_SOURCE)
344 unset(_GNU_SOURCE CACHE)
345 CHECK_SYMBOL_EXISTS(_GNU_SOURCE "features.h" _GNU_SOURCE)
349 set(_GNU_SOURCE TRUE)
354 add_definitions(-D_GNU_SOURCE=1)
357 CHECK_INCLUDE_FILE(sys/types.h EVENT__HAVE_SYS_TYPES_H)
358 if(EVENT__HAVE_SYS_TYPES_H)
359 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/types.h)
362 CHECK_INCLUDE_FILE(sys/socket.h EVENT__HAVE_SYS_SOCKET_H)
363 if(EVENT__HAVE_SYS_SOCKET_H)
364 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/socket.h)
367 CHECK_INCLUDE_FILE(netinet/in.h EVENT__HAVE_NETINET_IN_H)
368 if(EVENT__HAVE_NETINET_IN_H)
369 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netinet/in.h)
372 CHECK_INCLUDE_FILE(sys/un.h EVENT__HAVE_SYS_UN_H)
373 if(EVENT__HAVE_SYS_UN_H)
374 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/un.h)
378 CHECK_INCLUDE_FILE(afunix.h EVENT__HAVE_AFUNIX_H)
379 if(EVENT__HAVE_AFUNIX_H)
380 list(APPEND CMAKE_EXTRA_INCLUDE_FILES afunix.h)
383 CHECK_TYPE_SIZE("struct sockaddr_un" EVENT__HAVE_STRUCT_SOCKADDR_UN)
385 CHECK_INCLUDE_FILE(netinet/in6.h EVENT__HAVE_NETINET_IN6_H)
386 if(EVENT__HAVE_NETINET_IN6_H)
387 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netinet/in6.h)
390 CHECK_INCLUDE_FILE(unistd.h EVENT__HAVE_UNISTD_H)
391 CHECK_INCLUDE_FILE(netdb.h EVENT__HAVE_NETDB_H)
392 CHECK_INCLUDE_FILE(dlfcn.h EVENT__HAVE_DLFCN_H)
393 CHECK_INCLUDE_FILE(arpa/inet.h EVENT__HAVE_ARPA_INET_H)
394 CHECK_INCLUDE_FILE(fcntl.h EVENT__HAVE_FCNTL_H)
395 if(EVENT__HAVE_FCNTL_H)
396 list(APPEND CMAKE_EXTRA_INCLUDE_FILES fcntl.h)
398 CHECK_INCLUDE_FILE(inttypes.h EVENT__HAVE_INTTYPES_H)
399 CHECK_INCLUDE_FILE(memory.h EVENT__HAVE_MEMORY_H)
400 CHECK_INCLUDE_FILE(poll.h EVENT__HAVE_POLL_H)
401 CHECK_INCLUDE_FILE(port.h EVENT__HAVE_PORT_H)
402 if(EVENT__HAVE_PORT_H)
403 list(APPEND CMAKE_EXTRA_INCLUDE_FILES port.h)
405 CHECK_INCLUDE_FILE(signal.h EVENT__HAVE_SIGNAL_H)
406 CHECK_INCLUDE_FILE(stdarg.h EVENT__HAVE_STDARG_H)
407 CHECK_INCLUDE_FILE(stddef.h EVENT__HAVE_STDDEF_H)
408 CHECK_INCLUDE_FILE(stdint.h EVENT__HAVE_STDINT_H)
409 CHECK_INCLUDE_FILE(stdlib.h EVENT__HAVE_STDLIB_H)
410 CHECK_INCLUDE_FILE(strings.h EVENT__HAVE_STRINGS_H)
411 CHECK_INCLUDE_FILE(string.h EVENT__HAVE_STRING_H)
412 CHECK_INCLUDE_FILE(sys/devpoll.h EVENT__HAVE_DEVPOLL)
413 CHECK_INCLUDE_FILE(sys/epoll.h EVENT__HAVE_SYS_EPOLL_H)
414 CHECK_INCLUDE_FILE(sys/eventfd.h EVENT__HAVE_SYS_EVENTFD_H)
415 CHECK_INCLUDE_FILE(sys/event.h EVENT__HAVE_SYS_EVENT_H)
416 CHECK_INCLUDE_FILE(sys/ioctl.h EVENT__HAVE_SYS_IOCTL_H)
417 CHECK_INCLUDE_FILE(sys/mman.h EVENT__HAVE_SYS_MMAN_H)
418 CHECK_INCLUDE_FILE(sys/param.h EVENT__HAVE_SYS_PARAM_H)
419 CHECK_INCLUDE_FILE(sys/queue.h EVENT__HAVE_SYS_QUEUE_H)
420 CHECK_INCLUDE_FILE(sys/select.h EVENT__HAVE_SYS_SELECT_H)
421 CHECK_INCLUDE_FILE(sys/sendfile.h EVENT__HAVE_SYS_SENDFILE_H)
422 CHECK_INCLUDE_FILE(sys/stat.h EVENT__HAVE_SYS_STAT_H)
423 CHECK_INCLUDE_FILE(sys/time.h EVENT__HAVE_SYS_TIME_H)
424 if(EVENT__HAVE_SYS_TIME_H)
425 list(APPEND CMAKE_EXTRA_INCLUDE_FILES sys/time.h)
427 CHECK_INCLUDE_FILE(sys/uio.h EVENT__HAVE_SYS_UIO_H)
428 CHECK_INCLUDE_FILES("sys/types.h;ifaddrs.h" EVENT__HAVE_IFADDRS_H)
429 CHECK_INCLUDE_FILE(mach/mach_time.h EVENT__HAVE_MACH_MACH_TIME_H)
430 CHECK_INCLUDE_FILE(netinet/tcp.h EVENT__HAVE_NETINET_TCP_H)
431 CHECK_INCLUDE_FILE(sys/wait.h EVENT__HAVE_SYS_WAIT_H)
432 CHECK_INCLUDE_FILE(sys/resource.h EVENT__HAVE_SYS_RESOURCE_H)
433 CHECK_INCLUDE_FILE(sys/sysctl.h EVENT__HAVE_SYS_SYSCTL_H)
434 CHECK_INCLUDE_FILE(sys/timerfd.h EVENT__HAVE_SYS_TIMERFD_H)
435 CHECK_INCLUDE_FILE(errno.h EVENT__HAVE_ERRNO_H)
438 CHECK_FUNCTION_EXISTS_EX(epoll_create EVENT__HAVE_EPOLL)
439 CHECK_FUNCTION_EXISTS_EX(epoll_ctl EVENT__HAVE_EPOLL_CTL)
440 CHECK_FUNCTION_EXISTS_EX(eventfd EVENT__HAVE_EVENTFD)
441 if(NOT EVENT__DISABLE_CLOCK_GETTIME)
442 CHECK_FUNCTION_EXISTS_EX(clock_gettime EVENT__HAVE_CLOCK_GETTIME)
444 CHECK_FUNCTION_EXISTS_EX(fcntl EVENT__HAVE_FCNTL)
445 CHECK_FUNCTION_EXISTS_EX(getaddrinfo EVENT__HAVE_GETADDRINFO)
446 CHECK_FUNCTION_EXISTS_EX(getnameinfo EVENT__HAVE_GETNAMEINFO)
447 CHECK_FUNCTION_EXISTS_EX(gettimeofday EVENT__HAVE_GETTIMEOFDAY)
448 CHECK_FUNCTION_EXISTS_EX(getprotobynumber EVENT__HAVE_GETPROTOBYNUMBER)
449 CHECK_FUNCTION_EXISTS_EX(getservbyname EVENT__HAVE_GETSERVBYNAME)
450 CHECK_FUNCTION_EXISTS_EX(inet_ntop EVENT__HAVE_INET_NTOP)
451 CHECK_FUNCTION_EXISTS_EX(inet_pton EVENT__HAVE_INET_PTON)
452 CHECK_FUNCTION_EXISTS_EX(kqueue EVENT__HAVE_KQUEUE)
453 CHECK_FUNCTION_EXISTS_EX(mmap EVENT__HAVE_MMAP)
454 CHECK_FUNCTION_EXISTS_EX(pipe EVENT__HAVE_PIPE)
455 CHECK_FUNCTION_EXISTS_EX(pipe2 EVENT__HAVE_PIPE2)
456 CHECK_FUNCTION_EXISTS_EX(poll EVENT__HAVE_POLL)
457 CHECK_FUNCTION_EXISTS_EX(port_create EVENT__HAVE_PORT_CREATE)
458 CHECK_FUNCTION_EXISTS_EX(sendfile EVENT__HAVE_SENDFILE)
459 CHECK_FUNCTION_EXISTS_EX(sigaction EVENT__HAVE_SIGACTION)
460 CHECK_FUNCTION_EXISTS_EX(signal EVENT__HAVE_SIGNAL)
461 CHECK_FUNCTION_EXISTS_EX(splice EVENT__HAVE_SPLICE)
462 CHECK_FUNCTION_EXISTS_EX(strlcpy EVENT__HAVE_STRLCPY)
463 CHECK_FUNCTION_EXISTS_EX(strsep EVENT__HAVE_STRSEP)
464 CHECK_FUNCTION_EXISTS_EX(strtok_r EVENT__HAVE_STRTOK_R)
465 CHECK_FUNCTION_EXISTS_EX(strtoll EVENT__HAVE_STRTOLL)
466 CHECK_FUNCTION_EXISTS_EX(vasprintf EVENT__HAVE_VASPRINTF)
467 CHECK_FUNCTION_EXISTS_EX(sysctl EVENT__HAVE_SYSCTL)
468 CHECK_FUNCTION_EXISTS_EX(accept4 EVENT__HAVE_ACCEPT4)
469 CHECK_FUNCTION_EXISTS_EX(arc4random EVENT__HAVE_ARC4RANDOM)
470 CHECK_FUNCTION_EXISTS_EX(arc4random_buf EVENT__HAVE_ARC4RANDOM_BUF)
471 CHECK_FUNCTION_EXISTS_EX(arc4random_addrandom EVENT__HAVE_ARC4RANDOM_ADDRANDOM)
472 CHECK_FUNCTION_EXISTS_EX(epoll_create1 EVENT__HAVE_EPOLL_CREATE1)
473 CHECK_FUNCTION_EXISTS_EX(getegid EVENT__HAVE_GETEGID)
474 CHECK_FUNCTION_EXISTS_EX(geteuid EVENT__HAVE_GETEUID)
475 CHECK_FUNCTION_EXISTS_EX(getifaddrs EVENT__HAVE_GETIFADDRS)
476 CHECK_FUNCTION_EXISTS_EX(issetugid EVENT__HAVE_ISSETUGID)
477 CHECK_FUNCTION_EXISTS_EX(mach_absolute_time EVENT__HAVE_MACH_ABSOLUTE_TIME)
478 CHECK_FUNCTION_EXISTS_EX(nanosleep EVENT__HAVE_NANOSLEEP)
479 CHECK_FUNCTION_EXISTS_EX(usleep EVENT__HAVE_USLEEP)
480 CHECK_FUNCTION_EXISTS_EX(timeradd EVENT__HAVE_TIMERADD)
481 CHECK_FUNCTION_EXISTS_EX(timerclear EVENT__HAVE_TIMERCLEAR)
482 CHECK_FUNCTION_EXISTS_EX(timercmp EVENT__HAVE_TIMERCMP)
483 CHECK_FUNCTION_EXISTS_EX(timerfd_create EVENT__HAVE_TIMERFD_CREATE)
484 CHECK_FUNCTION_EXISTS_EX(timerisset EVENT__HAVE_TIMERISSET)
485 CHECK_FUNCTION_EXISTS_EX(putenv EVENT__HAVE_PUTENV)
486 CHECK_FUNCTION_EXISTS_EX(setenv EVENT__HAVE_SETENV)
487 CHECK_FUNCTION_EXISTS_EX(setrlimit EVENT__HAVE_SETRLIMIT)
488 CHECK_FUNCTION_EXISTS_EX(umask EVENT__HAVE_UMASK)
489 CHECK_FUNCTION_EXISTS_EX(unsetenv EVENT__HAVE_UNSETENV)
491 # Get the gethostbyname_r prototype.
492 CHECK_FUNCTION_EXISTS_EX(gethostbyname_r EVENT__HAVE_GETHOSTBYNAME_R)
494 if(EVENT__HAVE_GETHOSTBYNAME_R)
495 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
496 "int gethostbyname_r(const char *name, struct hostent *hp, struct hostent_data *hdata)"
499 EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)
501 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
502 "struct hostent *gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, int *herr)"
505 EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)
507 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
508 "int gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, struct hostent **result, int *herr)"
511 EVENT__HAVE_GETHOSTBYNAME_R_6_ARG)
514 if(HAVE_PORT_H AND HAVE_PORT_CREATE)
515 set(EVENT__HAVE_EVENT_PORTS 1)
519 CHECK_FUNCTION_EXISTS_EX(select EVENT__HAVE_SELECT)
522 CHECK_TYPE_SIZE("uint8_t" EVENT__HAVE_UINT8_T)
523 CHECK_TYPE_SIZE("uint16_t" EVENT__HAVE_UINT16_T)
524 CHECK_TYPE_SIZE("uint32_t" EVENT__HAVE_UINT32_T)
525 CHECK_TYPE_SIZE("uint64_t" EVENT__HAVE_UINT64_T)
526 CHECK_TYPE_SIZE("short" EVENT__SIZEOF_SHORT BUILTIN_TYPES_ONLY)
527 CHECK_TYPE_SIZE("int" EVENT__SIZEOF_INT BUILTIN_TYPES_ONLY)
528 CHECK_TYPE_SIZE("unsigned" EVENT__SIZEOF_UNSIGNED BUILTIN_TYPES_ONLY)
529 CHECK_TYPE_SIZE("unsigned int" EVENT__SIZEOF_UNSIGNED_INT BUILTIN_TYPES_ONLY)
530 CHECK_TYPE_SIZE("long" EVENT__SIZEOF_LONG BUILTIN_TYPES_ONLY)
531 CHECK_TYPE_SIZE("long long" EVENT__SIZEOF_LONG_LONG BUILTIN_TYPES_ONLY)
534 # These aren't available until Windows Vista.
535 # But you can still link them. They just won't be found when running the exe.
536 set(EVENT__HAVE_INET_NTOP 0)
537 set(EVENT__HAVE_INET_PTON 0)
540 # Check for different inline keyword versions.
541 check_function_keywords("inline" "__inline" "__inline__")
544 set(EVENT__inline inline)
545 elseif (HAVE___INLINE)
546 set(EVENT__inline __inline)
547 elseif(HAVE___INLINE__)
548 set(EVENT__inline __inline__)
553 # __func__/__FUNCTION__ is not a macros in general
554 CHECK_SYMBOL_EXISTS("__func__" "" EVENT__HAVE___func__)
555 CHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__)
557 CHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH)
558 CHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN)
559 CHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND)
560 CHECK_CONST_EXISTS(KERN_RANDOM sys/sysctl.h EVENT__HAVE_DECL_KERN_RANDOM)
561 CHECK_CONST_EXISTS(RANDOM_UUID sys/sysctl.h EVENT__HAVE_DECL_RANDOM_UUID)
562 CHECK_SYMBOL_EXISTS(F_SETFD fcntl.h EVENT__HAVE_SETFD)
564 CHECK_TYPE_SIZE(fd_mask EVENT__HAVE_FD_MASK)
566 CHECK_TYPE_SIZE(size_t EVENT__SIZEOF_SIZE_T)
567 if(NOT EVENT__SIZEOF_SIZE_T)
568 set(EVENT__size_t "unsigned")
569 set(EVENT__SIZEOF_SIZE_T ${EVENT__SIZEOF_UNSIGNED})
571 set(EVENT__size_t size_t)
574 CHECK_TYPE_SIZE("off_t" EVENT__SIZEOF_OFF_T LANGUAGE C)
577 # XXX we should functionalize these size and type sets. --elley
581 list(APPEND CMAKE_EXTRA_INCLUDE_FILES BaseTsd.h)
583 CHECK_TYPE_SIZE("ssize_t" EVENT__SIZEOF_SSIZE_T_LOWER LANGUAGE C)
584 CHECK_TYPE_SIZE("SSIZE_T" EVENT__SIZEOF_SSIZE_T_UPPER LANGUAGE C)
586 if (EVENT__SIZEOF_SSIZE_T_LOWER)
587 set(EVENT__ssize_t "ssize_t")
588 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_LOWER})
589 elseif (EVENT__SIZEOF_SSIZE_T_UPPER)
590 set(EVENT__ssize_t "SSIZE_T")
591 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_UPPER})
593 set(EVENT__ssize_t "int")
594 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_INT})
597 CHECK_TYPE_SIZE(socklen_t EVENT__SIZEOF_SOCKLEN_T)
598 if(NOT EVENT__SIZEOF_SOCKLEN_T)
599 set(EVENT__socklen_t "unsigned int")
600 set(EVENT__SIZEOF_SOCKLEN_T ${EVENT__SIZEOF_UNSIGNED_INT})
602 set(EVENT__socklen_t "socklen_t")
605 CHECK_TYPE_SIZE(pid_t EVENT__SIZEOF_PID_T)
606 if(NOT EVENT__SIZEOF_PID_T)
607 set(EVENT__SIZEOF_PID_T ${EVENT__SIZEOF_INT})
609 set(EVENT__SIZEOF_PID_T EVENT__SIZEOF_PID_T)
612 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
614 list(APPEND CMAKE_EXTRA_INCLUDE_FILES pthread.h)
616 CHECK_TYPE_SIZE(pthread_t EVENT__SIZEOF_PTHREAD_T)
619 if(EVENT__HAVE_CLOCK_GETTIME)
620 set(EVENT__DNS_USE_CPU_CLOCK_FOR_ID 1)
623 # we're just getting lazy now.
624 CHECK_TYPE_SIZE("uintptr_t" EVENT__HAVE_UINTPTR_T)
625 CHECK_TYPE_SIZE("void *" EVENT__SIZEOF_VOID_P)
626 CHECK_TYPE_SIZE("time_t" EVENT__SIZEOF_TIME_T)
628 # Tests file offset bits.
629 # TODO: Add AIX test for if -D_LARGE_FILES is needed.
631 # XXX: Why is this here? we don't even use it. Well, we don't even use it
632 # on top of that, why is it set in the config.h?! IT_MAKES_NO_SENSE
633 # I'm commenting it out for now.
636 #CHECK_FILE_OFFSET_BITS()
638 # Verify kqueue works with pipes.
639 if (EVENT__HAVE_KQUEUE)
640 if ((CMAKE_CROSSCOMPILING OR APPLE) AND NOT EVENT__FORCE_KQUEUE_CHECK)
641 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)")
642 set(EVENT__HAVE_WORKING_KQUEUE 1)
644 message(STATUS "Checking if kqueue works with pipes...")
645 include(CheckWorkingKqueue)
649 if(EVENT__HAVE_NETDB_H)
650 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netdb.h)
651 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
653 list(APPEND CMAKE_EXTRA_INCLUDE_FILES ws2tcpip.h)
654 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
657 # Check for sockaddr structure sizes.
658 set(SOCKADDR_HEADERS)
660 set(CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
661 if (_MSC_VER LESS 1300)
662 set(SOCKADDR_HEADERS winsock.h)
664 set(SOCKADDR_HEADERS winsock2.h ws2tcpip.h)
667 if (EVENT__HAVE_NETINET_IN_H)
668 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in.h)
671 if (EVENT__HAVE_NETINET_IN6_H)
672 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in6.h)
675 if (EVENT__HAVE_SYS_SOCKET_H)
676 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} sys/socket.h)
679 if (EVENT__HAVE_NETDB_H)
680 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netdb.h)
684 CHECK_TYPE_SIZE("struct in6_addr" EVENT__HAVE_STRUCT_IN6_ADDR)
685 if(EVENT__HAVE_STRUCT_IN6_ADDR)
686 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
687 s6_addr16 "${SOCKADDR_HEADERS}"
688 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16)
690 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
691 s6_addr32 "${SOCKADDR_HEADERS}"
692 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32)
695 CHECK_TYPE_SIZE("sa_family_t" EVENT__HAVE_SA_FAMILY_T)
696 CHECK_TYPE_SIZE("struct sockaddr_in6" EVENT__HAVE_STRUCT_SOCKADDR_IN6)
698 if(EVENT__HAVE_STRUCT_SOCKADDR_IN6)
699 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
700 sin6_len "${SOCKADDR_HEADERS}"
701 EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
703 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
704 sin_len "${SOCKADDR_HEADERS}"
705 EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
708 CHECK_TYPE_SIZE("struct sockaddr_storage" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
709 if(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
710 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
711 ss_family "${SOCKADDR_HEADERS}"
712 EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
714 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
715 __ss_family "${SOCKADDR_HEADERS}" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY)
718 CHECK_TYPE_SIZE("struct linger" EVENT__HAVE_STRUCT_LINGER)
720 # Group the source files.
722 bufferevent-internal.h
723 changelist-internal.h
725 epolltable-internal.h
753 include/event2/buffer.h
754 include/event2/bufferevent.h
755 include/event2/bufferevent_compat.h
756 include/event2/bufferevent_struct.h
757 include/event2/buffer_compat.h
759 include/event2/dns_compat.h
760 include/event2/dns_struct.h
761 include/event2/event.h
762 include/event2/event_compat.h
763 include/event2/event_struct.h
764 include/event2/http.h
765 include/event2/http_compat.h
766 include/event2/http_struct.h
767 include/event2/keyvalq_struct.h
768 include/event2/listener.h
770 include/event2/rpc_compat.h
771 include/event2/rpc_struct.h
773 include/event2/tag_compat.h
774 include/event2/thread.h
775 include/event2/util.h
776 include/event2/visibility.h
777 ${PROJECT_BINARY_DIR}/include/event2/event-config.h)
784 bufferevent_ratelim.c
797 if(EVENT__HAVE_SELECT)
798 list(APPEND SRC_CORE select.c)
802 list(APPEND SRC_CORE poll.c)
805 if(EVENT__HAVE_KQUEUE)
806 list(APPEND SRC_CORE kqueue.c)
809 if(EVENT__HAVE_DEVPOLL)
810 list(APPEND SRC_CORE devpoll.c)
813 if(EVENT__HAVE_EPOLL)
814 list(APPEND SRC_CORE epoll.c)
817 if(EVENT__HAVE_EVENT_PORTS)
818 list(APPEND SRC_CORE evport.c)
821 if (NOT EVENT__DISABLE_OPENSSL)
822 find_package(OpenSSL REQUIRED)
824 set(EVENT__HAVE_OPENSSL 1)
826 message(STATUS "OpenSSL include: ${OPENSSL_INCLUDE_DIR}")
827 message(STATUS "OpenSSL lib: ${OPENSSL_LIBRARIES}")
829 include_directories(${OPENSSL_INCLUDE_DIR})
831 list(APPEND SRC_OPENSSL bufferevent_openssl.c)
832 list(APPEND HDR_PUBLIC include/event2/bufferevent_ssl.h)
833 list(APPEND LIB_APPS ${OPENSSL_LIBRARIES})
836 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
838 list(APPEND SRC_CORE evthread_win32.c)
840 find_package(Threads REQUIRED)
841 if (NOT CMAKE_USE_PTHREADS_INIT)
843 "Failed to find Pthreads, set EVENT__DISABLE_THREAD_SUPPORT to disable")
846 set(EVENT__HAVE_PTHREADS 1)
847 list(APPEND LIB_APPS ${CMAKE_THREAD_LIBS_INIT})
851 if (NOT EVENT__DISABLE_TESTS)
852 # Zlib is only used for testing.
855 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
856 include_directories(${ZLIB_INCLUDE_DIRS})
858 set(EVENT__HAVE_LIBZ 1)
859 list(APPEND LIB_APPS ${ZLIB_LIBRARIES})
869 add_definitions(-DHAVE_CONFIG_H)
871 # We use BEFORE here so we don't accidentally look in system directories
872 # first for some previous versions of the headers that are installed.
873 include_directories(BEFORE ${PROJECT_SOURCE_DIR}
874 ${PROJECT_SOURCE_DIR}/compat
875 ${PROJECT_SOURCE_DIR}/include)
884 list(APPEND HDR_PRIVATE WIN32-Code/getopt.h)
886 set(EVENT__DNS_USE_FTIME_FOR_ID 1)
887 set(LIB_PLATFORM ws2_32 shell32 advapi32)
889 -D_CRT_SECURE_NO_WARNINGS
890 -D_CRT_NONSTDC_NO_DEPRECATE)
892 include_directories(./WIN32-Code)
896 list(APPEND LIB_PLATFORM socket nsl)
899 source_group("Headers Private" FILES ${HDR_PRIVATE})
900 source_group("Header Compat" FILES ${HDR_COMPAT})
901 source_group("Headers Public" FILES ${HDR_PUBLIC})
902 source_group("Source Core" FILES ${SRC_CORE})
903 source_group("Source Extra" FILES ${SRC_EXTRA})
905 # Generate the configure headers.
906 # (Place them in the build dir so we don't polute the source tree with generated files).
907 include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include)
910 set(EVENT_SHARED_FLAGS -fvisibility=hidden)
911 elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro")
912 set(EVENT_SHARED_FLAGS -xldscope=hidden)
916 ${CMAKE_CURRENT_SOURCE_DIR}/event-config.h.cmake
917 ${CMAKE_CURRENT_BINARY_DIR}/include/event2/event-config.h
921 ${CMAKE_CURRENT_SOURCE_DIR}/evconfig-private.h.cmake
922 ${CMAKE_CURRENT_BINARY_DIR}/include/evconfig-private.h)
925 # Create the libraries.
927 include(AddEventLibrary)
928 add_event_library(event_core SOURCES ${SRC_CORE})
929 add_event_library(event_extra
930 LIBRARIES event_core_shared
931 SOURCES ${SRC_EXTRA})
933 if (NOT EVENT__DISABLE_OPENSSL)
934 add_event_library(event_openssl
935 LIBRARIES event_core_shared ${OPENSSL_LIBRARIES}
936 SOURCES ${SRC_OPENSSL})
939 if (CMAKE_USE_PTHREADS_INIT)
940 set(SRC_PTHREADS evthread_pthread.c)
941 add_event_library(event_pthreads
942 LIBRARIES event_core_shared
943 SOURCES ${SRC_PTHREADS})
946 # library exists for historical reasons; it contains the contents of
947 # both libevent_core and libevent_extra. You shouldn’t use it; it may
948 # go away in a future version of Libevent.
949 add_event_library(event SOURCES ${SRC_CORE} ${SRC_EXTRA})
953 list(APPEND WIN32_GETOPT
955 WIN32-Code/getopt_long.c)
961 macro(add_sample_prog ssl name)
962 add_executable(${name} ${ARGN})
964 target_link_libraries(${name}
971 target_link_libraries(${name} event_openssl)
974 if (NOT EVENT__DISABLE_SAMPLES)
982 foreach(SAMPLE ${SAMPLES})
983 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c)
986 if (NOT EVENT__DISABLE_OPENSSL)
987 add_sample_prog(ON https-client
988 sample/https-client.c
989 sample/openssl_hostname_validation.c
991 add_sample_prog(ON le-proxy
999 foreach (SAMPLE ${SAMPLES_WOPT})
1000 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c ${WIN32_GETOPT})
1007 macro(add_bench_prog prog)
1008 add_executable(${prog} ${ARGN})
1009 target_link_libraries(${prog}
1015 if (NOT EVENT__DISABLE_BENCHMARK)
1016 foreach (BENCHMARK bench_http bench_httpclient)
1017 add_bench_prog(${BENCHMARK} test/${BENCHMARK}.c)
1020 add_bench_prog(bench test/bench.c ${WIN32_GETOPT})
1021 add_bench_prog(bench_cascade test/bench_cascade.c ${WIN32_GETOPT})
1027 macro(add_test_prog prog)
1028 add_executable(${prog} test/${prog}.c)
1029 target_link_libraries(${prog}
1036 if (NOT EVENT__DISABLE_TESTS)
1038 # Generate Regress tests.
1040 if (NOT EVENT__DISABLE_REGRESS)
1041 # (We require python to generate the regress tests)
1042 find_package(PythonInterp 3)
1044 if (PYTHONINTERP_FOUND)
1045 set(__FOUND_USABLE_PYTHON 1)
1047 find_package(PythonInterp 2)
1048 if (PYTHONINTERP_FOUND)
1049 set(__FOUND_USABLE_PYTHON 1)
1051 message(ERROR "No suitable Python version found, bailing...")
1055 if (__FOUND_USABLE_PYTHON)
1056 message(STATUS "Generating regress tests...")
1058 add_definitions(-DTINYTEST_LOCAL)
1062 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.c
1063 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.h
1067 COMMAND ${PYTHON_EXECUTABLE} ../event_rpcgen.py regress.rpc
1068 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test)
1070 list(APPEND SRC_REGRESS
1074 test/regress_buffer.c
1075 test/regress_bufferevent.c
1078 test/regress_finalize.c
1080 test/regress_listener.c
1082 test/regress_minheap.c
1084 test/regress_testutils.c
1085 test/regress_testutils.h
1090 list(APPEND SRC_REGRESS test/regress_iocp.c)
1091 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
1092 list(APPEND SRC_REGRESS test/regress_thread.c)
1094 elseif (CMAKE_USE_PTHREADS_INIT)
1095 list(APPEND SRC_REGRESS test/regress_thread.c)
1098 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
1099 list(APPEND SRC_REGRESS test/regress_zlib.c)
1102 if (NOT EVENT__DISABLE_OPENSSL)
1103 list(APPEND SRC_REGRESS test/regress_ssl.c)
1106 add_executable(regress ${SRC_REGRESS})
1108 target_link_libraries(regress
1113 if (NOT EVENT__DISABLE_OPENSSL)
1114 target_link_libraries(regress event_openssl)
1116 if (CMAKE_USE_PTHREADS_INIT)
1117 target_link_libraries(regress event_pthreads)
1120 message(WARNING "No suitable Python interpreter found, cannot generate regress tests!")
1127 # all of these, including the cmakelists.txt should be moved
1128 # into the dirctory 'tests' first.
1130 # doing this, we can remove all the DISABLE_TESTS stuff, and simply
1131 # do something like:
1133 # add_custom_targets(tests)
1134 # add_executable(... EXCLUDE_FROM_ALL ...c)
1135 # add_dependencis(tests testa testb testc)
1138 # then you can just run 'make tests' instead of them all
1139 # auto-compile|running
1141 set(TESTPROGS test-changelist
1148 foreach (TESTPROG ${TESTPROGS} test-dumpevents)
1149 add_test_prog(${TESTPROG})
1152 add_test_prog(test-ratelim m)
1154 add_test_prog(test-ratelim)
1164 # We run all tests with the different backends turned on one at a time.
1167 # Add event backends based on system introspection result.
1170 if (EVENT__HAVE_EPOLL)
1171 list(APPEND BACKENDS EPOLL)
1174 if (EVENT__HAVE_SELECT)
1175 list(APPEND BACKENDS SELECT)
1178 if (EVENT__HAVE_POLL)
1179 list(APPEND BACKENDS POLL)
1182 if (EVENT__HAVE_KQUEUE)
1183 list(APPEND BACKENDS KQUEUE)
1186 if (EVENT__HAVE_EVENT_PORTS)
1187 list(APPEND BACKENDS EVPORT)
1190 if (EVENT__HAVE_DEVPOLL)
1191 list(APPEND BACKENDS DEVPOLL)
1195 list(APPEND BACKENDS WIN32)
1199 # Default environment variables turns off all event systems,
1200 # then we enable each one, one at a time when creating the tests.
1201 set(DEFAULT_TEST_ENV_VARS "EVENT_SHOW_METHOD=1;")
1202 foreach(BACKEND ${BACKENDS})
1203 set(BACKEND_ENV_VAR "EVENT_NO${BACKEND}=1")
1204 list(APPEND DEFAULT_TEST_ENV_VARS "${BACKEND_ENV_VAR}")
1207 # Macro that creates the ctest test for a backend.
1208 macro(add_backend_test BACKEND_TEST_NAME ENV_VARS)
1211 foreach (TESTPROG ${TESTPROGS})
1212 set(TEST_NAME ${TESTPROG}__${BACKEND_TEST_NAME})
1214 add_test(${TEST_NAME}
1215 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TESTPROG})
1217 list(APPEND TEST_NAMES ${TEST_NAME})
1219 set_tests_properties(${TEST_NAME}
1220 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1224 if (__FOUND_USABLE_PYTHON)
1225 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME})
1227 add_test(${TEST_NAME}
1228 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents |
1229 ${PYTHON_EXECUTABLE}
1230 ${CMAKE_CURRENT_SOURCE_DIR}/test/check-dumpevents.py)
1232 set_tests_properties(${TEST_NAME}
1233 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1235 message(WARNING "test-dumpevents will be run without output check since python was not found!")
1236 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME}_no_check)
1238 add_test(${TEST_NAME}
1239 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents)
1241 set_tests_properties(${TEST_NAME}
1242 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1246 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1247 set(TEST_NAME regress__${BACKEND_TEST_NAME})
1249 add_test(${TEST_NAME}
1250 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress)
1252 set_tests_properties(${TEST_NAME}
1253 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1255 add_test(${TEST_NAME}_debug
1256 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress)
1258 set_tests_properties(${TEST_NAME}_debug
1259 PROPERTIES ENVIRONMENT "${ENV_VARS};EVENT_DEBUG_MODE=1")
1263 # Add the tests for each backend.
1264 foreach(BACKEND ${BACKENDS})
1265 # Enable this backend only.
1266 set(BACKEND_ENV_VARS ${DEFAULT_TEST_ENV_VARS})
1267 list(REMOVE_ITEM BACKEND_ENV_VARS EVENT_NO${BACKEND}=1)
1269 # Epoll has some extra settings.
1270 if (${BACKEND} STREQUAL "EPOLL")
1271 add_backend_test(timerfd_${BACKEND}
1272 "${BACKEND_ENV_VARS};EVENT_PRECISE_TIMER=1")
1274 add_backend_test(changelist_${BACKEND}
1275 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes")
1277 add_backend_test(timerfd_changelist_${BACKEND}
1278 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes;EVENT_PRECISE_TIMER=1")
1280 add_backend_test(${BACKEND} "${BACKEND_ENV_VARS}")
1285 # Rate limiter tests.
1288 # Group limits, no connection limit.
1289 set(RL_BIN ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-ratelim)
1291 add_test(test-ratelim__group_lim
1296 --check-grouplimit 1000
1299 # Connection limit, no group limit.
1300 add_test(test-ratelim__con_lim
1305 --check-connlimit 50
1308 # Connection limit and group limit.
1309 add_test(test-ratelim__group_con_lim
1315 --check-grouplimit 1000
1316 --check-connlimit 50
1319 # Connection limit and group limit with independent drain.
1320 add_test(test-ratelim__group_con_lim_drain
1327 --check-grouplimit 1000
1328 --check-connlimit 50
1331 # Add a "make verify" target, same as for autoconf.
1332 # (Important! This will unset all EVENT_NO* environment variables.
1333 # If they are set in the shell the tests are running using simply "ctest" or "make test" will fail)
1335 # Windows doesn't have "unset". But you can use "set VAR=" instead.
1336 # We need to guard against the possibility taht EVENT_NOWIN32 is set, and all test failing
1337 # since no event backend being available.
1338 file(TO_NATIVE_PATH ${CMAKE_CTEST_COMMAND} WINDOWS_CTEST_COMMAND)
1340 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1343 \"${WINDOWS_CTEST_COMMAND}\"
1346 message(STATUS "${WINDOWS_CTEST_COMMAND}")
1348 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1349 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1356 WORLD_READ WORLD_EXECUTE)
1359 "${CMAKE_CURRENT_BINARY_DIR}/verify_tests.bat" VERIFY_PATH)
1361 add_custom_target(verify COMMAND "${VERIFY_PATH}"
1362 DEPENDS event ${ALL_TESTPROGS})
1364 # On some platforms doing exec(unset) as CMake does won't work, so make sure
1365 # we run the unset command in a shell instead.
1366 # First we write the script contents.
1367 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1370 unset EVENT_NOEPOLL; unset EVENT_NOPOLL; unset EVENT_NOSELECT; unset EVENT_NOWIN32; unset EVENT_NOEVPORT; unset EVENT_NOKQUEUE; unset EVENT_NODEVPOLL
1371 ${CMAKE_CTEST_COMMAND}
1374 # Then we copy the file (this allows us to set execute permission on it)
1375 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1376 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1386 # Create the target that runs the script.
1387 add_custom_target(verify
1388 COMMAND ${CMAKE_CURRENT_BINARY_DIR}/verify_tests.sh
1389 DEPENDS event ${ALL_TESTPROGS})
1392 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1393 add_dependencies(verify regress)
1396 if (EVENT__COVERAGE)
1397 include(CodeCoverage)
1399 setup_target_for_coverage(
1400 verify_coverage # Coverage target name "make verify_coverage"
1402 coverage # Output directory.
1403 verify) # Arguments passed to test runner. "make verify"
1412 # Installation preparation.
1415 if(WIN32 AND NOT CYGWIN)
1416 set(DEF_INSTALL_CMAKE_DIR cmake)
1418 set(DEF_INSTALL_CMAKE_DIR lib/cmake/libevent)
1421 set(EVENT_INSTALL_CMAKE_DIR
1422 "${CMAKE_INSTALL_PREFIX}/${DEF_INSTALL_CMAKE_DIR}"
1423 CACHE PATH "Installation directory for CMake files")
1425 export(PACKAGE libevent)
1427 # Generate the config file for the build-tree.
1428 set(EVENT__INCLUDE_DIRS
1429 "${PROJECT_SOURCE_DIR}/include"
1430 "${PROJECT_BINARY_DIR}/include")
1432 set(LIBEVENT_INCLUDE_DIRS
1433 ${EVENT__INCLUDE_DIRS}
1434 CACHE PATH "Libevent include directories")
1436 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigBuildTree.cmake.in
1437 ${PROJECT_BINARY_DIR}/LibeventConfig.cmake
1440 # Generate the config file for the installation tree.
1441 # Calculate the relative directory from the Cmake dir.
1444 "${EVENT_INSTALL_CMAKE_DIR}"
1445 "${CMAKE_INSTALL_PREFIX}/include")
1447 # Note the LIBEVENT_CMAKE_DIR is defined in LibeventConfig.cmake.in,
1448 # we escape it here so it's evaluated when it is included instead
1449 # so that the include dirs are given relative to where the
1450 # config file is located.
1451 set(EVENT_INSTALL_INCLUDE_DIR "\${LIBEVENT_CMAKE_DIR}/${REL_INCLUDE_DIR}")
1453 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfig.cmake.in
1454 ${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
1457 # Generate version info for both build-tree and install-tree.
1458 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigVersion.cmake.in
1459 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1462 # Install compat headers
1463 install(FILES ${HDR_COMPAT}
1464 DESTINATION "include"
1467 # Install the configs.
1469 ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
1470 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1471 DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1474 # Install exports for the install-tree.
1475 install(EXPORT LibeventTargets
1476 DESTINATION "${DEF_INSTALL_CMAKE_DIR}"
1479 # Install the scripts.
1481 ${CMAKE_CURRENT_SOURCE_DIR}/event_rpcgen.py
1485 # Create documents with doxygen.
1486 find_program(DOXYGEN doxygen)
1488 add_custom_target(doxygen
1489 COMMAND ${DOXYGEN} Doxyfile
1490 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
1492 message(WARNING "The doxygen target will not support since doxygen command was not found!")
1496 # Create the uninstall target.
1497 # https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake
1498 configure_file(${PROJECT_SOURCE_DIR}/cmake/Uninstall.cmake.in
1499 ${PROJECT_BINARY_DIR}/Uninstall.cmake
1502 add_custom_target(uninstall
1503 COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/Uninstall.cmake)
1507 message(STATUS " ---( Libevent " ${EVENT_VERSION} " )---")
1509 message(STATUS "Available event backends: ${BACKENDS}")
1510 message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
1511 message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
1512 message(STATUS "CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
1513 message(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
1514 message(STATUS "PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
1515 message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
1516 message(STATUS "CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
1517 message(STATUS "CMAKE_COMMAND: ${CMAKE_COMMAND}")
1518 message(STATUS "CMAKE_ROOT: ${CMAKE_ROOT}")
1519 message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
1520 message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
1521 message(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
1522 message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
1523 message(STATUS "CMAKE_SKIP_RPATH: ${CMAKE_SKIP_RPATH}")
1524 message(STATUS "CMAKE_VERBOSE_MAKEFILE: ${CMAKE_VERBOSE_MAKEFILE}")
1525 message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
1526 message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
1527 message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER} (id ${CMAKE_C_COMPILER_ID}, clang ${CLANG}, GNUC ${GNUC})")
1528 message(STATUS "CMAKE_AR: ${CMAKE_AR}")
1529 message(STATUS "CMAKE_RANLIB: ${CMAKE_RANLIB}")