tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

CMakeLists.txt (46004B)


      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 "")