Spec-Zone.ru › CMake 3.31

CMakePackageConfigHelpers

Вспомогательные функции для создания файлов конфигурации, которые могут быть включены другими проектами для поиска и использования пакета.

Генерация файла конфигурации пакета

configure_package_config_file

Создайте файл конфигурации для проекта:

configure_package_config_file(<input> <output>
  INSTALL_DESTINATION <path>
  [PATH_VARS <var1> <var2> ... <varN>]
  [NO_SET_AND_CHECK_MACRO]
  [NO_CHECK_REQUIRED_COMPONENTS_MACRO]
  [INSTALL_PREFIX <path>]
  )

configure_package_config_file() следует использовать вместо обычной команды configure_file() при создании файла <PackageName>Config.cmake или <PackageName>-config.cmake для установки проекта или библиотеки. Это помогает сделать релоцируемым полученный пакет, избегая жёстко закодированных путей в установленных файлах <PackageName>Config.cmake.

В файле FooConfig.cmake может быть код, подобный этому, чтобы сделать известными места установки для использующего проекта:

set(FOO_INCLUDE_DIR   "@CMAKE_INSTALL_FULL_INCLUDEDIR@" )
set(FOO_DATA_DIR   "@CMAKE_INSTALL_PREFIX@/@RELATIVE_DATA_INSTALL_DIR@" )
set(FOO_ICONS_DIR   "@CMAKE_INSTALL_PREFIX@/share/icons" )
#...logic to determine installedPrefix from the own location...
set(FOO_CONFIG_DIR  "${installedPrefix}/@CONFIG_INSTALL_DIR@" )

Все четыре показанных выше варианта недостаточны. Первые три жёстко кодируют абсолютные пути каталогов. Четвёртый случай работает только если логика определения installedPrefix корректна и если CONFIG_INSTALL_DIR содержит относительный путь, что, как правило, гарантировать нельзя. Это приводит к тому, что полученный файл FooConfig.cmake плохо работает под Windows и macOS, где пользователи привыкли выбирать место установки бинарного пакета во время установки, независимо от того, как была задана CMAKE_INSTALL_PREFIX во время сборки/cmake.

Использование configure_package_config_file() помогает. При правильном использовании это делает релоцируемым полученный файл FooConfig.cmake. Использование:

  1. Напишите файл FooConfig.cmake.in так, как вы привыкли.
  2. Вставьте в начало строку, содержащую только строку @PACKAGE_INIT@.
  3. Вместо set(FOO_DIR "@SOME_INSTALL_DIR@"), используйте set(FOO_DIR "@PACKAGE_SOME_INSTALL_DIR@") (это должно быть после строки @PACKAGE_INIT@).
  4. Вместо обычной команды configure_file() используйте configure_package_config_file().

Аргументы <input> и <output> — входной и выходной файлы, так же, как и в configure_file().

Передаваемое <path> в INSTALL_DESTINATION должно быть местом назначения, куда будет установлен файл FooConfig.cmake. Этот путь может быть абсолютным или относительным к пути INSTALL_PREFIX.

Переменные <var1> до <varN>, заданные как PATH_VARS, — это переменные, содержащие места назначения установки. Для каждой из них макрос создаст вспомогательную переменную PACKAGE_<var...>. Эти вспомогательные переменные должны использоваться в файле FooConfig.cmake.in для задания места установки. Они рассчитываются с помощью configure_package_config_file(), чтобы всегда быть относительными к месту установки пакета. Это работает как для относительных, так и для абсолютных расположений. Для абсолютных расположений это работает только в том случае, если абсолютное расположение является подкаталогом INSTALL_PREFIX.

Добавлена в версии 3.30: Переменная PACKAGE_PREFIX_DIR всегда будет определена после строки @PACKAGE_INIT@. Она будет содержать значение базового места установки. В общем случае, переменные, определенные с помощью механизма PATH_VARS, должны использоваться вместо этого, но PACKAGE_PREFIX_DIR может использоваться в тех случаях, которые нелегко обрабатываются PATH_VARS, например, для файлов, устанавливаемых непосредственно в базовое место установки, а не в подкаталог.

Примечание

Когда потребители сгенерированного файла используют CMake 3.29 или более ранние версии, значение PACKAGE_PREFIX_DIR может быть изменено вызовом find_dependency() или find_package(). Если проект полагается на PACKAGE_PREFIX_DIR, ответственность проекта заключается в обеспечении того, чтобы значение PACKAGE_PREFIX_DIR сохранялось после таких вызовов или любых других вызовов, которые могут включать другой файл, сгенерированный configure_package_config_file().

Добавлена в версии 3.1: Если передается аргумент INSTALL_PREFIX, он используется в качестве базового пути для расчета всех относительных путей. Аргумент <path> должен быть абсолютным путем. Если этот аргумент не передается, используется переменная CMAKE_INSTALL_PREFIX. Значение по умолчанию хорошо, когда генерируется файл FooConfig.cmake для использования вашего пакета из дерева установки. При генерации файла FooConfig.cmake для использования вашего пакета из дерева сборки, следует использовать этот параметр.

По умолчанию, configure_package_config_file() также генерирует два вспомогательных макроса, set_and_check() и check_required_components(), в файл FooConfig.cmake.

set_and_check() следует использовать вместо обычной команды set() для задания каталогов и расположений файлов. Кроме установки переменной, она также проверяет, что указанный файл или каталог действительно существуют, и завершается с ошибкой, если этого нет. Это гарантирует, что сгенерированный файл FooConfig.cmake не содержит неправильных ссылок. Добавьте опцию NO_SET_AND_CHECK_MACRO для предотвращения генерации макроса set_and_check() в файле FooConfig.cmake.

check_required_components(<PackageName>) должен быть вызван в конце файла FooConfig.cmake. Этот макрос проверяет, были ли найдены все запрошенные, не-необязательные компоненты, и если это не так, устанавливает переменную Foo_FOUND в значение FALSE, чтобы пакет считался ненайденным. Это делается путём проверки переменных Foo_<Component>_FOUND для всех запрошенных обязательных компонентов. Этот макрос следует вызывать даже если пакет не предоставляет каких-либо компонентов, чтобы убедиться, что пользователи не ошибаются с указанием компонентов. Добавьте опцию NO_CHECK_REQUIRED_COMPONENTS_MACRO для предотвращения генерации макроса check_required_components() в файле FooConfig.cmake.

См. также Пример генерации файлов пакета.

Генерация файла версии пакета

write_basic_package_version_file

Создайте файл версии для проекта:

write_basic_package_version_file(<filename>
  [VERSION <major.minor.patch>]
  COMPATIBILITY <AnyNewerVersion|SameMajorVersion|SameMinorVersion|ExactVersion>
  [ARCH_INDEPENDENT] )

Записывает файл для использования в качестве файла <PackageName>ConfigVersion.cmake в <filename>. Смотрите документацию find_package() для получения подробной информации об таких файлах.

<filename> — имя выходного файла, которое должно находиться в дереве сборки. <major.minor.patch> — номер версии проекта, который будет установлен.

Если VERSION не указан, используется переменная PROJECT_VERSION. Если она не установлена, возникает ошибка.

Режим COMPATIBILITY AnyNewerVersion означает, что установленная версия пакета будет считаться совместимой, если она новее или точно такая же, как запрошенная версия. Этот режим следует использовать для пакетов, которые полностью совместимы с предыдущими версиями, также и через основные версии. Если используется SameMajorVersion, то поведение отличается от AnyNewerVersion тем, что номер основной версии должен быть таким же, как запрошен, например, версия 2.0 не будет считаться совместимой, если запрошена версия 1.0. Этот режим следует использовать для пакетов, которые гарантируют обратную совместимость в пределах одной основной версии. Если используется SameMinorVersion, поведение такое же, как у SameMajorVersion, но и основная, и второстепенная версии должны быть такими же, как запрошенные, например, версия 0.2 не будет считаться совместимой, если запрошена версия 0.1. Если используется ExactVersion, пакет считается совместимым только в том случае, если запрошенная версия точно соответствует его собственной версии (не учитывая версию исправления). Например, версия 1.2.3 пакета считается совместимой только с запрошенной версией 1.2.3. Этот режим предназначен для пакетов без гарантий совместимости. Если у вашего проекта есть более сложные правила сопоставления версий, вам необходимо написать свой собственный файл <PackageName>ConfigVersion.cmake вместо использования этого макроса.

Добавлена в версии 3.11: Режим совместимости SameMinorVersion.

Добавлена в версии 3.14: Если указано ARCH_INDEPENDENT, установленная версия пакета будет считаться совместимой, даже если она была скомпилирована для другой архитектуры, чем запрошенная архитектура. В противном случае будет выполнена проверка архитектуры, и пакет будет считаться совместимым только в том случае, если архитектура совпадает точно. Например, если пакет скомпилирован для 32-битной архитектуры, пакет считается совместимым только если используется на 32-битной архитектуре, за исключением случая, когда указано ARCH_INDEPENDENT, в этом случае пакет считается совместимым на любой архитектуре.

Примечание

ARCH_INDEPENDENT предназначен для библиотек только с заголовками или подобных пакетов без бинарных файлов.

Добавлена в версии 3.19: Файл версии, сгенерированный AnyNewerVersion, SameMajorVersion и SameMinorVersion аргументами COMPATIBILITY обрабатывает диапазон версий, если он указан (см. команду find_package() для получения подробной информации). Режим ExactVersion несовместим с диапазонами версий и отобразит предупреждение автора, если он указан.

Внутренне этот макрос выполняет configure_file() для создания результирующего файла версии. В зависимости от COMPATIBILITY, используется соответствующий файл BasicConfigVersion-<COMPATIBILITY>.cmake.in. Обратите внимание, что эти файлы являются внутренними для CMake, и вы не должны вызывать configure_file() на них самостоятельно, но их можно использовать в качестве отправной точки для создания более сложных пользовательских файлов <PackageName>ConfigVersion.cmake.

Генерация файла выбора платформы Apple

generate_apple_platform_selection_file

Добавлен в версии 3.29.

Создать файл выбора платформы Apple:

generate_apple_platform_selection_file(<filename>
  INSTALL_DESTINATION <path>
  [INSTALL_PREFIX <path>]
  [MACOS_INCLUDE_FILE <file>]
  [IOS_INCLUDE_FILE <file>]
  [IOS_SIMULATOR_INCLUDE_FILE <file>]
  [IOS_CATALYST_INCLUDE_FILE <file>]
  [TVOS_INCLUDE_FILE <file>]
  [TVOS_SIMULATOR_INCLUDE_FILE <file>]
  [WATCHOS_INCLUDE_FILE <file>]
  [WATCHOS_SIMULATOR_INCLUDE_FILE <file>]
  [VISIONOS_INCLUDE_FILE <file>]
  [VISIONOS_SIMULATOR_INCLUDE_FILE <file>]
  [ERROR_VARIABLE <variable>]
  )

Записать файл, включающий файл, специфичный для платформы Apple, например, для использования как .cmake. Это можно использовать совместно с аргументом XCFRAMEWORK_LOCATION команды export(SETUP) для экспорта пакетов таким образом, чтобы их могли использовать проекты, построенные для любой платформы Apple.

INSTALL_DESTINATION <path>

Путь, по которому вызывающий код установит сгенерированный файл, например, с помощью install(FILES). Путь может быть относительным к INSTALL_PREFIX или абсолютным.

INSTALL_PREFIX <path>

Префикс пути, по которому вызывающий код установит пакет. Аргумент <path> должен быть абсолютным путём. Если этот аргумент не передан, будет использоваться переменная CMAKE_INSTALL_PREFIX.

MACOS_INCLUDE_FILE <file>

Файл для включения, если платформа macOS.

IOS_INCLUDE_FILE <file>

Файл для включения, если платформа iOS.

IOS_SIMULATOR_INCLUDE_FILE <file>

Файл для включения, если платформа iOS Simulator.

IOS_CATALYST_INCLUDE_FILE <file>

Добавлен в версии 3.31.

Файл для включения, если платформа iOS Catalyst.

TVOS_INCLUDE_FILE <file>

Файл для включения, если платформа tvOS.

TVOS_SIMULATOR_INCLUDE_FILE <file>

Файл для включения, если платформа tvOS Simulator.

WATCHOS_INCLUDE_FILE <file>

Файл для включения, если платформа watchOS.

WATCHOS_SIMULATOR_INCLUDE_FILE <file>

Файл для включения, если платформа watchOS Simulator.

VISIONOS_INCLUDE_FILE <file>

Файл для включения, если платформа visionOS.

VISIONOS_SIMULATOR_INCLUDE_FILE <file>

Файл для включения, если платформа visionOS Simulator.

ERROR_VARIABLE <variable>

Если потребляющий проект скомпилирован для неподдерживаемой платформы, задайте <variable> сообщением об ошибке. Включающий может использовать эту информацию, чтобы имитировать, что пакет не найден. Если этот параметр не задан, по умолчанию генерируется фатальная ошибка.

Если какой-либо из необязательных файлов включения не указан, и потребляющий проект скомпилирован для соответствующей платформы, сгенерированный файл посчитает платформу неподдерживаемой. Поведение определяется параметром ERROR_VARIABLE.

Генерация файла выбора архитектуры Apple

generate_apple_architecture_selection_file

Добавлен в версии 3.29.

Создать файл выбора архитектуры Apple:

generate_apple_architecture_selection_file(<filename>
  INSTALL_DESTINATION <path>
  [INSTALL_PREFIX <path>]
  [SINGLE_ARCHITECTURES <arch>...
   SINGLE_ARCHITECTURE_INCLUDE_FILES <file>...]
  [UNIVERSAL_ARCHITECTURES <arch>...
   UNIVERSAL_INCLUDE_FILE <file>]
  [ERROR_VARIABLE <variable>]
  )

Записать файл, включающий файл, специфичный для архитектуры Apple, на основе CMAKE_OSX_ARCHITECTURES, например, для включения в файл, специфичный для Apple <PackageName>Config.cmake.

INSTALL_DESTINATION <path>

Путь, по которому вызывающий код установит сгенерированный файл, например, с помощью install(FILES). Путь может быть относительным к INSTALL_PREFIX или абсолютным.

INSTALL_PREFIX <path>

Префикс пути, по которому вызывающий код установит пакет. Аргумент <path> должен быть абсолютным путём. Если этот аргумент не передан, будет использоваться переменная CMAKE_INSTALL_PREFIX.

SINGLE_ARCHITECTURES <arch>...

Архитектуры, предоставляемые записями SINGLE_ARCHITECTURE_INCLUDE_FILES.

SINGLE_ARCHITECTURE_INCLUDE_FILES <file>...

Архитектурно-специфичные файлы. Один из них будет загружен, когда CMAKE_OSX_ARCHITECTURES содержит единственную архитектуру, соответствующую соответствующей записи SINGLE_ARCHITECTURES.

UNIVERSAL_ARCHITECTURES <arch>...

Архитектуры, предоставляемые UNIVERSAL_INCLUDE_FILE.

Список может включать $(ARCHS_STANDARD) для поддержки потребления с помощью генератора Xcode, но архитектуры также должны быть перечислены индивидуально.

UNIVERSAL_INCLUDE_FILE <file>

Файл для загрузки, когда CMAKE_OSX_ARCHITECTURES содержит (нестрогую) подмножество UNIVERSAL_ARCHITECTURES и не соответствует ни одному из SINGLE_ARCHITECTURES.

ERROR_VARIABLE <variable>

Если потребляющий проект скомпилирован для неподдерживаемой архитектуры, задайте <variable> сообщением об ошибке. Включающий может использовать эту информацию, чтобы имитировать, что пакет не найден. Если этот параметр не задан, по умолчанию генерируется фатальная ошибка.

Примеры генерации файлов пакета

Пример использования команд configure_package_config_file() и write_basic_package_version_file():

CMakeLists.txt
include(GNUInstallDirs)
set(INCLUDE_INSTALL_DIR ${CMAKE_INSTALL_INCLUDEDIR}/Foo
    CACHE PATH "Location of header files" )
set(SYSCONFIG_INSTALL_DIR ${CMAKE_INSTALL_SYSCONFDIR}/foo
    CACHE PATH "Location of configuration files" )
#...
include(CMakePackageConfigHelpers)
configure_package_config_file(FooConfig.cmake.in
  ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake
  INSTALL_DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Foo
  PATH_VARS INCLUDE_INSTALL_DIR SYSCONFIG_INSTALL_DIR)
write_basic_package_version_file(
  ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
  VERSION 1.2.3
  COMPATIBILITY SameMajorVersion )
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/FooConfig.cmake
              ${CMAKE_CURRENT_BINARY_DIR}/FooConfigVersion.cmake
        DESTINATION ${CMAKE_INSTALL_LIBDIR}/cmake/Foo )
FooConfig.cmake.in
set(FOO_VERSION x.y.z)
...
@PACKAGE_INIT@
...
set_and_check(FOO_INCLUDE_DIR "@PACKAGE_INCLUDE_INSTALL_DIR@")
set_and_check(FOO_SYSCONFIG_DIR "@PACKAGE_SYSCONFIG_INSTALL_DIR@")

check_required_components(Foo)

© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.31/module/CMakePackageConfigHelpers.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API