zeek/auxil/binpac/cmake/FindKqueue.cmake
Patrick Kelley 8fd444092b initial
2025-05-07 15:35:15 -04:00

138 lines
5.2 KiB
CMake

include(CheckFunctionExists)
# First check whether the system has kqueue built-in. Prefer that over everything else.
check_function_exists(kqueue HAVE_KQUEUE)
if (NOT HAVE_KQUEUE)
# If the user passed in a path for libkqueue, see if we can find a copy of it there.
# If they didn't pass one, build our local copy of it.
if (LIBKQUEUE_ROOT_DIR)
find_path(LIBKQUEUE_ROOT_DIR NAMES "include/sys/event.h")
# Prefer linking statically but look for a shared library version too.
find_library(
LIBKQUEUE_LIBRARIES NAMES "libkqueue${CMAKE_STATIC_LIBRARY_SUFFIX}"
"libkqueue${CMAKE_SHARED_LIBRARY_SUFFIX}"
HINTS ${LIBKQUEUE_ROOT_DIR}/lib)
find_path(LIBKQUEUE_INCLUDE_DIRS NAMES "sys/event.h"
HINTS ${LIBKQUEUE_ROOT_DIR}/include/kqueue)
include(FindPackageHandleStandardArgs)
find_package_handle_standard_args(LIBKQUEUE DEFAULT_MSG LIBKQUEUE_LIBRARIES
LIBKQUEUE_INCLUDE_DIRS)
mark_as_advanced(LIBKQUEUE_ROOT_DIR LIBKQUEUE_LIBRARIES LIBKQUEUE_INCLUDE_DIRS)
set(HAVE_KQUEUE true)
else ()
set(kqueue_build "${CMAKE_CURRENT_BINARY_DIR}/libkqueue-build")
set(kqueue_src "${CMAKE_CURRENT_SOURCE_DIR}/auxil/libkqueue")
set(kqueue_ep "${CMAKE_CURRENT_BINARY_DIR}/libkqueue-ep")
if (MSVC)
set(LIBKQUEUE_NAME "kqueue_static")
set(WIN_CONFIG -DCMAKE_POLICY_DEFAULT_CMP0091=NEW
-DCMAKE_MSVC_RUNTIME_LIBRARY=${CMAKE_MSVC_RUNTIME_LIBRARY})
set(kqueue_static_lib
"${kqueue_build}/kqueueStatic/${LIBKQUEUE_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
else ()
set(LIBKQUEUE_NAME "libkqueue")
set(kqueue_static_lib "${kqueue_build}/${LIBKQUEUE_NAME}${CMAKE_STATIC_LIBRARY_SUFFIX}")
endif ()
include(ExternalProject)
if (${CMAKE_VERSION} VERSION_LESS "3.2.0")
# Build byproducts is just required by the Ninja generator
# though it's not available before CMake 3.2 ...
if (${CMAKE_GENERATOR} STREQUAL Ninja)
message(FATAL_ERROR "Ninja generator requires CMake >= 3.2")
endif ()
set(build_byproducts_arg)
else ()
set(build_byproducts_arg BUILD_BYPRODUCTS ${kqueue_static_lib})
endif ()
ExternalProject_Add(
project_kqueue
PREFIX "${kqueue_ep}"
BINARY_DIR "${kqueue_build}"
DOWNLOAD_COMMAND ""
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND "" ${build_byproducts_arg})
if (${CMAKE_VERSION} VERSION_LESS "3.4.0")
set(use_terminal_arg)
else ()
set(use_terminal_arg USES_TERMINAL 1)
endif ()
ExternalProject_Add_Step(
project_kqueue project_kqueue_build_step
COMMAND ${CMAKE_MAKE_PROGRAM}
COMMENT "Building libkqueue"
WORKING_DIRECTORY ${kqueue_build}
ALWAYS 1
${use_terminal_arg})
if (CMAKE_TOOLCHAIN_FILE)
set(toolchain_arg -DCMAKE_TOOLCHAIN_FILE=${CMAKE_TOOLCHAIN_FILE})
else ()
set(toolchain_arg)
endif ()
if (CMAKE_C_COMPILER_LAUNCHER)
set(cmake_c_compiler_launcher_arg
-DCMAKE_C_COMPILER_LAUNCHER:path=${CMAKE_C_COMPILER_LAUNCHER})
else ()
set(cmake_c_compiler_launcher_arg)
endif ()
if (CMAKE_CXX_COMPILER_LAUNCHER)
set(cmake_cxx_compiler_launcher_arg
-DCMAKE_CXX_COMPILER_LAUNCHER:path=${CMAKE_CXX_COMPILER_LAUNCHER})
else ()
set(cmake_cxx_compiler_launcher_arg)
endif ()
execute_process(
COMMAND
${CMAKE_COMMAND} -G${CMAKE_GENERATOR} ${toolchain_arg}
${cmake_c_compiler_launcher_arg} ${cmake_cxx_compiler_launcher_arg}
-DCMAKE_BUILD_TYPE:string=${CMAKE_BUILD_TYPE} ${WIN_CONFIG} ${kqueue_src}
WORKING_DIRECTORY ${kqueue_build}
RESULT_VARIABLE kqueue_cmake_result
ERROR_VARIABLE KQUEUE_CMAKE_OUTPUT
OUTPUT_VARIABLE KQUEUE_CMAKE_OUTPUT
ERROR_STRIP_TRAILING_WHITESPACE OUTPUT_STRIP_TRAILING_WHITESPACE)
message("\n********** Begin libkqueue External Project CMake Output ************")
message("\n${KQUEUE_CMAKE_OUTPUT}")
message("\n*********** End libkqueue External Project CMake Output *************")
message("\n")
if (kqueue_cmake_result)
message(FATAL_ERROR "libkqueue CMake configuration failed")
endif ()
add_library(libkqueue_a STATIC IMPORTED)
set_property(TARGET libkqueue_a PROPERTY IMPORTED_LOCATION ${kqueue_static_lib})
add_dependencies(libkqueue_a project_kqueue)
set(HAVE_KQUEUE true)
set(LIBKQUEUE_LIBRARIES libkqueue_a CACHE STRING "libkqueue libs" FORCE)
set(LIBKQUEUE_INCLUDE_DIRS "${kqueue_src}/include;${kqueue_build}/include"
CACHE INTERNAL "libkqueue includes" FORCE)
endif ()
endif ()
if (NOT HAVE_KQUEUE)
message(FATAL_ERROR "Failed to find a working version of kqueue.")
endif ()