Оказывается, это было мое использование макроса find_dependency
, замена его на find_package
дала мне правильные результаты без обходных путей.
Если мы погрузимся в CMakeFindDependencyMacro.cmake
, станет совершенно ясно, чтовопрос есть.
macro(find_dependency dep)
if (NOT ${dep}_FOUND)
...
Если пакет уже найден, он сразу же остановит выполнение и не добавит дополнительные компоненты.Это означает, что вы можете сделать вызов find_package(SomePackage)
перед любым дополнительным find_package(Boost)
восходящим потоком, но не наоборот.
Я не думаю, что это проблема для изолированных пакетов, но как только у вас есть компоненты, которые вам может понадобиться добавить к уже существующей цели, find_dependency
, похоже, ломается из-за оператора if.Судя по другому ответу в отношении find_dependency , похоже, что это будет в основном для диагностических сообщений, сообщающих пользователю, что проблема возникает из файла *Config.cmake
, чем что-либо еще.
для полноты здесьрабочий пример файла конфигурации, где я удалил обходные пути:
# SomeProjectConfig.cmake.in
# Avoid repeatedly including the targets
if(NOT TARGET SomeProject::SomeProject)
# Provide path for package module scripts, CMAKE_CURRENT_LIST_DIR is the
# directory of the currently executing cmake file.
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_LIST_DIR})
include(CMakeFindDependencyMacro)
# Additionally we record the BOOST_ROOT - but we try to respect the upstream
# package if it specifies it.
if(NOT BOOST_ROOT)
set(BOOST_ROOT "@BOOST_ROOT@"
endif()
find_package(Boost 1.55 QUIET REQUIRED COMPONENTS system thread)
find_dependency(SomeOtherDependency 1.0 QUIET REQUIRED)
include("${CMAKE_CURRENT_LIST_DIR}/SomeProjectTargets.cmake")
# Clean up module path after we're done
list(REMOVE_AT CMAKE_MODULE_PATH -1)
endif()