Если я нахожу_пакет в CMakeLists.txt, должен ли я найти_установку в моем установленном config.cmake?

Я использую CMake для сборки и установки определенной библиотеки, foo .

Моя библиотека зависит от какой-то другой библиотеки bar , которая имеет конфигурационный скрипт CMake, поэтому у меня есть:

find_package(bar REQUIRED)
target_link_libraries(foo PUBLIC bar::bar)

Это так далеко, как строительство идет. Для установки у меня есть соответствующие команды install() , с экспортом, конфигурацией версии и всем этим. При этом генерируется файл пакета -config.cmake (а также файл конфигурации версии), поэтому мне не нужно хранить его в репозитории или создавать построчно в моем CMakeLists.txt

Теперь в CMake есть модуль find_dependency() , документация которого предполагает использование в файлах конфигурации пакетов. Но - я не добавляю это явно туда. Нужно ли мне? И в целом: при каких обстоятельствах я должен вручную убедиться, что в файле конфигурации пакета есть find_dependency() для различных find_package() ?

Всего 1 ответ


Во-первых, 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 в файле конфигурации вашего пакета.