Я пишу файл MyPackageConfig для моего проекта с экспортированными целями, чтобы другие проекты могли легко найти MyPackage и его зависимости. Это выглядит так:
include(CMakeFindDependencyMacro)
find_dependency(LIB1_WITHOUT_CMAKE_CONFIG)
find_dependency(LIB2_WITH_CMAKE_CONFIG)
include (Some/Install/Dir/MyPackageTargets.cmake)
Мне интересно, будет ли разумно добавить следующие строки в MyPackageConfig.cmake до вызова find_dependency
# Find target dependencies
# Allows packages linking with MyPackage to use the find modules that
# MyPackage used to find it's dependencies. Since this path is appended to
# the existing module path, the calling package's module path will take
# precedence
list(APPEND CMAKE_MODULE_PATH @CMAKE_INSTALL_PREFIX@/lib/cmake/MyPackage/modules)
# Allows packages linking with MyPackage to find MyPacakge's dependencies if
# they don't already have them. Since this path (or these paths) are
# appended to the existing prefix path, the calling package's prefix
# path will take precedence
list(APPEND CMAKE_PREFIX_PATH @CMAKE_PREFIX_PATH@)
find_dependency(LIB1_WITHOUT_CMAKE_CONFIG)
find_dependency(LIB2_WITH_CMAKE_CONFIG)
Хорошая идея? Нет?
Более подробное объяснение моего обоснования:
Как YourPackage, использующий MyPackage, находит LIB1?
(i). Вы можете написать свой собственный FindLIB1.cmake, но это дублирование усилий
(ii). Я мог бы установить свой FindLIB1.cmake вместе с MyPackageConfig.cmake в директории Modules. Но вам придется включить этот путь в путь к модулю.
Мое предложение: добавьте строку перед find_dependency(LIB1_WITHOUT_CMAKE_CONFIG)
, изменив путь к модулю следующим образом:
list(APPEND CMAKE_MODULE_PATH @CMAKE_INSTALL_PREFIX@/lib/cmake/mstk/modules)
Это гарантирует, что если у вас есть FindLIB1.cmake, он будет использоваться, но если вы его не найдете, мой будет найден и использован.
Как вы узнаете, где находятся LIB1 и LIB2 (включая файл конфигурации LIB2)?
Добавив строку
list(APPEND CMAKE_PREFIX_PATH @CMAKE_PREFIX_PATH@)
Я говорю ваш пакет, в котором я искал и нашел мои зависимости (но только если у вас их еще не было в указанном вами CMAKE_PREFIX_PATH)