138 lines
5.2 KiB
CMake
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 ()
|