mirror of
https://github.com/libevent/libevent.git
synced 2025-01-31 09:12:55 +08:00
1675a55620
The current cmake/LibeventConfig.cmake.in has a few problems and I'm not sure how cleanly developed it is. It seems rater complex for the little things I would assume it needs to do. I found two problems that are fixed in this PR: - If the downstream user does not explicitly set LIBEVENT_STATIC_LINK before calling find_package(libevent) then they will not be able to detect the static library, even if its the only one that exists. Since this may be rather strict, I've changed the behavior so that LIBEVENT_STATIC_LINK can be set to ON or OFF, but if unset, it defaults to whatever configuration libevent was built as. - The other problem is a bug. The package configuration needs to unset CMAKE_FIND_LIBRARY_SUFFIXES after use, otherwise all packages that are detected after libevent will be "infected" by this setting. This was a significant problem for us, and is very hard to detect in downstream project, because the order of dependencies will lead to different search results.
184 lines
7.0 KiB
CMake
184 lines
7.0 KiB
CMake
# - Config file for the Libevent package
|
|
# It defines the following variables
|
|
# LIBEVENT_FOUND - true if libevent and all required components found on the system
|
|
# LIBEVENT_xxx_FOUND - true if component xxx(see available components) found on the system
|
|
# LIBEVENT_VERSION - libevent version in format Major.Minor.Patch
|
|
# LIBEVENT_INCLUDE_DIRS - directories where libevent header is located.
|
|
# LIBEVENT_INCLUDE_DIR - same as DIRS
|
|
# LIBEVENT_LIBRARIES - libevent library to link against.
|
|
# LIBEVENT_LIBRARY - same as LIBRARIES
|
|
#
|
|
# These variables are deprecated, don't use them.
|
|
# LIBEVENT_STATIC_LIBRARIES - libraries to link against (archive/static)
|
|
# LIBEVENT_SHARED_LIBRARIES - libraries to link against (shared)
|
|
#
|
|
# When you try to locate the libevent libraries, you should specify which components you want to use.
|
|
# The following table lists all available components. If none is given, all imported targets will used.
|
|
# core - the core functons of libevent
|
|
# extra - extra functions, contains http, dns and rpc
|
|
# pthreads - multiple threads for libevent, not exists on Windows
|
|
# openssl - openssl support for libevent
|
|
#
|
|
# By default, the shared libraries of libevent will be found. To find the static ones instead,
|
|
# you must set the LIBEVENT_STATIC_LINK variable to TRUE before calling find_package(Libevent ...).
|
|
# If no component provided, all components will be used.
|
|
# example:
|
|
# set(LIBEVENT_STATIC_LINK TRUE)
|
|
# find_package(Libevent 2.2 REQUIRED COMPONENTS core)
|
|
# include_directories(${LIBEVENT_INCLUDE_DIRS}) # Can be omitted
|
|
# target_link_libraries(myapp ${LIBEVENT_LIBRARIES})
|
|
# or target_link_libraries(myapp libevent::core)
|
|
#
|
|
# find_package() can handle dependencies automatically. For example, given the 'openssl' component,
|
|
# all dependencies (libevent_core, libssl, libcrypto and openssl include directories) will be found.
|
|
|
|
set(CONFIG_FOR_INSTALL_TREE @CONFIG_FOR_INSTALL_TREE@)
|
|
|
|
set(LIBEVENT_VERSION @EVENT_PACKAGE_VERSION@)
|
|
|
|
# IMPORTED targets from LibeventTargets.cmake
|
|
set(LIBEVENT_STATIC_LIBRARIES "@LIBEVENT_STATIC_LIBRARIES@")
|
|
set(LIBEVENT_SHARED_LIBRARIES "@LIBEVENT_SHARED_LIBRARIES@")
|
|
|
|
# Default to the same type as libevent was built:
|
|
if(NOT DEFINED LIBEVENT_STATIC_LINK)
|
|
set(LIBEVENT_STATIC_LINK NOT @BUILD_SHARED_LIBS@)
|
|
endif()
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES_SAVE "${CMAKE_FIND_LIBRARY_SUFFIXES}")
|
|
if(LIBEVENT_STATIC_LINK)
|
|
set(_LIB_TYPE static)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_STATIC_LIBRARY_SUFFIX})
|
|
set(_AVAILABLE_LIBS "${LIBEVENT_STATIC_LIBRARIES}")
|
|
else()
|
|
set(_LIB_TYPE shared)
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_SHARED_LIBRARY_SUFFIX})
|
|
set(_AVAILABLE_LIBS "${LIBEVENT_SHARED_LIBRARIES}")
|
|
endif()
|
|
|
|
# Get the path of the current file.
|
|
get_filename_component(LIBEVENT_CMAKE_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
|
|
get_filename_component(_INSTALL_PREFIX "${LIBEVENT_CMAKE_DIR}/../../.." ABSOLUTE)
|
|
|
|
macro(message_if_needed _flag _msg)
|
|
if (NOT ${CMAKE_FIND_PACKAGE_NAME}_FIND_QUIETLY)
|
|
message(${_flag} "${_msg}")
|
|
endif()
|
|
endmacro()
|
|
|
|
macro(no_component_msg _comp)
|
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED_${_comp})
|
|
set(pthreadlib)
|
|
if(NOT WIN32)
|
|
set(pthreadlib ", pthreads")
|
|
endif()
|
|
message(FATAL_ERROR "Your libevent library does not contain a ${_comp} component!\n"
|
|
"The valid components are core, extra${pthreadlib} and openssl.")
|
|
else()
|
|
message_if_needed(WARNING "Your libevent library does not contain a ${_comp} component!")
|
|
endif()
|
|
endmacro()
|
|
|
|
set(_EVENT_COMPONENTS)
|
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
|
|
list(REMOVE_DUPLICATES ${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS)
|
|
foreach(_comp ${${CMAKE_FIND_PACKAGE_NAME}_FIND_COMPONENTS})
|
|
list(FIND _AVAILABLE_LIBS ${_comp} _INDEX)
|
|
if(_INDEX GREATER -1)
|
|
list(APPEND _EVENT_COMPONENTS ${_comp})
|
|
else()
|
|
no_component_msg(${_comp})
|
|
endif()
|
|
endforeach()
|
|
else()
|
|
set(_EVENT_COMPONENTS ${_AVAILABLE_LIBS})
|
|
endif()
|
|
|
|
set(_POSSIBLE_PKG_NAMES)
|
|
list(APPEND _POSSIBLE_PKG_NAMES ${CMAKE_FIND_PACKAGE_NAME} LIBEVENT Libevent libevent)
|
|
list(REMOVE_DUPLICATES _POSSIBLE_PKG_NAMES)
|
|
|
|
macro(set_case_insensitive_found _comp)
|
|
foreach(name ${_POSSIBLE_PKG_NAMES})
|
|
if("${_comp}" STREQUAL "")
|
|
set(${name}_FOUND TRUE)
|
|
set(${name}_NOTFOUND FALSE)
|
|
else()
|
|
set(${name}_${_comp}_FOUND TRUE)
|
|
set(${name}_${_comp}_NOTFOUND FALSE)
|
|
endif()
|
|
endforeach()
|
|
endmacro()
|
|
|
|
if(CONFIG_FOR_INSTALL_TREE)
|
|
## Config for install tree ----------------------------------------
|
|
# Find includes
|
|
unset(_event_h CACHE)
|
|
find_path(_event_h
|
|
NAMES event2/event.h
|
|
PATHS "${_INSTALL_PREFIX}/include"
|
|
NO_DEFAULT_PATH)
|
|
if(_event_h)
|
|
set(LIBEVENT_INCLUDE_DIRS "${_event_h}")
|
|
message_if_needed(STATUS "Found libevent include directory: ${_event_h}")
|
|
else()
|
|
message_if_needed(WARNING "Your libevent library does not contain header files!")
|
|
endif()
|
|
|
|
# Find libraries
|
|
macro(find_event_lib _comp)
|
|
unset(_event_lib CACHE)
|
|
find_library(_event_lib
|
|
NAMES "event_${_comp}"
|
|
PATHS "${_INSTALL_PREFIX}/lib"
|
|
NO_DEFAULT_PATH)
|
|
if(_event_lib)
|
|
list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}")
|
|
set_case_insensitive_found(${_comp})
|
|
message_if_needed(STATUS "Found libevent component: ${_event_lib}")
|
|
else()
|
|
no_component_msg(${_comp})
|
|
endif()
|
|
endmacro()
|
|
|
|
foreach(comp ${_EVENT_COMPONENTS})
|
|
find_event_lib(${comp})
|
|
endforeach()
|
|
else()
|
|
## Config for build tree ----------------------------------------
|
|
set(LIBEVENT_INCLUDE_DIRS "@EVENT__INCLUDE_DIRS@")
|
|
foreach(_comp ${_EVENT_COMPONENTS})
|
|
list(APPEND LIBEVENT_LIBRARIES "libevent::${_comp}")
|
|
set_case_insensitive_found(${_comp})
|
|
endforeach()
|
|
endif()
|
|
|
|
set(LIBEVENT_INCLUDE_DIR ${LIBEVENT_INCLUDE_DIRS})
|
|
if(LIBEVENT_LIBRARIES)
|
|
set(LIBEVENT_LIBRARY ${LIBEVENT_LIBRARIES})
|
|
if(CONFIG_FOR_INSTALL_TREE)
|
|
message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${_INSTALL_PREFIX}")
|
|
else()
|
|
message_if_needed(STATUS "Found libevent ${LIBEVENT_VERSION} in ${LIBEVENT_CMAKE_DIR}")
|
|
endif()
|
|
|
|
# Avoid including targets more than one times
|
|
if(NOT TARGET event_core_${_LIB_TYPE})
|
|
# Include the project Targets file, this contains definitions for IMPORTED targets.
|
|
include(${LIBEVENT_CMAKE_DIR}/LibeventTargets-${_LIB_TYPE}.cmake)
|
|
endif()
|
|
else()
|
|
if(${CMAKE_FIND_PACKAGE_NAME}_FIND_REQUIRED)
|
|
message(FATAL_ERROR "Can not find any libraries for libevent.")
|
|
else()
|
|
message_if_needed(WARNING "Can not find any libraries for libevent.")
|
|
endif()
|
|
endif()
|
|
|
|
set(CMAKE_FIND_LIBRARY_SUFFIXES "${CMAKE_FIND_LIBRARY_SUFFIXES_SAVE}")
|
|
unset(_LIB_TYPE)
|
|
unset(_AVAILABLE_LIBS)
|
|
unset(_EVENT_COMPONENTS)
|
|
unset(_POSSIBLE_PKG_NAMES)
|
|
unset(_INSTALL_PREFIX)
|