find_package
- Базовая подпись и режим модуля
- Полная подпись и режим конфигурации
- Выбор версии
- Процедура поиска
- Переменные интерфейса файла пакета
Найти внешний проект и загрузить его настройки.
Базовая подпись и режим модуля
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[NO_POLICY_SCOPE])
Ищет и загружает настройки из внешнего проекта. <PackageName>_FOUND будет установлено, чтобы указать, был ли найден пакет. Когда пакет найден, информация, специфичная для пакета, предоставляется через переменные и Импортированные цели, документированные самим пакетом. Опция QUIET отключает информационные сообщения, включая те, которые указывают, что пакет не найден, если он не REQUIRED. Опция REQUIRED останавливает обработку с сообщением об ошибке, если пакет не найден.
Указанный после COMPONENTS опции (или после REQUIRED опции, если она присутствует) список необходимых компонентов для пакета. Дополнительные необязательные компоненты могут быть перечислены после OPTIONAL_COMPONENTS. Доступные компоненты и их влияние на то, считается ли пакет найденным, определяются целевым пакетом.
Аргумент [version] запрашивает версию, с которой должен быть совместим найденный пакет (формат major[.minor[.patch[.tweak]]]). Опция EXACT запрашивает, чтобы версия точно совпадала. Если ни [version], ни список компонентов не указаны для рекурсивного вызова внутри модуля поиска, соответствующие аргументы автоматически передаются из внешнего вызова (включая флаг EXACT для [version]). Поддержка версий в настоящее время предоставляется только на основе пакета (см. раздел Выбор версии ниже).
См. документацию команды cmake_policy() для обсуждения опции NO_POLICY_SCOPE.
Команда имеет два режима поиска пакетов: «Модуль» и «Конфигурация». Вышеуказанная подпись выбирает режим «Модуль». Если модуль не найден, команда переходит к режиму «Конфигурация», описанному ниже. Этот переход отключается, если указана опция MODULE.
В режиме «Модуль» CMake ищет файл с именем Find<PackageName>.cmake. Файл сначала ищется в CMAKE_MODULE_PATH, затем среди Модулей поиска, предоставляемых установкой CMake. Если файл найден, он читается и обрабатывается CMake. Он отвечает за поиск пакета, проверку версии и создание необходимых сообщений. Некоторые модули поиска предоставляют ограниченную или никакую поддержку версионирования; ознакомьтесь с документацией модуля.
Если опция MODULE не указана в вышеприведенной подписи, CMake сначала ищет пакет в режиме «Модуль». Затем, если пакет не найден, он снова ищет в режиме «Конфигурация». Пользователь может установить переменную CMAKE_FIND_PACKAGE_PREFER_CONFIG в значение TRUE, чтобы направить CMake сначала искать в режиме «Конфигурация», прежде чем переходить к режиму «Модуль».
Полная подпись и режим конфигурации
В коде пользователя следует в основном искать пакеты, используя вышеописанную базовую подпись. Остальная часть документации по этой команде описывает полную подпись команды и подробности процесса поиска. Разработчики проектов, желающие предоставить пакет, который должен быть найден этой командой, могут продолжить чтение.
Полная подпись команды в режиме «Конфигурация»:
find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[CONFIG|NO_MODULE]
[NO_POLICY_SCOPE]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_PACKAGE_REGISTRY]
[NO_CMAKE_BUILDS_PATH] # Deprecated; does nothing.
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
Опция CONFIG, синонимичная опция NO_MODULE, или использование опций, не указанных в базовой подписи, все навязывают чистый режим «Конфигурация». В чистом режиме «Конфигурация» команда пропускает поиск в режиме «Модуль» и сразу переходит к поиску в режиме «Конфигурация».
Поиск в режиме «Конфигурация» пытается найти файл конфигурации, предоставленный искомым пакетом. В кэш добавляется запись под названием <PackageName>_DIR, которая будет содержать каталог, содержащий файл. По умолчанию команда ищет пакет с именем <PackageName>. Если указана опция NAMES, вместо <PackageName> используются имена, следующие за ней. Команда ищет файл с именем <PackageName>Config.cmake или <lower-case-package-name>-config.cmake для каждого указанного имени. Замена возможных имён файлов конфигурации может быть задана с помощью опции CONFIGS. Процедура поиска указана ниже. После того как он найден, файл конфигурации читается и обрабатывается CMake. Поскольку файл предоставляется пакетом, он уже знает расположение содержимого пакета. Полный путь к файлу конфигурации хранится в переменной cmake <PackageName>_CONFIG.
Все файлы конфигурации, которые были рассмотрены CMake при поиске установки пакета с подходящей версией, хранятся в переменной cmake <PackageName>_CONSIDERED_CONFIGS, а соответствующие версии в <PackageName>_CONSIDERED_VERSIONS.
Если файл конфигурации пакета не найден, CMake сгенерирует ошибку, описывающую проблему, если не указан аргумент QUIET. Если REQUIRED указано и пакет не найден, генерируется фатальная ошибка, и выполнение шага настройки останавливается. Если <PackageName>_DIR установлена в каталог, не содержащий файла конфигурации, CMake проигнорирует его и начнёт поиск с нуля.
Разработчикам пакетов, предоставляющим файлы конфигурации пакета CMake, рекомендуется называть и устанавливать их таким образом, чтобы процедура поиска, описанная ниже, могла их найти без необходимости дополнительных опций.
Выбор версии
Когда указан аргумент [version], режим «Конфигурация» будет искать только такую версию пакета, которая заявляет о совместимости с запрошенной версией (формат major[.minor[.patch[.tweak]]]). Если указана опция EXACT, может быть найдена только версия пакета, утверждающая о точном соответствии запрашиваемой версии. CMake не устанавливает никаких соглашений о значении номеров версий. Номера версий пакетов проверяются файлами «версия», предоставляемыми самими пакетами. Для файла конфигурации кандидата пакета <config-file>.cmake соответствующий файл версии находится рядом с ним и называется либо <config-file>-version.cmake или <config-file>Version.cmake. Если такой файла версии недоступен, то файл конфигурации считается несовместимым с какой-либо запрошенной версией. Базовый файл версии, содержащий код для соответствия версиям, может быть создан с помощью модуля CMakePackageConfigHelpers. Когда файл версии найден, он загружается для проверки запрошенного номера версии. Файл версии загружается в вложенном контексте, в котором определены следующие переменные:
-
PACKAGE_FIND_NAME -
<PackageName> -
PACKAGE_FIND_VERSION -
полная строка запрошенной версии
-
PACKAGE_FIND_VERSION_MAJOR -
главная версия, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MINOR -
второстепенная версия, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_PATCH -
исправленная версия, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_TWEAK -
дополнительная версия, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_COUNT -
количество компонентов версии, от 0 до 4
Файл версии проверяет, удовлетворяет ли он запрошенной версии, и устанавливает следующие переменные:
-
PACKAGE_VERSION -
полная строка предоставленной версии
-
PACKAGE_VERSION_EXACT -
true, если версия точно совпадает
-
PACKAGE_VERSION_COMPATIBLE -
true, если версия совместима
-
PACKAGE_VERSION_UNSUITABLE -
true, если не подходит как любая версия
Эти переменные проверяются командой find_package, чтобы определить, предоставляет ли файл конфигурации приемлемую версию. Они недоступны после того, как вызов find_package возвращается. Если версия приемлема, устанавливаются следующие переменные:
-
<PackageName>_VERSION -
полная строка предоставленной версии
-
<PackageName>_VERSION_MAJOR -
главная версия, если предоставлена, иначе 0
-
<PackageName>_VERSION_MINOR -
второстепенная версия, если предоставлена, иначе 0
-
<PackageName>_VERSION_PATCH -
исправленная версия, если предоставлена, иначе 0
-
<PackageName>_VERSION_TWEAK -
дополнительная версия, если предоставлена, иначе 0
-
<PackageName>_VERSION_COUNT -
количество компонентов версии, от 0 до 4
и соответствующий файл конфигурации пакета загружается. Если доступно несколько файлов конфигурации пакета, файлы версий которых утверждают о совместимости с запрошенной версией, не определено, какой из них выбирается: если переменная CMAKE_FIND_PACKAGE_SORT_ORDER не установлена, не предпринимается попытка выбрать наибольшую или наиболее близкую версию.
Чтобы управлять порядком, в котором find_package проверяет совместимость, используйте две переменные CMAKE_FIND_PACKAGE_SORT_ORDER и CMAKE_FIND_PACKAGE_SORT_DIRECTION. Например, для выбора самой высокой версии можно установить
SET(CMAKE_FIND_PACKAGE_SORT_ORDER NATURAL) SET(CMAKE_FIND_PACKAGE_SORT_DIRECTION DEC)
перед вызовом find_package.
Процедура поиска
CMake строит набор возможных префиксов установки для пакета. Под каждым префиксом несколько каталогов проверяются на наличие файла конфигурации. Таблицы ниже показывают каталоги, которые проверяются. Каждый элемент предназначен для древовидных структур установки, следующих соглашениям Windows (W), UNIX (U) или Apple (A) :
<prefix>/ (W) <prefix>/(cmake|CMake)/ (W) <prefix>/<name>*/ (W) <prefix>/<name>*/(cmake|CMake)/ (W) <prefix>/(lib/<arch>|lib*|share)/cmake/<name>*/ (U) <prefix>/(lib/<arch>|lib*|share)/<name>*/ (U) <prefix>/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (U) <prefix>/<name>*/(lib/<arch>|lib*|share)/cmake/<name>*/ (W/U) <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/ (W/U) <prefix>/<name>*/(lib/<arch>|lib*|share)/<name>*/(cmake|CMake)/ (W/U)
В системах, поддерживающих macOS FRAMEWORK и BUNDLE, следующие каталоги проверяются на наличие фреймворков или пакетов приложений, содержащих конфигурационный файл:
<prefix>/<name>.framework/Resources/ (A) <prefix>/<name>.framework/Resources/CMake/ (A) <prefix>/<name>.framework/Versions/*/Resources/ (A) <prefix>/<name>.framework/Versions/*/Resources/CMake/ (A) <prefix>/<name>.app/Contents/Resources/ (A) <prefix>/<name>.app/Contents/Resources/CMake/ (A)
Во всех случаях <name> интерпретируется как регистронезависимая и соответствует любому из указанных имен (<PackageName> или имена, заданные NAMES).
Пути с lib/<arch> активируются, если переменная CMAKE_LIBRARY_ARCHITECTURE установлена. lib* включает одно или несколько значений lib64, lib32, libx32 или lib (проверяются в указанном порядке).
- Пути с
lib64проверяются в 64-битных платформах, если свойствоFIND_LIBRARY_USE_LIB64_PATHSустановлено в значениеTRUE. - Пути с
lib32проверяются в 32-битных платформах, если свойствоFIND_LIBRARY_USE_LIB32_PATHSустановлено в значениеTRUE. - Пути с
libx32проверяются в платформах, использующих ABI x32, если свойствоFIND_LIBRARY_USE_LIBX32_PATHSустановлено в значениеTRUE. - Путь
libвсегда проверяется.
Если PATH_SUFFIXES указан, суффиксы добавляются к каждому (W) или (U) элементу каталога по одному.
Этот набор каталогов предназначен для работы совместно с проектами, предоставляющими конфигурационные файлы в своих дереве установки. Каталоги, помеченные (W), предназначены для установок на Windows, где префикс может указывать на верхний уровень каталога установки приложения. Каталоги, помеченные (U), предназначены для установок на платформах UNIX, где префикс используется несколькими пакетами. Это всего лишь соглашение, поэтому все каталоги (W) и (U) все равно проверяются во всех платформах. Каталоги, помеченные (A), предназначены для установок на платформах Apple. Переменные CMAKE_FIND_FRAMEWORK и CMAKE_FIND_APPBUNDLE определяют порядок предпочтения.
Набор префиксов установки строится по следующим шагам. Если NO_DEFAULT_PATH указан, все NO_* опции активированы.
- Проверяются пути, указанные в переменной CMake
<PackageName>_ROOTи переменной среды<PackageName>_ROOT, где<PackageName>— пакет, который нужно найти. Переменные корня пакета хранятся как стек, поэтому, если вызов происходит из модуля поиска, пути корня родительского модуля поиска также будут проверяться после путей текущего пакета. Это можно пропустить, если переданоNO_PACKAGE_ROOT_PATH. См. политикуCMP0074. -
Проверяются пути, указанные в переменных кэша, специфичных для CMake. Они предназначены для использования в командной строке с
-DVAR=value. Значения интерпретируются как списки, разделённые точкой с запятой. Это можно пропустить, если переданоNO_CMAKE_PATH:CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
-
Проверяются пути, указанные в переменных среды, специфичных для CMake. Они предназначены для задания в конфигурации оболочки пользователя и, следовательно, используют разделитель путей хоста (
;в Windows и:в UNIX). Это можно пропустить, если переданоNO_CMAKE_ENVIRONMENT_PATH:<PackageName>_DIR CMAKE_PREFIX_PATH CMAKE_FRAMEWORK_PATH CMAKE_APPBUNDLE_PATH
- Проверяются пути, указанные опцией
HINTS. Обычно это пути, вычисленные путём анализа системы, такие как подсказка, полученная из расположения другого уже найденного элемента. Жёстко заданные предположения должны быть указаны с помощью опцииPATHS. -
Проверяются стандартные переменные среды. Это можно пропустить, если передано
NO_SYSTEM_ENVIRONMENT_PATH. Элементы пути, оканчивающиеся на/binили/sbin, автоматически преобразуются в каталоги их родителей:PATH
- Проверяются пути, сохранённые в реестре пакетов CMake пользователя. Это можно пропустить, если передано
NO_CMAKE_PACKAGE_REGISTRYили путём установкиCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRYв значениеTRUE. См. руководствоcmake-packages(7)для получения информации о реестре пакетов пользователя. -
Проверяются переменные CMake, определённые в файлах платформы для текущей системы. Это можно пропустить, если передано
NO_CMAKE_SYSTEM_PATH:CMAKE_SYSTEM_PREFIX_PATH CMAKE_SYSTEM_FRAMEWORK_PATH CMAKE_SYSTEM_APPBUNDLE_PATH
- Проверяются пути, сохранённые в реестре пакетов CMake системы. Это можно пропустить, если передано
NO_CMAKE_SYSTEM_PACKAGE_REGISTRYили путём установкиCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRYв значениеTRUE. См. руководствоcmake-packages(7)для получения информации о реестре пакетов системы. - Проверяются пути, указанные опцией
PATHS. Обычно это жёстко заданные предположения.
Переменная CMake CMAKE_FIND_ROOT_PATH указывает один или несколько каталогов, которые будут добавлены перед всеми другими каталогами поиска. Это фактически «перезадаёт корень» всего поиска в указанных местах. Пути, которые являются потомками переменной CMAKE_STAGING_PREFIX, исключаются из этого перезадания корня, поскольку эта переменная всегда является путём на системе хоста. По умолчанию CMAKE_FIND_ROOT_PATH пуста.
Переменная CMAKE_SYSROOT также может быть использована для указания ровно одного каталога, который будет использоваться в качестве префикса. Установка CMAKE_SYSROOT также имеет другие эффекты. См. документацию по этой переменной для получения дополнительной информации.
Эти переменные особенно полезны при кросс-компиляции, чтобы указать на корневой каталог целевой среды, и CMake также будет искать там. По умолчанию в первую очередь проверяются каталоги, перечисленные в CMAKE_FIND_ROOT_PATH, затем каталог CMAKE_SYSROOT, а затем каталоги без корня будут проверяться. Поведение по умолчанию может быть скорректировано путём установки CMAKE_FIND_ROOT_PATH_MODE_PACKAGE. Это поведение может быть переопределено вручную в каждом вызове с помощью опций:
-
CMAKE_FIND_ROOT_PATH_BOTH -
Проверка в порядке, описанном выше.
-
NO_CMAKE_FIND_ROOT_PATH -
Не использовать переменную
CMAKE_FIND_ROOT_PATH. -
ONLY_CMAKE_FIND_ROOT_PATH -
Проверять только каталоги с перезаданным корнем и каталоги ниже
CMAKE_STAGING_PREFIX.
По умолчанию порядок поиска предназначен для наиболее специфичных для общих случаев использования. Проекты могут переопределить порядок, просто вызвав команду несколько раз и используя опции NO_*:
find_package (<PackageName> PATHS paths... NO_DEFAULT_PATH) find_package (<PackageName>)
Как только один из вызовов окажется успешным, переменная результата будет установлена и сохранена в кэше, поэтому ни один вызов не будет искать ещё раз.
По умолчанию значение, хранящееся в переменной результата, будет путём, в котором найден файл. Переменная CMAKE_FIND_PACKAGE_RESOLVE_SYMLINKS может быть установлена в значение TRUE перед вызовом find_package для разрешения символьных ссылок и сохранения реального пути к файлу.
Каждый вызов find_package без атрибута REQUIRED можно отключить, установив переменную CMAKE_DISABLE_FIND_PACKAGE_<PackageName> в значение TRUE.
Переменные интерфейса файла пакета
При загрузке файла модуля поиска или конфигурации пакета find_package определяет переменные для предоставления информации об аргументах вызова (и восстанавливает их исходное состояние перед возвратом):
-
CMAKE_FIND_PACKAGE_NAME -
искомый
<PackageName> -
<PackageName>_FIND_REQUIRED -
true, если был задан параметр
REQUIRED -
<PackageName>_FIND_QUIETLY -
true, если был задан параметр
QUIET -
<PackageName>_FIND_VERSION -
полная строка запрошенной версии
-
<PackageName>_FIND_VERSION_MAJOR -
главная версия, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MINOR -
второстепенная версия, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_PATCH -
дополнительная версия, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_TWEAK -
версия доработки, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_COUNT -
количество компонентов версии, от 0 до 4
-
<PackageName>_FIND_VERSION_EXACT -
true, если был задан параметр
EXACT -
<PackageName>_FIND_COMPONENTS -
список запрошенных компонентов
-
<PackageName>_FIND_REQUIRED_<c> -
true, если компонент
<c>обязателен, false, если компонент<c>необязателен
В режиме модуля загруженный модуль поиска отвечает за выполнение запроса, подробно описанного в этих переменных; см. подробности в модуле поиска. В режиме конфигурации find_package автоматически обрабатывает параметры REQUIRED, QUIET, и [version], но оставляет обработку компонентов на усмотрение файла конфигурации пакета. Файл конфигурации пакета может установить <PackageName>_FOUND в false, чтобы сообщить find_package о том, что требования к компонентам не удовлетворены.
© 2000–2020 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.15/command/find_package.html