Во-первых, CMake не поддерживает "переходное" поведение для find_package () (отметьте этот вопрос ).
Документация рекомендует, чтобы "Все ТРЕБУЕМЫЕ зависимости" пакет должен быть найден в файле Config.cmake ":
# <package>Config.cmake file
include(CMakeFindDependencyMacro)
find_dependency(Stats 2.6.4)
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake") # They depend on Stats
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsMacros.cmake")
Итак, отвечая на ваши вопросы:
- " Я явно не добавляю его туда. Должен ли я? " Вы действительно должны, по крайней мере, для
REQUIRED
пакетов. - "При каких обстоятельствах я должен вручную убедиться, что в файле конфигурации пакета есть find_dependency () для различных find_package ()?" Для необходимых пакетов, вы должны. Для необязательного пакета вы можете добавить его в файл конфигурации, чтобы были доступны дополнительные функции.
Я работаю над проектом, который зависит от внешнего пакета (Catch2). В моем верхнем уровне CMakelists.txt у меня есть:
# Top level CMakelists.txt
set(Catch2_DIR "${PATH_TO_CATCH2}/lib/cmake/Catch2/")
find_package(Catch2 ${CATCH2_VERSION} REQUIRED)
Затем я добавил следующее в мой файл конфигурации пакета:
# <package>Config.cmake file
include(CMakeFindDependencyMacro)
set(Catch2_DIR "@PATH_TO_CATCH2@/lib/cmake/Catch2/") #be careful, path hard coded
find_dependency(Catch2 REQUIRED)
Просто будьте осторожны, потому что find_dependency
- это макрос и он изменит значение переменной PACKAGE_PREFIX_DIR
в файле конфигурации вашего пакета.