Если я нахожу_пакет в CMakeLists.txt, должен ли я найти_установку в моем установленном config.cmake? - PullRequest
0 голосов
/ 25 марта 2020

Я использую 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 Ответ

0 голосов
/ 26 марта 2020

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

...