################################################################################ # 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()