Общее «транзитивное поведение» в файле конфигурации пакета CMake (find_dependency)

Я пытаюсь улучшить мой 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.

3

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]