cmake/search_libs.cmake

64 lines
2.5 KiB
CMake

###############################################################################
## Search a (possibly empty) list of libraries for the library required to link
## against a given (extern C) symbol. Pass the list of libraries as variadic
## arguments to the macro.
##
## Operates analogously to autoconfs AC_SEARCH_LIBS.
##
## If the symbol is found the variable provided will be set to the required
## library, or cleared for no library. Sets variable_FOUND to true if the
## symbol was discovered in some capacity (to differentiate between no library
## required, and the symbol not being found)
##
## Does not work for C++ symbols.
set(_SEARCH_LIBS_LIST_DIR ${CMAKE_CURRENT_LIST_DIR})
macro(search_libs _variable _symbol)
if (NOT DEFINED __search_libs_${_symbol})
message (STATUS "searching for ${_symbol}")
if (NOT DEFINED __search_libs_${_symbol}_lib)
try_compile(
__search_libs_${_symbol}
"${CMAKE_BINARY_DIR}/CMakeTmp"
SOURCES
"${_SEARCH_LIBS_LIST_DIR}/search_libs.cpp"
COMPILE_DEFINITIONS
"-DSYMBOL=${_symbol}")
if (__search_libs_${_symbol})
set (__search_libs_${_symbol}_lib CACHE INTERNAL "library exposing ${_symbol}")
else ()
foreach (lib ${ARGN})
if (NOT __search_libs_${_symbol})
message (STATUS "searching for ${_symbol} in ${lib}")
try_compile(
__search_libs_${_symbol}
"${CMAKE_BINARY_DIR}/CMakeTmp"
SOURCES
"${_SEARCH_LIBS_LIST_DIR}/search_libs.cpp"
LINK_LIBRARIES
"${lib}"
COMPILE_DEFINITIONS
"-DSYMBOL=${_symbol}")
if (__search_libs_${_symbol})
set (__search_libs_${_symbol}_lib ${lib} CACHE INTERNAL "library exposing ${_symbol}")
endif ()
endif ()
endforeach()
endif ()
endif ()
if (__search_libs_${_symbol})
message (STATUS "searching for ${_symbol} - found")
else ()
message (STATUS "searching for ${_symbol} - not found")
endif()
endif ()
set (${_variable}_FOUND ${__search_libs_${_symbol}})
set (${_variable} ${__search_libs_${_symbol}_lib})
endmacro()