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. Использование:
- Напишите файл
FooConfig.cmake.inтак, как вы привыкли. - Вставьте в начало строку, содержащую только строку
@PACKAGE_INIT@. - Вместо
set(FOO_DIR "@SOME_INSTALL_DIR@"), используйтеset(FOO_DIR "@PACKAGE_SOME_INSTALL_DIR@")(это должно быть после строки@PACKAGE_INIT@). - Вместо обычной команды
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.txtinclude(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.inset(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