xref: /libevent-2.1.12/CMakeLists.txt (revision 2cfa7ff7)
1e415196aSJoakim Soderberg#
2e415196aSJoakim Soderberg# Libevent CMake project
3e415196aSJoakim Soderberg#
4e415196aSJoakim Soderberg# Based on initial work by:
5e415196aSJoakim Soderberg#    Alexey Ozeritsky
6e415196aSJoakim Soderberg#
7e415196aSJoakim Soderberg# Additional changes:
8e415196aSJoakim Soderberg#   Brodie Thiesfield
9e415196aSJoakim Soderberg#   Joakim Soderberg
104545fa9bSTrond Norbye#   Trond Norbye
1127bd9fafSSergey Nikulov#   Sergei Nikulov
12e415196aSJoakim Soderberg#
13e415196aSJoakim Soderberg#   Build example:
14e415196aSJoakim Soderberg#
15e415196aSJoakim Soderberg#       cd libevent
16e415196aSJoakim Soderberg#       md build
17e415196aSJoakim Soderberg#       cd build
18e415196aSJoakim Soderberg#       cmake -G "Visual Studio 10" ..
19e415196aSJoakim Soderberg#       start libevent.sln
20e415196aSJoakim Soderberg#
21eb10a738SAzat Khuzhin
22c46ead5dSAzat Khuzhincmake_minimum_required(VERSION 3.1 FATAL_ERROR)
234a2373eeSlightningkay
244a2373eeSlightningkayif (POLICY CMP0054)
256f749540SAzat Khuzhin    cmake_policy(SET CMP0054 NEW)
264a2373eeSlightningkayendif()
273d3d1e05SAzat Khuzhinif (POLICY CMP0074)
283d3d1e05SAzat Khuzhin    cmake_policy(SET CMP0074 NEW)
293d3d1e05SAzat Khuzhinendif()
305e5de36fSAzat Khuzhinif (POLICY CMP0075)
315e5de36fSAzat Khuzhin    cmake_policy(SET CMP0075 NEW)
325e5de36fSAzat Khuzhinendif()
33e415196aSJoakim Soderberg
348b228e27SMark Ellzeyif(NOT CMAKE_BUILD_TYPE)
358b228e27SMark Ellzey    set(CMAKE_BUILD_TYPE Release
368b228e27SMark Ellzey        CACHE STRING "Set build type to Debug o Release (default Release)" FORCE)
378b228e27SMark Ellzeyendif()
3840fbffc0SAzat Khuzhinstring(TOLOWER "${CMAKE_BUILD_TYPE}" CMAKE_BUILD_TYPE_LOWER)
398b228e27SMark Ellzey
40e415196aSJoakim Soderberg# get rid of the extra default configurations
418b228e27SMark Ellzey# what? why would you get id of other useful build types? - Ellzey
42e415196aSJoakim Soderbergset(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Limited configurations" FORCE)
43e415196aSJoakim Soderberg
44eb10a738SAzat Khuzhinset(EVENT__LIBRARY_TYPE DEFAULT CACHE STRING
45bc7f2fd9SAzat Khuzhin    "Set library type to SHARED/STATIC/BOTH (default SHARED for MSVC, otherwise BOTH)")
46eb10a738SAzat Khuzhin
474ac086abSJoakim Soderbergproject(libevent C)
48e415196aSJoakim Soderberg
4987c6f735SMichael Davidsaverlist(APPEND CMAKE_MODULE_PATH "${PROJECT_SOURCE_DIR}/cmake/")
50050bfc7fSAzat Khuzhinstring(REGEX MATCH "SunOS" SOLARIS "${CMAKE_SYSTEM_NAME}")
514545fa9bSTrond Norbye
528b228e27SMark Ellzey
537f9646d2SMark Ellzeyinclude(CheckTypeSize)
54e415196aSJoakim Soderberginclude(CheckFileOffsetBits)
5513af9d26Syuangongjiinclude(Macros)
56e415196aSJoakim Soderberginclude(CheckVariableExists)
57e415196aSJoakim Soderberginclude(CheckSymbolExists)
58e415196aSJoakim Soderberginclude(CheckStructHasMember)
59e415196aSJoakim Soderberginclude(CheckCSourceCompiles)
60e415196aSJoakim Soderberginclude(CheckPrototypeDefinition)
618b228e27SMark Ellzeyinclude(CheckFunctionKeywords)
62a0bfe2c4SAzat Khuzhininclude(CheckConstExists)
63a9db46aeSMark Ellzeyinclude(AddCompilerFlags)
64a9db46aeSMark Ellzeyinclude(VersionViaGit)
658b228e27SMark Ellzey
66a9db46aeSMark Ellzeyevent_fuzzy_version_from_git()
678b228e27SMark Ellzey
68a9db46aeSMark Ellzeyset(EVENT_VERSION_MAJOR ${EVENT_GIT___VERSION_MAJOR})
69a9db46aeSMark Ellzeyset(EVENT_VERSION_MINOR ${EVENT_GIT___VERSION_MINOR})
70a9db46aeSMark Ellzeyset(EVENT_VERSION_PATCH ${EVENT_GIT___VERSION_PATCH})
7149a53811SMark Ellzeyset(EVENT_VERSION_STAGE ${EVENT_GIT___VERSION_STAGE})
728b228e27SMark Ellzey
73a9db46aeSMark Ellzey
74a9db46aeSMark Ellzeyset(EVENT_ABI_MAJOR ${EVENT_VERSION_MAJOR})
75a9db46aeSMark Ellzeyset(EVENT_ABI_MINOR ${EVENT_VERSION_MINOR})
76a9db46aeSMark Ellzeyset(EVENT_ABI_PATCH ${EVENT_VERSION_PATCH})
77a9db46aeSMark Ellzey
78a9db46aeSMark Ellzeyset(EVENT_ABI_LIBVERSION
79a9db46aeSMark Ellzey    "${EVENT_ABI_MAJOR}.${EVENT_ABI_MINOR}.${EVENT_ABI_PATCH}")
80a9db46aeSMark Ellzey
81a9db46aeSMark Ellzeyset(EVENT_PACKAGE_VERSION
82a9db46aeSMark Ellzey    "${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}")
83a9db46aeSMark Ellzey
84*2cfa7ff7SAzat Khuzhinset(EVENT_NUMERIC_VERSION 0x02010c00)
85305251b9Syuangongji# equals to VERSION_INFO in Makefile.am
865b723a66SAzat Khuzhinset(EVENT_ABI_LIBVERSION_CURRENT   7)
87*2cfa7ff7SAzat Khuzhinset(EVENT_ABI_LIBVERSION_REVISION  1)
88305251b9Syuangongjiset(EVENT_ABI_LIBVERSION_AGE       0)
89305251b9Syuangongji
90305251b9Syuangongji# equals to RELEASE in Makefile.am
91305251b9Syuangongjiset(EVENT_PACKAGE_RELEASE 2.1)
92a9db46aeSMark Ellzey
93a9db46aeSMark Ellzey# only a subset of names can be used, defaults to "beta"
94d9d11cb2SAzat Khuzhinset(EVENT_STAGE_NAME ${EVENT_VERSION_STAGE})
95a9db46aeSMark Ellzey
96a9db46aeSMark Ellzey# a list that defines what can set for EVENT_STAGE_VERSION
97a9db46aeSMark Ellzeyset(EVENT__ALLOWED_STAGE_NAMES
98a9db46aeSMark Ellzey	rc
99a9db46aeSMark Ellzey	beta
100a9db46aeSMark Ellzey	alpha
101d9d11cb2SAzat Khuzhin	alpha-dev
102d9d11cb2SAzat Khuzhin	release
103d9d11cb2SAzat Khuzhin	stable
104d9d11cb2SAzat Khuzhin)
105d9d11cb2SAzat Khuzhinlist(
106d9d11cb2SAzat Khuzhin	FIND EVENT__ALLOWED_STAGE_NAMES
107d9d11cb2SAzat Khuzhin	"${EVENT_STAGE_NAME}"
108d9d11cb2SAzat Khuzhin	EVENT__STAGE_RET
109d9d11cb2SAzat Khuzhin)
110d9d11cb2SAzat Khuzhinif (EVENT__STAGE_RET EQUAL -1)
111d9d11cb2SAzat Khuzhin	message(WARNING
112d9d11cb2SAzat Khuzhin		"stage ${EVENT_STAGE_NAME} is not allowed, reset to beta")
113d56efd94SMark Ellzey	set(EVENT_STAGE_NAME beta)
1148b228e27SMark Ellzeyendif()
115a9db46aeSMark Ellzey
116a9db46aeSMark Ellzeyset(EVENT_VERSION
11749a53811SMark Ellzey	"${EVENT_VERSION_MAJOR}.${EVENT_VERSION_MINOR}.${EVENT_VERSION_PATCH}-${EVENT_STAGE_NAME}")
118a9db46aeSMark Ellzey
119a9db46aeSMark Ellzeyoption(EVENT__DISABLE_DEBUG_MODE
120a9db46aeSMark Ellzey    "Define if libevent should build without support for a debug mode" OFF)
121a9db46aeSMark Ellzey
122a9db46aeSMark Ellzeyoption(EVENT__ENABLE_VERBOSE_DEBUG
123a9db46aeSMark Ellzey    "Enables verbose debugging" OFF)
124a9db46aeSMark Ellzey
125a9db46aeSMark Ellzeyoption(EVENT__DISABLE_MM_REPLACEMENT
126a9db46aeSMark Ellzey    "Define if libevent should not allow replacing the mm functions" OFF)
127a9db46aeSMark Ellzey
128a9db46aeSMark Ellzeyoption(EVENT__DISABLE_THREAD_SUPPORT
129a9db46aeSMark Ellzey    "Define if libevent should not be compiled with thread support" OFF)
130a9db46aeSMark Ellzey
131a9db46aeSMark Ellzeyoption(EVENT__DISABLE_OPENSSL
132c264028cSFredrik Strupe    "Define if libevent should build without support for OpenSSL encryption" OFF)
133a9db46aeSMark Ellzey
134a9db46aeSMark Ellzeyoption(EVENT__DISABLE_BENCHMARK
135c264028cSFredrik Strupe    "Defines if libevent should build without the benchmark executables" OFF)
136a9db46aeSMark Ellzey
137a9db46aeSMark Ellzeyoption(EVENT__DISABLE_TESTS
138a9db46aeSMark Ellzey    "If tests should be compiled or not" OFF)
139a9db46aeSMark Ellzey
140a9db46aeSMark Ellzeyoption(EVENT__DISABLE_REGRESS
141a9db46aeSMark Ellzey    "Disable the regress tests" OFF)
142a9db46aeSMark Ellzey
143a9db46aeSMark Ellzeyoption(EVENT__DISABLE_SAMPLES
144a9db46aeSMark Ellzey    "Disable sample files" OFF)
145a9db46aeSMark Ellzey
14691559607SAzat Khuzhinoption(EVENT__DISABLE_CLOCK_GETTIME
14791559607SAzat Khuzhin    "Do not use clock_gettime even if it is available" OFF)
14891559607SAzat Khuzhin
149a9db46aeSMark Ellzeyoption(EVENT__FORCE_KQUEUE_CHECK
150c264028cSFredrik Strupe    "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)
151a9db46aeSMark Ellzey
152a9db46aeSMark Ellzey# TODO: Add --disable-largefile     omit support for large files
153a9db46aeSMark Ellzeyoption(EVENT__COVERAGE
154a9db46aeSMark Ellzey"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)
155a9db46aeSMark Ellzey
156a9db46aeSMark Ellzey# Put the libaries and binaries that get built into directories at the
157a9db46aeSMark Ellzey# top of the build tree rather than in hard-to-find leaf directories.
1582db851a9SAzat Khuzhin#
1592db851a9SAzat Khuzhin# But only if this variables are not defined yet
1602db851a9SAzat Khuzhin# (i.e. libevent is used via add_subdirectory())
1612db851a9SAzat Khuzhinif (NOT DEFINED CMAKE_RUNTIME_OUTPUT_DIRECTORY)
162a9db46aeSMark Ellzey    set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/bin)
1632db851a9SAzat Khuzhinendif()
1642db851a9SAzat Khuzhinif (NOT DEFINED CMAKE_LIBRARY_OUTPUT_DIRECTORY)
165a9db46aeSMark Ellzey    set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
1662db851a9SAzat Khuzhinendif()
1672db851a9SAzat Khuzhinif (NOT DEFINED CMAKE_ARCHIVE_OUTPUT_DIRECTORY)
168a9db46aeSMark Ellzey    set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${PROJECT_BINARY_DIR}/lib)
1692db851a9SAzat Khuzhinendif()
170e415196aSJoakim Soderberg
171fd42e70dSJoakim Soderbergif (EVENT__ENABLE_VERBOSE_DEBUG)
172e35f2241SAzat Khuzhin    add_definitions(-DUSE_DEBUG=1)
173fd42e70dSJoakim Soderbergendif()
174fd42e70dSJoakim Soderberg
1752594a96fSAzat Khuzhin# make it colorful under ninja-build
1762594a96fSAzat Khuzhinif ("${CMAKE_GENERATOR}" STREQUAL "Ninja")
1772594a96fSAzat Khuzhin    add_compiler_flags(-fdiagnostics-color=always)
1782594a96fSAzat Khuzhinendif()
1792594a96fSAzat Khuzhin
180f2483f8bSJoakim Soderberg# Setup compiler flags for coverage.
181f2483f8bSJoakim Soderbergif (EVENT__COVERAGE)
18240fbffc0SAzat Khuzhin    if (NOT "${CMAKE_BUILD_TYPE_LOWER}" STREQUAL "debug")
183a9db46aeSMark Ellzey        message(FATAL_ERROR "Coverage requires -DCMAKE_BUILD_TYPE=Debug")
184f2483f8bSJoakim Soderberg    endif()
185f2483f8bSJoakim Soderberg
1868b228e27SMark Ellzey    message(STATUS "Setting coverage compiler flags")
18740fbffc0SAzat Khuzhin
18840fbffc0SAzat Khuzhin    set(CMAKE_REQUIRED_LIBRARIES "--coverage")
18940fbffc0SAzat Khuzhin    add_compiler_flags(-g -O0 --coverage)
19040fbffc0SAzat Khuzhin    set(CMAKE_REQUIRED_LIBRARIES "")
191f2483f8bSJoakim Soderbergendif()
192f2483f8bSJoakim Soderberg
193acf4821dSAzat Khuzhinset(GNUC 0)
194acf4821dSAzat Khuzhinset(CLANG 0)
195bc7f2fd9SAzat Khuzhinset(MSVC 0)
196acf4821dSAzat Khuzhinif (("${CMAKE_C_COMPILER_ID}" STREQUAL "Clang") OR
197acf4821dSAzat Khuzhin    ("${CMAKE_C_COMPILER_ID}" STREQUAL "AppleClang"))
198acf4821dSAzat Khuzhin    set(CLANG 1)
199acf4821dSAzat Khuzhinendif()
200bc7f2fd9SAzat Khuzhinif (("${CMAKE_C_COMPILER_ID}" STREQUAL "GNU") OR (${CLANG}))
201acf4821dSAzat Khuzhin    set(GNUC 1)
202acf4821dSAzat Khuzhinendif()
203bc7f2fd9SAzat Khuzhinif (("${CMAKE_C_COMPILER_ID}" STREQUAL "MSVC") OR (${CLANG}))
204bc7f2fd9SAzat Khuzhin    set(MSVC 1)
205bc7f2fd9SAzat Khuzhinendif()
206acf4821dSAzat Khuzhin
207eb10a738SAzat Khuzhin# Detect library type
208eb10a738SAzat Khuzhinset(EVENT_LIBRARY_TYPE)
209eb10a738SAzat Khuzhinif ("${EVENT__LIBRARY_TYPE}" STREQUAL "DEFAULT")
210bc7f2fd9SAzat Khuzhin    if (${MSVC})
211bc7f2fd9SAzat Khuzhin        set(EVENT_LIBRARY_TYPE SHARED)
212bc7f2fd9SAzat Khuzhin    else()
213eb10a738SAzat Khuzhin        set(EVENT_LIBRARY_TYPE BOTH)
214bc7f2fd9SAzat Khuzhin    endif()
215eb10a738SAzat Khuzhinelse()
216eb10a738SAzat Khuzhin    string(TOUPPER "${EVENT__LIBRARY_TYPE}" EVENT_LIBRARY_TYPE)
217eb10a738SAzat Khuzhinendif()
218bc7f2fd9SAzat Khuzhinif ((${MSVC}) AND ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH"))
219bc7f2fd9SAzat Khuzhin    message(WARNING
220bc7f2fd9SAzat Khuzhin      "Building SHARED and STATIC is not supported for MSVC "
221bc7f2fd9SAzat Khuzhin      "(due to conflicts in library name"
222bc7f2fd9SAzat Khuzhin      " between STATIC library and IMPORTED library for SHARED libraries)")
223bc7f2fd9SAzat Khuzhinendif()
224eb10a738SAzat Khuzhinset(EVENT_LIBRARY_STATIC OFF)
225eb10a738SAzat Khuzhinset(EVENT_LIBRARY_SHARED OFF)
226eb10a738SAzat Khuzhinif ("${EVENT_LIBRARY_TYPE}" STREQUAL "BOTH")
227eb10a738SAzat Khuzhin    set(EVENT_LIBRARY_STATIC ON)
228eb10a738SAzat Khuzhin    set(EVENT_LIBRARY_SHARED ON)
229eb10a738SAzat Khuzhinelseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
230eb10a738SAzat Khuzhin    set(EVENT_LIBRARY_STATIC ON)
231eb10a738SAzat Khuzhinelseif ("${EVENT_LIBRARY_TYPE}" STREQUAL "SHARED")
232eb10a738SAzat Khuzhin    set(EVENT_LIBRARY_SHARED ON)
233eb10a738SAzat Khuzhinelse()
234eb10a738SAzat Khuzhin    message(FATAL_ERROR "${EVENT_LIBRARY_TYPE} is not supported")
235eb10a738SAzat Khuzhinendif()
236eb10a738SAzat Khuzhin
237c8b3ec17SAzat Khuzhinif (${MSVC})
238c8b3ec17SAzat Khuzhin    set(msvc_static_runtime OFF)
239c8b3ec17SAzat Khuzhin    if ("${EVENT_LIBRARY_TYPE}" STREQUAL "STATIC")
240c8b3ec17SAzat Khuzhin        set(msvc_static_runtime ON)
241c8b3ec17SAzat Khuzhin    endif()
242c8b3ec17SAzat Khuzhin
243c8b3ec17SAzat Khuzhin    # For more info:
244c8b3ec17SAzat Khuzhin    # - https://docs.microsoft.com/en-us/cpp/build/reference/md-mt-ld-use-run-time-library?view=vs-2017
245c8b3ec17SAzat Khuzhin    # - https://gitlab.kitware.com/cmake/community/wikis/FAQ#how-can-i-build-my-msvc-application-with-a-static-runtime
246c8b3ec17SAzat Khuzhin    option(EVENT__MSVC_STATIC_RUNTIME
247c8b3ec17SAzat Khuzhin           "Link static runtime libraries"
248c8b3ec17SAzat Khuzhin           ${msvc_static_runtime})
249c8b3ec17SAzat Khuzhin
250c8b3ec17SAzat Khuzhin    if (EVENT__MSVC_STATIC_RUNTIME)
251c8b3ec17SAzat Khuzhin        foreach (flag_var
252c8b3ec17SAzat Khuzhin                 CMAKE_C_FLAGS_DEBUG
253c8b3ec17SAzat Khuzhin                 CMAKE_C_FLAGS_RELEASE
254c8b3ec17SAzat Khuzhin                 CMAKE_C_FLAGS_MINSIZEREL
255c8b3ec17SAzat Khuzhin                 CMAKE_C_FLAGS_RELWITHDEBINFO
256c8b3ec17SAzat Khuzhin        )
257c8b3ec17SAzat Khuzhin            if (${flag_var} MATCHES "/MD")
258c8b3ec17SAzat Khuzhin                string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
259c8b3ec17SAzat Khuzhin            endif()
260c8b3ec17SAzat Khuzhin        endforeach()
261c8b3ec17SAzat Khuzhin    endif()
262c8b3ec17SAzat Khuzhinendif()
263c8b3ec17SAzat Khuzhin
264acf4821dSAzat Khuzhin# GNUC specific options.
265acf4821dSAzat Khuzhinif (${GNUC})
26619222e52SJoakim Soderberg    option(EVENT__DISABLE_GCC_WARNINGS "Disable verbose warnings with GCC" OFF)
26719222e52SJoakim Soderberg    option(EVENT__ENABLE_GCC_HARDENING "Enable compiler security checks" OFF)
2688b228e27SMark Ellzey    option(EVENT__ENABLE_GCC_FUNCTION_SECTIONS "Enable gcc function sections" OFF)
2698b228e27SMark Ellzey    option(EVENT__ENABLE_GCC_WARNINGS "Make all GCC warnings into errors" OFF)
2708b228e27SMark Ellzey
271acf4821dSAzat Khuzhin    set(GCC_V ${CMAKE_C_COMPILER_VERSION})
272acf4821dSAzat Khuzhin
273acf4821dSAzat Khuzhin    list(APPEND __FLAGS
274b062bf0aSAzat Khuzhin         -Wall -Wextra -Wno-unused-parameter -Wstrict-aliasing -Wstrict-prototypes
275acf4821dSAzat Khuzhin
276acf4821dSAzat Khuzhin         -fno-strict-aliasing # gcc 2.9.5+
2773da21a94SAzat Khuzhin         -Wmissing-prototypes
278acf4821dSAzat Khuzhin
279acf4821dSAzat Khuzhin         # gcc 4
280acf4821dSAzat Khuzhin         -Winit-self
281acf4821dSAzat Khuzhin         -Wmissing-field-initializers
282acf4821dSAzat Khuzhin         -Wdeclaration-after-statement
283acf4821dSAzat Khuzhin
284acf4821dSAzat Khuzhin         # gcc 4.2
285acf4821dSAzat Khuzhin         -Waddress
286acf4821dSAzat Khuzhin         -Wnormalized=id
287acf4821dSAzat Khuzhin         -Woverride-init
288acf4821dSAzat Khuzhin
289acf4821dSAzat Khuzhin         # gcc 4.5
290acf4821dSAzat Khuzhin         -Wlogical-op
291b062bf0aSAzat Khuzhin
292b062bf0aSAzat Khuzhin         -Wwrite-strings
293acf4821dSAzat Khuzhin    )
2948b228e27SMark Ellzey
295b062bf0aSAzat Khuzhin    if (${CLANG})
296b062bf0aSAzat Khuzhin        list(APPEND __FLAGS -Wno-unused-function)
297b062bf0aSAzat Khuzhin    endif()
298b062bf0aSAzat Khuzhin
2998b228e27SMark Ellzey    if (EVENT__DISABLE_GCC_WARNINGS)
3008b228e27SMark Ellzey        list(APPEND __FLAGS -w)
30119222e52SJoakim Soderberg    endif()
30219222e52SJoakim Soderberg
3038b228e27SMark Ellzey    if (EVENT__ENABLE_GCC_HARDENING)
3048b228e27SMark Ellzey        list(APPEND __FLAGS
3058b228e27SMark Ellzey             -fstack-protector-all
3068b228e27SMark Ellzey             -fwrapv
3078b228e27SMark Ellzey             -fPIE
3088b228e27SMark Ellzey             -Wstack-protector
3098b228e27SMark Ellzey             "--param ssp-buffer-size=1")
3108b228e27SMark Ellzey
3118b228e27SMark Ellzey        add_definitions(-D_FORTIFY_SOURCE=2)
3128b228e27SMark Ellzey    endif()
3138b228e27SMark Ellzey
31419222e52SJoakim Soderberg    if (EVENT__ENABLE_GCC_FUNCTION_SECTIONS)
3158b228e27SMark Ellzey        list(APPEND __FLAGS -ffunction-sections)
31619222e52SJoakim Soderberg        # TODO: Add --gc-sections support. We need some checks for NetBSD to ensure this works.
31719222e52SJoakim Soderberg    endif()
31819222e52SJoakim Soderberg
319dd413bd1SJoakim Soderberg    if (EVENT__ENABLE_GCC_WARNINGS)
3208b228e27SMark Ellzey        list(APPEND __FLAGS -Werror)
321dd413bd1SJoakim Soderberg    endif()
322dd413bd1SJoakim Soderberg
32336588e16SAzat Khuzhin    add_compiler_flags(${__FLAGS})
32419222e52SJoakim Soderbergendif()
32519222e52SJoakim Soderberg
32669c3516bSJoakim Söderbergif (APPLE)
32769c3516bSJoakim Söderberg    # Get rid of deprecated warnings for OpenSSL on OSX 10.7 and greater.
3288b228e27SMark Ellzey    add_compiler_flags(
3298b228e27SMark Ellzey        -Wno-error=deprecated-declarations
33036588e16SAzat Khuzhin        -Qunused-arguments
33136588e16SAzat Khuzhin    )
33269c3516bSJoakim Söderbergendif()
33369c3516bSJoakim Söderberg
33413af9d26Syuangongjiif (MINGW OR CYGWIN)
33513af9d26Syuangongji    set(WIN32 TRUE)
33613af9d26Syuangongjiendif()
33713af9d26Syuangongji
338e415196aSJoakim Soderberg# Winsock.
339e415196aSJoakim Soderbergif(WIN32)
34013af9d26Syuangongji    set(CMAKE_REQUIRED_LIBRARIES  ws2_32 shell32 advapi32)
341dea51c2eSyuangongji    set(CMAKE_REQUIRED_DEFINITIONS -FIwinsock2.h -FIws2tcpip.h -D_WIN32_WINNT=0x0600)
342e415196aSJoakim Soderbergendif()
343dc95823cSAzat Khuzhinif (SOLARIS)
344dc95823cSAzat Khuzhin    set(CMAKE_REQUIRED_LIBRARIES socket nsl)
345dc95823cSAzat Khuzhinendif()
346e415196aSJoakim Soderberg
347e415196aSJoakim Soderberg# Check if _GNU_SOURCE is available.
348b52c6498SAzat Khuzhinif (NOT DEFINED _GNU_SOURCE)
349e415196aSJoakim Soderberg  CHECK_SYMBOL_EXISTS(__GNU_LIBRARY__ "features.h" _GNU_SOURCE)
350e415196aSJoakim Soderberg
351a0bfe2c4SAzat Khuzhin  if (NOT _GNU_SOURCE)
352a0bfe2c4SAzat Khuzhin    unset(_GNU_SOURCE CACHE)
353a0bfe2c4SAzat Khuzhin    CHECK_SYMBOL_EXISTS(_GNU_SOURCE "features.h" _GNU_SOURCE)
354a0bfe2c4SAzat Khuzhin  endif()
355f013fc7dSKeith Smiley
356f013fc7dSKeith Smiley  if (ANDROID)
357f013fc7dSKeith Smiley    set(_GNU_SOURCE TRUE)
358f013fc7dSKeith Smiley  endif()
359a0bfe2c4SAzat Khuzhinendif()
360a0bfe2c4SAzat Khuzhin
361e415196aSJoakim Soderbergif (_GNU_SOURCE)
36200ba9fa2SEnji Cooper    add_definitions(-D_GNU_SOURCE=1)
36313af9d26Syuangongji    set(CMAKE_REQUIRED_DEFINITIONS -D_GNU_SOURCE)
364e415196aSJoakim Soderbergendif()
365e415196aSJoakim Soderberg
36613af9d26Syuangongji# Check if header files exist
36713af9d26Syuangongjilist(APPEND FILES_TO_CHECK
36813af9d26Syuangongji    fcntl.h
36913af9d26Syuangongji    inttypes.h
37013af9d26Syuangongji    memory.h
37113af9d26Syuangongji    signal.h
37213af9d26Syuangongji    stdarg.h
37313af9d26Syuangongji    stddef.h
37413af9d26Syuangongji    stdint.h
37513af9d26Syuangongji    stdlib.h
37613af9d26Syuangongji    string.h
37713af9d26Syuangongji    errno.h
37813af9d26Syuangongji    unistd.h
37913af9d26Syuangongji    time.h
38013af9d26Syuangongji    sys/types.h
38113af9d26Syuangongji    sys/stat.h
38213af9d26Syuangongji    sys/time.h
38313af9d26Syuangongji    sys/param.h
38413af9d26Syuangongji)
3857c4da937SAzat Khuzhinif (WIN32)
38613af9d26Syuangongji    list(APPEND FILES_TO_CHECK
38713af9d26Syuangongji        io.h
38813af9d26Syuangongji        winsock2.h
38913af9d26Syuangongji        ws2tcpip.h
39013af9d26Syuangongji        afunix.h
39113af9d26Syuangongji    )
39213af9d26Syuangongjielse()
39313af9d26Syuangongji    list(APPEND FILES_TO_CHECK
39413af9d26Syuangongji        netdb.h
39513af9d26Syuangongji        dlfcn.h
39613af9d26Syuangongji        arpa/inet.h
39713af9d26Syuangongji        poll.h
39813af9d26Syuangongji        port.h
39913af9d26Syuangongji        sys/socket.h
40013af9d26Syuangongji        sys/random.h
40113af9d26Syuangongji        sys/un.h
40213af9d26Syuangongji        sys/devpoll.h
40313af9d26Syuangongji        sys/epoll.h
40413af9d26Syuangongji        sys/eventfd.h
40513af9d26Syuangongji        sys/event.h
40613af9d26Syuangongji        sys/ioctl.h
40713af9d26Syuangongji        sys/mman.h
40813af9d26Syuangongji        sys/queue.h
40913af9d26Syuangongji        sys/select.h
41013af9d26Syuangongji        sys/sendfile.h
41113af9d26Syuangongji        sys/uio.h
41213af9d26Syuangongji        sys/wait.h
41313af9d26Syuangongji        sys/resource.h
41413af9d26Syuangongji        sys/timerfd.h
41513af9d26Syuangongji        netinet/in.h
41613af9d26Syuangongji        netinet/in6.h
41713af9d26Syuangongji        netinet/tcp.h
41813af9d26Syuangongji        ifaddrs.h
41913af9d26Syuangongji    )
420e415196aSJoakim Soderbergendif()
421e415196aSJoakim Soderberg
422d2871a37SAzat Khuzhinif (NOT "${CMAKE_HOST_SYSTEM_NAME}" STREQUAL "Linux")
42313af9d26Syuangongji    list(APPEND FILES_TO_CHECK sys/sysctl.h)
424d2871a37SAzat Khuzhinendif()
425e415196aSJoakim Soderberg
42613af9d26Syuangongjiif (APPLE)
42713af9d26Syuangongji    list(APPEND FILES_TO_CHECK
42813af9d26Syuangongji        mach/mach_time.h
42913af9d26Syuangongji        mach/mach.h
43013af9d26Syuangongji    )
431dea51c2eSyuangongjiendif()
43213af9d26Syuangongji
43313af9d26Syuangongjiforeach(FILE ${FILES_TO_CHECK})
43413af9d26Syuangongji    CHECK_INCLUDE_FILE_CONCAT(${FILE} "EVENT")
43513af9d26Syuangongjiendforeach()
43613af9d26Syuangongjiunset(FILES_TO_CHECK)
43713af9d26Syuangongji
43813af9d26Syuangongji# Check if functions exist
439dea51c2eSyuangongjilist(APPEND SYMBOLS_TO_CHECK
440dea51c2eSyuangongji    getaddrinfo
441dea51c2eSyuangongji    getnameinfo
442dea51c2eSyuangongji    getprotobynumber
44313af9d26Syuangongji    getservbyname
44413af9d26Syuangongji    gethostbyname
445dea51c2eSyuangongji    inet_ntop
446dea51c2eSyuangongji    inet_pton
44713af9d26Syuangongji    gettimeofday
44813af9d26Syuangongji    signal
449dea51c2eSyuangongji    strtoll
45013af9d26Syuangongji    splice
45113af9d26Syuangongji    strlcpy
45213af9d26Syuangongji    strsep
45313af9d26Syuangongji    strtok_r
45413af9d26Syuangongji    vasprintf
455dea51c2eSyuangongji    timerclear
456dea51c2eSyuangongji    timercmp
457dea51c2eSyuangongji    timerisset
45813af9d26Syuangongji    timeradd
45913af9d26Syuangongji    nanosleep
460dea51c2eSyuangongji    putenv
46113af9d26Syuangongji    umask
462dea51c2eSyuangongji)
46391559607SAzat Khuzhinif (NOT EVENT__DISABLE_CLOCK_GETTIME)
46413af9d26Syuangongji    list(APPEND SYMBOLS_TO_CHECK clock_gettime)
46591559607SAzat Khuzhinendif()
46613af9d26Syuangongji
46713af9d26Syuangongjiif (WIN32)
46813af9d26Syuangongji    list(APPEND SYMBOLS_TO_CHECK
46913af9d26Syuangongji        _gmtime64_s
47013af9d26Syuangongji        _gmtime64
47113af9d26Syuangongji    )
47213af9d26Syuangongjielse()
47313af9d26Syuangongji    list(APPEND SYMBOLS_TO_CHECK
47413af9d26Syuangongji        getifaddrs
47513af9d26Syuangongji        select
47613af9d26Syuangongji        epoll_create
47713af9d26Syuangongji        epoll_create1
47813af9d26Syuangongji        epoll_ctl
47913af9d26Syuangongji        eventfd
48013af9d26Syuangongji        poll
48113af9d26Syuangongji        port_create
48213af9d26Syuangongji        kqueue
48313af9d26Syuangongji        fcntl
48413af9d26Syuangongji        mmap
48513af9d26Syuangongji        pipe
48613af9d26Syuangongji        pipe2
48713af9d26Syuangongji        sendfile
48813af9d26Syuangongji        sigaction
48913af9d26Syuangongji        strsignal
49013af9d26Syuangongji        sysctl
49113af9d26Syuangongji        accept4
49213af9d26Syuangongji        arc4random
49313af9d26Syuangongji        arc4random_buf
49413af9d26Syuangongji        arc4random_addrandom
49513af9d26Syuangongji        getrandom
49613af9d26Syuangongji        getegid
49713af9d26Syuangongji        geteuid
49813af9d26Syuangongji        issetugid
49913af9d26Syuangongji        usleep
50013af9d26Syuangongji        timerfd_create
50113af9d26Syuangongji        setenv
50213af9d26Syuangongji        unsetenv
50313af9d26Syuangongji        setrlimit
50413af9d26Syuangongji        gethostbyname_r
50513af9d26Syuangongji    )
50613af9d26Syuangongji    if (APPLE)
50713af9d26Syuangongji        list(APPEND SYMBOLS_TO_CHECK mach_absolute_time)
50813af9d26Syuangongji    endif()
50913af9d26Syuangongjiendif()
51013af9d26Syuangongji
51113af9d26Syuangongji# Add stdio.h for vasprintf
51213af9d26Syuangongjiset(EVENT_INCLUDES ${EVENT_INCLUDES} stdio.h)
51313af9d26SyuangongjiCHECK_SYMBOLS_EXIST("${SYMBOLS_TO_CHECK}" "${EVENT_INCLUDES}" "EVENT")
51413af9d26Syuangongjiunset(SYMBOLS_TO_CHECK)
51513af9d26Syuangongjiset(EVENT__HAVE_EPOLL ${EVENT__HAVE_EPOLL_CREATE})
516e415196aSJoakim Soderberg
517e415196aSJoakim Soderberg# Get the gethostbyname_r prototype.
518e415196aSJoakim Soderbergif(EVENT__HAVE_GETHOSTBYNAME_R)
519e415196aSJoakim Soderberg    CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
520e415196aSJoakim Soderberg        "int gethostbyname_r(const char *name, struct hostent *hp, struct hostent_data *hdata)"
521e415196aSJoakim Soderberg        "0"
522e415196aSJoakim Soderberg        "netdb.h"
523e415196aSJoakim Soderberg        EVENT__HAVE_GETHOSTBYNAME_R_3_ARG)
524e415196aSJoakim Soderberg
525e415196aSJoakim Soderberg    CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
526e415196aSJoakim Soderberg        "struct hostent *gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, int *herr)"
527e415196aSJoakim Soderberg        "NULL"
528e415196aSJoakim Soderberg        "netdb.h"
529e415196aSJoakim Soderberg        EVENT__HAVE_GETHOSTBYNAME_R_5_ARG)
530e415196aSJoakim Soderberg
531e415196aSJoakim Soderberg    CHECK_PROTOTYPE_DEFINITION(gethostbyname_r
532e415196aSJoakim Soderberg        "int gethostbyname_r(const char *name, struct hostent *hp, char *buf, size_t buflen, struct hostent **result, int *herr)"
533e415196aSJoakim Soderberg        "0"
534e415196aSJoakim Soderberg        "netdb.h"
535e415196aSJoakim Soderberg        EVENT__HAVE_GETHOSTBYNAME_R_6_ARG)
536e415196aSJoakim Soderbergendif()
537e415196aSJoakim Soderberg
538e415196aSJoakim Soderbergif(HAVE_PORT_H AND HAVE_PORT_CREATE)
539e415196aSJoakim Soderberg    set(EVENT__HAVE_EVENT_PORTS 1)
540e415196aSJoakim Soderbergendif()
541e415196aSJoakim Soderberg
54213af9d26Syuangongji# Only `CHECK_TYPE_SIZE()' will use `CMAKE_EXTRA_INCLUDE_FILES'
54313af9d26Syuangongjiset(CMAKE_EXTRA_INCLUDE_FILES ${EVENT_INCLUDES})
544e415196aSJoakim Soderberg
54513af9d26SyuangongjiCHECK_TYPE_SIZE("struct sockaddr_un" EVENT__HAVE_STRUCT_SOCKADDR_UN)
546e415196aSJoakim SoderbergCHECK_TYPE_SIZE("uint8_t" EVENT__HAVE_UINT8_T)
547e415196aSJoakim SoderbergCHECK_TYPE_SIZE("uint16_t" EVENT__HAVE_UINT16_T)
548e415196aSJoakim SoderbergCHECK_TYPE_SIZE("uint32_t" EVENT__HAVE_UINT32_T)
549e415196aSJoakim SoderbergCHECK_TYPE_SIZE("uint64_t" EVENT__HAVE_UINT64_T)
550e415196aSJoakim SoderbergCHECK_TYPE_SIZE("short" EVENT__SIZEOF_SHORT BUILTIN_TYPES_ONLY)
551e415196aSJoakim SoderbergCHECK_TYPE_SIZE("int" EVENT__SIZEOF_INT BUILTIN_TYPES_ONLY)
552e415196aSJoakim SoderbergCHECK_TYPE_SIZE("unsigned" EVENT__SIZEOF_UNSIGNED BUILTIN_TYPES_ONLY)
553e415196aSJoakim SoderbergCHECK_TYPE_SIZE("unsigned int" EVENT__SIZEOF_UNSIGNED_INT BUILTIN_TYPES_ONLY)
554e415196aSJoakim SoderbergCHECK_TYPE_SIZE("long" EVENT__SIZEOF_LONG BUILTIN_TYPES_ONLY)
555e415196aSJoakim SoderbergCHECK_TYPE_SIZE("long long" EVENT__SIZEOF_LONG_LONG BUILTIN_TYPES_ONLY)
556e415196aSJoakim Soderberg
557e415196aSJoakim Soderbergif(WIN32)
558e415196aSJoakim Soderberg    # These aren't available until Windows Vista.
559e415196aSJoakim Soderberg    # But you can still link them. They just won't be found when running the exe.
560e415196aSJoakim Soderberg    set(EVENT__HAVE_INET_NTOP 0)
561e415196aSJoakim Soderberg    set(EVENT__HAVE_INET_PTON 0)
562e415196aSJoakim Soderbergendif()
563e415196aSJoakim Soderberg
564e415196aSJoakim Soderberg# Check for different inline keyword versions.
5658b228e27SMark Ellzeycheck_function_keywords("inline" "__inline" "__inline__")
566e415196aSJoakim Soderberg
5678b228e27SMark Ellzeyif (HAVE_INLINE)
5688b228e27SMark Ellzey    set(EVENT__inline inline)
5698b228e27SMark Ellzeyelseif (HAVE___INLINE)
570e415196aSJoakim Soderberg    set(EVENT__inline __inline)
5718b228e27SMark Ellzeyelseif(HAVE___INLINE__)
5728b228e27SMark Ellzey    set(EVENT__inline __inline__)
573e415196aSJoakim Soderbergelse()
5748b228e27SMark Ellzey    set(EVENT__inline)
575e415196aSJoakim Soderbergendif()
576b3af7bddSAzat Khuzhin
577b3af7bddSAzat Khuzhin# __func__/__FUNCTION__ is not a macros in general
578b3af7bddSAzat KhuzhinCHECK_SYMBOL_EXISTS("__func__"     "" EVENT__HAVE___func__)
579b3af7bddSAzat KhuzhinCHECK_SYMBOL_EXISTS("__FUNCTION__" "" EVENT__HAVE___FUNCTION__)
580e415196aSJoakim Soderberg
581e415196aSJoakim SoderbergCHECK_SYMBOL_EXISTS(TAILQ_FOREACH sys/queue.h EVENT__HAVE_TAILQFOREACH)
582a0bfe2c4SAzat KhuzhinCHECK_CONST_EXISTS(CTL_KERN sys/sysctl.h EVENT__HAVE_DECL_CTL_KERN)
583a0bfe2c4SAzat KhuzhinCHECK_CONST_EXISTS(KERN_ARND sys/sysctl.h EVENT__HAVE_DECL_KERN_ARND)
584e415196aSJoakim SoderbergCHECK_SYMBOL_EXISTS(F_SETFD fcntl.h EVENT__HAVE_SETFD)
585e415196aSJoakim Soderberg
586e415196aSJoakim SoderbergCHECK_TYPE_SIZE(fd_mask EVENT__HAVE_FD_MASK)
5878b228e27SMark Ellzey
5883375750aSAzat KhuzhinCHECK_TYPE_SIZE(size_t EVENT__SIZEOF_SIZE_T)
589e415196aSJoakim Soderbergif(NOT EVENT__SIZEOF_SIZE_T)
59049a53811SMark Ellzey  set(EVENT__size_t "unsigned")
591e415196aSJoakim Soderberg  set(EVENT__SIZEOF_SIZE_T ${EVENT__SIZEOF_UNSIGNED})
5928b228e27SMark Ellzeyelse()
59349a53811SMark Ellzey    set(EVENT__size_t size_t)
594e415196aSJoakim Soderbergendif()
595e415196aSJoakim Soderberg
5967f9646d2SMark EllzeyCHECK_TYPE_SIZE("off_t" EVENT__SIZEOF_OFF_T LANGUAGE C)
597e415196aSJoakim Soderberg
5987f9646d2SMark Ellzey
5997f9646d2SMark Ellzey# XXX we should functionalize these size and type sets. --elley
6007f9646d2SMark Ellzey
6017f9646d2SMark Ellzey# Winssck.
6027707f6b0SAzat Khuzhinif (_MSC_VER)
6037707f6b0SAzat Khuzhin    list(APPEND CMAKE_EXTRA_INCLUDE_FILES BaseTsd.h)
6047707f6b0SAzat Khuzhinendif()
6057707f6b0SAzat KhuzhinCHECK_TYPE_SIZE("ssize_t" EVENT__SIZEOF_SSIZE_T_LOWER LANGUAGE C)
6067707f6b0SAzat KhuzhinCHECK_TYPE_SIZE("SSIZE_T" EVENT__SIZEOF_SSIZE_T_UPPER LANGUAGE C)
6077f9646d2SMark Ellzey
6087707f6b0SAzat Khuzhinif (EVENT__SIZEOF_SSIZE_T_LOWER)
6097f9646d2SMark Ellzey    set(EVENT__ssize_t "ssize_t")
610dc624adfSZonr Chang    set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_LOWER})
6117707f6b0SAzat Khuzhinelseif (EVENT__SIZEOF_SSIZE_T_UPPER)
6127f9646d2SMark Ellzey    set(EVENT__ssize_t "SSIZE_T")
613dc624adfSZonr Chang    set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_SSIZE_T_UPPER})
61449a53811SMark Ellzeyelse()
61549a53811SMark Ellzey    set(EVENT__ssize_t "int")
616e415196aSJoakim Soderberg    set(EVENT__SIZEOF_SSIZE_T ${EVENT__SIZEOF_INT})
617e415196aSJoakim Soderbergendif()
618e415196aSJoakim Soderberg
619e415196aSJoakim SoderbergCHECK_TYPE_SIZE(socklen_t EVENT__SIZEOF_SOCKLEN_T)
620e415196aSJoakim Soderbergif(NOT EVENT__SIZEOF_SOCKLEN_T)
621e415196aSJoakim Soderberg  set(EVENT__socklen_t "unsigned int")
622e415196aSJoakim Soderberg  set(EVENT__SIZEOF_SOCKLEN_T ${EVENT__SIZEOF_UNSIGNED_INT})
6238b228e27SMark Ellzeyelse()
6248b228e27SMark Ellzey    set(EVENT__socklen_t "socklen_t")
625e415196aSJoakim Soderbergendif()
626e415196aSJoakim Soderberg
627e415196aSJoakim SoderbergCHECK_TYPE_SIZE(pid_t EVENT__SIZEOF_PID_T)
628e415196aSJoakim Soderbergif(NOT EVENT__SIZEOF_PID_T)
629e415196aSJoakim Soderberg  set(EVENT__SIZEOF_PID_T ${EVENT__SIZEOF_INT})
63049a53811SMark Ellzeyelse()
63149a53811SMark Ellzey	set(EVENT__SIZEOF_PID_T EVENT__SIZEOF_PID_T)
632e415196aSJoakim Soderbergendif()
633e415196aSJoakim Soderberg
6348b228e27SMark Ellzeyif (NOT EVENT__DISABLE_THREAD_SUPPORT)
635ebd12e6dSAzat Khuzhin    if (NOT WIN32)
636a0bfe2c4SAzat Khuzhin        list(APPEND CMAKE_EXTRA_INCLUDE_FILES pthread.h)
637ebd12e6dSAzat Khuzhin    endif()
638e415196aSJoakim Soderberg    CHECK_TYPE_SIZE(pthread_t EVENT__SIZEOF_PTHREAD_T)
6398b228e27SMark Ellzeyendif()
640e415196aSJoakim Soderberg
641e415196aSJoakim Soderbergif(EVENT__HAVE_CLOCK_GETTIME)
642e415196aSJoakim Soderberg  set(EVENT__DNS_USE_CPU_CLOCK_FOR_ID 1)
643e415196aSJoakim Soderbergendif()
644e415196aSJoakim Soderberg
6457f9646d2SMark Ellzey# we're just getting lazy now.
646e415196aSJoakim SoderbergCHECK_TYPE_SIZE("uintptr_t" EVENT__HAVE_UINTPTR_T)
647e415196aSJoakim SoderbergCHECK_TYPE_SIZE("void *" EVENT__SIZEOF_VOID_P)
6488983e511SCarlo Marcelo Arenas BelónCHECK_TYPE_SIZE("time_t" EVENT__SIZEOF_TIME_T)
649e415196aSJoakim Soderberg
650e415196aSJoakim Soderberg# Tests file offset bits.
651e415196aSJoakim Soderberg# TODO: Add AIX test for if -D_LARGE_FILES is needed.
6528b228e27SMark Ellzey
6538b228e27SMark Ellzey# XXX: Why is this here? we don't even use it. Well, we don't even use it
6548b228e27SMark Ellzey#      on top of that, why is it set in the config.h?! IT_MAKES_NO_SENSE
6558b228e27SMark Ellzey#      I'm commenting it out for now.
6568b228e27SMark Ellzey#      - ellzey
6578b228e27SMark Ellzey
6588b228e27SMark Ellzey#CHECK_FILE_OFFSET_BITS()
659e415196aSJoakim Soderberg
6602799b359SJoakim Söderberg# Verify kqueue works with pipes.
661a831f2f7SJoakim Söderbergif (EVENT__HAVE_KQUEUE)
6623aa68a82SKeith Smiley    if ((CMAKE_CROSSCOMPILING OR APPLE) AND NOT EVENT__FORCE_KQUEUE_CHECK)
6632799b359SJoakim Söderberg        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)")
664a831f2f7SJoakim Söderberg        set(EVENT__HAVE_WORKING_KQUEUE 1)
6652799b359SJoakim Söderberg    else()
6668b228e27SMark Ellzey        message(STATUS "Checking if kqueue works with pipes...")
6672799b359SJoakim Söderberg        include(CheckWorkingKqueue)
6682799b359SJoakim Söderberg    endif()
669a831f2f7SJoakim Söderbergendif()
670e415196aSJoakim Soderberg
671e415196aSJoakim Soderbergif(EVENT__HAVE_NETDB_H)
672e415196aSJoakim Soderberg    list(APPEND CMAKE_EXTRA_INCLUDE_FILES netdb.h)
673e415196aSJoakim Soderberg    CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
674e415196aSJoakim Soderbergelseif(WIN32)
675e415196aSJoakim Soderberg    list(APPEND CMAKE_EXTRA_INCLUDE_FILES ws2tcpip.h)
676e415196aSJoakim Soderberg    CHECK_TYPE_SIZE("struct addrinfo" EVENT__HAVE_STRUCT_ADDRINFO)
677e415196aSJoakim Soderbergendif()
678e415196aSJoakim Soderberg
679e415196aSJoakim Soderberg# Check for sockaddr structure sizes.
680e415196aSJoakim Soderbergset(SOCKADDR_HEADERS)
681e415196aSJoakim Soderbergif (WIN32)
682e415196aSJoakim Soderberg    set(CMAKE_REQUIRED_DEFINITIONS "-DWIN32_LEAN_AND_MEAN")
683e415196aSJoakim Soderberg    if (_MSC_VER LESS 1300)
684e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS winsock.h)
685e415196aSJoakim Soderberg    else()
686e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS winsock2.h ws2tcpip.h)
687e415196aSJoakim Soderberg    endif()
688e415196aSJoakim Soderbergelse()
689e415196aSJoakim Soderberg    if (EVENT__HAVE_NETINET_IN_H)
690e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in.h)
691e415196aSJoakim Soderberg    endif()
692e415196aSJoakim Soderberg
693e415196aSJoakim Soderberg    if (EVENT__HAVE_NETINET_IN6_H)
694e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netinet/in6.h)
695e415196aSJoakim Soderberg    endif()
696e415196aSJoakim Soderberg
697e415196aSJoakim Soderberg    if (EVENT__HAVE_SYS_SOCKET_H)
698e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} sys/socket.h)
699e415196aSJoakim Soderberg    endif()
700e415196aSJoakim Soderberg
701e415196aSJoakim Soderberg    if (EVENT__HAVE_NETDB_H)
702e415196aSJoakim Soderberg        set(SOCKADDR_HEADERS ${SOCKADDR_HEADERS} netdb.h)
703e415196aSJoakim Soderberg    endif()
704e415196aSJoakim Soderbergendif()
705e415196aSJoakim Soderberg
706e415196aSJoakim SoderbergCHECK_TYPE_SIZE("struct in6_addr" EVENT__HAVE_STRUCT_IN6_ADDR)
707e415196aSJoakim Soderbergif(EVENT__HAVE_STRUCT_IN6_ADDR)
708a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
709a9db46aeSMark Ellzey            s6_addr16 "${SOCKADDR_HEADERS}"
710a9db46aeSMark Ellzey            EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR16)
711a9db46aeSMark Ellzey
712a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct in6_addr"
713a9db46aeSMark Ellzey            s6_addr32 "${SOCKADDR_HEADERS}"
714a9db46aeSMark Ellzey            EVENT__HAVE_STRUCT_IN6_ADDR_S6_ADDR32)
715e415196aSJoakim Soderbergendif()
716e415196aSJoakim Soderberg
717e415196aSJoakim SoderbergCHECK_TYPE_SIZE("sa_family_t" EVENT__HAVE_SA_FAMILY_T)
718e415196aSJoakim SoderbergCHECK_TYPE_SIZE("struct sockaddr_in6" EVENT__HAVE_STRUCT_SOCKADDR_IN6)
719a9db46aeSMark Ellzey
720e415196aSJoakim Soderbergif(EVENT__HAVE_STRUCT_SOCKADDR_IN6)
721a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
722a9db46aeSMark Ellzey            sin6_len "${SOCKADDR_HEADERS}"
723a9db46aeSMark Ellzey            EVENT__HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN)
724a9db46aeSMark Ellzey
725a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct sockaddr_in6"
726a9db46aeSMark Ellzey            sin_len "${SOCKADDR_HEADERS}"
727a9db46aeSMark Ellzey            EVENT__HAVE_STRUCT_SOCKADDR_IN_SIN_LEN)
728e415196aSJoakim Soderbergendif()
729e415196aSJoakim Soderberg
730e415196aSJoakim SoderbergCHECK_TYPE_SIZE("struct sockaddr_storage" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
731e415196aSJoakim Soderbergif(EVENT__HAVE_STRUCT_SOCKADDR_STORAGE)
732a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
733a9db46aeSMark Ellzey            ss_family "${SOCKADDR_HEADERS}"
734a9db46aeSMark Ellzey            EVENT__HAVE_STRUCT_SOCKADDR_STORAGE_SS_FAMILY)
735a9db46aeSMark Ellzey
736a9db46aeSMark Ellzey    CHECK_STRUCT_HAS_MEMBER("struct sockaddr_storage"
737a9db46aeSMark Ellzey            __ss_family "${SOCKADDR_HEADERS}" EVENT__HAVE_STRUCT_SOCKADDR_STORAGE___SS_FAMILY)
738e415196aSJoakim Soderbergendif()
739e415196aSJoakim Soderberg
7408567f2f5SAzat KhuzhinCHECK_TYPE_SIZE("struct linger" EVENT__HAVE_STRUCT_LINGER)
7418567f2f5SAzat Khuzhin
742e415196aSJoakim Soderberg# Group the source files.
743e415196aSJoakim Soderbergset(HDR_PRIVATE
744e415196aSJoakim Soderberg    bufferevent-internal.h
745e415196aSJoakim Soderberg    changelist-internal.h
746e415196aSJoakim Soderberg    defer-internal.h
74743ffcf69SNick Mathewson    epolltable-internal.h
748e415196aSJoakim Soderberg    evbuffer-internal.h
749e415196aSJoakim Soderberg    event-internal.h
750e415196aSJoakim Soderberg    evmap-internal.h
751e415196aSJoakim Soderberg    evrpc-internal.h
752e415196aSJoakim Soderberg    evsignal-internal.h
753e415196aSJoakim Soderberg    evthread-internal.h
754e415196aSJoakim Soderberg    ht-internal.h
755e415196aSJoakim Soderberg    http-internal.h
756e415196aSJoakim Soderberg    iocp-internal.h
757e415196aSJoakim Soderberg    ipv6-internal.h
758e415196aSJoakim Soderberg    log-internal.h
759e415196aSJoakim Soderberg    minheap-internal.h
760e415196aSJoakim Soderberg    mm-internal.h
761e415196aSJoakim Soderberg    ratelim-internal.h
762e415196aSJoakim Soderberg    strlcpy-internal.h
763e415196aSJoakim Soderberg    util-internal.h
764e415196aSJoakim Soderberg    evconfig-private.h
765a9db46aeSMark Ellzey    compat/sys/queue.h)
766e415196aSJoakim Soderberg
76727bd9fafSSergey Nikulovset(HDR_COMPAT
76827bd9fafSSergey Nikulov    include/evdns.h
76927bd9fafSSergey Nikulov    include/evrpc.h
77027bd9fafSSergey Nikulov    include/event.h
77127bd9fafSSergey Nikulov    include/evhttp.h
772a9db46aeSMark Ellzey    include/evutil.h)
77327bd9fafSSergey Nikulov
774e415196aSJoakim Soderbergset(HDR_PUBLIC
775e415196aSJoakim Soderberg    include/event2/buffer.h
776e415196aSJoakim Soderberg    include/event2/bufferevent.h
777e415196aSJoakim Soderberg    include/event2/bufferevent_compat.h
778e415196aSJoakim Soderberg    include/event2/bufferevent_struct.h
779e415196aSJoakim Soderberg    include/event2/buffer_compat.h
780e415196aSJoakim Soderberg    include/event2/dns.h
781e415196aSJoakim Soderberg    include/event2/dns_compat.h
782e415196aSJoakim Soderberg    include/event2/dns_struct.h
783e415196aSJoakim Soderberg    include/event2/event.h
784e415196aSJoakim Soderberg    include/event2/event_compat.h
785e415196aSJoakim Soderberg    include/event2/event_struct.h
786e415196aSJoakim Soderberg    include/event2/http.h
787e415196aSJoakim Soderberg    include/event2/http_compat.h
788e415196aSJoakim Soderberg    include/event2/http_struct.h
78915d90cceSTrond Norbye    include/event2/keyvalq_struct.h
790e415196aSJoakim Soderberg    include/event2/listener.h
791e415196aSJoakim Soderberg    include/event2/rpc.h
792e415196aSJoakim Soderberg    include/event2/rpc_compat.h
793e415196aSJoakim Soderberg    include/event2/rpc_struct.h
794e415196aSJoakim Soderberg    include/event2/tag.h
795e415196aSJoakim Soderberg    include/event2/tag_compat.h
796e415196aSJoakim Soderberg    include/event2/thread.h
797e415196aSJoakim Soderberg    include/event2/util.h
79873474042STrond Norbye    include/event2/visibility.h
799a9db46aeSMark Ellzey    ${PROJECT_BINARY_DIR}/include/event2/event-config.h)
800e415196aSJoakim Soderberg
801e415196aSJoakim Soderbergset(SRC_CORE
802e415196aSJoakim Soderberg    buffer.c
803e415196aSJoakim Soderberg    bufferevent.c
804e415196aSJoakim Soderberg    bufferevent_filter.c
805e415196aSJoakim Soderberg    bufferevent_pair.c
806e415196aSJoakim Soderberg    bufferevent_ratelim.c
807e415196aSJoakim Soderberg    bufferevent_sock.c
808e415196aSJoakim Soderberg    event.c
809e415196aSJoakim Soderberg    evmap.c
810e415196aSJoakim Soderberg    evthread.c
811e415196aSJoakim Soderberg    evutil.c
812e415196aSJoakim Soderberg    evutil_rand.c
813e415196aSJoakim Soderberg    evutil_time.c
814e415196aSJoakim Soderberg    listener.c
815e415196aSJoakim Soderberg    log.c
816e415196aSJoakim Soderberg    signal.c
817a9db46aeSMark Ellzey    strlcpy.c)
818e415196aSJoakim Soderberg
819e415196aSJoakim Soderbergif(EVENT__HAVE_SELECT)
820e415196aSJoakim Soderberg    list(APPEND SRC_CORE select.c)
821e415196aSJoakim Soderbergendif()
822e415196aSJoakim Soderberg
823e415196aSJoakim Soderbergif(EVENT__HAVE_POLL)
824e415196aSJoakim Soderberg    list(APPEND SRC_CORE poll.c)
825e415196aSJoakim Soderbergendif()
826e415196aSJoakim Soderberg
827e415196aSJoakim Soderbergif(EVENT__HAVE_KQUEUE)
828e415196aSJoakim Soderberg    list(APPEND SRC_CORE kqueue.c)
829e415196aSJoakim Soderbergendif()
830e415196aSJoakim Soderberg
831e415196aSJoakim Soderbergif(EVENT__HAVE_DEVPOLL)
832e415196aSJoakim Soderberg    list(APPEND SRC_CORE devpoll.c)
833e415196aSJoakim Soderbergendif()
834e415196aSJoakim Soderberg
835e415196aSJoakim Soderbergif(EVENT__HAVE_EPOLL)
836cea61de6SAzat Khuzhin    list(APPEND SRC_CORE epoll.c)
837e415196aSJoakim Soderbergendif()
838e415196aSJoakim Soderberg
839e415196aSJoakim Soderbergif(EVENT__HAVE_EVENT_PORTS)
840e415196aSJoakim Soderberg    list(APPEND SRC_CORE evport.c)
841e415196aSJoakim Soderbergendif()
842e415196aSJoakim Soderberg
843e415196aSJoakim Soderbergif (NOT EVENT__DISABLE_OPENSSL)
844e415196aSJoakim Soderberg    find_package(OpenSSL REQUIRED)
845a9db46aeSMark Ellzey
846e9fc014cSJoakim Soderberg    set(EVENT__HAVE_OPENSSL 1)
847a9db46aeSMark Ellzey
8488b228e27SMark Ellzey    message(STATUS "OpenSSL include: ${OPENSSL_INCLUDE_DIR}")
8498b228e27SMark Ellzey    message(STATUS "OpenSSL lib: ${OPENSSL_LIBRARIES}")
850a9db46aeSMark Ellzey
851e9fc014cSJoakim Soderberg    include_directories(${OPENSSL_INCLUDE_DIR})
852a9db46aeSMark Ellzey
8539806b126SAzat Khuzhin    list(APPEND SRC_OPENSSL bufferevent_openssl.c)
854e9fc014cSJoakim Soderberg    list(APPEND HDR_PUBLIC include/event2/bufferevent_ssl.h)
85519222e52SJoakim Soderberg    list(APPEND LIB_APPS ${OPENSSL_LIBRARIES})
856e415196aSJoakim Soderbergendif()
857e415196aSJoakim Soderberg
858e9fc014cSJoakim Soderbergif (NOT EVENT__DISABLE_THREAD_SUPPORT)
859e9fc014cSJoakim Soderberg    if (WIN32)
860e9fc014cSJoakim Soderberg        list(APPEND SRC_CORE evthread_win32.c)
861e9fc014cSJoakim Soderberg    else()
862e9fc014cSJoakim Soderberg        find_package(Threads REQUIRED)
863e9fc014cSJoakim Soderberg        if (NOT CMAKE_USE_PTHREADS_INIT)
864a9db46aeSMark Ellzey            message(FATAL_ERROR
865a9db46aeSMark Ellzey                    "Failed to find Pthreads, set EVENT__DISABLE_THREAD_SUPPORT to disable")
866e9fc014cSJoakim Soderberg        endif()
867a9db46aeSMark Ellzey
868e415196aSJoakim Soderberg        set(EVENT__HAVE_PTHREADS 1)
86919222e52SJoakim Soderberg        list(APPEND LIB_APPS ${CMAKE_THREAD_LIBS_INIT})
870e415196aSJoakim Soderberg    endif()
871e9fc014cSJoakim Soderbergendif()
872e415196aSJoakim Soderberg
873f7805939SJoakim Soderbergif (NOT EVENT__DISABLE_TESTS)
874f7805939SJoakim Soderberg    # Zlib is only used for testing.
875f7805939SJoakim Soderberg    find_package(ZLIB)
876f7805939SJoakim Soderberg
877c4dfb93fSAzat Khuzhin    if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
878a9db46aeSMark Ellzey        include_directories(${ZLIB_INCLUDE_DIRS})
879a9db46aeSMark Ellzey
880dc624adfSZonr Chang        set(EVENT__HAVE_LIBZ 1)
88119222e52SJoakim Soderberg        list(APPEND LIB_APPS ${ZLIB_LIBRARIES})
882e415196aSJoakim Soderberg    endif()
883f7805939SJoakim Soderbergendif()
884e415196aSJoakim Soderberg
885e415196aSJoakim Soderbergset(SRC_EXTRA
886e415196aSJoakim Soderberg    event_tagging.c
887e415196aSJoakim Soderberg    http.c
888e415196aSJoakim Soderberg    evdns.c
889a9db46aeSMark Ellzey    evrpc.c)
890e415196aSJoakim Soderberg
891e415196aSJoakim Soderbergadd_definitions(-DHAVE_CONFIG_H)
89220244671SJoakim Söderberg
89320244671SJoakim Söderberg# We use BEFORE here so we don't accidentally look in system directories
89420244671SJoakim Söderberg# first for some previous versions of the headers that are installed.
89520244671SJoakim Söderberginclude_directories(BEFORE ${PROJECT_SOURCE_DIR}
89620244671SJoakim Söderberg    ${PROJECT_SOURCE_DIR}/compat
89720244671SJoakim Söderberg    ${PROJECT_SOURCE_DIR}/include)
898e415196aSJoakim Soderberg
899e415196aSJoakim Soderbergif(WIN32)
900e415196aSJoakim Soderberg    list(APPEND SRC_CORE
901e415196aSJoakim Soderberg        buffer_iocp.c
902e415196aSJoakim Soderberg        bufferevent_async.c
903e415196aSJoakim Soderberg        event_iocp.c
904a9db46aeSMark Ellzey        win32select.c)
905e9fc014cSJoakim Soderberg
906e9fc014cSJoakim Soderberg    list(APPEND HDR_PRIVATE WIN32-Code/getopt.h)
907e9fc014cSJoakim Soderberg
908e415196aSJoakim Soderberg    set(EVENT__DNS_USE_FTIME_FOR_ID 1)
909c9ce638cSAzat Khuzhin    set(LIB_PLATFORM ws2_32 shell32 advapi32)
910a9db46aeSMark Ellzey    add_definitions(
911a9db46aeSMark Ellzey            -D_CRT_SECURE_NO_WARNINGS
912a9db46aeSMark Ellzey            -D_CRT_NONSTDC_NO_DEPRECATE)
913a9db46aeSMark Ellzey
914e415196aSJoakim Soderberg    include_directories(./WIN32-Code)
91558fcd428SJoakim Soderbergendif()
91658fcd428SJoakim Soderberg
917050bfc7fSAzat Khuzhinif (SOLARIS)
918050bfc7fSAzat Khuzhin    list(APPEND LIB_PLATFORM socket nsl)
919050bfc7fSAzat Khuzhinendif()
920050bfc7fSAzat Khuzhin
921e415196aSJoakim Soderbergsource_group("Headers Private"  FILES ${HDR_PRIVATE})
92227bd9fafSSergey Nikulovsource_group("Header Compat"    FILES ${HDR_COMPAT})
923e415196aSJoakim Soderbergsource_group("Headers Public"   FILES ${HDR_PUBLIC})
924e415196aSJoakim Soderbergsource_group("Source Core"      FILES ${SRC_CORE})
925e415196aSJoakim Soderbergsource_group("Source Extra"     FILES ${SRC_EXTRA})
926e415196aSJoakim Soderberg
927ce14defeSJoakim Soderberg# Generate the configure headers.
928ce14defeSJoakim Soderberg# (Place them in the build dir so we don't polute the source tree with generated files).
92920244671SJoakim Söderberginclude_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include)
930ce14defeSJoakim Soderberg
931acf4821dSAzat Khuzhinif (${GNUC})
9329806b126SAzat Khuzhin    set(EVENT_SHARED_FLAGS -fvisibility=hidden)
9334545fa9bSTrond Norbyeelseif ("${CMAKE_C_COMPILER_ID}" STREQUAL "SunPro")
9349806b126SAzat Khuzhin    set(EVENT_SHARED_FLAGS -xldscope=hidden)
9354545fa9bSTrond Norbyeendif()
9364545fa9bSTrond Norbye
937e415196aSJoakim Soderbergconfigure_file(
938e415196aSJoakim Soderberg    ${CMAKE_CURRENT_SOURCE_DIR}/event-config.h.cmake
9398b228e27SMark Ellzey    ${CMAKE_CURRENT_BINARY_DIR}/include/event2/event-config.h
9408b228e27SMark Ellzey        NEWLINE_STYLE UNIX)
941ce14defeSJoakim Soderberg
942ce14defeSJoakim Soderbergconfigure_file(
943ce14defeSJoakim Soderberg    ${CMAKE_CURRENT_SOURCE_DIR}/evconfig-private.h.cmake
944ce14defeSJoakim Soderberg    ${CMAKE_CURRENT_BINARY_DIR}/include/evconfig-private.h)
945e415196aSJoakim Soderberg
946f3446ed5SJoakim Soderberg#
947f3446ed5SJoakim Soderberg# Create the libraries.
948f3446ed5SJoakim Soderberg#
9499806b126SAzat Khuzhininclude(AddEventLibrary)
9509806b126SAzat Khuzhinadd_event_library(event_core SOURCES ${SRC_CORE})
9519806b126SAzat Khuzhinadd_event_library(event_extra
9521c047618Syuangongji    INNER_LIBRARIES event_core
9539806b126SAzat Khuzhin    SOURCES ${SRC_EXTRA})
954f3446ed5SJoakim Soderberg
9559806b126SAzat Khuzhinif (NOT EVENT__DISABLE_OPENSSL)
9569806b126SAzat Khuzhin    add_event_library(event_openssl
9571c047618Syuangongji        INNER_LIBRARIES event_core
9581c047618Syuangongji        OUTER_INCLUDES ${OPENSSL_INCLUDE_DIR}
9591c047618Syuangongji        LIBRARIES ${OPENSSL_LIBRARIES}
9609806b126SAzat Khuzhin        SOURCES ${SRC_OPENSSL})
9619806b126SAzat Khuzhinendif()
962e415196aSJoakim Soderberg
963a62ec765SPaul Osborneif (EVENT__HAVE_PTHREADS)
9649806b126SAzat Khuzhin    set(SRC_PTHREADS evthread_pthread.c)
9659806b126SAzat Khuzhin    add_event_library(event_pthreads
9661c047618Syuangongji        INNER_LIBRARIES event_core
9679806b126SAzat Khuzhin        SOURCES ${SRC_PTHREADS})
9689806b126SAzat Khuzhinendif()
969e415196aSJoakim Soderberg
970a0dd5df2STrond Norbye# library exists for historical reasons; it contains the contents of
971a0dd5df2STrond Norbye# both libevent_core and libevent_extra. You shouldn’t use it; it may
972a0dd5df2STrond Norbye# go away in a future version of Libevent.
9739806b126SAzat Khuzhinadd_event_library(event SOURCES ${SRC_CORE} ${SRC_EXTRA})
9744545fa9bSTrond Norbye
975d2a41a50SAzat Khuzhinset(WIN32_GETOPT)
976d2a41a50SAzat Khuzhinif (WIN32)
977f602211fSPhilip Homburg    set(_TMPLIBS)
978f602211fSPhilip Homburg    if (${EVENT_LIBRARY_STATIC})
979f602211fSPhilip Homburg        list(APPEND _TMPLIBS event_core_static event_static)
980f602211fSPhilip Homburg    endif()
981f602211fSPhilip Homburg    if (${EVENT_LIBRARY_SHARED})
982f602211fSPhilip Homburg        list(APPEND _TMPLIBS event_core_shared event_shared)
983f602211fSPhilip Homburg    endif()
984f602211fSPhilip Homburg    foreach(lib ${_TMPLIBS})
985f602211fSPhilip Homburg        target_link_libraries(${lib} iphlpapi)
986f602211fSPhilip Homburg    endforeach()
987f602211fSPhilip Homburg    unset(_TMPLIBS)
988f602211fSPhilip Homburg
989d2a41a50SAzat Khuzhin    list(APPEND WIN32_GETOPT
990d2a41a50SAzat Khuzhin         WIN32-Code/getopt.c
991d2a41a50SAzat Khuzhin         WIN32-Code/getopt_long.c)
992d2a41a50SAzat Khuzhinendif()
993d2a41a50SAzat Khuzhin
994f3446ed5SJoakim Soderberg#
995f3446ed5SJoakim Soderberg# Samples.
996f3446ed5SJoakim Soderberg#
9979806b126SAzat Khuzhinmacro(add_sample_prog ssl name)
9989806b126SAzat Khuzhin    add_executable(${name} ${ARGN})
999f3446ed5SJoakim Soderberg
10009806b126SAzat Khuzhin    target_link_libraries(${name}
1001eb10a738SAzat Khuzhin                          event_extra
1002eb10a738SAzat Khuzhin                          event_core
10039806b126SAzat Khuzhin                          ${LIB_APPS}
10049806b126SAzat Khuzhin                          ${LIB_PLATFORM})
10059806b126SAzat Khuzhin
10069806b126SAzat Khuzhin    if (${ssl})
1007eb10a738SAzat Khuzhin        target_link_libraries(${name} event_openssl)
1008e9478640Syuangongji        if(WIN32)
1009e9478640Syuangongji            target_link_libraries(${name} crypt32)
1010e9478640Syuangongji        endif()
10119806b126SAzat Khuzhin    endif()
10129806b126SAzat Khuzhinendmacro()
1013e9fc014cSJoakim Soderbergif (NOT EVENT__DISABLE_SAMPLES)
101419222e52SJoakim Soderberg    set(SAMPLES
101519222e52SJoakim Soderberg        event-read-fifo
101619222e52SJoakim Soderberg        hello-world
101719222e52SJoakim Soderberg        signal-test
10181d34498eSAzat Khuzhin        http-connect
101919222e52SJoakim Soderberg        time-test)
102019222e52SJoakim Soderberg
10219806b126SAzat Khuzhin    foreach(SAMPLE ${SAMPLES})
10229806b126SAzat Khuzhin        add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c)
10239806b126SAzat Khuzhin    endforeach()
10249806b126SAzat Khuzhin
10259806b126SAzat Khuzhin    if (NOT EVENT__DISABLE_OPENSSL)
10269806b126SAzat Khuzhin        add_sample_prog(ON https-client
102719222e52SJoakim Soderberg                        sample/https-client.c
102819222e52SJoakim Soderberg                        sample/openssl_hostname_validation.c
102919222e52SJoakim Soderberg                        sample/hostcheck.c)
10309806b126SAzat Khuzhin        add_sample_prog(ON le-proxy
10319806b126SAzat Khuzhin                        sample/le-proxy.c)
103219222e52SJoakim Soderberg    endif()
103319222e52SJoakim Soderberg
1034b6309bccSAzat Khuzhin    set(SAMPLES_WOPT
1035b6309bccSAzat Khuzhin        dns-example
1036b6309bccSAzat Khuzhin        http-server
1037b6309bccSAzat Khuzhin    )
1038b6309bccSAzat Khuzhin    foreach (SAMPLE ${SAMPLES_WOPT})
1039b6309bccSAzat Khuzhin        add_sample_prog(OFF ${SAMPLE} sample/${SAMPLE}.c ${WIN32_GETOPT})
1040b6309bccSAzat Khuzhin    endforeach()
1041e9fc014cSJoakim Soderbergendif()
1042e415196aSJoakim Soderberg
10439806b126SAzat Khuzhin#
10449806b126SAzat Khuzhin# Benchmarks
10459806b126SAzat Khuzhin#
10469806b126SAzat Khuzhinmacro(add_bench_prog prog)
10473e690290SAzat Khuzhin    add_executable(${prog} ${ARGN})
10483e690290SAzat Khuzhin    target_link_libraries(${prog}
1049eb10a738SAzat Khuzhin                          event_extra
1050eb10a738SAzat Khuzhin                          event_core
10519806b126SAzat Khuzhin                          ${LIB_APPS}
1052a9db46aeSMark Ellzey                          ${LIB_PLATFORM})
10539806b126SAzat Khuzhinendmacro()
10549806b126SAzat Khuzhinif (NOT EVENT__DISABLE_BENCHMARK)
10553e690290SAzat Khuzhin    foreach (BENCHMARK bench_http bench_httpclient)
10563e690290SAzat Khuzhin        add_bench_prog(${BENCHMARK} test/${BENCHMARK}.c)
1057e9fc014cSJoakim Soderberg    endforeach()
10583e690290SAzat Khuzhin
10593e690290SAzat Khuzhin    add_bench_prog(bench test/bench.c ${WIN32_GETOPT})
10603e690290SAzat Khuzhin    add_bench_prog(bench_cascade test/bench_cascade.c ${WIN32_GETOPT})
1061e415196aSJoakim Soderbergendif()
1062e415196aSJoakim Soderberg
10639806b126SAzat Khuzhin#
10649806b126SAzat Khuzhin# Tests
10659806b126SAzat Khuzhin#
10669806b126SAzat Khuzhinmacro(add_test_prog prog)
10679806b126SAzat Khuzhin    add_executable(${prog} test/${prog}.c)
10689806b126SAzat Khuzhin    target_link_libraries(${prog}
10699806b126SAzat Khuzhin                          ${LIB_APPS}
10709806b126SAzat Khuzhin                          ${LIB_PLATFORM}
1071eb10a738SAzat Khuzhin                          event_core
1072eb10a738SAzat Khuzhin                          event_extra
10739806b126SAzat Khuzhin                          ${ARGN})
10749806b126SAzat Khuzhinendmacro()
1075e415196aSJoakim Soderbergif (NOT EVENT__DISABLE_TESTS)
1076e9fc014cSJoakim Soderberg    #
107799c1dc32SJoakim Soderberg    # Generate Regress tests.
1078e9fc014cSJoakim Soderberg    #
1079d38d798bSJoakim Söderberg    if (NOT EVENT__DISABLE_REGRESS)
1080532a8cc3SKiyoshi Aman        # (We require python to generate the regress tests)
1081532a8cc3SKiyoshi Aman        find_package(PythonInterp 3)
1082a9db46aeSMark Ellzey
1083532a8cc3SKiyoshi Aman        if (PYTHONINTERP_FOUND)
108427bd9fafSSergey Nikulov            set(__FOUND_USABLE_PYTHON 1)
1085532a8cc3SKiyoshi Aman        else()
1086532a8cc3SKiyoshi Aman            find_package(PythonInterp 2)
1087532a8cc3SKiyoshi Aman            if (PYTHONINTERP_FOUND)
1088532a8cc3SKiyoshi Aman                set(__FOUND_USABLE_PYTHON 1)
1089532a8cc3SKiyoshi Aman            else()
1090532a8cc3SKiyoshi Aman                message(ERROR "No suitable Python version found, bailing...")
1091532a8cc3SKiyoshi Aman            endif()
109227bd9fafSSergey Nikulov        endif()
109327bd9fafSSergey Nikulov
109427bd9fafSSergey Nikulov        if (__FOUND_USABLE_PYTHON)
10958b228e27SMark Ellzey            message(STATUS "Generating regress tests...")
1096a9db46aeSMark Ellzey
1097e415196aSJoakim Soderberg            add_definitions(-DTINYTEST_LOCAL)
1098a9db46aeSMark Ellzey
1099e415196aSJoakim Soderberg            add_custom_command(
1100e415196aSJoakim Soderberg                OUTPUT
1101e415196aSJoakim Soderberg                    ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.c
1102e415196aSJoakim Soderberg                    ${CMAKE_CURRENT_SOURCE_DIR}/test/regress.gen.h
1103e415196aSJoakim Soderberg                DEPENDS
1104e415196aSJoakim Soderberg                    event_rpcgen.py
1105e415196aSJoakim Soderberg                    test/regress.rpc
11069ea60ab2SAzat Khuzhin                COMMAND ${PYTHON_EXECUTABLE} ../event_rpcgen.py --quiet regress.rpc
1107a9db46aeSMark Ellzey                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test)
1108e415196aSJoakim Soderberg
1109e415196aSJoakim Soderberg            list(APPEND SRC_REGRESS
1110e415196aSJoakim Soderberg                 test/regress.c
1111e415196aSJoakim Soderberg                 test/regress.gen.c
1112e415196aSJoakim Soderberg                 test/regress.gen.h
1113e9fc014cSJoakim Soderberg                 test/regress_buffer.c
1114e9fc014cSJoakim Soderberg                 test/regress_bufferevent.c
1115e9fc014cSJoakim Soderberg                 test/regress_dns.c
1116e9fc014cSJoakim Soderberg                 test/regress_et.c
1117e415196aSJoakim Soderberg                 test/regress_finalize.c
1118e9fc014cSJoakim Soderberg                 test/regress_http.c
1119e9fc014cSJoakim Soderberg                 test/regress_listener.c
1120e9fc014cSJoakim Soderberg                 test/regress_main.c
1121e9fc014cSJoakim Soderberg                 test/regress_minheap.c
1122e9fc014cSJoakim Soderberg                 test/regress_rpc.c
1123e9fc014cSJoakim Soderberg                 test/regress_testutils.c
1124e9fc014cSJoakim Soderberg                 test/regress_testutils.h
1125e9fc014cSJoakim Soderberg                 test/regress_util.c
11269806b126SAzat Khuzhin                 test/tinytest.c)
1127e415196aSJoakim Soderberg
1128e9fc014cSJoakim Soderberg            if (WIN32)
1129e9fc014cSJoakim Soderberg                list(APPEND SRC_REGRESS test/regress_iocp.c)
1130de0c1965SAzat Khuzhin                if (NOT EVENT__DISABLE_THREAD_SUPPORT)
1131e9fc014cSJoakim Soderberg                    list(APPEND SRC_REGRESS test/regress_thread.c)
1132e9fc014cSJoakim Soderberg                endif()
1133a62ec765SPaul Osborne            elseif (EVENT__HAVE_PTHREADS)
1134e9fc014cSJoakim Soderberg                list(APPEND SRC_REGRESS test/regress_thread.c)
1135e9fc014cSJoakim Soderberg            endif()
1136e9fc014cSJoakim Soderberg
1137c4dfb93fSAzat Khuzhin            if (ZLIB_LIBRARY AND ZLIB_INCLUDE_DIR)
1138e9fc014cSJoakim Soderberg                list(APPEND SRC_REGRESS test/regress_zlib.c)
1139e9fc014cSJoakim Soderberg            endif()
1140e9fc014cSJoakim Soderberg
11419806b126SAzat Khuzhin            if (NOT EVENT__DISABLE_OPENSSL)
1142e9fc014cSJoakim Soderberg                list(APPEND SRC_REGRESS test/regress_ssl.c)
1143e9fc014cSJoakim Soderberg            endif()
1144e9fc014cSJoakim Soderberg
1145e415196aSJoakim Soderberg            add_executable(regress ${SRC_REGRESS})
1146a9db46aeSMark Ellzey
1147a9db46aeSMark Ellzey            target_link_libraries(regress
1148a9db46aeSMark Ellzey                                  ${LIB_APPS}
11499806b126SAzat Khuzhin                                  ${LIB_PLATFORM}
1150eb10a738SAzat Khuzhin                                  event_core
1151eb10a738SAzat Khuzhin                                  event_extra)
11529806b126SAzat Khuzhin            if (NOT EVENT__DISABLE_OPENSSL)
1153eb10a738SAzat Khuzhin                target_link_libraries(regress event_openssl)
11549806b126SAzat Khuzhin            endif()
11559806b126SAzat Khuzhin            if (CMAKE_USE_PTHREADS_INIT)
1156eb10a738SAzat Khuzhin                target_link_libraries(regress event_pthreads)
11579806b126SAzat Khuzhin            endif()
1158e415196aSJoakim Soderberg        else()
115927bd9fafSSergey Nikulov            message(WARNING "No suitable Python interpreter found, cannot generate regress tests!")
1160e415196aSJoakim Soderberg        endif()
1161d38d798bSJoakim Söderberg    endif()
1162e415196aSJoakim Soderberg
116399c1dc32SJoakim Soderberg    #
116499c1dc32SJoakim Soderberg    # Test programs.
116599c1dc32SJoakim Soderberg    #
11668b228e27SMark Ellzey    # all of these, including the cmakelists.txt should be moved
11678b228e27SMark Ellzey    # into the dirctory 'tests' first.
11688b228e27SMark Ellzey    #
11698b228e27SMark Ellzey    # doing this, we can remove all the DISABLE_TESTS stuff, and simply
11708b228e27SMark Ellzey    # do something like:
11718b228e27SMark Ellzey    #
11728b228e27SMark Ellzey    # add_custom_targets(tests)
11738b228e27SMark Ellzey    # add_executable(... EXCLUDE_FROM_ALL ...c)
11748b228e27SMark Ellzey    # add_dependencis(tests testa testb testc)
11758b228e27SMark Ellzey    # add_test(....)
11768b228e27SMark Ellzey    #
11778b228e27SMark Ellzey    # then you can just run 'make tests' instead of them all
11788b228e27SMark Ellzey    # auto-compile|running
11798b228e27SMark Ellzey    # - ellzey
118099c1dc32SJoakim Soderberg    set(TESTPROGS test-changelist
118199c1dc32SJoakim Soderberg                  test-eof
11829ed49f2dSAzat Khuzhin                  test-closed
118399c1dc32SJoakim Soderberg                  test-fdleak
118499c1dc32SJoakim Soderberg                  test-init
118599c1dc32SJoakim Soderberg                  test-time
118699c1dc32SJoakim Soderberg                  test-weof)
118799c1dc32SJoakim Soderberg
11889806b126SAzat Khuzhin    foreach (TESTPROG ${TESTPROGS} test-dumpevents)
11899806b126SAzat Khuzhin        add_test_prog(${TESTPROG})
11909806b126SAzat Khuzhin    endforeach()
11919806b126SAzat Khuzhin    if (UNIX)
11929806b126SAzat Khuzhin        add_test_prog(test-ratelim m)
11939806b126SAzat Khuzhin    else()
11949806b126SAzat Khuzhin        add_test_prog(test-ratelim)
11959806b126SAzat Khuzhin    endif()
11969806b126SAzat Khuzhin
1197a9db46aeSMark Ellzey    set(ALL_TESTPROGS
1198a9db46aeSMark Ellzey        ${TESTPROGS}
1199a9db46aeSMark Ellzey        test-dumpevents
12009806b126SAzat Khuzhin        test-ratelim
12019806b126SAzat Khuzhin    )
120299c1dc32SJoakim Soderberg
120399c1dc32SJoakim Soderberg    #
120499c1dc32SJoakim Soderberg    # We run all tests with the different backends turned on one at a time.
120599c1dc32SJoakim Soderberg    #
120699c1dc32SJoakim Soderberg
12077ea4159dSJoakim Soderberg    # Add event backends based on system introspection result.
12087ea4159dSJoakim Soderberg    set(BACKENDS "")
12097ea4159dSJoakim Soderberg
12107ea4159dSJoakim Soderberg    if (EVENT__HAVE_EPOLL)
12117ea4159dSJoakim Soderberg        list(APPEND BACKENDS EPOLL)
12127ea4159dSJoakim Soderberg    endif()
12137ea4159dSJoakim Soderberg
12147ea4159dSJoakim Soderberg    if (EVENT__HAVE_SELECT)
12157ea4159dSJoakim Soderberg        list(APPEND BACKENDS SELECT)
12167ea4159dSJoakim Soderberg    endif()
12177ea4159dSJoakim Soderberg
12187ea4159dSJoakim Soderberg    if (EVENT__HAVE_POLL)
12197ea4159dSJoakim Soderberg        list(APPEND BACKENDS POLL)
12207ea4159dSJoakim Soderberg    endif()
12217ea4159dSJoakim Soderberg
12227ea4159dSJoakim Soderberg    if (EVENT__HAVE_KQUEUE)
12237ea4159dSJoakim Soderberg        list(APPEND BACKENDS KQUEUE)
12247ea4159dSJoakim Soderberg    endif()
12257ea4159dSJoakim Soderberg
12267ea4159dSJoakim Soderberg    if (EVENT__HAVE_EVENT_PORTS)
12277ea4159dSJoakim Soderberg        list(APPEND BACKENDS EVPORT)
12287ea4159dSJoakim Soderberg    endif()
12297ea4159dSJoakim Soderberg
12307ea4159dSJoakim Soderberg    if (EVENT__HAVE_DEVPOLL)
12317ea4159dSJoakim Soderberg        list(APPEND BACKENDS DEVPOLL)
12327ea4159dSJoakim Soderberg    endif()
12337ea4159dSJoakim Soderberg
12347ea4159dSJoakim Soderberg    if (WIN32)
12357ea4159dSJoakim Soderberg        list(APPEND BACKENDS WIN32)
12367ea4159dSJoakim Soderberg    endif()
12377ea4159dSJoakim Soderberg
12387ea4159dSJoakim Soderberg
123999c1dc32SJoakim Soderberg    # Default environment variables turns off all event systems,
124099c1dc32SJoakim Soderberg    # then we enable each one, one at a time when creating the tests.
1241677378eaSAzat Khuzhin    set(DEFAULT_TEST_ENV_VARS)
124299c1dc32SJoakim Soderberg    foreach(BACKEND ${BACKENDS})
1243e053c4f0SJoakim Soderberg        set(BACKEND_ENV_VAR "EVENT_NO${BACKEND}=1")
1244e053c4f0SJoakim Soderberg        list(APPEND DEFAULT_TEST_ENV_VARS "${BACKEND_ENV_VAR}")
124599c1dc32SJoakim Soderberg    endforeach()
124699c1dc32SJoakim Soderberg
124799c1dc32SJoakim Soderberg    # Macro that creates the ctest test for a backend.
124899c1dc32SJoakim Soderberg    macro(add_backend_test BACKEND_TEST_NAME ENV_VARS)
12497ea4159dSJoakim Soderberg        set(TEST_NAMES "")
12507ea4159dSJoakim Soderberg
125199c1dc32SJoakim Soderberg        foreach (TESTPROG ${TESTPROGS})
1252e053c4f0SJoakim Soderberg            set(TEST_NAME ${TESTPROG}__${BACKEND_TEST_NAME})
1253a9db46aeSMark Ellzey
1254a9db46aeSMark Ellzey            add_test(${TEST_NAME}
1255a9db46aeSMark Ellzey                     ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/${TESTPROG})
1256a9db46aeSMark Ellzey
12577ea4159dSJoakim Soderberg            list(APPEND TEST_NAMES ${TEST_NAME})
1258a9db46aeSMark Ellzey
1259a9db46aeSMark Ellzey            set_tests_properties(${TEST_NAME}
1260a9db46aeSMark Ellzey                                 PROPERTIES ENVIRONMENT "${ENV_VARS}")
126199c1dc32SJoakim Soderberg        endforeach()
126299c1dc32SJoakim Soderberg
126399c1dc32SJoakim Soderberg        # Dump events test.
126427bd9fafSSergey Nikulov        if (__FOUND_USABLE_PYTHON)
1265e053c4f0SJoakim Soderberg            set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME})
1266a9db46aeSMark Ellzey
1267a9db46aeSMark Ellzey            add_test(${TEST_NAME}
1268a9db46aeSMark Ellzey                     ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents |
1269a9db46aeSMark Ellzey                     ${PYTHON_EXECUTABLE}
1270a9db46aeSMark Ellzey                     ${CMAKE_CURRENT_SOURCE_DIR}/test/check-dumpevents.py)
1271a9db46aeSMark Ellzey
1272a9db46aeSMark Ellzey            set_tests_properties(${TEST_NAME}
1273a9db46aeSMark Ellzey                                 PROPERTIES ENVIRONMENT "${ENV_VARS}")
127499c1dc32SJoakim Soderberg        else()
127599c1dc32SJoakim Soderberg            message(WARNING "test-dumpevents will be run without output check since python was not found!")
1276e053c4f0SJoakim Soderberg            set(TEST_NAME test-dumpevents__${BACKEND_TEST_NAME}_no_check)
1277a9db46aeSMark Ellzey
1278a9db46aeSMark Ellzey            add_test(${TEST_NAME}
1279a9db46aeSMark Ellzey                     ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-dumpevents)
1280a9db46aeSMark Ellzey
1281a9db46aeSMark Ellzey            set_tests_properties(${TEST_NAME}
1282a9db46aeSMark Ellzey                                 PROPERTIES ENVIRONMENT "${ENV_VARS}")
128399c1dc32SJoakim Soderberg        endif()
128499c1dc32SJoakim Soderberg
128599c1dc32SJoakim Soderberg        # Regress tests.
128627bd9fafSSergey Nikulov        if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1287e053c4f0SJoakim Soderberg            set(TEST_NAME regress__${BACKEND_TEST_NAME})
1288cf2cf2a0SAzat Khuzhin
1289a9db46aeSMark Ellzey            add_test(${TEST_NAME}
129070ac2144SAzat Khuzhin                     ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress --quiet)
1291a9db46aeSMark Ellzey
1292a9db46aeSMark Ellzey            set_tests_properties(${TEST_NAME}
1293a9db46aeSMark Ellzey                                 PROPERTIES ENVIRONMENT "${ENV_VARS}")
1294a9db46aeSMark Ellzey
1295a9db46aeSMark Ellzey            add_test(${TEST_NAME}_debug
129670ac2144SAzat Khuzhin                     ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/regress --quiet)
1297a9db46aeSMark Ellzey
1298a9db46aeSMark Ellzey            set_tests_properties(${TEST_NAME}_debug
1299a9db46aeSMark Ellzey                                 PROPERTIES ENVIRONMENT "${ENV_VARS};EVENT_DEBUG_MODE=1")
130099c1dc32SJoakim Soderberg        endif()
130199c1dc32SJoakim Soderberg    endmacro()
130299c1dc32SJoakim Soderberg
130399c1dc32SJoakim Soderberg    # Add the tests for each backend.
130499c1dc32SJoakim Soderberg    foreach(BACKEND ${BACKENDS})
130599c1dc32SJoakim Soderberg        # Enable this backend only.
130699c1dc32SJoakim Soderberg        set(BACKEND_ENV_VARS ${DEFAULT_TEST_ENV_VARS})
130719222e52SJoakim Soderberg        list(REMOVE_ITEM BACKEND_ENV_VARS EVENT_NO${BACKEND}=1)
130899c1dc32SJoakim Soderberg
130999c1dc32SJoakim Soderberg        # Epoll has some extra settings.
131099c1dc32SJoakim Soderberg        if (${BACKEND} STREQUAL "EPOLL")
1311a9db46aeSMark Ellzey            add_backend_test(timerfd_${BACKEND}
1312a9db46aeSMark Ellzey                            "${BACKEND_ENV_VARS};EVENT_PRECISE_TIMER=1")
1313a9db46aeSMark Ellzey
1314a9db46aeSMark Ellzey            add_backend_test(changelist_${BACKEND}
1315a9db46aeSMark Ellzey                            "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes")
1316a9db46aeSMark Ellzey
1317a9db46aeSMark Ellzey            add_backend_test(timerfd_changelist_${BACKEND}
1318a9db46aeSMark Ellzey                            "${BACKEND_ENV_VARS};EVENT_EPOLL_USE_CHANGELIST=yes;EVENT_PRECISE_TIMER=1")
131999c1dc32SJoakim Soderberg        else()
13207ea4159dSJoakim Soderberg            add_backend_test(${BACKEND} "${BACKEND_ENV_VARS}")
132199c1dc32SJoakim Soderberg        endif()
132299c1dc32SJoakim Soderberg    endforeach()
132399c1dc32SJoakim Soderberg
132499c1dc32SJoakim Soderberg    #
132599c1dc32SJoakim Soderberg    # Rate limiter tests.
132699c1dc32SJoakim Soderberg    #
132799c1dc32SJoakim Soderberg
132899c1dc32SJoakim Soderberg    # Group limits, no connection limit.
1329a9db46aeSMark Ellzey    set(RL_BIN ${CMAKE_RUNTIME_OUTPUT_DIRECTORY}/test-ratelim)
1330a9db46aeSMark Ellzey
1331a9db46aeSMark Ellzey    add_test(test-ratelim__group_lim
1332a9db46aeSMark Ellzey             ${RL_BIN}
1333a9db46aeSMark Ellzey             -g 30000
1334a9db46aeSMark Ellzey             -n 30
1335a9db46aeSMark Ellzey             -t 100
1336a9db46aeSMark Ellzey             --check-grouplimit 1000
1337a9db46aeSMark Ellzey             --check-stddev 100)
133899c1dc32SJoakim Soderberg
133999c1dc32SJoakim Soderberg    # Connection limit, no group limit.
1340a9db46aeSMark Ellzey    add_test(test-ratelim__con_lim
1341a9db46aeSMark Ellzey             ${RL_BIN}
1342a9db46aeSMark Ellzey             -c 1000
1343a9db46aeSMark Ellzey             -n 30
1344a9db46aeSMark Ellzey             -t 100
1345a9db46aeSMark Ellzey             --check-connlimit 50
1346a9db46aeSMark Ellzey             --check-stddev 50)
134799c1dc32SJoakim Soderberg
134899c1dc32SJoakim Soderberg    # Connection limit and group limit.
1349a9db46aeSMark Ellzey    add_test(test-ratelim__group_con_lim
1350a9db46aeSMark Ellzey             ${RL_BIN}
1351a9db46aeSMark Ellzey             -c 1000
1352a9db46aeSMark Ellzey             -g 30000
1353a9db46aeSMark Ellzey             -n 30
1354a9db46aeSMark Ellzey             -t 100
1355a9db46aeSMark Ellzey             --check-grouplimit 1000
1356a9db46aeSMark Ellzey             --check-connlimit 50
1357a9db46aeSMark Ellzey             --check-stddev 50)
135899c1dc32SJoakim Soderberg
135999c1dc32SJoakim Soderberg    # Connection limit and group limit with independent drain.
1360a9db46aeSMark Ellzey    add_test(test-ratelim__group_con_lim_drain
1361a9db46aeSMark Ellzey             ${RL_BIN}
1362a9db46aeSMark Ellzey             -c 1000
1363a9db46aeSMark Ellzey             -g 35000
1364a9db46aeSMark Ellzey             -n 30
1365a9db46aeSMark Ellzey             -t 100
1366a9db46aeSMark Ellzey             -G 500
1367a9db46aeSMark Ellzey             --check-grouplimit 1000
1368a9db46aeSMark Ellzey             --check-connlimit 50
1369a9db46aeSMark Ellzey             --check-stddev 50)
137099c1dc32SJoakim Soderberg
1371e053c4f0SJoakim Soderberg    # Add a "make verify" target, same as for autoconf.
1372e053c4f0SJoakim Soderberg    # (Important! This will unset all EVENT_NO* environment variables.
1373e053c4f0SJoakim Soderberg    #  If they are set in the shell the tests are running using simply "ctest" or "make test" will fail)
137467e5d749SJoakim Soderberg    if (WIN32)
1375f1715b47SJoakim Soderberg        # Windows doesn't have "unset". But you can use "set VAR=" instead.
1376f1715b47SJoakim Soderberg        # We need to guard against the possibility taht EVENT_NOWIN32 is set, and all test failing
1377f1715b47SJoakim Soderberg        # since no event backend being available.
1378f1715b47SJoakim Soderberg        file(TO_NATIVE_PATH ${CMAKE_CTEST_COMMAND} WINDOWS_CTEST_COMMAND)
1379f1715b47SJoakim Soderberg
1380f1715b47SJoakim Soderberg        file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
1381f1715b47SJoakim Soderberg            "
1382f1715b47SJoakim Soderberg            set EVENT_NOWIN32=
1383f1715b47SJoakim Soderberg            \"${WINDOWS_CTEST_COMMAND}\"
1384f1715b47SJoakim Soderberg            ")
1385f1715b47SJoakim Soderberg
13868b228e27SMark Ellzey        message(STATUS "${WINDOWS_CTEST_COMMAND}")
1387f1715b47SJoakim Soderberg
1388a9db46aeSMark Ellzey        file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.bat
13899806b126SAzat Khuzhin             DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1390a9db46aeSMark Ellzey             FILE_PERMISSIONS
1391a9db46aeSMark Ellzey                             OWNER_READ
1392a9db46aeSMark Ellzey                             OWNER_WRITE
1393a9db46aeSMark Ellzey                             OWNER_EXECUTE
1394a9db46aeSMark Ellzey                             GROUP_READ
1395a9db46aeSMark Ellzey                             GROUP_EXECUTE
1396a9db46aeSMark Ellzey                             WORLD_READ WORLD_EXECUTE)
1397a9db46aeSMark Ellzey
1398a9db46aeSMark Ellzey        file(TO_NATIVE_PATH
1399a9db46aeSMark Ellzey                    "${CMAKE_CURRENT_BINARY_DIR}/verify_tests.bat" VERIFY_PATH)
1400f1715b47SJoakim Soderberg
1401f1715b47SJoakim Soderberg        add_custom_target(verify COMMAND "${VERIFY_PATH}"
140267e5d749SJoakim Soderberg                          DEPENDS event ${ALL_TESTPROGS})
140367e5d749SJoakim Soderberg    else()
14044ac086abSJoakim Soderberg        # On some platforms doing exec(unset) as CMake does won't work, so make sure
14054ac086abSJoakim Soderberg        # we run the unset command in a shell instead.
14064ac086abSJoakim Soderberg        # First we write the script contents.
14074ac086abSJoakim Soderberg        file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
14084ac086abSJoakim Soderberg            "
14094ac086abSJoakim Soderberg            #!/bin/bash
14104ac086abSJoakim Soderberg            unset EVENT_NOEPOLL; unset EVENT_NOPOLL; unset EVENT_NOSELECT; unset EVENT_NOWIN32; unset EVENT_NOEVPORT; unset EVENT_NOKQUEUE; unset EVENT_NODEVPOLL
14114ac086abSJoakim Soderberg            ${CMAKE_CTEST_COMMAND}
14124ac086abSJoakim Soderberg            ")
14134ac086abSJoakim Soderberg
14144ac086abSJoakim Soderberg        # Then we copy the file (this allows us to set execute permission on it)
14154ac086abSJoakim Soderberg        file(COPY ${CMAKE_CURRENT_BINARY_DIR}/tmp/verify_tests.sh
14164ac086abSJoakim Soderberg             DESTINATION ${CMAKE_CURRENT_BINARY_DIR}
1417a9db46aeSMark Ellzey             FILE_PERMISSIONS
1418a9db46aeSMark Ellzey                             OWNER_READ
1419a9db46aeSMark Ellzey                             OWNER_WRITE
1420a9db46aeSMark Ellzey                             OWNER_EXECUTE
1421a9db46aeSMark Ellzey                             GROUP_READ
1422a9db46aeSMark Ellzey                             GROUP_EXECUTE
1423a9db46aeSMark Ellzey                             WORLD_READ
1424a9db46aeSMark Ellzey                             WORLD_EXECUTE)
14254ac086abSJoakim Soderberg
14264ac086abSJoakim Soderberg        # Create the target that runs the script.
1427a9db46aeSMark Ellzey        add_custom_target(verify
14289806b126SAzat Khuzhin                          COMMAND ${CMAKE_CURRENT_BINARY_DIR}/verify_tests.sh
14299806b126SAzat Khuzhin                          DEPENDS event ${ALL_TESTPROGS})
143067e5d749SJoakim Soderberg    endif()
1431e053c4f0SJoakim Soderberg
143227bd9fafSSergey Nikulov    if (NOT EVENT__DISABLE_REGRESS AND __FOUND_USABLE_PYTHON)
1433e053c4f0SJoakim Soderberg        add_dependencies(verify regress)
1434e053c4f0SJoakim Soderberg    endif()
1435e053c4f0SJoakim Soderberg
1436f2483f8bSJoakim Soderberg    if (EVENT__COVERAGE)
1437f2483f8bSJoakim Soderberg        include(CodeCoverage)
1438f2483f8bSJoakim Soderberg
1439f2483f8bSJoakim Soderberg        setup_target_for_coverage(
1440f2483f8bSJoakim Soderberg            verify_coverage # Coverage target name "make verify_coverage"
1441f2483f8bSJoakim Soderberg            make            # Test runner.
1442f2483f8bSJoakim Soderberg            coverage        # Output directory.
1443f2483f8bSJoakim Soderberg            verify)         # Arguments passed to test runner. "make verify"
1444f2483f8bSJoakim Soderberg    endif()
1445f2483f8bSJoakim Soderberg
1446e415196aSJoakim Soderberg    enable_testing()
1447e415196aSJoakim Soderberg
1448e415196aSJoakim Soderberg    include(CTest)
1449e415196aSJoakim Soderbergendif()
1450f3446ed5SJoakim Soderberg
1451f3446ed5SJoakim Soderberg#
1452f3446ed5SJoakim Soderberg# Installation preparation.
1453f3446ed5SJoakim Soderberg#
1454f3446ed5SJoakim Soderberg
14559806b126SAzat Khuzhinset(EVENT_INSTALL_CMAKE_DIR
14561c047618Syuangongji    "${CMAKE_INSTALL_PREFIX}/lib/cmake/libevent")
1457f3446ed5SJoakim Soderberg
1458f3446ed5SJoakim Soderbergexport(PACKAGE libevent)
1459f3446ed5SJoakim Soderberg
14601c047618Syuangongjifunction(gen_package_config forinstall)
14611c047618Syuangongji    if(${forinstall})
14621c047618Syuangongji        set(CONFIG_FOR_INSTALL_TREE 1)
14631c047618Syuangongji        set(dir "${PROJECT_BINARY_DIR}${CMAKE_FILES_DIRECTORY}")
14641c047618Syuangongji    else()
14651c047618Syuangongji        set(CONFIG_FOR_INSTALL_TREE 0)
14661c047618Syuangongji        set(dir "${PROJECT_BINARY_DIR}")
14671c047618Syuangongji    endif()
14681c047618Syuangongji    configure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfig.cmake.in
14691c047618Syuangongji                "${dir}/LibeventConfig.cmake"
14701c047618Syuangongji                @ONLY)
14711c047618Syuangongjiendfunction()
14721c047618Syuangongji
1473f3446ed5SJoakim Soderberg# Generate the config file for the build-tree.
1474f3446ed5SJoakim Soderbergset(EVENT__INCLUDE_DIRS
1475f3446ed5SJoakim Soderberg    "${PROJECT_SOURCE_DIR}/include"
1476f3446ed5SJoakim Soderberg    "${PROJECT_BINARY_DIR}/include")
1477a9db46aeSMark Ellzey
1478a9db46aeSMark Ellzeyset(LIBEVENT_INCLUDE_DIRS
1479a9db46aeSMark Ellzey    ${EVENT__INCLUDE_DIRS}
1480a9db46aeSMark Ellzey    CACHE PATH "Libevent include directories")
1481a9db46aeSMark Ellzey
14821c047618Syuangongjigen_package_config(0)
1483f3446ed5SJoakim Soderberg
1484f3446ed5SJoakim Soderberg# Generate the config file for the installation tree.
14851c047618Syuangongjigen_package_config(1)
1486f3446ed5SJoakim Soderberg
1487f3446ed5SJoakim Soderberg# Generate version info for both build-tree and install-tree.
1488f3446ed5SJoakim Soderbergconfigure_file(${PROJECT_SOURCE_DIR}/cmake/LibeventConfigVersion.cmake.in
1489f3446ed5SJoakim Soderberg               ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
1490f3446ed5SJoakim Soderberg               @ONLY)
1491f3446ed5SJoakim Soderberg
149227bd9fafSSergey Nikulov# Install compat headers
149327bd9fafSSergey Nikulovinstall(FILES ${HDR_COMPAT}
14949806b126SAzat Khuzhin        DESTINATION "include"
149527bd9fafSSergey Nikulov        COMPONENT dev)
1496f3446ed5SJoakim Soderberg
1497a9d1121dSyuangongji# Install public headers
1498a9d1121dSyuangongjiinstall(FILES ${HDR_PUBLIC}
1499a9d1121dSyuangongji        DESTINATION "include/event2"
1500a9d1121dSyuangongji        COMPONENT dev)
1501a9d1121dSyuangongji
1502f3446ed5SJoakim Soderberg# Install the configs.
1503f3446ed5SJoakim Soderberginstall(FILES
1504f3446ed5SJoakim Soderberg        ${PROJECT_BINARY_DIR}/${CMAKE_FILES_DIRECTORY}/LibeventConfig.cmake
15054b754df9SJoakim Soderberg        ${PROJECT_BINARY_DIR}/LibeventConfigVersion.cmake
15069806b126SAzat Khuzhin        DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1507a9db46aeSMark Ellzey        COMPONENT dev)
1508f3446ed5SJoakim Soderberg
1509f3446ed5SJoakim Soderberg# Install exports for the install-tree.
15101c047618Syuangongjimacro(install_export type)
15111c047618Syuangongji    install(EXPORT LibeventTargets-${type}
15121c047618Syuangongji        NAMESPACE ${PROJECT_NAME}::
15131c047618Syuangongji        DESTINATION "${EVENT_INSTALL_CMAKE_DIR}"
1514a9db46aeSMark Ellzey        COMPONENT dev)
15151c047618Syuangongjiendmacro()
15161c047618Syuangongji
15171c047618Syuangongjiif (${EVENT_LIBRARY_STATIC})
15181c047618Syuangongji    install_export(static)
15191c047618Syuangongjiendif()
15201c047618Syuangongjiif (${EVENT_LIBRARY_SHARED})
15211c047618Syuangongji    install_export(shared)
15221c047618Syuangongjiendif()
152349ab3632SJoakim Soderberg
15242d65071cSyuangongji# Install the scripts.
15252d65071cSyuangongjiinstall(PROGRAMS
15262d65071cSyuangongji       ${CMAKE_CURRENT_SOURCE_DIR}/event_rpcgen.py
15272d65071cSyuangongji       DESTINATION "bin"
15282d65071cSyuangongji       COMPONENT runtime)
15292d65071cSyuangongji
15302d65071cSyuangongji# Create documents with doxygen.
15317a85300aSyuangongjioption(EVENT__DOXYGEN
15327a85300aSyuangongji    "Enables doxygen documentation" OFF)
15337a85300aSyuangongjiif (EVENT__DOXYGEN)
15347a85300aSyuangongji    include(UseDoxygen)
15357a85300aSyuangongji    UseDoxygen()
15362d65071cSyuangongjiendif()
15372d65071cSyuangongji
15382d65071cSyuangongji
15393f1fb1f9SDimo Markovif (NOT TARGET uninstall)
15402d65071cSyuangongji	# Create the uninstall target.
15412d65071cSyuangongji	# https://gitlab.kitware.com/cmake/community/wikis/FAQ#can-i-do-make-uninstall-with-cmake
15422d65071cSyuangongji	configure_file(${PROJECT_SOURCE_DIR}/cmake/Uninstall.cmake.in
15432d65071cSyuangongji				   ${PROJECT_BINARY_DIR}/Uninstall.cmake
15442d65071cSyuangongji				   @ONLY)
15452d65071cSyuangongji
15462d65071cSyuangongji	add_custom_target(uninstall
15472d65071cSyuangongji					  COMMAND ${CMAKE_COMMAND} -P ${PROJECT_BINARY_DIR}/Uninstall.cmake)
15483f1fb1f9SDimo Markovendif()
15492d65071cSyuangongji
155038716c65SAzat Khuzhinmessage(STATUS "")
155138716c65SAzat Khuzhinmessage(STATUS "        ---( Libevent " ${EVENT_VERSION} " )---")
155238716c65SAzat Khuzhinmessage(STATUS "")
15538b228e27SMark Ellzeymessage(STATUS "Available event backends: ${BACKENDS}")
1554acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_BINARY_DIR:         ${CMAKE_BINARY_DIR}")
1555acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_CURRENT_BINARY_DIR: ${CMAKE_CURRENT_BINARY_DIR}")
1556acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SOURCE_DIR:         ${CMAKE_SOURCE_DIR}")
1557acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_CURRENT_SOURCE_DIR: ${CMAKE_CURRENT_SOURCE_DIR}")
1558acf4821dSAzat Khuzhinmessage(STATUS "PROJECT_BINARY_DIR:       ${PROJECT_BINARY_DIR}")
1559acf4821dSAzat Khuzhinmessage(STATUS "PROJECT_SOURCE_DIR:       ${PROJECT_SOURCE_DIR}")
1560acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_MODULE_PATH:        ${CMAKE_MODULE_PATH}")
1561acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_COMMAND:            ${CMAKE_COMMAND}")
1562acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_ROOT:               ${CMAKE_ROOT}")
1563acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SYSTEM:             ${CMAKE_SYSTEM}")
1564acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SYSTEM_NAME:        ${CMAKE_SYSTEM_NAME}")
1565acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SYSTEM_VERSION:     ${CMAKE_SYSTEM_VERSION}")
1566acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SYSTEM_PROCESSOR:   ${CMAKE_SYSTEM_PROCESSOR}")
1567acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_SKIP_RPATH:         ${CMAKE_SKIP_RPATH}")
1568acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_VERBOSE_MAKEFILE:   ${CMAKE_VERBOSE_MAKEFILE}")
1569acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_C_FLAGS:            ${CMAKE_C_FLAGS}")
1570acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_BUILD_TYPE:         ${CMAKE_BUILD_TYPE}")
1571acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_C_COMPILER:         ${CMAKE_C_COMPILER} (id ${CMAKE_C_COMPILER_ID}, clang ${CLANG}, GNUC ${GNUC})")
1572acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_AR:                 ${CMAKE_AR}")
1573acf4821dSAzat Khuzhinmessage(STATUS "CMAKE_RANLIB:             ${CMAKE_RANLIB}")
157438716c65SAzat Khuzhinmessage(STATUS "")
1575a9db46aeSMark Ellzey
1576