]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/libevent/CMakeLists.txt
ctl_backend_block: Prepare for NVMe support
[FreeBSD/FreeBSD.git] / contrib / libevent / CMakeLists.txt
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 shouldn’t 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