-
Notifications
You must be signed in to change notification settings - Fork 12
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
To make it easier to share find_package2 across projects let's move it into its own file.
- Loading branch information
1 parent
1c43450
commit 13ebedc
Showing
3 changed files
with
103 additions
and
95 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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 <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() |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters