mirror of
https://github.com/FairRootGroup/FairLogger.git
synced 2025-10-13 00:31:12 +00:00
To make it easier to share find_package2 across projects let's move it into its own file.
103 lines
4.3 KiB
CMake
103 lines
4.3 KiB
CMake
################################################################################
|
|
# 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 <pkgname>
|
|
# [VERSION <version>]
|
|
# [COMPONENTS <list of components>]
|
|
# [ADD_REQUIREMENTS_OF <list of dep_pgkname>]
|
|
# [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]_<pkgname>_([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
|
|
# <dep_pkgname>_<pkgname>_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()
|