From cb0aeacbf22571be03dec22bb94fb5e6184e9330 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20BOULMIER?= Date: Tue, 25 Jun 2019 01:21:31 -0400 Subject: [PATCH] refactoring find packages --- cmake/common/utils.cmake | 58 ++++++++++++++++++---------- cmake/modules/FindCairoFC.cmake | 30 +------------- cmake/modules/FindLibInotify.cmake | 29 ++------------ cmake/modules/FindLibMPDClient.cmake | 21 +--------- cmake/modules/FindLibNlGenl3.cmake | 16 +------- cmake/modules/FindLibPulse.cmake | 22 +---------- cmake/modules/FindLibiw.cmake | 5 +-- cmake/modules/FindXcb.cmake | 34 +++++----------- 8 files changed, 60 insertions(+), 155 deletions(-) diff --git a/cmake/common/utils.cmake b/cmake/common/utils.cmake index 71f2cf76..be9265a7 100644 --- a/cmake/common/utils.cmake +++ b/cmake/common/utils.cmake @@ -71,31 +71,47 @@ function(queryfont output_variable fontname) endfunction() # }}} -# querylib {{{ +# find_package_impl {{{ -function(querylib flag type pkg out_library out_include_dirs) - if(${flag}) - if(${type} STREQUAL "cmake") - find_package(${pkg} REQUIRED) - string(TOUPPER ${pkg} pkg_upper) - list(APPEND ${out_library} ${${pkg_upper}_LIBRARY}) - list(APPEND ${out_include_dirs} ${${pkg_upper}_INCLUDE_DIR}) - elseif(${type} STREQUAL "pkg-config") - find_package(PkgConfig REQUIRED) - pkg_check_modules(PKG_${flag} REQUIRED ${pkg}) +macro(find_package_impl pkg_config_name find_pkg_name header_to_find) + find_package(PkgConfig REQUIRED) + include(FindPackageHandleStandardArgs) - # Set packet version so that it can be used in the summary - set(${flag}_VERSION ${PKG_${flag}_VERSION} PARENT_SCOPE) - list(APPEND ${out_library} ${PKG_${flag}_LIBRARIES}) - list(APPEND ${out_include_dirs} ${PKG_${flag}_INCLUDE_DIRS}) - else() - message(FATAL_ERROR "Invalid lookup type '${type}'") - endif() - set(${out_library} ${${out_library}} PARENT_SCOPE) - set(${out_include_dirs} ${${out_include_dirs}} PARENT_SCOPE) + pkg_check_modules(PC_${find_pkg_name} REQUIRED ${pkg_config_name}) + + if (NOT ${header_to_find} STREQUAL "") + find_path(PC_${find_pkg_name}_INCLUDE_DIRS_ + NAMES "${header_to_find}" + HINTS "${PC_${find_pkg_name}_INCLUDE_DIRS}" + ) + set(PC_${find_pkg_name}_INCLUDE_DIRS ${PC_${find_pkg_name}_INCLUDE_DIRS_}) endif() -endfunction() + set(${find_pkg_name}_INCLUDE_DIR ${PC_${find_pkg_name}_INCLUDE_DIRS}) + set(${find_pkg_name}_INCLUDE_DIRS ${${find_pkg_name}_INCLUDE_DIR}) + set(${find_pkg_name}_LIBRARY ${PC_${find_pkg_name}_LIBRARIES}) + set(${find_pkg_name}_LIBRARIES ${${find_pkg_name}_LIBRARY}) + + find_package_handle_standard_args(${find_pkg_name} + REQUIRED_VARS + ${find_pkg_name}_INCLUDE_DIRS + ${find_pkg_name}_LIBRARIES + VERSION_VAR + PC_${find_pkg_name}_VERSION + ) + + mark_as_advanced(${find_pkg_name}_INCLUDE_DIR ${find_pkg_name}_LIBRARY) +endmacro() + +# }}} +# create_imported_target {{{ +function(create_imported_target library_name includes libraries) + add_library(${library_name} INTERFACE IMPORTED) + set_target_properties(${library_name} PROPERTIES + INTERFACE_LINK_LIBRARIES "${libraries}" + ) + target_include_directories(${library_name} SYSTEM INTERFACE ${includes}) +endfunction() # }}} # checklib {{{ diff --git a/cmake/modules/FindCairoFC.cmake b/cmake/modules/FindCairoFC.cmake index f18d7626..febbe52e 100644 --- a/cmake/modules/FindCairoFC.cmake +++ b/cmake/modules/FindCairoFC.cmake @@ -1,31 +1,5 @@ -find_package(PkgConfig REQUIRED) -include(CMakeFindDependencyMacro) - -pkg_check_modules(PC_CairoFC QUIET cairo-fc) - -set(CairoFC_INCLUDE_DIR ${PC_CairoFC_INCLUDE_DIRS}) -set(CairoFC_LIBRARY ${PC_CairoFC_LIBRARIES}) - -include(FindPackageHandleStandardArgs) -# handle the QUIETLY and REQUIRED arguments and set CairoFC_FOUND to TRUE -# if all listed variables are TRUE -find_package_handle_standard_args(CairoFC - REQUIRED_VARS - CairoFC_INCLUDE_DIR - CairoFC_LIBRARY - VERSION_VAR - PC_CairoFC_VERSION) -message(STATUS "${CairoFC}") - -mark_as_advanced(CairoFC_INCLUDE_DIR CairoFC_LIBRARY) - -set(CairoFC_LIBRARIES ${CairoFC_LIBRARY}) -set(CairoFC_INCLUDE_DIRS ${CairoFC_INCLUDE_DIR}) +find_package_impl("cairo-fc" "CairoFC" "") if(CairoFC_FOUND AND NOT TARGET Cairo::CairoFC) - add_library(Cairo::CairoFC INTERFACE IMPORTED) - set_target_properties(Cairo::CairoFC PROPERTIES - INTERFACE_INCLUDE_DIRECTORIES "${CairoFC_INCLUDE_DIRS}" - INTERFACE_LINK_LIBRARIES "${CairoFC_LIBRARIES}" - ) + create_imported_target("Cairo::CairoFC" "${CairoFC_INCLUDE_DIR}" "${CairoFC_LIBRARY}") endif() diff --git a/cmake/modules/FindLibInotify.cmake b/cmake/modules/FindLibInotify.cmake index 038a1c8b..8434914d 100644 --- a/cmake/modules/FindLibInotify.cmake +++ b/cmake/modules/FindLibInotify.cmake @@ -1,26 +1,5 @@ -function(libinotify) - find_package(PkgConfig REQUIRED) - pkg_check_modules(PC_LibInotify QUIET libinotify) +find_package_impl("libinotify" "LibInotify" "") - include(FindPackageHandleStandardArgs) - - find_path(LibInotify_INCLUDES - NAMES netlink/version.h - HINTS ${PC_LibInotify_INCLUDEDIR} ${PC_LibInotify_INCLUDE_DIRS} - ) - - find_package_handle_standard_args(LibInotify - REQUIRED_VARS PC_LibInotify_INCLUDE_DIRS - VERSION_VAR PC_LibInotify_VERSION - ) - - if(LibInotify_FOUND AND NOT TARGET LibInotify::LibInotify) - add_library(LibInotify::LibInotify INTERFACE IMPORTED) - set_target_properties(LibInotify::LibInotify PROPERTIES - INTERFACE_LINK_LIBRARIES "${PC_LibInotify_LIBRARIES}") - - target_include_directories(LibInotify::LibInotify SYSTEM INTERFACE ${LibInotify_INCLUDES}) - endif() -endfunction() - -libinotify() +if(LibInotify_FOUND AND NOT TARGET LibInotify::LibInotify) + create_imported_target("LibInotify::LibInotify" "${LibInotify_INCLUDE_DIR}" "${LibInotify_LIBRARY}") +endif() diff --git a/cmake/modules/FindLibMPDClient.cmake b/cmake/modules/FindLibMPDClient.cmake index 1599a4fe..a4e430bb 100644 --- a/cmake/modules/FindLibMPDClient.cmake +++ b/cmake/modules/FindLibMPDClient.cmake @@ -1,22 +1,5 @@ -find_package(PkgConfig REQUIRED) -pkg_check_modules(PC_LibMPDClient QUIET libmpdclient) - -include(FindPackageHandleStandardArgs) - -find_path(LibMPDClient_INCLUDES - NAMES mpd/player.h - HINTS ${PC_LibMPDClient_INCLUDEDIR} ${PC_LibMPDClient_INCLUDE_DIRS} - ) - -find_package_handle_standard_args(LibMPDClient - REQUIRED_VARS LibMPDClient_INCLUDES - VERSION_VAR PC_LibMPDClient_VERSION - ) +find_package_impl("libmpdclient" "LibMPDClient" "mpd/player.h") if(LibMPDClient_FOUND AND NOT TARGET LibMPDClient::LibMPDClient) - add_library(LibMPDClient::LibMPDClient INTERFACE IMPORTED) - set_target_properties(LibMPDClient::LibMPDClient PROPERTIES - INTERFACE_LINK_LIBRARIES "${PC_LibMPDClient_LIBRARIES}") - - target_include_directories(LibMPDClient::LibMPDClient SYSTEM INTERFACE ${LibMPDClient_INCLUDES}) + create_imported_target("LibMPDClient::LibMPDClient" "${LibMPDClient_INCLUDE_DIR}" "${LibMPDClient_LIBRARY}") endif() diff --git a/cmake/modules/FindLibNlGenl3.cmake b/cmake/modules/FindLibNlGenl3.cmake index 1a86972c..879399f5 100644 --- a/cmake/modules/FindLibNlGenl3.cmake +++ b/cmake/modules/FindLibNlGenl3.cmake @@ -1,17 +1,5 @@ -find_package(PkgConfig REQUIRED) -pkg_check_modules(PC_LibNlGenl3 QUIET libnl-genl-3.0) - -include(FindPackageHandleStandardArgs) - -find_package_handle_standard_args(LibNlGenl3 - REQUIRED_VARS PC_LibNlGenl3_INCLUDE_DIRS - VERSION_VAR PC_LibNlGenl3_VERSION -) +find_package_impl("libnl-genl-3.0" "LibNlGenl3" "") if(LibNlGenl3_FOUND AND NOT TARGET LibNlGenl3::LibNlGenl3) - add_library(LibNlGenl3::LibNlGenl3 INTERFACE IMPORTED) - - set_target_properties(LibNlGenl3::LibNlGenl3 PROPERTIES - INTERFACE_LINK_LIBRARIES "${PC_LibNlGenl3_LIBRARIES}") - target_include_directories(LibNlGenl3::LibNlGenl3 SYSTEM INTERFACE ${PC_LibNlGenl3_INCLUDE_DIRS}) + create_imported_target("LibNlGenl3::LibNlGenl3" "${LibNlGenl3_INCLUDE_DIR}" "${LibNlGenl3_LIBRARY}") endif() diff --git a/cmake/modules/FindLibPulse.cmake b/cmake/modules/FindLibPulse.cmake index a15ac00f..7a84604d 100644 --- a/cmake/modules/FindLibPulse.cmake +++ b/cmake/modules/FindLibPulse.cmake @@ -1,23 +1,5 @@ - -find_package(PkgConfig REQUIRED) -pkg_check_modules(PC_LibPulse QUIET libpulse) - -include(FindPackageHandleStandardArgs) - -find_path(LibPulse_INCLUDES - NAMES pulse/version.h - HINTS ${PC_LibPulse_INCLUDEDIR} ${PC_LibPulse_INCLUDE_DIRS} -) - -find_package_handle_standard_args(LibPulse - REQUIRED_VARS LibPulse_INCLUDES - VERSION_VAR PC_LibPulse_VERSION -) +find_package_impl("libpulse" "LibPulse" "pulse/version.h") if(LibPulse_FOUND AND NOT TARGET LibPulse::LibPulse) - add_library(LibPulse::LibPulse INTERFACE IMPORTED) - set_target_properties(LibPulse::LibPulse PROPERTIES - INTERFACE_LINK_LIBRARIES "${PC_LibPulse_LIBRARIES}") - - target_include_directories(LibPulse::LibPulse SYSTEM INTERFACE ${LibPulse_INCLUDES}) + create_imported_target("LibPulse::LibPulse" "${LibPulse_INCLUDE_DIR}" "${LibPulse_LIBRARY}") endif() diff --git a/cmake/modules/FindLibiw.cmake b/cmake/modules/FindLibiw.cmake index bab2adb9..43405e0b 100644 --- a/cmake/modules/FindLibiw.cmake +++ b/cmake/modules/FindLibiw.cmake @@ -17,8 +17,5 @@ find_package_handle_standard_args(Libiw DEFAULT_MSG LIBIW_LIBRARY LIBIW_INCLUDE_ mark_as_advanced(LIBIW_INCLUDE_DIR LIBIW_LIBRARY) if(Libiw_FOUND AND NOT TARGET Libiw::Libiw) - add_library(Libiw::Libiw INTERFACE IMPORTED) - set_target_properties(Libiw::Libiw PROPERTIES - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${LIBIW_INCLUDE_DIR}" - INTERFACE_LINK_LIBRARIES "${LIBIW_LIBRARY}") + create_imported_target("Libiw::Libiw" "${LIBIW_INCLUDE_DIR}" "${LIBIW_LIBRARIES}") endif() diff --git a/cmake/modules/FindXcb.cmake b/cmake/modules/FindXcb.cmake index b04e3158..78e07239 100644 --- a/cmake/modules/FindXcb.cmake +++ b/cmake/modules/FindXcb.cmake @@ -1,6 +1,4 @@ -cmake_policy(PUSH) -cmake_policy(SET CMP0057 NEW) - +# This script only supports the following components of XCB set(XCB_known_components XCB RANDR @@ -9,44 +7,32 @@ set(XCB_known_components XRM CURSOR) +# Deducing header from the name of the component foreach(_comp ${XCB_known_components}) string(TOLOWER "${_comp}" _lc_comp) set(XCB_${_comp}_pkg_config "xcb-${_lc_comp}") set(XCB_${_comp}_header "xcb/${_lc_comp}.h") endforeach() +# Exception cases set(XCB_XRM_header "xcb/xcb_xrm.h") set(XCB_CURSOR_header "xcb/xcb_cursor.h") -find_package(PkgConfig REQUIRED) -include(FindPackageHandleStandardArgs) +cmake_policy(PUSH) +cmake_policy(SET CMP0057 NEW) foreach(_comp ${Xcb_FIND_COMPONENTS}) if (NOT ${_comp} IN_LIST XCB_known_components) cmake_policy(POP) - message(FATAL_ERROR "Unknow component ${_comp} for XCB") + message(FATAL_ERROR "Unknow component \"${_comp}\" of XCB") endif() - pkg_check_modules(PC_${_comp} QUIET ${XCB_${_comp}_pkg_config}) - - find_path(${_comp}_INCLUDES_DIRS - NAMES "${XCB_${_comp}_header}" - HINTS ${PC_${_comp}_INCLUDEDIR} ${PC_${_comp}_INCLUDE_DIRS} - ) - - find_package_handle_standard_args(Xcb_${_comp} - REQUIRED_VARS ${_comp}_INCLUDES_DIRS - VERSION_VAR PC_${_comp}_VERSION - HANDLE_COMPONENTS - ) + find_package_impl(${XCB_${_comp}_pkg_config} "Xcb_${_comp}" "${XCB_${_comp}_header}") if(Xcb_${_comp}_FOUND AND NOT TARGET Xcb::${_comp}) - add_library(Xcb::${_comp} INTERFACE IMPORTED) - set_target_properties(Xcb::${_comp} PROPERTIES - INTERFACE_SYSTEM_INCLUDE_DIRECTORIES "${_comp}_INCLUDES" - INTERFACE_LINK_LIBRARIES "${PC_${_comp}_LIBRARIES}" - ) + create_imported_target("Xcb::${_comp}" "${Xcb_${_comp}_INCLUDE_DIRS}" "${Xcb_${_comp}_LIBRARIES}") elseif(NOT Xcb_${_comp}_FOUND AND Xcb_FIND_REQUIRED) - message(FATAL_ERROR "Xcb: Required component \"${component}\" is not found") + cmake_policy(POP) + message(FATAL_ERROR "Xcb: Required component \"${_comp}\" is not found") endif() endforeach()