CMakeLists.txt revision 1.1.1.1 1 #
2 # Libevent CMake project
3 #
4 # Based on initial work by:
5 # Alexey Ozeritsky
6 #
7 # Additional changes:
8 # Brodie Thiesfield
9 # Joakim Soderberg
10 # Trond Norbye
11 # Sergei Nikulov
12 #
13 # Build example:
14 #
15 # cd libevent
16 # md build
17 # cd build
18 # cmake -G "Visual Studio 10" ..
19 # start libevent.sln
20 #
21
22 cmake_minimum_required(VERSION 3.1 FATAL_ERROR)
23
24 if (POLICY CMP0054)
25 cmake_policy(SET CMP0054 NEW)
26 endif()
27 if (POLICY CMP0074)
28 cmake_policy(SET CMP0074 NEW)
29 endif()
30 if (POLICY CMP0075)
31 cmake_policy(SET CMP0075 NEW)
32 endif()
33
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)
37 endif()
38 string(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
39
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)
43
44 set(EVENT__LIBRARY_TYPE DEFAULT CACHE STRING
45 "Set library type to SHARED/STATIC/BOTH (default SHARED for MSVC, otherwise BOTH)")
46
47 project(libevent C)
48
49 list(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
50 string(REGEX MATCH "SunOS" SOLARIS "${CMAKE_SYSTEM_NAME}")
51
52
53 include(CheckTypeSize)
54 include(CheckFileOffsetBits)
55 include(Macros)
56 include(CheckVariableExists)
57 include(CheckSymbolExists)
58 include(CheckStructHasMember)
59 include(CheckCSourceCompiles)
60 include(CheckPrototypeDefinition)
61 include(CheckFunctionKeywords)
62 include(CheckConstExists)
63 include(AddCompilerFlags)
64 include(VersionViaGit)
65
66 event_fuzzy_version_from_git()
67
68 set(EVENT_VERSION_MAJOR ${EVENT_GIT___VERSION_MAJOR})
69 set(EVENT_VERSION_MINOR ${EVENT_GIT___VERSION_MINOR})
70 set(EVENT_VERSION_PATCH ${EVENT_GIT___VERSION_PATCH})
71 set(EVENT_VERSION_STAGE ${EVENT_GIT___VERSION_STAGE})
72
73
74 set(EVENT_ABI_MAJOR ${EVENT_VERSION_MAJOR})
75 set(EVENT_ABI_MINOR ${EVENT_VERSION_MINOR})
76 set(EVENT_ABI_PATCH ${EVENT_VERSION_PATCH})
77
78 set(EVENT_ABI_LIBVERSION
79 "${EVENT_ABI_MAJOR}.${EVENT_ABI_MINOR}.${EVENT_ABI_PATCH}")
80
81 set(EVENT_PACKAGE_VERSION
82 "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}")
83
84 set(EVENT_NUMERIC_VERSION 0x02010c00)
85 # equals to VERSION_INFO in Makefile.am
86 set(EVENT_ABI_LIBVERSION_CURRENT 7)
87 set(EVENT_ABI_LIBVERSION_REVISION 1)
88 set(EVENT_ABI_LIBVERSION_AGE 0)
89
90 # equals to RELEASE in Makefile.am
91 set(EVENT_PACKAGE_RELEASE 2.1)
92
93 # only a subset of names can be used, defaults to "beta"
94 set(EVENT_STAGE_NAME ${EVENT_VERSION_STAGE})
95
96 # a list that defines what can set for EVENT_STAGE_VERSION
97 set(EVENT__ALLOWED_STAGE_NAMES
98 rc
99 beta
100 alpha
101 alpha-dev
102 release
103 stable
104 )
105 list(
106 FIND EVENT__ALLOWED_STAGE_NAMES
107 "${EVENT_STAGE_NAME}"
108 EVENT__STAGE_RET
109 )
110 if (EVENT__STAGE_RET EQUAL -1)
111 message(WARNING
112 "stage ${EVENT_STAGE_NAME} is not allowed, reset to beta")
113 set(EVENT_STAGE_NAME beta)
114 endif()
115
116 set(EVENT_VERSION
117 "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}-${EVENT_STAGE_NAME}")
118
119 option(EVENT__DISABLE_DEBUG_MODE
120 "Define if libevent should build without support for a debug mode" OFF)
121
122 option(EVENT__ENABLE_VERBOSE_DEBUG
123 "Enables verbose debugging" OFF)
124
125 option(EVENT__DISABLE_MM_REPLACEMENT
126 "Define if libevent should not allow replacing the mm functions" OFF)
127
128 option(EVENT__DISABLE_THREAD_SUPPORT
129 "Define if libevent should not be compiled with thread support" OFF)
130
131 option(EVENT__DISABLE_OPENSSL
132 "Define if libevent should build without support for OpenSSL encryption" OFF)
133
134 option(EVENT__DISABLE_BENCHMARK
135 "Defines if libevent should build without the benchmark executables" OFF)
136
137 option(EVENT__DISABLE_TESTS
138 "If tests should be compiled or not" OFF)
139
140 option(EVENT__DISABLE_REGRESS
141 "Disable the regress tests" OFF)
142
143 option(EVENT__DISABLE_SAMPLES
144 "Disable sample files" OFF)
145
146 option(EVENT__DISABLE_CLOCK_GETTIME
147 "Do not use clock_gettime even if it is available" OFF)
148
149 option(EVENT__FORCE_KQUEUE_CHECK
150 "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)
151
152 # TODO: Add --disable-largefile omit support for large files
153 option(EVENT__COVERAGE
154 "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)
155
156 # Put the libaries and binaries that get built into directories at the
157 # top of the build tree rather than in hard-to-find leaf directories.
158 #
159 # But only if this variables are not defined yet
160 # (i.e. libevent is used via add_subdirectory())
161 if (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
162 set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
163 endif()
164 if (NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY)
165 set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
166 endif()
167 if (NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
168 set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
169 endif()
170
171 if (EVENT__ENABLE_VERBOSE_DEBUG)
172 add_definitions(-DUSE_DEBUG=1)
173 endif()
174
175 # make it colorful under ninja-build
176 if ("${CMAKE_GENERATOR}" STREQUAL "Ninja")
177 add_compiler_flags(-fdiagnostics-color=always)
178 endif()
179
180 # Setup compiler flags for coverage.
181 if (EVENT__COVERAGE)
182 if (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "debug")
183 message(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
184 endif()
185
186 message(STATUS "Setting coverage compiler flags")
187
188 set(CMAKE_REQUIRED_LIBRARIES "--coverage")
189 add_compiler_flags(-g -O0 --coverage)
190 set(CMAKE_REQUIRED_LIBRARIES "")
191 endif()
192
193 set(GNUC 0)
194 set(CLANG 0)
195 set(MSVC 0)
196 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") OR
197 ("${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang"))
198 set(CLANG 1)
199 endif()
200 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR (${CLANG}))
201 set(GNUC 1)
202 endif()
203 if (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR (${CLANG}))
204 set(MSVC 1)
205 endif()
206
207 # Detect library type
208 set(EVENT_LIBRARY_TYPE)
209 if ("${EVENT__LIBRARY_TYPE}" STREQUAL "DEFAULT")
210 if (${MSVC})
211 set(EVENT_LIBRARY_TYPE SHARED)
212 else()
213 set(EVENT_LIBRARY_TYPE BOTH)
214 endif()
215 else()
216 string(TOUPPER "${EVENT__LIBRARY_TYPE}" EVENT_LIBRARY_TYPE)
217 endif()
218 if ((${MSVC}) AND ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH"))
219 message(WARNING
220 "Building SHARED and STATIC is not supported for MSVC "
221 "(due to conflicts in library name"
222 " between STATIC library and IMPORTED library for SHARED libraries)")
223 endif()
224 set(EVENT_LIBRARY_STATIC OFF)
225 set(EVENT_LIBRARY_SHARED OFF)
226 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH")
227 set(EVENT_LIBRARY_STATIC ON)
228 set(EVENT_LIBRARY_SHARED ON)
229 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
230 set(EVENT_LIBRARY_STATIC ON)
231 elseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "SHARED")
232 set(EVENT_LIBRARY_SHARED ON)
233 else()
234 message(FATAL_ERROR "${EVENT_LIBRARY_TYPE} is not supported")
235 endif()
236
237 if (${MSVC})
238 set(msvc_static_runtime OFF)
239 if ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
240 set(msvc_static_runtime ON)
241 endif()
242
243 # For more info:
244 # - https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2017
245 # - https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime
246 option(EVENT__MSVC_STATIC_RUNTIME
247 "Link static runtime libraries"
248 ${msvc_static_runtime})
249
250 if (EVENT__MSVC_STATIC_RUNTIME)
251 foreach (flag_var
252 CMAKE_C_FLAGS_DEBUG
253 CMAKE_C_FLAGS_RELEASE
254 CMAKE_C_FLAGS_MINSIZEREL
255 CMAKE_C_FLAGS_RELWITHDEBINFO
256 )
257 if (${flag_var} MATCHES "/MD")
258 string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
259 endif()
260 endforeach()
261 endif()
262 endif()
263
264 # GNUC specific options.
265 if (${GNUC})
266 option(EVENT__DISABLE_GCC_WARNINGS "Disable verbose warnings with GCC" OFF)
267 option(EVENT__ENABLE_GCC_HARDENING "Enable compiler security checks" OFF)
268 option(EVENT__ENABLE_GCC_FUNCTION_SECTIONS "Enable gcc function sections" OFF)
269 option(EVENT__ENABLE_GCC_WARNINGS "Make all GCC warnings into errors" OFF)
270
271 set(GCC_V ${CMAKE_C_COMPILER_VERSION})
272
273 list(APPEND __FLAGS
274 -Wall -Wextra -Wno-unused-parameter -Wstrict-aliasing -Wstrict-prototypes
275
276 -fno-strict-aliasing # gcc 2.9.5+
277 -Wmissing-prototypes
278
279 # gcc 4
280 -Winit-self
281 -Wmissing-field-initializers
282 -Wdeclaration-after-statement
283
284 # gcc 4.2
285 -Waddress
286 -Wnormalized=id
287 -Woverride-init
288
289 # gcc 4.5
290 -Wlogical-op
291
292 -Wwrite-strings
293 )
294
295 if (${CLANG})
296 list(APPEND __FLAGS -Wno-unused-function)
297 endif()
298
299 if (EVENT__DISABLE_GCC_WARNINGS)
300 list(APPEND __FLAGS -w)
301 endif()
302
303 if (EVENT__ENABLE_GCC_HARDENING)
304 list(APPEND __FLAGS
305 -fstack-protector-all
306 -fwrapv
307 -fPIE
308 -Wstack-protector
309 "--param ssp-buffer-size=1")
310
311 add_definitions(-D_FORTIFY_SOURCE=2)
312 endif()
313
314 if (EVENT__ENABLE_GCC_FUNCTION_SECTIONS)
315 list(APPEND __FLAGS -ffunction-sections)
316 # TODO: Add --gc-sections support. We need some checks for NetBSD to ensure this works.
317 endif()
318
319 if (EVENT__ENABLE_GCC_WARNINGS)
320 list(APPEND __FLAGS -Werror)
321 endif()
322
323 add_compiler_flags(${__FLAGS})
324 endif()
325
326 if (APPLE)
327 # Get rid of deprecated warnings for OpenSSL on OSX 10.7 and greater.
328 add_compiler_flags(
329 -Wno-error=deprecated-declarations
330 -Qunused-arguments
331 )
332 endif()
333
334 if (MINGW OR CYGWIN)
335 set(WIN32 TRUE)
336 endif()
337
338 # Winsock.
339 if(WIN32)
340 set(CMAKE_REQUIRED_LIBRARIES ws2_32 shell32 advapi32)
341 set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h -D_WIN32_WINNT=0x0600)
342 endif()
343 if (SOLARIS)
344 set(CMAKE_REQUIRED_LIBRARIES socket nsl)
345 endif()
346
347 # Check if _GNU_SOURCE is available.
348 if (NOT DEFINED _GNU_SOURCE)
349 CHECK_SYMBOL_EXISTS(__GNU_LIBRARY__ "features.h" _GNU_SOURCE)
350
351 if (NOT _GNU_SOURCE)
352 unset(_GNU_SOURCE CACHE)
353 CHECK_SYMBOL_EXISTS(_GNU_SOURCE "features.h" _GNU_SOURCE)
354 endif()
355
356 if (ANDROID)
357 set(_GNU_SOURCE TRUE)
358 endif()
359 endif()
360
361 if (_GNU_SOURCE)
362 add_definitions(-D_GNU_SOURCE=1)
363 set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
364 endif()
365
366 # Check if header files exist
367 list(APPEND FILES_TO_CHECK
368 fcntl.h
369 inttypes.h
370 memory.h
371 signal.h
372 stdarg.h
373 stddef.h
374 stdint.h
375 stdlib.h
376 string.h
377 errno.h
378 unistd.h
379 time.h
380 sys/types.h
381 sys/stat.h
382 sys/time.h
383 sys/param.h
384 )
385 if (WIN32)
386 list(APPEND FILES_TO_CHECK
387 io.h
388 winsock2.h
389 ws2tcpip.h
390 afunix.h
391 )
392 else()
393 list(APPEND FILES_TO_CHECK
394 netdb.h
395 dlfcn.h
396 arpa/inet.h
397 poll.h
398 port.h
399 sys/socket.h
400 sys/random.h
401 sys/un.h
402 sys/devpoll.h
403 sys/epoll.h
404 sys/eventfd.h
405 sys/event.h
406 sys/ioctl.h
407 sys/mman.h
408 sys/queue.h
409 sys/select.h
410 sys/sendfile.h
411 sys/uio.h
412 sys/wait.h
413 sys/resource.h
414 sys/timerfd.h
415 netinet/in.h
416 netinet/in6.h
417 netinet/tcp.h
418 ifaddrs.h
419 )
420 endif()
421
422 if (NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux")
423 list(APPEND FILES_TO_CHECK sys/sysctl.h)
424 endif()
425
426 if (APPLE)
427 list(APPEND FILES_TO_CHECK
428 mach/mach_time.h
429 mach/mach.h
430 )
431 endif()
432
433 foreach(FILE ${FILES_TO_CHECK})
434 CHECK_INCLUDE_FILE_CONCAT(${FILE} "EVENT")
435 endforeach()
436 unset(FILES_TO_CHECK)
437
438 # Check if functions exist
439 list(APPEND SYMBOLS_TO_CHECK
440 getaddrinfo
441 getnameinfo
442 getprotobynumber
443 getservbyname
444 gethostbyname
445 inet_ntop
446 inet_pton
447 gettimeofday
448 signal
449 strtoll
450 splice
451 strlcpy
452 strsep
453 strtok_r
454 vasprintf
455 timerclear
456 timercmp
457 timerisset
458 timeradd
459 nanosleep
460 putenv
461 umask
462 )
463 if (NOT EVENT__DISABLE_CLOCK_GETTIME)
464 list(APPEND SYMBOLS_TO_CHECK clock_gettime)
465 endif()
466
467 if (WIN32)
468 list(APPEND SYMBOLS_TO_CHECK
469 _gmtime64_s
470 _gmtime64
471 )
472 else()
473 list(APPEND SYMBOLS_TO_CHECK
474 getifaddrs
475 select
476 epoll_create
477 epoll_create1
478 epoll_ctl
479 eventfd
480 poll
481 port_create
482 kqueue
483 fcntl
484 mmap
485 pipe
486 pipe2
487 sendfile
488 sigaction
489 strsignal
490 sysctl
491 accept4
492 arc4random
493 arc4random_buf
494 arc4random_addrandom
495 getrandom
496 getegid
497 geteuid
498 issetugid
499 usleep
500 timerfd_create
501 setenv
502 unsetenv
503 setrlimit
504 gethostbyname_r
505 )
506 if (APPLE)
507 list(APPEND SYMBOLS_TO_CHECK mach_absolute_time)
508 endif()
509 endif()
510
511 # Add stdio.h for vasprintf
512 set(EVENT_INCLUDES ${EVENT_INCLUDES} stdio.h)
513 CHECK_SYMBOLS_EXIST("${SYMBOLS_TO_CHECK}" "${EVENT_INCLUDES}" "EVENT")
514 unset(SYMBOLS_TO_CHECK)
515 set(EVENT__HAVE_EPOLL ${EVENT__HAVE_EPOLL_CREATE})
516
517 # Get the gethostbyname_r prototype.
518 if(EVENT__HAVE_GETHOSTBYNAME_R)
519 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
520 "int gethostbyname_r(const char *name, struct hostent *hp, struct hostent_data *hdata)"
521 "0"
522 "netdb.h"
523 EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)
524
525 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
526 "struct hostent *gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, int *herr)"
527 "NULL"
528 "netdb.h"
529 EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)
530
531 CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
532 "int gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, struct hostent **result, int *herr)"
533 "0"
534 "netdb.h"
535 EVENT__HAVE_GETHOSTBYNAME_R_6_ARG)
536 endif()
537
538 if(HAVE_PORT_H AND HAVE_PORT_CREATE)
539 set(EVENT__HAVE_EVENT_PORTS 1)
540 endif()
541
542 # Only `CHECK_TYPE_SIZE()' will use `CMAKE_EXTRA_INCLUDE_FILES'
543 set(CMAKE_EXTRA_INCLUDE_FILES ${EVENT_INCLUDES})
544
545 CHECK_TYPE_SIZE("struct sockaddr_un" EVENT__HAVE_STRUCT_SOCKADDR_UN)
546 CHECK_TYPE_SIZE("uint8_t" EVENT__HAVE_UINT8_T)
547 CHECK_TYPE_SIZE("uint16_t" EVENT__HAVE_UINT16_T)
548 CHECK_TYPE_SIZE("uint32_t" EVENT__HAVE_UINT32_T)
549 CHECK_TYPE_SIZE("uint64_t" EVENT__HAVE_UINT64_T)
550 CHECK_TYPE_SIZE("short" EVENT__SIZEOF_SHORT BUILTIN_TYPES_ONLY)
551 CHECK_TYPE_SIZE("int" EVENT__SIZEOF_INT BUILTIN_TYPES_ONLY)
552 CHECK_TYPE_SIZE("unsigned" EVENT__SIZEOF_UNSIGNED BUILTIN_TYPES_ONLY)
553 CHECK_TYPE_SIZE("unsigned int" EVENT__SIZEOF_UNSIGNED_INT BUILTIN_TYPES_ONLY)
554 CHECK_TYPE_SIZE("long" EVENT__SIZEOF_LONG BUILTIN_TYPES_ONLY)
555 CHECK_TYPE_SIZE("long long" EVENT__SIZEOF_LONG_LONG BUILTIN_TYPES_ONLY)
556
557 if(WIN32)
558 # These aren't available until Windows Vista.
559 # But you can still link them. They just won't be found when running the exe.
560 set(EVENT__HAVE_INET_NTOP 0)
561 set(EVENT__HAVE_INET_PTON 0)
562 endif()
563
564 # Check for different inline keyword versions.
565 check_function_keywords("inline" "__inline" "__inline__")
566
567 if (HAVE_INLINE)
568 set(EVENT__inline inline)
569 elseif (HAVE___INLINE)
570 set(EVENT__inline __inline)
571 elseif(HAVE___INLINE__)
572 set(EVENT__inline __inline__)
573 else()
574 set(EVENT__inline)
575 endif()
576
577 # __func__/__FUNCTION__ is not a macros in general
578 CHECK_SYMBOL_EXISTS("__func__" "" EVENT__HAVE___func__)
579 CHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__)
580
581 CHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH)
582 CHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN)
583 CHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND)
584 CHECK_SYMBOL_EXISTS(F_SETFD fcntl.h EVENT__HAVE_SETFD)
585
586 CHECK_TYPE_SIZE(fd_mask EVENT__HAVE_FD_MASK)
587
588 CHECK_TYPE_SIZE(size_t EVENT__SIZEOF_SIZE_T)
589 if(NOT EVENT__SIZEOF_SIZE_T)
590 set(EVENT__size_t "unsigned")
591 set(EVENT__SIZEOF_SIZE_T ${EVENT__SIZEOF_UNSIGNED})
592 else()
593 set(EVENT__size_t size_t)
594 endif()
595
596 CHECK_TYPE_SIZE("off_t" EVENT__SIZEOF_OFF_T LANGUAGE C)
597
598
599 # XXX we should functionalize these size and type sets. --elley
600
601 # Winssck.
602 if (_MSC_VER)
603 list(APPEND CMAKE_EXTRA_INCLUDE_FILES BaseTsd.h)
604 endif()
605 CHECK_TYPE_SIZE("ssize_t" EVENT__SIZEOF_SSIZE_T_LOWER LANGUAGE C)
606 CHECK_TYPE_SIZE("SSIZE_T" EVENT__SIZEOF_SSIZE_T_UPPER LANGUAGE C)
607
608 if (EVENT__SIZEOF_SSIZE_T_LOWER)
609 set(EVENT__ssize_t "ssize_t")
610 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_LOWER})
611 elseif (EVENT__SIZEOF_SSIZE_T_UPPER)
612 set(EVENT__ssize_t "SSIZE_T")
613 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_UPPER})
614 else()
615 set(EVENT__ssize_t "int")
616 set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_INT})
617 endif()
618
619 CHECK_TYPE_SIZE(socklen_t EVENT__SIZEOF_SOCKLEN_T)
620 if(NOT EVENT__SIZEOF_SOCKLEN_T)
621 set(EVENT__socklen_t "unsigned int")
622 set(EVENT__SIZEOF_SOCKLEN_T ${EVENT__SIZEOF_UNSIGNED_INT})
623 else()
624 set(EVENT__socklen_t "socklen_t")
625 endif()
626
627 CHECK_TYPE_SIZE(pid_t EVENT__SIZEOF_PID_T)
628 if(NOT EVENT__SIZEOF_PID_T)
629 set(EVENT__SIZEOF_PID_T ${EVENT__SIZEOF_INT})
630 else()
631 set(EVENT__SIZEOF_PID_T EVENT__SIZEOF_PID_T)
632 endif()
633
634 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
635 if (NOT WIN32)
636 list(APPEND CMAKE_EXTRA_INCLUDE_FILES pthread.h)
637 endif()
638 CHECK_TYPE_SIZE(pthread_t EVENT__SIZEOF_PTHREAD_T)
639 endif()
640
641 if(EVENT__HAVE_CLOCK_GETTIME)
642 set(EVENT__DNS_USE_CPU_CLOCK_FOR_ID 1)
643 endif()
644
645 # we're just getting lazy now.
646 CHECK_TYPE_SIZE("uintptr_t" EVENT__HAVE_UINTPTR_T)
647 CHECK_TYPE_SIZE("void *" EVENT__SIZEOF_VOID_P)
648 CHECK_TYPE_SIZE("time_t" EVENT__SIZEOF_TIME_T)
649
650 # Tests file offset bits.
651 # TODO: Add AIX test for if -D_LARGE_FILES is needed.
652
653 # XXX: Why is this here? we don't even use it. Well, we don't even use it
654 # on top of that, why is it set in the config.h?! IT_MAKES_NO_SENSE
655 # I'm commenting it out for now.
656 # - ellzey
657
658 #CHECK_FILE_OFFSET_BITS()
659
660 # Verify kqueue works with pipes.
661 if (EVENT__HAVE_KQUEUE)
662 if ((CMAKE_CROSSCOMPILING OR APPLE) AND NOT EVENT__FORCE_KQUEUE_CHECK)
663 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)")
664 set(EVENT__HAVE_WORKING_KQUEUE 1)
665 else()
666 message(STATUS "Checking if kqueue works with pipes...")
667 include(CheckWorkingKqueue)
668 endif()
669 endif()
670
671 if(EVENT__HAVE_NETDB_H)
672 list(APPEND CMAKE_EXTRA_INCLUDE_FILES netdb.h)
673 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
674 elseif(WIN32)
675 list(APPEND CMAKE_EXTRA_INCLUDE_FILES ws2tcpip.h)
676 CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
677 endif()
678
679 # Check for sockaddr structure sizes.
680 set(SOCKADDR_HEADERS)
681 if (WIN32)
682 set(CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
683 if (_MSC_VER LESS 1300)
684 set(SOCKADDR_HEADERS winsock.h)
685 else()
686 set(SOCKADDR_HEADERS winsock2.h ws2tcpip.h)
687 endif()
688 else()
689 if (EVENT__HAVE_NETINET_IN_H)
690 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in.h)
691 endif()
692
693 if (EVENT__HAVE_NETINET_IN6_H)
694 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in6.h)
695 endif()
696
697 if (EVENT__HAVE_SYS_SOCKET_H)
698 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} sys/socket.h)
699 endif()
700
701 if (EVENT__HAVE_NETDB_H)
702 set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netdb.h)
703 endif()
704 endif()
705
706 CHECK_TYPE_SIZE("struct in6_addr" EVENT__HAVE_STRUCT_IN6_ADDR)
707 if(EVENT__HAVE_STRUCT_IN6_ADDR)
708 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
709 s6_addr16 "${SOCKADDR_HEADERS}"
710 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16)
711
712 CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
713 s6_addr32 "${SOCKADDR_HEADERS}"
714 EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32)
715 endif()
716
717 CHECK_TYPE_SIZE("sa_family_t" EVENT__HAVE_SA_FAMILY_T)
718 CHECK_TYPE_SIZE("struct sockaddr_in6" EVENT__HAVE_STRUCT_SOCKADDR_IN6)
719
720 if(EVENT__HAVE_STRUCT_SOCKADDR_IN6)
721 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
722 sin6_len "${SOCKADDR_HEADERS}"
723 EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
724
725 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
726 sin_len "${SOCKADDR_HEADERS}"
727 EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
728 endif()
729
730 CHECK_TYPE_SIZE("struct sockaddr_storage" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
731 if(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
732 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
733 ss_family "${SOCKADDR_HEADERS}"
734 EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
735
736 CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
737 __ss_family "${SOCKADDR_HEADERS}" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY)
738 endif()
739
740 CHECK_TYPE_SIZE("struct linger" EVENT__HAVE_STRUCT_LINGER)
741
742 # Group the source files.
743 set(HDR_PRIVATE
744 bufferevent-internal.h
745 changelist-internal.h
746 defer-internal.h
747 epolltable-internal.h
748 evbuffer-internal.h
749 event-internal.h
750 evmap-internal.h
751 evrpc-internal.h
752 evsignal-internal.h
753 evthread-internal.h
754 ht-internal.h
755 http-internal.h
756 iocp-internal.h
757 ipv6-internal.h
758 log-internal.h
759 minheap-internal.h
760 mm-internal.h
761 ratelim-internal.h
762 strlcpy-internal.h
763 util-internal.h
764 evconfig-private.h
765 compat/sys/queue.h)
766
767 set(HDR_COMPAT
768 include/evdns.h
769 include/evrpc.h
770 include/event.h
771 include/evhttp.h
772 include/evutil.h)
773
774 set(HDR_PUBLIC
775 include/event2/buffer.h
776 include/event2/bufferevent.h
777 include/event2/bufferevent_compat.h
778 include/event2/bufferevent_struct.h
779 include/event2/buffer_compat.h
780 include/event2/dns.h
781 include/event2/dns_compat.h
782 include/event2/dns_struct.h
783 include/event2/event.h
784 include/event2/event_compat.h
785 include/event2/event_struct.h
786 include/event2/http.h
787 include/event2/http_compat.h
788 include/event2/http_struct.h
789 include/event2/keyvalq_struct.h
790 include/event2/listener.h
791 include/event2/rpc.h
792 include/event2/rpc_compat.h
793 include/event2/rpc_struct.h
794 include/event2/tag.h
795 include/event2/tag_compat.h
796 include/event2/thread.h
797 include/event2/util.h
798 include/event2/visibility.h
799 ${PROJECT_BINARY_DIR}/include/event2/event-config.h)
800
801 set(SRC_CORE
802 buffer.c
803 bufferevent.c
804 bufferevent_filter.c
805 bufferevent_pair.c
806 bufferevent_ratelim.c
807 bufferevent_sock.c
808 event.c
809 evmap.c
810 evthread.c
811 evutil.c
812 evutil_rand.c
813 evutil_time.c
814 listener.c
815 log.c
816 signal.c
817 strlcpy.c)
818
819 if(EVENT__HAVE_SELECT)
820 list(APPEND SRC_CORE select.c)
821 endif()
822
823 if(EVENT__HAVE_POLL)
824 list(APPEND SRC_CORE poll.c)
825 endif()
826
827 if(EVENT__HAVE_KQUEUE)
828 list(APPEND SRC_CORE kqueue.c)
829 endif()
830
831 if(EVENT__HAVE_DEVPOLL)
832 list(APPEND SRC_CORE devpoll.c)
833 endif()
834
835 if(EVENT__HAVE_EPOLL)
836 list(APPEND SRC_CORE epoll.c)
837 endif()
838
839 if(EVENT__HAVE_EVENT_PORTS)
840 list(APPEND SRC_CORE evport.c)
841 endif()
842
843 if (NOT EVENT__DISABLE_OPENSSL)
844 find_package(OpenSSL REQUIRED)
845
846 set(EVENT__HAVE_OPENSSL 1)
847
848 message(STATUS "OpenSSL include: ${OPENSSL_INCLUDE_DIR}")
849 message(STATUS "OpenSSL lib: ${OPENSSL_LIBRARIES}")
850
851 include_directories(${OPENSSL_INCLUDE_DIR})
852
853 list(APPEND SRC_OPENSSL bufferevent_openssl.c)
854 list(APPEND HDR_PUBLIC include/event2/bufferevent_ssl.h)
855 list(APPEND LIB_APPS ${OPENSSL_LIBRARIES})
856 endif()
857
858 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
859 if (WIN32)
860 list(APPEND SRC_CORE evthread_win32.c)
861 else()
862 find_package(Threads REQUIRED)
863 if (NOT CMAKE_USE_PTHREADS_INIT)
864 message(FATAL_ERROR
865 "Failed to find Pthreads, set EVENT__DISABLE_THREAD_SUPPORT to disable")
866 endif()
867
868 set(EVENT__HAVE_PTHREADS 1)
869 list(APPEND LIB_APPS ${CMAKE_THREAD_LIBS_INIT})
870 endif()
871 endif()
872
873 if (NOT EVENT__DISABLE_TESTS)
874 # Zlib is only used for testing.
875 find_package(ZLIB)
876
877 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
878 include_directories(${ZLIB_INCLUDE_DIRS})
879
880 set(EVENT__HAVE_LIBZ 1)
881 list(APPEND LIB_APPS ${ZLIB_LIBRARIES})
882 endif()
883 endif()
884
885 set(SRC_EXTRA
886 event_tagging.c
887 http.c
888 evdns.c
889 evrpc.c)
890
891 add_definitions(-DHAVE_CONFIG_H)
892
893 # We use BEFORE here so we don't accidentally look in system directories
894 # first for some previous versions of the headers that are installed.
895 include_directories(BEFORE ${PROJECT_SOURCE_DIR}
896 ${PROJECT_SOURCE_DIR}/compat
897 ${PROJECT_SOURCE_DIR}/include)
898
899 if(WIN32)
900 list(APPEND SRC_CORE
901 buffer_iocp.c
902 bufferevent_async.c
903 event_iocp.c
904 win32select.c)
905
906 list(APPEND HDR_PRIVATE WIN32-Code/getopt.h)
907
908 set(EVENT__DNS_USE_FTIME_FOR_ID 1)
909 set(LIB_PLATFORM ws2_32 shell32 advapi32)
910 add_definitions(
911 -D_CRT_SECURE_NO_WARNINGS
912 -D_CRT_NONSTDC_NO_DEPRECATE)
913
914 include_directories(./WIN32-Code)
915 endif()
916
917 if (SOLARIS)
918 list(APPEND LIB_PLATFORM socket nsl)
919 endif()
920
921 source_group("Headers Private" FILES ${HDR_PRIVATE})
922 source_group("Header Compat" FILES ${HDR_COMPAT})
923 source_group("Headers Public" FILES ${HDR_PUBLIC})
924 source_group("Source Core" FILES ${SRC_CORE})
925 source_group("Source Extra" FILES ${SRC_EXTRA})
926
927 # Generate the configure headers.
928 # (Place them in the build dir so we don't polute the source tree with generated files).
929 include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include)
930
931 if (${GNUC})
932 set(EVENT_SHARED_FLAGS -fvisibility=hidden)
933 elseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro")
934 set(EVENT_SHARED_FLAGS -xldscope=hidden)
935 endif()
936
937 configure_file(
938 ${CMAKE_CURRENT_SOURCE_DIR}/event-config.h.cmake
939 ${CMAKE_CURRENT_BINARY_DIR}/include/event2/event-config.h
940 NEWLINE_STYLE UNIX)
941
942 configure_file(
943 ${CMAKE_CURRENT_SOURCE_DIR}/evconfig-private.h.cmake
944 ${CMAKE_CURRENT_BINARY_DIR}/include/evconfig-private.h)
945
946 #
947 # Create the libraries.
948 #
949 include(AddEventLibrary)
950 add_event_library(event_core SOURCES ${SRC_CORE})
951 add_event_library(event_extra
952 INNER_LIBRARIES event_core
953 SOURCES ${SRC_EXTRA})
954
955 if (NOT EVENT__DISABLE_OPENSSL)
956 add_event_library(event_openssl
957 INNER_LIBRARIES event_core
958 OUTER_INCLUDES ${OPENSSL_INCLUDE_DIR}
959 LIBRARIES ${OPENSSL_LIBRARIES}
960 SOURCES ${SRC_OPENSSL})
961 endif()
962
963 if (EVENT__HAVE_PTHREADS)
964 set(SRC_PTHREADS evthread_pthread.c)
965 add_event_library(event_pthreads
966 INNER_LIBRARIES event_core
967 SOURCES ${SRC_PTHREADS})
968 endif()
969
970 # library exists for historical reasons; it contains the contents of
971 # both libevent_core and libevent_extra. You shouldnt use it; it may
972 # go away in a future version of Libevent.
973 add_event_library(event SOURCES ${SRC_CORE} ${SRC_EXTRA})
974
975 set(WIN32_GETOPT)
976 if (WIN32)
977 set(_TMPLIBS)
978 if (${EVENT_LIBRARY_STATIC})
979 list(APPEND _TMPLIBS event_core_static event_static)
980 endif()
981 if (${EVENT_LIBRARY_SHARED})
982 list(APPEND _TMPLIBS event_core_shared event_shared)
983 endif()
984 foreach(lib ${_TMPLIBS})
985 target_link_libraries(${lib} iphlpapi)
986 endforeach()
987 unset(_TMPLIBS)
988
989 list(APPEND WIN32_GETOPT
990 WIN32-Code/getopt.c
991 WIN32-Code/getopt_long.c)
992 endif()
993
994 #
995 # Samples.
996 #
997 macro(add_sample_prog ssl name)
998 add_executable(${name} ${ARGN})
999
1000 target_link_libraries(${name}
1001 event_extra
1002 event_core
1003 ${LIB_APPS}
1004 ${LIB_PLATFORM})
1005
1006 if (${ssl})
1007 target_link_libraries(${name} event_openssl)
1008 if(WIN32)
1009 target_link_libraries(${name} crypt32)
1010 endif()
1011 endif()
1012 endmacro()
1013 if (NOT EVENT__DISABLE_SAMPLES)
1014 set(SAMPLES
1015 event-read-fifo
1016 hello-world
1017 signal-test
1018 http-connect
1019 time-test)
1020
1021 foreach(SAMPLE ${SAMPLES})
1022 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c)
1023 endforeach()
1024
1025 if (NOT EVENT__DISABLE_OPENSSL)
1026 add_sample_prog(ON https-client
1027 sample/https-client.c
1028 sample/openssl_hostname_validation.c
1029 sample/hostcheck.c)
1030 add_sample_prog(ON le-proxy
1031 sample/le-proxy.c)
1032 endif()
1033
1034 set(SAMPLES_WOPT
1035 dns-example
1036 http-server
1037 )
1038 foreach (SAMPLE ${SAMPLES_WOPT})
1039 add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c ${WIN32_GETOPT})
1040 endforeach()
1041 endif()
1042
1043 #
1044 # Benchmarks
1045 #
1046 macro(add_bench_prog prog)
1047 add_executable(${prog} ${ARGN})
1048 target_link_libraries(${prog}
1049 event_extra
1050 event_core
1051 ${LIB_APPS}
1052 ${LIB_PLATFORM})
1053 endmacro()
1054 if (NOT EVENT__DISABLE_BENCHMARK)
1055 foreach (BENCHMARK bench_http bench_httpclient)
1056 add_bench_prog(${BENCHMARK} test/${BENCHMARK}.c)
1057 endforeach()
1058
1059 add_bench_prog(bench test/bench.c ${WIN32_GETOPT})
1060 add_bench_prog(bench_cascade test/bench_cascade.c ${WIN32_GETOPT})
1061 endif()
1062
1063 #
1064 # Tests
1065 #
1066 macro(add_test_prog prog)
1067 add_executable(${prog} test/${prog}.c)
1068 target_link_libraries(${prog}
1069 ${LIB_APPS}
1070 ${LIB_PLATFORM}
1071 event_core
1072 event_extra
1073 ${ARGN})
1074 endmacro()
1075 if (NOT EVENT__DISABLE_TESTS)
1076 #
1077 # Generate Regress tests.
1078 #
1079 if (NOT EVENT__DISABLE_REGRESS)
1080 # (We require python to generate the regress tests)
1081 find_package(PythonInterp 3)
1082
1083 if (PYTHONINTERP_FOUND)
1084 set(__FOUND_USABLE_PYTHON 1)
1085 else()
1086 find_package(PythonInterp 2)
1087 if (PYTHONINTERP_FOUND)
1088 set(__FOUND_USABLE_PYTHON 1)
1089 else()
1090 message(ERROR "No suitable Python version found, bailing...")
1091 endif()
1092 endif()
1093
1094 if (__FOUND_USABLE_PYTHON)
1095 message(STATUS "Generating regress tests...")
1096
1097 add_definitions(-DTINYTEST_LOCAL)
1098
1099 add_custom_command(
1100 OUTPUT
1101 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.c
1102 ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.h
1103 DEPENDS
1104 event_rpcgen.py
1105 test/regress.rpc
1106 COMMAND ${PYTHON_EXECUTABLE} ../event_rpcgen.py --quiet regress.rpc
1107 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test)
1108
1109 list(APPEND SRC_REGRESS
1110 test/regress.c
1111 test/regress.gen.c
1112 test/regress.gen.h
1113 test/regress_buffer.c
1114 test/regress_bufferevent.c
1115 test/regress_dns.c
1116 test/regress_et.c
1117 test/regress_finalize.c
1118 test/regress_http.c
1119 test/regress_listener.c
1120 test/regress_main.c
1121 test/regress_minheap.c
1122 test/regress_rpc.c
1123 test/regress_testutils.c
1124 test/regress_testutils.h
1125 test/regress_util.c
1126 test/tinytest.c)
1127
1128 if (WIN32)
1129 list(APPEND SRC_REGRESS test/regress_iocp.c)
1130 if (NOT EVENT__DISABLE_THREAD_SUPPORT)
1131 list(APPEND SRC_REGRESS test/regress_thread.c)
1132 endif()
1133 elseif (EVENT__HAVE_PTHREADS)
1134 list(APPEND SRC_REGRESS test/regress_thread.c)
1135 endif()
1136
1137 if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
1138 list(APPEND SRC_REGRESS test/regress_zlib.c)
1139 endif()
1140
1141 if (NOT EVENT__DISABLE_OPENSSL)
1142 list(APPEND SRC_REGRESS test/regress_ssl.c)
1143 endif()
1144
1145 add_executable(regress ${SRC_REGRESS})
1146
1147 target_link_libraries(regress
1148 ${LIB_APPS}
1149 ${LIB_PLATFORM}
1150 event_core
1151 event_extra)
1152 if (NOT EVENT__DISABLE_OPENSSL)
1153 target_link_libraries(regress event_openssl)
1154 endif()
1155 if (CMAKE_USE_PTHREADS_INIT)
1156 target_link_libraries(regress event_pthreads)
1157 endif()
1158 else()
1159 message(WARNING "No suitable Python interpreter found, cannot generate regress tests!")
1160 endif()
1161 endif()
1162
1163 #
1164 # Test programs.
1165 #
1166 # all of these, including the cmakelists.txt should be moved
1167 # into the dirctory 'tests' first.
1168 #
1169 # doing this, we can remove all the DISABLE_TESTS stuff, and simply
1170 # do something like:
1171 #
1172 # add_custom_targets(tests)
1173 # add_executable(... EXCLUDE_FROM_ALL ...c)
1174 # add_dependencis(tests testa testb testc)
1175 # add_test(....)
1176 #
1177 # then you can just run 'make tests' instead of them all
1178 # auto-compile|running
1179 # - ellzey
1180 set(TESTPROGS test-changelist
1181 test-eof
1182 test-closed
1183 test-fdleak
1184 test-init
1185 test-time
1186 test-weof)
1187
1188 foreach (TESTPROG ${TESTPROGS} test-dumpevents)
1189 add_test_prog(${TESTPROG})
1190 endforeach()
1191 if (UNIX)
1192 add_test_prog(test-ratelim m)
1193 else()
1194 add_test_prog(test-ratelim)
1195 endif()
1196
1197 set(ALL_TESTPROGS
1198 ${TESTPROGS}
1199 test-dumpevents
1200 test-ratelim
1201 )
1202
1203 #
1204 # We run all tests with the different backends turned on one at a time.
1205 #
1206
1207 # Add event backends based on system introspection result.
1208 set(BACKENDS "")
1209
1210 if (EVENT__HAVE_EPOLL)
1211 list(APPEND BACKENDS EPOLL)
1212 endif()
1213
1214 if (EVENT__HAVE_SELECT)
1215 list(APPEND BACKENDS SELECT)
1216 endif()
1217
1218 if (EVENT__HAVE_POLL)
1219 list(APPEND BACKENDS POLL)
1220 endif()
1221
1222 if (EVENT__HAVE_KQUEUE)
1223 list(APPEND BACKENDS KQUEUE)
1224 endif()
1225
1226 if (EVENT__HAVE_EVENT_PORTS)
1227 list(APPEND BACKENDS EVPORT)
1228 endif()
1229
1230 if (EVENT__HAVE_DEVPOLL)
1231 list(APPEND BACKENDS DEVPOLL)
1232 endif()
1233
1234 if (WIN32)
1235 list(APPEND BACKENDS WIN32)
1236 endif()
1237
1238
1239 # Default environment variables turns off all event systems,
1240 # then we enable each one, one at a time when creating the tests.
1241 set(DEFAULT_TEST_ENV_VARS)
1242 foreach(BACKEND ${BACKENDS})
1243 set(BACKEND_ENV_VAR "EVENT_NO${BACKEND}=1")
1244 list(APPEND DEFAULT_TEST_ENV_VARS "${BACKEND_ENV_VAR}")
1245 endforeach()
1246
1247 # Macro that creates the ctest test for a backend.
1248 macro(add_backend_test BACKEND_TEST_NAME ENV_VARS)
1249 set(TEST_NAMES "")
1250
1251 foreach (TESTPROG ${TESTPROGS})
1252 set(TEST_NAME ${TESTPROG}__${BACKEND_TEST_NAME})
1253
1254 add_test(${TEST_NAME}
1255 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TESTPROG})
1256
1257 list(APPEND TEST_NAMES ${TEST_NAME})
1258
1259 set_tests_properties(${TEST_NAME}
1260 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1261 endforeach()
1262
1263 # Dump events test.
1264 if (__FOUND_USABLE_PYTHON)
1265 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME})
1266
1267 add_test(${TEST_NAME}
1268 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents |
1269 ${PYTHON_EXECUTABLE}
1270 ${CMAKE_CURRENT_SOURCE_DIR}/test/check-dumpevents.py)
1271
1272 set_tests_properties(${TEST_NAME}
1273 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1274 else()
1275 message(WARNING "test-dumpevents will be run without output check since python was not found!")
1276 set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME}_no_check)
1277
1278 add_test(${TEST_NAME}
1279 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents)
1280
1281 set_tests_properties(${TEST_NAME}
1282 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1283 endif()
1284
1285 # Regress tests.
1286 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1287 set(TEST_NAME regress__${BACKEND_TEST_NAME})
1288
1289 add_test(${TEST_NAME}
1290 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress --quiet)
1291
1292 set_tests_properties(${TEST_NAME}
1293 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1294
1295 add_test(${TEST_NAME}_debug
1296 ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress --quiet)
1297
1298 set_tests_properties(${TEST_NAME}_debug
1299 PROPERTIES ENVIRONMENT "${ENV_VARS};EVENT_DEBUG_MODE=1")
1300 endif()
1301 endmacro()
1302
1303 # Add the tests for each backend.
1304 foreach(BACKEND ${BACKENDS})
1305 # Enable this backend only.
1306 set(BACKEND_ENV_VARS ${DEFAULT_TEST_ENV_VARS})
1307 list(REMOVE_ITEM BACKEND_ENV_VARS EVENT_NO${BACKEND}=1)
1308
1309 # Epoll has some extra settings.
1310 if (${BACKEND} STREQUAL "EPOLL")
1311 add_backend_test(timerfd_${BACKEND}
1312 "${BACKEND_ENV_VARS};EVENT_PRECISE_TIMER=1")
1313
1314 add_backend_test(changelist_${BACKEND}
1315 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes")
1316
1317 add_backend_test(timerfd_changelist_${BACKEND}
1318 "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes;EVENT_PRECISE_TIMER=1")
1319 else()
1320 add_backend_test(${BACKEND} "${BACKEND_ENV_VARS}")
1321 endif()
1322 endforeach()
1323
1324 #
1325 # Rate limiter tests.
1326 #
1327
1328 # Group limits, no connection limit.
1329 set(RL_BIN ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-ratelim)
1330
1331 add_test(test-ratelim__group_lim
1332 ${RL_BIN}
1333 -g 30000
1334 -n 30
1335 -t 100
1336 --check-grouplimit 1000
1337 --check-stddev 100)
1338
1339 # Connection limit, no group limit.
1340 add_test(test-ratelim__con_lim
1341 ${RL_BIN}
1342 -c 1000
1343 -n 30
1344 -t 100
1345 --check-connlimit 50
1346 --check-stddev 50)
1347
1348 # Connection limit and group limit.
1349 add_test(test-ratelim__group_con_lim
1350 ${RL_BIN}
1351 -c 1000
1352 -g 30000
1353 -n 30
1354 -t 100
1355 --check-grouplimit 1000
1356 --check-connlimit 50
1357 --check-stddev 50)
1358
1359 # Connection limit and group limit with independent drain.
1360 add_test(test-ratelim__group_con_lim_drain
1361 ${RL_BIN}
1362 -c 1000
1363 -g 35000
1364 -n 30
1365 -t 100
1366 -G 500
1367 --check-grouplimit 1000
1368 --check-connlimit 50
1369 --check-stddev 50)
1370
1371 # Add a "make verify" target, same as for autoconf.
1372 # (Important! This will unset all EVENT_NO* environment variables.
1373 # If they are set in the shell the tests are running using simply "ctest" or "make test" will fail)
1374 if (WIN32)
1375 # Windows doesn't have "unset". But you can use "set VAR=" instead.
1376 # We need to guard against the possibility taht EVENT_NOWIN32 is set, and all test failing
1377 # since no event backend being available.
1378 file(TO_NATIVE_PATH ${CMAKE_CTEST_COMMAND} WINDOWS_CTEST_COMMAND)
1379
1380 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1381 "
1382 set EVENT_NOWIN32=
1383 \"${WINDOWS_CTEST_COMMAND}\"
1384 ")
1385
1386 message(STATUS "${WINDOWS_CTEST_COMMAND}")
1387
1388 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1389 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1390 FILE_PERMISSIONS
1391 OWNER_READ
1392 OWNER_WRITE
1393 OWNER_EXECUTE
1394 GROUP_READ
1395 GROUP_EXECUTE
1396 WORLD_READ WORLD_EXECUTE)
1397
1398 file(TO_NATIVE_PATH
1399 "${CMAKE_CURRENT_BINARY_DIR}/verify_tests.bat" VERIFY_PATH)
1400
1401 add_custom_target(verify COMMAND "${VERIFY_PATH}"
1402 DEPENDS event ${ALL_TESTPROGS})
1403 else()
1404 # On some platforms doing exec(unset) as CMake does won't work, so make sure
1405 # we run the unset command in a shell instead.
1406 # First we write the script contents.
1407 file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1408 "
1409 #!/bin/bash
1410 unset EVENT_NOEPOLL; unset EVENT_NOPOLL; unset EVENT_NOSELECT; unset EVENT_NOWIN32; unset EVENT_NOEVPORT; unset EVENT_NOKQUEUE; unset EVENT_NODEVPOLL
1411 ${CMAKE_CTEST_COMMAND}
1412 ")
1413
1414 # Then we copy the file (this allows us to set execute permission on it)
1415 file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
1416 DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1417 FILE_PERMISSIONS
1418 OWNER_READ
1419 OWNER_WRITE
1420 OWNER_EXECUTE
1421 GROUP_READ
1422 GROUP_EXECUTE
1423 WORLD_READ
1424 WORLD_EXECUTE)
1425
1426 # Create the target that runs the script.
1427 add_custom_target(verify
1428 COMMAND ${CMAKE_CURRENT_BINARY_DIR}/verify_tests.sh
1429 DEPENDS event ${ALL_TESTPROGS})
1430 endif()
1431
1432 if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1433 add_dependencies(verify regress)
1434 endif()
1435
1436 if (EVENT__COVERAGE)
1437 include(CodeCoverage)
1438
1439 setup_target_for_coverage(
1440 verify_coverage # Coverage target name "make verify_coverage"
1441 make # Test runner.
1442 coverage # Output directory.
1443 verify) # Arguments passed to test runner. "make verify"
1444 endif()
1445
1446 enable_testing()
1447
1448 include(CTest)
1449 endif()
1450
1451 #
1452 # Installation preparation.
1453 #
1454
1455 set(EVENT_INSTALL_CMAKE_DIR
1456 "${CMAKE_INSTALL_PREFIX}/lib/cmake/libevent")
1457
1458 export(PACKAGE libevent)
1459
1460 function(gen_package_config forinstall)
1461 if(${forinstall})
1462 set(CONFIG_FOR_INSTALL_TREE 1)
1463 set(dir "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}")
1464 else()
1465 set(CONFIG_FOR_INSTALL_TREE 0)
1466 set(dir "${PROJECT_BINARY_DIR}")
1467 endif()
1468 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfig.cmake.in
1469 "${dir}/LibeventConfig.cmake"
1470 @ONLY)
1471 endfunction()
1472
1473 # Generate the config file for the build-tree.
1474 set(EVENT__INCLUDE_DIRS
1475 "${PROJECT_SOURCE_DIR}/include"
1476 "${PROJECT_BINARY_DIR}/include")
1477
1478 set(LIBEVENT_INCLUDE_DIRS
1479 ${EVENT__INCLUDE_DIRS}
1480 CACHE PATH "Libevent include directories")
1481
1482 gen_package_config(0)
1483
1484 # Generate the config file for the installation tree.
1485 gen_package_config(1)
1486
1487 # Generate version info for both build-tree and install-tree.
1488 configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigVersion.cmake.in
1489 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1490 @ONLY)
1491
1492 # Install compat headers
1493 install(FILES ${HDR_COMPAT}
1494 DESTINATION "include"
1495 COMPONENT dev)
1496
1497 # Install public headers
1498 install(FILES ${HDR_PUBLIC}
1499 DESTINATION "include/event2"
1500 COMPONENT dev)
1501
1502 # Install the configs.
1503 install(FILES
1504 ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
1505 ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1506 DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1507 COMPONENT dev)
1508
1509 # Install exports for the install-tree.
1510 macro(install_export type)
1511 install(EXPORT LibeventTargets-${type}
1512 NAMESPACE ${PROJECT_NAME}::
1513 DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1514 COMPONENT dev)
1515 endmacro()
1516
1517 if (${EVENT_LIBRARY_STATIC})
1518 install_export(static)
1519 endif()
1520 if (${EVENT_LIBRARY_SHARED})
1521 install_export(shared)
1522 endif()
1523
1524 # Install the scripts.
1525 install(PROGRAMS
1526 ${CMAKE_CURRENT_SOURCE_DIR}/event_rpcgen.py
1527 DESTINATION "bin"
1528 COMPONENT runtime)
1529
1530 # Create documents with doxygen.
1531 option(EVENT__DOXYGEN
1532 "Enables doxygen documentation" OFF)
1533 if (EVENT__DOXYGEN)
1534 include(UseDoxygen)
1535 UseDoxygen()
1536 endif()
1537
1538
1539 if (NOT TARGET uninstall)
1540 # Create the uninstall target.
1541 # https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake
1542 configure_file(${PROJECT_SOURCE_DIR}/cmake/Uninstall.cmake.in
1543 ${PROJECT_BINARY_DIR}/Uninstall.cmake
1544 @ONLY)
1545
1546 add_custom_target(uninstall
1547 COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/Uninstall.cmake)
1548 endif()
1549
1550 message(STATUS "")
1551 message(STATUS " ---( Libevent " ${EVENT_VERSION} " )---")
1552 message(STATUS "")
1553 message(STATUS "Available event backends: ${BACKENDS}")
1554 message(STATUS "CMAKE_BINARY_DIR: ${CMAKE_BINARY_DIR}")
1555 message(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
1556 message(STATUS "CMAKE_SOURCE_DIR: ${CMAKE_SOURCE_DIR}")
1557 message(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
1558 message(STATUS "PROJECT_BINARY_DIR: ${PROJECT_BINARY_DIR}")
1559 message(STATUS "PROJECT_SOURCE_DIR: ${PROJECT_SOURCE_DIR}")
1560 message(STATUS "CMAKE_MODULE_PATH: ${CMAKE_MODULE_PATH}")
1561 message(STATUS "CMAKE_COMMAND: ${CMAKE_COMMAND}")
1562 message(STATUS "CMAKE_ROOT: ${CMAKE_ROOT}")
1563 message(STATUS "CMAKE_SYSTEM: ${CMAKE_SYSTEM}")
1564 message(STATUS "CMAKE_SYSTEM_NAME: ${CMAKE_SYSTEM_NAME}")
1565 message(STATUS "CMAKE_SYSTEM_VERSION: ${CMAKE_SYSTEM_VERSION}")
1566 message(STATUS "CMAKE_SYSTEM_PROCESSOR: ${CMAKE_SYSTEM_PROCESSOR}")
1567 message(STATUS "CMAKE_SKIP_RPATH: ${CMAKE_SKIP_RPATH}")
1568 message(STATUS "CMAKE_VERBOSE_MAKEFILE: ${CMAKE_VERBOSE_MAKEFILE}")
1569 message(STATUS "CMAKE_C_FLAGS: ${CMAKE_C_FLAGS}")
1570 message(STATUS "CMAKE_BUILD_TYPE: ${CMAKE_BUILD_TYPE}")
1571 message(STATUS "CMAKE_C_COMPILER: ${CMAKE_C_COMPILER} (id ${CMAKE_C_COMPILER_ID}, clang ${CLANG}, GNUC ${GNUC})")
1572 message(STATUS "CMAKE_AR: ${CMAKE_AR}")
1573 message(STATUS "CMAKE_RANLIB: ${CMAKE_RANLIB}")
1574 message(STATUS "")
1575
1576