From 13ebedca3d66e8e07e1481028c36dc19334e4b4e Mon Sep 17 00:00:00 2001 From: Christian Tacke <58549698+ChristianTackeGSI@users.noreply.github.com> Date: Fri, 9 Apr 2021 13:48:20 +0200 Subject: [PATCH] Extract find_package2 into own File To make it easier to share find_package2 across projects let's move it into its own file. --- CMakeLists.txt | 1 + cmake/FairFindPackage2.cmake | 102 +++++++++++++++++++++++++++++++++++ cmake/FairLoggerLib.cmake | 95 -------------------------------- 3 files changed, 103 insertions(+), 95 deletions(-) create mode 100644 cmake/FairFindPackage2.cmake diff --git a/CMakeLists.txt b/CMakeLists.txt index dc8d2dc..a5b4886 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,6 +12,7 @@ cmake_policy(VERSION 3.9...3.19) # Project ###################################################################### set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) include(FairLoggerLib) +include(FairFindPackage2) get_git_version() diff --git a/cmake/FairFindPackage2.cmake b/cmake/FairFindPackage2.cmake new file mode 100644 index 0000000..32307e3 --- /dev/null +++ b/cmake/FairFindPackage2.cmake @@ -0,0 +1,102 @@ +################################################################################ +# Copyright (C) 2018-2021 GSI Helmholtzzentrum fuer Schwerionenforschung GmbH # +# # +# This software is distributed under the terms of the # +# GNU Lesser General Public Licence (LGPL) version 3, # +# copied verbatim in the file "LICENSE" # +################################################################################ + +# +# find_package2(PRIVATE|PUBLIC|INTERFACE +# [VERSION ] +# [COMPONENTS ] +# [ADD_REQUIREMENTS_OF ] +# [any other option the native find_package supports]...) +# +# Wrapper around CMake's native find_package command to add some features and bookkeeping. +# +# The qualifier (PRIVATE|PUBLIC|INTERFACE) to the package to populate +# the variables PROJECT_[INTERFACE]__([VERSION]|[COMPONENTS]|PACKAGE_DEPENDENCIES) +# accordingly. This bookkeeping information is used to print our dependency found summary +# table and to generate a part of our CMake package. +# +# When a dependending package is listed with ADD_REQUIREMENTS_OF the variables +# __VERSION|COMPONENTS are looked up to and added to the native +# VERSION (selected highest version) and COMPONENTS (deduplicated) args. +# +# COMPONENTS and VERSION args are then just passed to the native find_package. +# +macro(find_package2 qualifier pkgname) + cmake_parse_arguments(ARGS "" "VERSION" "COMPONENTS;ADD_REQUIREMENTS_OF" ${ARGN}) + + string(TOUPPER ${pkgname} pkgname_upper) + set(__old_cpp__ ${CMAKE_PREFIX_PATH}) + set(CMAKE_PREFIX_PATH ${${pkgname_upper}_ROOT} $ENV{${pkgname_upper}_ROOT} ${CMAKE_PREFIX_PATH}) + + # build lists of required versions and components + unset(__required_versions__) + unset(__components__) + if(ARGS_VERSION) + list(APPEND __required_versions__ ${ARGS_VERSION}) + endif() + if(ARGS_COMPONENTS) + list(APPEND __components__ ${ARGS_COMPONENTS}) + endif() + if(ARGS_ADD_REQUIREMENTS_OF) + foreach(dep_pkgname IN LISTS ARGS_ADD_REQUIREMENTS_OF) + if(${dep_pkgname}_${pkgname}_VERSION) + list(APPEND __required_versions__ ${${dep_pkgname}_${pkgname}_VERSION}) + endif() + if(${dep_pkgname}_${pkgname}_COMPONENTS) + list(APPEND __components__ ${${dep_pkgname}_${pkgname}_COMPONENTS}) + endif() + endforeach() + endif() + + # select highest required version + unset(__version__) + if(__required_versions__) + list(GET __required_versions__ 0 __version__) + foreach(v IN LISTS __required_versions__) + if(${v} VERSION_GREATER ${__version__}) + set(__version__ ${v}) + endif() + endforeach() + endif() + # deduplicate required component list + if(__components__) + list(REMOVE_DUPLICATES ARGS_COMPONENTS) + endif() + + # call native find_package + if(__components__) + find_package(${pkgname} ${__version__} QUIET COMPONENTS ${__components__} ${ARGS_UNPARSED_ARGUMENTS}) + else() + find_package(${pkgname} ${__version__} QUIET ${ARGS_UNPARSED_ARGUMENTS}) + endif() + + if(${pkgname}_FOUND) + if(${qualifier} STREQUAL PRIVATE) + set(PROJECT_${pkgname}_VERSION ${__version__}) + set(PROJECT_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) + set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) + elseif(${qualifier} STREQUAL PUBLIC) + set(PROJECT_${pkgname}_VERSION ${__version__}) + set(PROJECT_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) + set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) + set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) + set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) + set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) + elseif(${qualifier} STREQUAL INTERFACE) + set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) + set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) + set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) + endif() + endif() + + unset(__version__) + unset(__components__) + unset(__required_versions__) + set(CMAKE_PREFIX_PATH ${__old_cpp__}) + unset(__old_cpp__) +endmacro() diff --git a/cmake/FairLoggerLib.cmake b/cmake/FairLoggerLib.cmake index 5b57d83..a48a566 100644 --- a/cmake/FairLoggerLib.cmake +++ b/cmake/FairLoggerLib.cmake @@ -248,98 +248,3 @@ macro(install_cmake_package) DESTINATION ${PACKAGE_INSTALL_DESTINATION} ) endmacro() - -# -# find_package2(PRIVATE|PUBLIC|INTERFACE -# [VERSION ] -# [COMPONENTS ] -# [ADD_REQUIREMENTS_OF ] -# [any other option the native find_package supports]...) -# -# Wrapper around CMake's native find_package command to add some features and bookkeeping. -# -# The qualifier (PRIVATE|PUBLIC|INTERFACE) to the package to populate -# the variables PROJECT_[INTERFACE]__([VERSION]|[COMPONENTS]|PACKAGE_DEPENDENCIES) -# accordingly. This bookkeeping information is used to print our dependency found summary -# table and to generate a part of our CMake package. -# -# When a dependending package is listed with ADD_REQUIREMENTS_OF the variables -# __VERSION|COMPONENTS are looked up to and added to the native -# VERSION (selected highest version) and COMPONENTS (deduplicated) args. -# -# COMPONENTS and VERSION args are then just passed to the native find_package. -# -macro(find_package2 qualifier pkgname) - cmake_parse_arguments(ARGS "" "VERSION" "COMPONENTS;ADD_REQUIREMENTS_OF" ${ARGN}) - - string(TOUPPER ${pkgname} pkgname_upper) - set(__old_cpp__ ${CMAKE_PREFIX_PATH}) - set(CMAKE_PREFIX_PATH ${${pkgname_upper}_ROOT} $ENV{${pkgname_upper}_ROOT} ${CMAKE_PREFIX_PATH}) - - # build lists of required versions and components - unset(__required_versions__) - unset(__components__) - if(ARGS_VERSION) - list(APPEND __required_versions__ ${ARGS_VERSION}) - endif() - if(ARGS_COMPONENTS) - list(APPEND __components__ ${ARGS_COMPONENTS}) - endif() - if(ARGS_ADD_REQUIREMENTS_OF) - foreach(dep_pkgname IN LISTS ARGS_ADD_REQUIREMENTS_OF) - if(${dep_pkgname}_${pkgname}_VERSION) - list(APPEND __required_versions__ ${${dep_pkgname}_${pkgname}_VERSION}) - endif() - if(${dep_pkgname}_${pkgname}_COMPONENTS) - list(APPEND __components__ ${${dep_pkgname}_${pkgname}_COMPONENTS}) - endif() - endforeach() - endif() - - # select highest required version - unset(__version__) - if(__required_versions__) - list(GET __required_versions__ 0 __version__) - foreach(v IN LISTS __required_versions__) - if(${v} VERSION_GREATER ${__version__}) - set(__version__ ${v}) - endif() - endforeach() - endif() - # deduplicate required component list - if(__components__) - list(REMOVE_DUPLICATES ARGS_COMPONENTS) - endif() - - # call native find_package - if(__components__) - find_package(${pkgname} ${__version__} QUIET COMPONENTS ${__components__} ${ARGS_UNPARSED_ARGUMENTS}) - else() - find_package(${pkgname} ${__version__} QUIET ${ARGS_UNPARSED_ARGUMENTS}) - endif() - - if(${pkgname}_FOUND) - if(${qualifier} STREQUAL PRIVATE) - set(PROJECT_${pkgname}_VERSION ${__version__}) - set(PROJECT_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) - set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) - elseif(${qualifier} STREQUAL PUBLIC) - set(PROJECT_${pkgname}_VERSION ${__version__}) - set(PROJECT_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) - set(PROJECT_PACKAGE_DEPENDENCIES ${PROJECT_PACKAGE_DEPENDENCIES} ${pkgname}) - set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) - set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) - set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) - elseif(${qualifier} STREQUAL INTERFACE) - set(PROJECT_INTERFACE_${pkgname}_VERSION ${__version__}) - set(PROJECT_INTERFACE_${pkgname}_COMPONENTS ${ARGS_COMPONENTS}) - set(PROJECT_INTERFACE_PACKAGE_DEPENDENCIES ${PROJECT_INTERFACE_PACKAGE_DEPENDENCIES} ${pkgname}) - endif() - endif() - - unset(__version__) - unset(__components__) - unset(__required_versions__) - set(CMAKE_PREFIX_PATH ${__old_cpp__}) - unset(__old_cpp__) -endmacro()