194 lines
6.8 KiB
CMake
194 lines
6.8 KiB
CMake
|
include(CMakeParseArguments)
|
||
|
|
||
|
set(LIBEVENT_SHARED_LIBRARIES "")
|
||
|
set(LIBEVENT_STATIC_LIBRARIES "")
|
||
|
|
||
|
macro(set_event_shared_lib_flags LIB_NAME)
|
||
|
set_target_properties("${LIB_NAME}_shared" PROPERTIES
|
||
|
COMPILE_FLAGS ${ARGN})
|
||
|
set_target_properties("${LIB_NAME}_shared" PROPERTIES
|
||
|
LINK_FLAGS ${ARGN})
|
||
|
endmacro()
|
||
|
|
||
|
macro(generate_pkgconfig LIB_NAME)
|
||
|
set(prefix ${CMAKE_INSTALL_PREFIX})
|
||
|
set(exec_prefix ${CMAKE_INSTALL_PREFIX})
|
||
|
set(libdir ${CMAKE_INSTALL_PREFIX}/lib)
|
||
|
set(includedir ${CMAKE_INSTALL_PREFIX}/include)
|
||
|
|
||
|
set(VERSION ${EVENT_ABI_LIBVERSION})
|
||
|
|
||
|
set(LIBS "")
|
||
|
foreach (LIB ${LIB_PLATFORM})
|
||
|
set(LIBS "${LIBS} -L${LIB}")
|
||
|
endforeach()
|
||
|
|
||
|
set(OPENSSL_LIBS "")
|
||
|
foreach(LIB ${OPENSSL_LIBRARIES})
|
||
|
set(OPENSSL_LIBS "${OPENSSL_LIBS} -L${LIB}")
|
||
|
endforeach()
|
||
|
|
||
|
configure_file("lib${LIB_NAME}.pc.in" "lib${LIB_NAME}.pc" @ONLY)
|
||
|
install(
|
||
|
FILES "${CMAKE_CURRENT_BINARY_DIR}/lib${LIB_NAME}.pc"
|
||
|
DESTINATION "${CMAKE_INSTALL_PREFIX}/lib/pkgconfig"
|
||
|
)
|
||
|
endmacro()
|
||
|
|
||
|
# LIB_NAME maybe event_core, event_extra, event_openssl, event_pthreads or event.
|
||
|
# Targets whose LIB_NAME is not 'event' should be exported and installed.
|
||
|
macro(export_install_target TYPE LIB_NAME OUTER_INCLUDES)
|
||
|
if("${LIB_NAME}" STREQUAL "event")
|
||
|
install(TARGETS "${LIB_NAME}_${TYPE}"
|
||
|
LIBRARY DESTINATION "lib" COMPONENT lib
|
||
|
ARCHIVE DESTINATION "lib" COMPONENT lib
|
||
|
RUNTIME DESTINATION "lib" COMPONENT lib
|
||
|
COMPONENT dev
|
||
|
)
|
||
|
else()
|
||
|
string(REPLACE "event_" "" PURE_NAME ${LIB_NAME})
|
||
|
string(TOUPPER ${TYPE} UPPER_TYPE)
|
||
|
list(APPEND LIBEVENT_${UPPER_TYPE}_LIBRARIES "${PURE_NAME}")
|
||
|
set(OUTER_INCS)
|
||
|
if (NOT "${OUTER_INCLUDES}" STREQUAL "NONE")
|
||
|
set(OUTER_INCS ${OUTER_INCLUDES})
|
||
|
endif()
|
||
|
target_include_directories("${LIB_NAME}_${TYPE}"
|
||
|
PUBLIC "$<INSTALL_INTERFACE:include>"
|
||
|
"$<BUILD_INTERFACE:${PROJECT_SOURCE_DIR}/include>"
|
||
|
"$<BUILD_INTERFACE:${PROJECT_BINARY_DIR}/include>"
|
||
|
${OUTER_INCS}
|
||
|
)
|
||
|
set_target_properties("${LIB_NAME}_${TYPE}" PROPERTIES EXPORT_NAME ${PURE_NAME})
|
||
|
export(TARGETS "${LIB_NAME}_${TYPE}"
|
||
|
NAMESPACE ${PROJECT_NAME}::
|
||
|
FILE "${PROJECT_BINARY_DIR}/LibeventTargets-${TYPE}.cmake"
|
||
|
APPEND
|
||
|
)
|
||
|
install(TARGETS "${LIB_NAME}_${TYPE}"
|
||
|
EXPORT LibeventTargets-${TYPE}
|
||
|
LIBRARY DESTINATION "lib" COMPONENT lib
|
||
|
ARCHIVE DESTINATION "lib" COMPONENT lib
|
||
|
RUNTIME DESTINATION "lib" COMPONENT lib
|
||
|
COMPONENT dev
|
||
|
)
|
||
|
endif()
|
||
|
endmacro()
|
||
|
|
||
|
# Global variables that it uses:
|
||
|
# - EVENT_ABI_LIBVERSION
|
||
|
# - EVENT_ABI_LIBVERSION_CURRENT
|
||
|
# - EVENT_ABI_LIBVERSION_REVISION
|
||
|
# - EVENT_ABI_LIBVERSION_AGE
|
||
|
# - EVENT_PACKAGE_RELEASE
|
||
|
# - CMAKE_THREAD_LIBS_INIT LIB_PLATFORM
|
||
|
# - OPENSSL_LIBRARIES
|
||
|
# - EVENT_SHARED_FLAGS
|
||
|
# - EVENT_LIBRARY_STATIC
|
||
|
# - EVENT_LIBRARY_SHARED
|
||
|
#
|
||
|
# Exported variables:
|
||
|
# - LIBEVENT_SHARED_LIBRARIES
|
||
|
# - LIBEVENT_STATIC_LIBRARIES
|
||
|
macro(add_event_library LIB_NAME)
|
||
|
cmake_parse_arguments(LIB
|
||
|
"" # Options
|
||
|
"VERSION" # One val
|
||
|
"SOURCES;LIBRARIES;INNER_LIBRARIES;OUTER_INCLUDES" # Multi val
|
||
|
${ARGN}
|
||
|
)
|
||
|
|
||
|
if ("${LIB_OUTER_INCLUDES}" STREQUAL "")
|
||
|
set(LIB_OUTER_INCLUDES NONE)
|
||
|
endif()
|
||
|
set(ADD_EVENT_LIBRARY_INTERFACE)
|
||
|
|
||
|
if (${EVENT_LIBRARY_STATIC})
|
||
|
add_library("${LIB_NAME}_static" STATIC ${LIB_SOURCES})
|
||
|
set_target_properties("${LIB_NAME}_static" PROPERTIES
|
||
|
OUTPUT_NAME "${LIB_NAME}"
|
||
|
CLEAN_DIRECT_OUTPUT 1)
|
||
|
|
||
|
if(LIB_INNER_LIBRARIES)
|
||
|
set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_static")
|
||
|
endif()
|
||
|
target_link_libraries("${LIB_NAME}_static"
|
||
|
${CMAKE_THREAD_LIBS_INIT}
|
||
|
${LIB_PLATFORM}
|
||
|
${INNER_LIBRARIES}
|
||
|
${LIB_LIBRARIES})
|
||
|
|
||
|
export_install_target(static "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
|
||
|
|
||
|
set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_static")
|
||
|
endif()
|
||
|
|
||
|
if (${EVENT_LIBRARY_SHARED})
|
||
|
add_library("${LIB_NAME}_shared" SHARED ${LIB_SOURCES})
|
||
|
|
||
|
if(LIB_INNER_LIBRARIES)
|
||
|
set(INNER_LIBRARIES "${LIB_INNER_LIBRARIES}_shared")
|
||
|
endif()
|
||
|
target_link_libraries("${LIB_NAME}_shared"
|
||
|
${CMAKE_THREAD_LIBS_INIT}
|
||
|
${LIB_PLATFORM}
|
||
|
${INNER_LIBRARIES}
|
||
|
${LIB_LIBRARIES})
|
||
|
|
||
|
if (EVENT_SHARED_FLAGS)
|
||
|
set_event_shared_lib_flags("${LIB_NAME}" "${EVENT_SHARED_FLAGS}")
|
||
|
endif()
|
||
|
|
||
|
if (WIN32)
|
||
|
set_target_properties(
|
||
|
"${LIB_NAME}_shared" PROPERTIES
|
||
|
OUTPUT_NAME "${LIB_NAME}"
|
||
|
SOVERSION ${EVENT_ABI_LIBVERSION})
|
||
|
elseif (APPLE)
|
||
|
math(EXPR COMPATIBILITY_VERSION "${EVENT_ABI_LIBVERSION_CURRENT}+1")
|
||
|
math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
|
||
|
set_target_properties(
|
||
|
"${LIB_NAME}_shared" PROPERTIES
|
||
|
OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}.${CURRENT_MINUS_AGE}"
|
||
|
INSTALL_NAME_DIR "${CMAKE_INSTALL_PREFIX}/lib"
|
||
|
LINK_FLAGS "-compatibility_version ${COMPATIBILITY_VERSION} -current_version ${COMPATIBILITY_VERSION}.${EVENT_ABI_LIBVERSION_REVISION}")
|
||
|
else()
|
||
|
math(EXPR CURRENT_MINUS_AGE "${EVENT_ABI_LIBVERSION_CURRENT}-${EVENT_ABI_LIBVERSION_AGE}")
|
||
|
set_target_properties(
|
||
|
"${LIB_NAME}_shared" PROPERTIES
|
||
|
OUTPUT_NAME "${LIB_NAME}-${EVENT_PACKAGE_RELEASE}"
|
||
|
VERSION "${CURRENT_MINUS_AGE}.${EVENT_ABI_LIBVERSION_AGE}.${EVENT_ABI_LIBVERSION_REVISION}"
|
||
|
SOVERSION "${CURRENT_MINUS_AGE}"
|
||
|
INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
|
||
|
endif()
|
||
|
|
||
|
if (NOT WIN32)
|
||
|
set(LIB_LINK_NAME
|
||
|
"${CMAKE_SHARED_LIBRARY_PREFIX}${LIB_NAME}${CMAKE_SHARED_LIBRARY_SUFFIX}")
|
||
|
|
||
|
add_custom_command(TARGET ${LIB_NAME}_shared
|
||
|
POST_BUILD
|
||
|
COMMAND ${CMAKE_COMMAND} -E create_symlink
|
||
|
"$<TARGET_FILE_NAME:${LIB_NAME}_shared>"
|
||
|
"${LIB_LINK_NAME}"
|
||
|
WORKING_DIRECTORY "${CMAKE_LIBRARY_OUTPUT_DIRECTORY}")
|
||
|
endif()
|
||
|
|
||
|
export_install_target(shared "${LIB_NAME}" "${LIB_OUTER_INCLUDES}")
|
||
|
|
||
|
set(ADD_EVENT_LIBRARY_INTERFACE "${LIB_NAME}_shared")
|
||
|
|
||
|
if (NOT WIN32)
|
||
|
install(FILES
|
||
|
"$<TARGET_FILE_DIR:${LIB_NAME}_shared>/${LIB_LINK_NAME}"
|
||
|
DESTINATION "lib"
|
||
|
COMPONENT lib)
|
||
|
endif()
|
||
|
endif()
|
||
|
|
||
|
add_library(${LIB_NAME} INTERFACE)
|
||
|
target_link_libraries(${LIB_NAME} INTERFACE ${ADD_EVENT_LIBRARY_INTERFACE})
|
||
|
|
||
|
generate_pkgconfig("${LIB_NAME}")
|
||
|
endmacro()
|