Я пытаюсь улучшить мой CMake конвенции поверх конфигурации
рамки на данный момент. Каждый из моих компонентов C ++ (то есть проект CMake) построен с использованием этой инфраструктуры, и среда уже способна создавать CMake. Файл конфигурации пакета с использованием configure_package_config_file()
команда.
Следующий (минимальный) файл шаблона PackageConfig.cmake.in
(v1) используется фреймворком.
@PACKAGE_INIT@
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components("@PROJECT_NAME@")
Все отлично работает, если компонент Foo построен и установлен с таким подходом
используется другим компонентом Бар с find_package(<package> CONFIG)
команда (пока правильные пути к каталогам, указывающие на
Установленный файл конфигурации пакета CMake из Foo устанавливается через CLI).
Но (конечно) проблемы возникают, если само по себе имеет одну или несколько зависимостей. Используя текущий подход, В должен find_package()
каждая из зависимостей
сам. Это означает, что транзитивные зависимости в настоящее время не передаются компоненту, требующему зависимости. Очевидно, это не то, что я хочу
достичь.
После некоторого поиска я узнал о find_dependency()
Команда, которая была создана для решения упомянутой проблемы:
Он предназначен для использования в файле конфигурации пакета (
<package>Config.cmake
). find_dependency пересылает правильные параметры дляQUIET
а такжеREQUIRED
которые были переданы оригиналуfind_package()
вызов. Любые дополнительные аргументы передаютсяfind_package()
,
Пока все хорошо, но подождите … Я должен эксплицитно установить имя каждой зависимости и ее версию снова? Я уже сделал это при объявлении зависимостей в CMakeLists.txt
! Как я могу создать многоразовый и универсальный пакет
Файл конфигурации, использующий этот подход? В настоящее время я не могу найти никакого решения этой проблемы, кроме явного перечисления всех зависимостей (вместе с их версией) в CMakeLists.txt
и передать этот список PackageConfig.cmake.in
,
Пример: Непроверенные PackageConfig.cmake.in
(V2):
@PACKAGE_INIT@
include(CMakeFindDependencyMacro)
# TODO(wolters): How-to implement this with a generic approach? Would the
# following work? Does a better solution do the problem exist?
#
# 1. Add the following to `CMakeLists.txt`:
# list(APPEND target_dependencies "Baz 1.2.3")
# list(APPEND target_dependencies "Example 0.9.0")
# 2. "Pass" the variable `target_dependencies` to the
# `configure_package_config_file` command.
# 3. Add the following code to the CMake package config file.
foreach(dependency "@target_dependencies@")
find_dependency(${dependency})
endforeach()
include("${CMAKE_CURRENT_LIST_DIR}/@[email protected]")
check_required_components("@PROJECT_NAME@")
Хотя это кажется странным, и я (пока) не знаю, работает ли он вообще (но должен,
теоретически).
Итак, мой вопрос: как я могу в целом реализовать переходное поведение для
Файл конфигурации пакета CMake.
Последнее, но не менее важное: я использую последнюю стабильную версию CMake 3.9.4.
Задача ещё не решена.
Других решений пока нет …