diff --git a/CMakeLists.txt b/CMakeLists.txt index 67755eb..401baa1 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -28,7 +28,13 @@ option(USE_BOOST_PRETTY_FUNCTION "Use Boost BOOST_PRETTY_FUNCTION macro" OFF) # Dependency ################################################################### if(USE_BOOST_PRETTY_FUNCTION) - find_package(Boost REQUIRED) + if(NOT DEFINED Boost_NO_BOOST_CMAKE AND CMAKE_VERSION VERSION_LESS 3.15) + # Since Boost 1.70 a CMake package is shipped by default. Unfortunately, it has a number + # of problems that are only fixed in Boost 1.71 or CMake 3.15. By default we skip the + # BoostConfig lookup. This can be overridden on the command line via -DBoost_NO_BOOST_CMAKE=OFF + set(Boost_NO_BOOST_CMAKE ON) + endif() + find_package2(PUBLIC Boost REQUIRED) endif() ################################################################################ diff --git a/cmake/FairLoggerLib.cmake b/cmake/FairLoggerLib.cmake index 37dcdf6..0d8a4d2 100644 --- a/cmake/FairLoggerLib.cmake +++ b/cmake/FairLoggerLib.cmake @@ -212,3 +212,98 @@ 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()