Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/contrib/libevent/CMakeLists.txt
39475 views
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
1576
1577