diff options
Diffstat (limited to 'cmake/ProcessPackage.cmake')
-rw-r--r-- | cmake/ProcessPackage.cmake | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/cmake/ProcessPackage.cmake b/cmake/ProcessPackage.cmake new file mode 100644 index 0000000..a46fd85 --- /dev/null +++ b/cmake/ProcessPackage.cmake @@ -0,0 +1,122 @@ +# Process required package by using FindPackage and calling for INCLUDE_DIRECTORIES and +# setting list of required libraries +# Usage: +# ProcessPackage(VAR [OPTIONAL] [ROOT path] [INCLUDE path] +# [LIBRARY path] [INCLUDE_SUFFIXES path1 path2 ...] [LIB_SUFFIXES path1 path2 ...] +# [MODULES module1 module2 ...]) +# params: +# OPTIONAL - do not fail if a package has not been found +# ROOT - defines root directory for a package +# INCLUDE - name of the include file to check +# LIBRARY - name of the library to check +# INCLUDE_SUFFIXES - list of include suffixes (relative to ROOT) +# LIB_SUFFIXES - list of library suffixes +# MODULES - modules to search using pkg_config +MACRO(ProcessPackage PKG_NAME) + + CMAKE_PARSE_ARGUMENTS(PKG "OPTIONAL;OPTIONAL_INCLUDE" "ROOT;INCLUDE" + "LIBRARY;INCLUDE_SUFFIXES;LIB_SUFFIXES;MODULES;LIB_OUTPUT" ${ARGN}) + + IF(NOT PKG_LIBRARY) + SET(PKG_LIBRARY "${PKG_NAME}") + ENDIF() + IF(NOT PKG_INCLUDE) + SET(PKG_INCLUDE "${PKG_NAME}.h") + ENDIF() + IF(NOT PKG_LIB_OUTPUT) + SET(PKG_LIB_OUTPUT RSPAMD_REQUIRED_LIBRARIES) + ENDIF() + + IF(NOT PKG_ROOT AND PKG_MODULES) + PKG_SEARCH_MODULE(${PKG_NAME} ${PKG_MODULES}) + ENDIF() + + IF(${PKG_NAME}_FOUND) + MESSAGE(STATUS "Found package ${PKG_NAME} in pkg-config modules ${PKG_MODULES}") + SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "") + IF(ENABLE_STATIC MATCHES "ON") + SET(_XPREFIX "${PKG_NAME}_STATIC") + ELSE(ENABLE_STATIC MATCHES "ON") + SET(_XPREFIX "${PKG_NAME}") + ENDIF(ENABLE_STATIC MATCHES "ON") + FOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS}) + INCLUDE_DIRECTORIES("${_arg}") + SET(${PKG_NAME}_INCLUDE "${_arg}" CACHE INTERNAL "") + ENDFOREACH(_arg ${${_XPREFIX}_INCLUDE_DIRS}) + FOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS}) + LINK_DIRECTORIES("${_arg}") + SET(${PKG_NAME}_LIBRARY_PATH "${_arg}" CACHE INTERNAL "") + ENDFOREACH(_arg ${${_XPREFIX}_LIBRARY_DIRS}) + # Handle other CFLAGS and LDFLAGS + FOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER}) + SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${_arg}") + SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${_arg}") + ENDFOREACH(_arg ${${_XPREFIX}_CFLAGS_OTHER}) + FOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER}) + SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${_arg}") + ENDFOREACH(_arg ${${_XPREFIX}_LDFLAGS_OTHER}) + LIST(APPEND ${PKG_LIB_OUTPUT} "${${_XPREFIX}_LIBRARIES}") + INCLUDE_DIRECTORIES(${${_XPREFIX}_INCLUDEDIR}) + ELSE() + IF(NOT ${PKG_NAME}_GUESSED) + # Try some more heuristic + FIND_LIBRARY(_lib NAMES ${PKG_LIBRARY} + HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH} + PATH_SUFFIXES ${PKG_LIB_SUFFIXES} lib64 lib + PATHS ${RSPAMD_DEFAULT_LIBRARY_PATHS}) + IF(NOT _lib) + IF(PKG_OPTIONAL) + MESSAGE(STATUS "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}, ignoring") + ELSE() + MESSAGE(FATAL_ERROR "Cannot find library ${PKG_LIBRARY} for package ${PKG_NAME}") + ENDIF() + ENDIF(NOT _lib) + + FIND_PATH(_incl ${PKG_INCLUDE} + HINTS ${PKG_ROOT} ${RSPAMD_SEARCH_PATH} + PATH_SUFFIXES ${PKG_INCLUDE_SUFFIXES} include + PATHS {RSPAMD_DEFAULT_INCLUDE_PATHS}) + IF(NOT _incl) + IF(PKG_OPTIONAL OR PKG_OPTIONAL_INCLUDE) + MESSAGE(STATUS "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}") + ELSE() + MESSAGE(FATAL_ERROR "Cannot find header ${PKG_INCLUDE} for package ${PKG_NAME}") + ENDIF() + ELSE() + STRING(REGEX REPLACE "/[^/]+$" "" _incl_path "${PKG_INCLUDE}") + STRING(REGEX REPLACE "${_incl_path}/$" "" _stripped_incl "${_incl}") + INCLUDE_DIRECTORIES("${_stripped_incl}") + SET(${PKG_NAME}_INCLUDE "${_stripped_incl}" CACHE INTERNAL "") + ENDIF(NOT _incl) + + IF(_lib) + # We need to apply heuristic to find the real dir name + GET_FILENAME_COMPONENT(_lib_path "${_lib}" PATH) + LINK_DIRECTORIES("${_lib_path}") + LIST(APPEND ${PKG_LIB_OUTPUT} ${_lib}) + SET(${PKG_NAME}_LIBRARY_PATH "${_lib_path}" CACHE INTERNAL "") + SET(${PKG_NAME}_LIBRARY "${_lib}" CACHE INTERNAL "") + ENDIF() + + IF(_incl AND _lib) + MESSAGE(STATUS "Found package ${PKG_NAME} in '${_lib_path}' (${_lib}) and '${_stripped_incl}' (${PKG_INCLUDE}).") + SET(${PKG_NAME}_GUESSED 1 CACHE INTERNAL "") + SET(WITH_${PKG_NAME} 1 CACHE INTERNAL "") + ELSEIF(_lib) + IF(PKG_OPTIONAL_INCLUDE) + SET(${PKG_NAME}_GUESSED 1 INTERNAL "") + SET(WITH_${PKG_NAME} 1 INTERNAL "") + ENDIF() + MESSAGE(STATUS "Found incomplete package ${PKG_NAME} in '${_lib_path}' (${_lib}); no includes.") + ENDIF() + ELSE() + MESSAGE(STATUS "Found package ${PKG_NAME} (cached)") + INCLUDE_DIRECTORIES("${${PKG_NAME}_INCLUDE}") + LINK_DIRECTORIES("${${PKG_NAME}_LIBRARY_PATH}") + LIST(APPEND ${PKG_LIB_OUTPUT} "${${PKG_NAME}_LIBRARY}") + ENDIF() + ENDIF(${PKG_NAME}_FOUND) + + UNSET(_lib CACHE) + UNSET(_incl CACHE) +ENDMACRO(ProcessPackage name)
\ No newline at end of file |