Spec-Zone.ru › CMake 3.7

cmake-packages(7)

  • Введение
  • Использование пакетов
    • Пакеты с файлами конфигурации
    • Пакеты с модулями поиска
  • Структура пакета
    • Файл конфигурации пакета
    • Файл версии пакета
  • Создание пакетов
    • Создание файла конфигурации пакета
      • Создание файла конфигурации пакета для дерева сборки
    • Создание переносимых пакетов
  • Реестр пакетов
    • Пользовательский реестр пакетов
    • Системный реестр пакетов
    • Отключение реестра пакетов
    • Пример реестра пакетов
    • Владение реестром пакетов

Введение

Пакеты предоставляют информацию о зависимостях для систем сборки CMake. Пакеты находятся с помощью команды find_package(). Результатом использования find_package является либо набор IMPORTED целей, либо набор переменных, соответствующих информации, необходимой для сборки.

Использование пакетов

CMake предоставляет прямую поддержку двух типов пакетов: пакеты с файлами конфигурации и пакеты с модулями поиска. Косвенная поддержка pkg-config пакетов также предоставляется через модуль FindPkgConfig. Во всех случаях базовая форма вызовов find_package() одинакова:

find_package(Qt4 4.7.0 REQUIRED) # CMake provides a Qt4 find-module
find_package(Qt5Core 5.1.0 REQUIRED) # Qt provides a Qt5 package config file.
find_package(LibXml2 REQUIRED) # Use pkg-config via the LibXml2 find-module

В тех случаях, когда известно, что файл конфигурации пакета предоставляется поставщиком вышестоящего уровня, и следует использовать только его, ключевое слово CONFIG может быть передано команде find_package():

find_package(Qt5Core 5.1.0 CONFIG REQUIRED)
find_package(Qt5Gui 5.1.0 CONFIG)

Аналогично, ключевое слово MODULE указывает на использование только модуля поиска:

find_package(Qt4 4.7.0 MODULE REQUIRED)

Явное указание типа пакета улучшает сообщение об ошибке, отображаемое пользователю, если пакет не найден.

Оба типа пакетов также поддерживают указание компонентов пакета, либо после ключевого слова REQUIRED,

find_package(Qt5 5.1.0 CONFIG REQUIRED Widgets Xml Sql)

либо как отдельный список COMPONENTS,

find_package(Qt5 5.1.0 COMPONENTS Widgets Xml Sql)

либо как отдельный список OPTIONAL_COMPONENTS,

find_package(Qt5 5.1.0 COMPONENTS Widgets
                       OPTIONAL_COMPONENTS Xml Sql
)

Обработка COMPONENTS и OPTIONAL_COMPONENTS определяется пакетом.

Установкой переменной CMAKE_DISABLE_FIND_PACKAGE_<PackageName> в значение TRUE, поиск пакета PackageName не будет производиться, и он всегда будет NOTFOUND.

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

Пакет с файлом конфигурации — это набор файлов, предоставляемых поставщиком вышестоящего уровня для использования нижестоящими. CMake ищет файлы конфигурации пакета в нескольких местах, как описано в документации к команде find_package(). Наиболее простой способ сообщить CMake, чтобы он искал пакет в нестандартном префиксе, — это установить переменную кэша CMAKE_PREFIX_PATH.

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

При использовании пакета с файлом конфигурации также автоматически устанавливается набор переменных, предоставляющих информацию о состоянии пакета. Переменная <Package>_FOUND устанавливается в значение true или false в зависимости от того, был ли найден пакет. Переменная кэша <Package>_DIR устанавливается в местоположение файла конфигурации пакета.

Пакеты с модулями поиска

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

В отличие от случая с файлом конфигурации пакета, предоставляемого поставщиком вышестоящего уровня, нет единой точки отсчета, определяющей найден ли пакет, поэтому переменная <Package>_FOUND не устанавливается автоматически командой find_package(). Однако можно ожидать, что она будет установлена по умолчанию, и должна быть установлена автором модуля поиска. Аналогично, нет переменной <Package>_DIR, но каждый из артефактов, таких как расположение библиотек и файлов заголовков, предоставляет отдельную переменную кэша.

См. руководство cmake-developer(7) для получения дополнительной информации о создании файлов модулей поиска.

Структура пакета

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

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

Рассмотрим проект Foo, который устанавливает следующие файлы:

<prefix>/include/foo-1.2/foo.h
<prefix>/lib/foo-1.2/libfoo.a

Он также может предоставлять файл конфигурации пакета CMake:

<prefix>/lib/cmake/foo-1.2/FooConfig.cmake

содержащий определение IMPORTED целей или определение переменных, таких как:

# ...
# (compute PREFIX relative to file location)
# ...
set(Foo_INCLUDE_DIRS ${PREFIX}/include/foo-1.2)
set(Foo_LIBRARIES ${PREFIX}/lib/foo-1.2/libfoo.a)

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

Команда find_package() может использоваться для поиска файла конфигурации пакета. Эта команда строит набор префиксов установки и ищет под каждым префиксом в нескольких местах. Учитывая имя Foo, она ищет файл под названием FooConfig.cmake или foo-config.cmake. Полный набор местоположений указан в документации к команде find_package(). Одно из мест, где она ищет, это:

<prefix>/lib/cmake/Foo*/

где Foo* — это выражение сопоставления с образцом, нечувствительное к регистру. В нашем примере выражение сопоставления с образцом будет соответствовать <prefix>/lib/cmake/foo-1.2, и файл конфигурации пакета будет найден.

После нахождения файла конфигурации пакета он немедленно загружается. Он вместе с файлом версии пакета содержит всю информацию, необходимую проекту для использования пакета.

Файл версии пакета

Когда команда find_package() находит потенциальный файл конфигурации пакета, она ищет рядом с ним файл версии. Файл версии загружается для проверки, соответствует ли версия пакета запрошенной версии. Если файл версии утверждает совместимость, файл конфигурации принимается. В противном случае он игнорируется.

Имя файла версии пакета должно совпадать с именем файла конфигурации пакета, но к нему добавлено либо -version, либо Version перед расширением .cmake. Например, файлы:

<prefix>/lib/cmake/foo-1.3/foo-config.cmake
<prefix>/lib/cmake/foo-1.3/foo-config-version.cmake

и:

<prefix>/lib/cmake/bar-4.2/BarConfig.cmake
<prefix>/lib/cmake/bar-4.2/BarConfigVersion.cmake

являются каждой парой файла конфигурации пакета и соответствующего файла версии пакета.

При загрузке файла версии командой find_package() сначала устанавливаются следующие переменные:

PACKAGE_FIND_NAME
Имя пакета
PACKAGE_FIND_VERSION
Полная строка запрошенной версии
PACKAGE_FIND_VERSION_MAJOR
Основная версия, если запрошена, иначе 0
PACKAGE_FIND_VERSION_MINOR
Дополнительная версия, если запрошена, иначе 0
PACKAGE_FIND_VERSION_PATCH
Версия исправления, если запрошена, иначе 0
PACKAGE_FIND_VERSION_TWEAK
Версия Tweak, если запрошена, иначе 0
PACKAGE_FIND_VERSION_COUNT
Количество компонент версии, от 0 до 4

Файл версии должен использовать эти переменные для проверки совместимости или точного соответствия запрошенной версии и установить следующие переменные с результатами:

PACKAGE_VERSION
Полная строка предоставленной версии
PACKAGE_VERSION_EXACT
Истина, если версия является точным соответствием
PACKAGE_VERSION_COMPATIBLE
Истина, если версия совместима
PACKAGE_VERSION_UNSUITABLE
Истина, если версия непригодна

Файлы версий загружаются во вложенном пространстве имен, поэтому они могут свободно устанавливать любые переменные, необходимые для их вычислений. Команда find_package очищает пространство имен, когда файл версии завершил работу и проверил переменные вывода. Когда файл версии утверждает, что является приемлемым соответствием запрошенной версии, команда find_package устанавливает следующие переменные для использования проектом:

<package>_VERSION
Полная предоставленная строка версии
<package>_VERSION_MAJOR
Основная версия, если указана, иначе 0
<package>_VERSION_MINOR
Вспомогательная версия, если указана, иначе 0
<package>_VERSION_PATCH
Версия исправления, если указана, иначе 0
<package>_VERSION_TWEAK
Версия доработки, если указана, иначе 0
<package>_VERSION_COUNT
Количество компонентов версии, от 0 до 4

Переменные сообщают о версии пакета, которая была фактически найдена. Часть имени <package> соответствует аргументу, переданному команде find_package().

Создание пакетов

Обычно, зависимость от верхнего уровня зависит от самого CMake и может использовать некоторые возможности CMake для создания файлов пакета. Рассмотрим верхний уровень, который предоставляет единственную общую библиотеку:

project(UpstreamLib)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_INCLUDE_CURRENT_DIR_IN_INTERFACE ON)

set(Upstream_VERSION 3.4.1)

include(GenerateExportHeader)

add_library(ClimbingStats SHARED climbingstats.cpp)
generate_export_header(ClimbingStats)
set_property(TARGET ClimbingStats PROPERTY VERSION ${Upstream_VERSION})
set_property(TARGET ClimbingStats PROPERTY SOVERSION 3)
set_property(TARGET ClimbingStats PROPERTY
  INTERFACE_ClimbingStats_MAJOR_VERSION 3)
set_property(TARGET ClimbingStats APPEND PROPERTY
  COMPATIBLE_INTERFACE_STRING ClimbingStats_MAJOR_VERSION
)

install(TARGETS ClimbingStats EXPORT ClimbingStatsTargets
  LIBRARY DESTINATION lib
  ARCHIVE DESTINATION lib
  RUNTIME DESTINATION bin
  INCLUDES DESTINATION include
)
install(
  FILES
    climbingstats.h
    "${CMAKE_CURRENT_BINARY_DIR}/climbingstats_export.h"
  DESTINATION
    include
  COMPONENT
    Devel
)

include(CMakePackageConfigHelpers)
write_basic_package_version_file(
  "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  VERSION ${Upstream_VERSION}
  COMPATIBILITY AnyNewerVersion
)

export(EXPORT ClimbingStatsTargets
  FILE "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsTargets.cmake"
  NAMESPACE Upstream::
)
configure_file(cmake/ClimbingStatsConfig.cmake
  "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfig.cmake"
  COPYONLY
)

set(ConfigPackageLocation lib/cmake/ClimbingStats)
install(EXPORT ClimbingStatsTargets
  FILE
    ClimbingStatsTargets.cmake
  NAMESPACE
    Upstream::
  DESTINATION
    ${ConfigPackageLocation}
)
install(
  FILES
    cmake/ClimbingStatsConfig.cmake
    "${CMAKE_CURRENT_BINARY_DIR}/ClimbingStats/ClimbingStatsConfigVersion.cmake"
  DESTINATION
    ${ConfigPackageLocation}
  COMPONENT
    Devel
)

Модуль CMakePackageConfigHelpers предоставляет макрос для создания простого файла ConfigVersion.cmake. Этот файл устанавливает версию пакета. Он считывается CMake при вызове find_package() для определения совместимости с запрошенной версией и для установки некоторых переменных, специфичных для версии <Package>_VERSION, <Package>_VERSION_MAJOR, <Package>_VERSION_MINOR и т. д. Команда install(EXPORT) используется для экспорта целевых объектов в ClimbingStatsTargets export-set, определённом ранее командой install(TARGETS). Эта команда генерирует файл ClimbingStatsTargets.cmake, который содержит целевые объекты IMPORTED, подходящие для использования зависимыми проектами, и организует установку в lib/cmake/ClimbingStats. Сгенерированные файлы ClimbingStatsConfigVersion.cmake и cmake/ClimbingStatsConfig.cmake устанавливаются в то же место, завершая создание пакета.

У сгенерированных целевых объектов IMPORTED установлены соответствующие свойства для определения их требований к использованию, таких как INTERFACE_INCLUDE_DIRECTORIES, INTERFACE_COMPILE_DEFINITIONS и другие соответствующие встроенные INTERFACE_ свойства. Вариант INTERFACE пользовательских свойств, перечисленных в COMPATIBLE_INTERFACE_STRING и других Свойства совместимого интерфейса, также распространяются на сгенерированные целевые объекты IMPORTED. В данном случае, ClimbingStats_MAJOR_VERSION определяется как строка, которая должна быть совместима среди зависимостей любого зависимого проекта. Установив это пользовательское свойство в данной версии и в следующей версии ClimbingStats, cmake(1) выдаст диагностическое сообщение, если произойдёт попытка использования версии 3 вместе с версией 4. Пакеты могут выбрать использование такой схемы, если разные основные версии пакета предназначены для несовместимости.

NAMESPACE с двойными двоеточиями указывается при экспорте целевых объектов для установки. Эта конвенция двойных двоеточий даёт CMake подсказку, что имя является целевым объектом IMPORTED, когда он используется зависимыми проектами с помощью команды target_link_libraries(). Таким образом, CMake может выдать диагностическое сообщение, если пакет, который его предоставляет, ещё не найден.

В этом случае, при использовании install(TARGETS) был указан INCLUDES DESTINATION. Это приводит к тому, что целевые объекты IMPORTED будут иметь свои INTERFACE_INCLUDE_DIRECTORIES, заполненные директорией include в CMAKE_INSTALL_PREFIX. Когда целевой объект IMPORTED используется зависимым проектом, он автоматически использует записи из этого свойства.

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

В этом случае файл ClimbingStatsConfig.cmake может быть таким простым:

include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")

Так как это позволяет зависимым проектам использовать целевые объекты IMPORTED. Если пакет ClimbingStats должен предоставлять макросы, они должны быть в отдельном файле, который устанавливается в том же месте, что и файл ClimbingStatsConfig.cmake, и включаться оттуда.

Это также можно расширить для обработки зависимостей:

# ...
add_library(ClimbingStats SHARED climbingstats.cpp)
generate_export_header(ClimbingStats)

find_package(Stats 2.6.4 REQUIRED)
target_link_libraries(ClimbingStats PUBLIC Stats::Types)

Так как целевой объект Stats::Types является зависимостью PUBLIC объекта ClimbingStats, зависимые проекты должны также найти пакет Stats и подключиться к библиотеке Stats::Types. Пакет Stats должен быть найден в файле ClimbingStatsConfig.cmake для обеспечения этого. Макрос find_dependency из CMakeFindDependencyMacro помогает в этом, передавая, является ли пакет REQUIRED, или QUIET и т. д. Все REQUIRED зависимости пакета должны быть найдены в файле Config.cmake:

include(CMakeFindDependencyMacro)
find_dependency(Stats 2.6.4)

include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsMacros.cmake")

Макрос find_dependency также устанавливает ClimbingStats_FOUND в False в случае, если зависимость не найдена, вместе с диагностическим сообщением о том, что пакет ClimbingStats не может использоваться без пакета Stats.

Если COMPONENTS указаны, когда зависимый проект использует find_package(), они перечислены в переменной <Package>_FIND_COMPONENTS. Если определённый компонент является не обязательным, то <Package>_FIND_REQUIRED_<comp> будет истинным. Это можно проверить с помощью логики в файле конфигурации пакета:

include(CMakeFindDependencyMacro)
find_dependency(Stats 2.6.4)

include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsTargets.cmake")
include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStatsMacros.cmake")

set(_supported_components Plot Table)

foreach(_comp ${ClimbingStats_FIND_COMPONENTS})
  if (NOT ";${_supported_components};" MATCHES _comp)
    set(ClimbingStats_FOUND False)
    set(ClimbingStats_NOTFOUND_MESSAGE "Unsupported component: ${_comp}")
  endif()
  include("${CMAKE_CURRENT_LIST_DIR}/ClimbingStats${_comp}Targets.cmake")
endforeach()

Здесь ClimbingStats_NOTFOUND_MESSAGE устанавливается как диагностическое сообщение, что пакет не был найден, потому что был указан неверный компонент. Эта переменная сообщения может быть установлена для любых случаев, когда переменная _FOUND установлена в False, и будет отображаться пользователю.

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

Команда export(EXPORT) создаёт файл определения целевых объектов IMPORTED, специфичный для дерева сборки, и непереносимый. Это аналогичным образом можно использовать с соответствующим файлом конфигурации пакета и файлом версии пакета для определения пакета для дерева сборки, который можно использовать без установки. Потребители дерева сборки могут просто убедиться, что CMAKE_PREFIX_PATH содержит каталог сборки, или установить ClimbingStats_DIR в <build_dir>/ClimbingStats в кэше.

Создание переносимых пакетов

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

Пакеты, созданные командой install(EXPORT), предназначены для переносимости, используя пути, относительные к расположению пакета. При определении интерфейса целевого объекта для EXPORT, имейте в виду, что каталоги заголовков должны быть указаны как относительные пути, относительные к CMAKE_INSTALL_PREFIX:

target_include_directories(tgt INTERFACE
  # Wrong, not relocatable:
  $<INSTALL_INTERFACE:${CMAKE_INSTALL_PREFIX}/include/TgtName>
)

target_include_directories(tgt INTERFACE
  # Ok, relocatable:
  $<INSTALL_INTERFACE:include/TgtName>
)

$<INSTALL_PREFIX> generator expression может использоваться как плейсхолдер для префикса установки без получения непереносимого пакета. Это необходимо, если используются сложные генераторные выражения:

target_include_directories(tgt INTERFACE
  # Ok, relocatable:
  $<INSTALL_INTERFACE:$<$<CONFIG:Debug>:$<INSTALL_PREFIX>/include/TgtName>>
)

Это также относится к путям, ссылающимся на внешние зависимости. Не рекомендуется заполнять какие-либо свойства, которые могут содержать пути, такие как INTERFACE_INCLUDE_DIRECTORIES и INTERFACE_LINK_LIBRARIES, путями, относящимися к зависимостям. Например, этот код может не работать должным образом для перемещаемого пакета:

target_link_libraries(ClimbingStats INTERFACE
  ${Foo_LIBRARIES} ${Bar_LIBRARIES}
  )
target_include_directories(ClimbingStats INTERFACE
  "$<INSTALL_INTERFACE:${Foo_INCLUDE_DIRS};${Bar_INCLUDE_DIRS}>"
  )

Ссылаемые переменные могут содержать абсолютные пути к библиотекам и каталогам включения в том виде, как они были найдены на компьютере, на котором был создан пакет. Это создаст пакет с жёстко закодированными путями к зависимостям, что непригодно для перемещения.

В идеале такие зависимости следует использовать через свои собственные IMPORTED цели, которые имеют свои собственные IMPORTED_LOCATION и свойства требований к использованию, такие как INTERFACE_INCLUDE_DIRECTORIES, заполненные должным образом. Затем эти импортированные цели можно использовать с командой target_link_libraries() для ClimbingStats:

target_link_libraries(ClimbingStats INTERFACE Foo::Foo Bar::Bar)

С этим подходом пакет ссылается на свои внешние зависимости только по именам IMPORTED целей. Когда пользователь использует установленный пакет, пользователь выполнит соответствующие команды find_package() (через макрос find_dependency, описанный выше), чтобы найти зависимости и заполнить импортированные цели соответствующими путями на собственном компьютере пользователя.

К сожалению, многие modules, поставляемые с CMake, ещё не предоставляют IMPORTED цели, потому что их разработка предшествовала этому подходу. Это может постепенно улучшаться со временем. Обходные пути для создания перемещаемых пакетов, использующих такие модули, включают:

  • При построении пакета укажите каждую запись кэша Foo_LIBRARY как просто имя библиотеки, например, -DFoo_LIBRARY=foo. Это говорит соответствующему модулю поиска о заполнении Foo_LIBRARIES только foo, чтобы попросить компоновщик поискать библиотеку вместо жёсткого кодирования пути.
  • Или, после установки содержимого пакета, но перед созданием исполняемого файла установки пакета для распространения, вручную замените абсолютные пути на заполнитель для подстановки инструментом установки при установке пакета.

Регистр пакетов

CMake предоставляет два центральных места для регистрации пакетов, которые были построены или установлены где-либо в системе:

  • Пользовательский регистр пакетов
  • Системный регистр пакетов

Регистры особенно полезны для помощи проектам в поиске пакетов в нестандартных местах установки или непосредственно в собственных деревьях построения. Проект может заполнить либо пользовательский, либо системный регистр (используя собственные средства, см. ниже), чтобы сослаться на своё расположение. В любом случае пакет должен хранить по зарегистрированному адресу файл конфигурации пакета (<package>Config.cmake) и необязательно файл версии пакета (<package>ConfigVersion.cmake).

Команда find_package() ищет два регистра пакетов как две из этапов поиска, указанные в документации. Если у него достаточно прав, он также удаляет устаревшие записи регистра пакетов, которые ссылаются на каталоги, которые не существуют или не содержат соответствующий файл конфигурации пакета.

Пользовательский регистр пакетов

Пользовательский регистр пакетов хранится в пользовательском расположении. Команда export(PACKAGE) может быть использована для регистрации дерева построения проекта в пользовательском регистре пакетов. В настоящее время CMake не предоставляет интерфейса для добавления деревьев установки в пользовательский регистр пакетов. Инсталляторам необходимо вручную научиться регистрировать свои пакеты, если это необходимо.

В Windows пользовательский регистр пакетов хранится в реестре Windows в разделе HKEY_CURRENT_USER.

Значение <package> может появиться в разделе реестра:

HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\<package>

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

В платформах UNIX пользовательский регистр пакетов хранится в домашнем каталоге пользователя в ~/.cmake/packages. Файл <package> может появиться в каталоге:

~/.cmake/packages/<package>

как файл с произвольным именем, содержимое которого указывает каталог, содержащий файл конфигурации пакета.

Системный регистр пакетов

Системный регистр пакетов хранится в системном расположении. В настоящее время CMake не предоставляет интерфейса для добавления в системный регистр пакетов. Инсталляторам необходимо вручную научиться регистрировать свои пакеты, если это необходимо.

В Windows системный регистр пакетов хранится в реестре Windows в разделе HKEY_LOCAL_MACHINE. Значение <package> может появиться в разделе реестра:

HKEY_LOCAL_MACHINE\Software\Kitware\CMake\Packages\<package>

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

Системного регистра пакетов нет в платформах, отличных от Windows.

Отключение регистра пакетов

В некоторых случаях использование регистров пакетов нежелательно. CMake позволяет отключить их с помощью следующих переменных:

  • CMAKE_EXPORT_NO_PACKAGE_REGISTRY отключает команду export(PACKAGE).
  • CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY отключает пользовательский регистр пакетов во всех вызовах find_package().
  • CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY отключает системный регистр пакетов во всех вызовах find_package().

Пример регистра пакетов

Простой соглашение об именовании записей в регистре пакетов — использовать хэши содержимого. Они детерминированы и вряд ли столкнутся (export(PACKAGE) использует этот подход). Имя записи, ссылающейся на определённый каталог, — это просто хэш содержимого самого пути каталога.

Если проект организует существование записей в регистре пакетов, например:

> reg query HKCU\Software\Kitware\CMake\Packages\MyPackage
HKEY_CURRENT_USER\Software\Kitware\CMake\Packages\MyPackage
 45e7d55f13b87179bb12f907c8de6fc4 REG_SZ c:/Users/Me/Work/lib/cmake/MyPackage
 7b4a9844f681c80ce93190d4e3185db9 REG_SZ c:/Users/Me/Work/MyPackage-build

или:

$ cat ~/.cmake/packages/MyPackage/7d1fb77e07ce59a81bed093bbee945bd
/home/me/work/lib/cmake/MyPackage
$ cat ~/.cmake/packages/MyPackage/f92c1db873a1937f3100706657c63e07
/home/me/work/MyPackage-build

тогда код CMakeLists.txt:

find_package(MyPackage)

будет искать по зарегистрированным расположениям файлы конфигурации пакетов (MyPackageConfig.cmake). Порядок поиска среди записей регистра пакетов для одного пакета не определён, и имена записей (хэши в данном примере) не имеют значения. Зарегистрированные расположения могут содержать файлы версии пакета (MyPackageConfigVersion.cmake) для указания find_package(), подходит ли определённое место для запрошенной версии.

Владение регистром пакетов

Записи регистра пакетов индивидуально принадлежат проектам установки, на которые они ссылаются. Инсталлятор пакета отвечает за добавление собственной записи, а соответствующий удалитель отвечает за её удаление.

Команда export(PACKAGE) заполняет пользовательский регистр пакетов расположением дерева построения проекта. Деревья построения часто удаляются разработчиками и не имеют события «удаление», которое могло бы инициировать удаление их записей. Чтобы поддерживать чистоту регистров, команда find_package() автоматически удаляет устаревшие записи, которые она встречает, если у неё достаточно прав. CMake не предоставляет интерфейса для удаления записи, ссылающейся на существующее дерево построения после вызова export(PACKAGE). Однако, если проект удалит свой файл конфигурации пакета из дерева построения, запись, ссылающаяся на расположение, будет считаться устаревшей.

© 2000–2019 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.7/manual/cmake-packages.7.html

Spec-Zone.ru

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