find_package
- Режимы поиска
- Базовая подпись
- Полная подпись
- Процедура поиска в режиме конфигурации
- Выбор версии в режиме конфигурации
- Переменные интерфейса файла пакета
Примечание
В Using Dependencies Guide приводится общее введение в эту тему. Он предоставляет более широкую картину того, как команда find_package() вписывается в общую картину, включая её взаимосвязь с модулем FetchContent. Рекомендуется предварительно ознакомиться с руководством, прежде чем переходить к деталям ниже.
Найти пакет (обычно предоставляемый чем-то внешним для проекта) и загрузить его пакетные детали. Вызовы этой команды также могут быть перехвачены поставщиками зависимостей.
Режимы поиска
Команда имеет несколько режимов поиска пакетов:
- Режим модуля
-
В этом режиме CMake ищет файл
Find<PackageName>.cmake, сначала в расположениях, указанных вCMAKE_MODULE_PATH, затем среди Модулей поиска, предоставляемых установкой CMake. Если файл найден, он считывается и обрабатывается CMake. Он отвечает за поиск пакета, проверку версии и вывод необходимых сообщений. Некоторые модули поиска предоставляют ограниченную или никакую поддержку версионирования; см. документацию модуля поиска.Файл
Find<PackageName>.cmakeобычно не предоставляется самим пакетом. Скорее, он обычно предоставляется чем-то внешним по отношению к пакету, например, операционной системой, самим CMake или даже проектом, из которого была вызвана командаfind_package(). Будучи внешними, Модули поиска имеют эвристический характер и могут устареть. Они обычно ищут определённые библиотеки, файлы и другие артефакты пакета.Режим модуля поддерживается только базовой подписью команды базовой подписи.
- Режим конфигурации
-
В этом режиме CMake ищет файл
<lowercasePackageName>-config.cmakeили<PackageName>Config.cmake. Он также будет искать<lowercasePackageName>-config-version.cmakeили<PackageName>ConfigVersion.cmake, если были указаны детали версии (см. Выбор версии в режиме конфигурации для объяснения того, как используются эти отдельные файлы версии).В режиме конфигурации команде можно предоставить список имен для поиска в качестве имён пакетов. Расположения, где CMake ищет файлы конфигурации и версии, значительно сложнее, чем в режиме модуля (см. Процедуру поиска в режиме конфигурации).
Файлы конфигурации и версии обычно устанавливаются как часть пакета, поэтому они, как правило, более надёжны, чем модули поиска. Они обычно содержат прямые сведения о содержимом пакета, поэтому в самих файлах конфигурации или версии не требуется поиск или эвристика.
Режим конфигурации поддерживается как базовой базовой, так и полной полной подписью команды.
- Режим перенаправления FetchContent
-
Введено в версии 3.24: Вызов
find_package()может быть перенаправлен внутри пакета, предоставляемого модулемFetchContent. Для вызывающего сторона поведение будет аналогично режиму конфигурации, за исключением того, что логика поиска пропущена, и информация о компоненте не используется. См.FetchContent_Declare()иFetchContent_MakeAvailable()для получения дополнительной информации.
Если команда не перенаправлена на пакет, предоставляемый модулем FetchContent, аргументы команды определяют, используется ли режим модуля или конфигурации. При использовании базовой подписи команда сначала выполняет поиск в режиме модуля. Если пакет не найден, поиск переходит в режим конфигурации. Пользователь может установить переменную CMAKE_FIND_PACKAGE_PREFER_CONFIG в значение true, чтобы изменить приоритет и направить CMake на поиск в режиме конфигурации перед возвратом к режиму модуля. Базовая подпись также может быть принудительно использована только в режиме модуля с ключевым словом MODULE. Если используется полная подпись, команда выполняет поиск только в режиме конфигурации.
Если это возможно, пользовательский код обычно должен искать пакеты с использованием базовой подписи, так как это позволяет найти пакет в любом режиме. Авторы проектов, желающие предоставить пакет конфигурации, должны понимать общую картину, как объяснено в Полной подписи и последующих разделах этой страницы.
Базовая подпись
find_package(<PackageName> [version] [EXACT] [QUIET] [MODULE]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER])
Базовая подпись поддерживается как в режиме модуля, так и в режиме конфигурации. Ключевое слово MODULE подразумевает, что для поиска пакета может быть использован только режим модуля без возврата к режиму конфигурации.
Независимо от используемого режима, переменная <PackageName>_FOUND будет установлена, чтобы указать, был ли пакет найден. При нахождении пакета пакетная информация может быть предоставлена через другие переменные и импортированные цели, задокументированные самим пакетом. Опция QUIET отключает информационные сообщения, включая те, которые указывают, что пакет не найден, если он не REQUIRED. Опция REQUIRED останавливает обработку с сообщением об ошибке, если пакет не найден.
После ключевого слова COMPONENTS может быть указан пакетный список необходимых компонентов. Если любой из этих компонентов не может быть удовлетворён, весь пакет считается не найденным. Если присутствует опция REQUIRED, это рассматривается как ошибка, в противном случае выполнение продолжается. В качестве сокращения, если присутствует опция REQUIRED, ключевое слово COMPONENTS может быть опущено, и необходимые компоненты могут быть указаны непосредственно после REQUIRED.
Дополнительные необязательные компоненты могут быть перечислены после OPTIONAL_COMPONENTS. Если их нельзя удовлетворить, пакет по-прежнему может считаться найденным, если все необходимые компоненты удовлетворены.
Набор доступных компонентов и их значение определяются целевым пакетом. Формально, целевой пакет сам определяет, как интерпретировать информацию о компонентах, но должен следовать вышеуказанным ожиданиям. Для вызовов, где компоненты не указаны, нет единого ожидаемого поведения, и целевые пакеты должны чётко определить, что происходит в таких случаях. Общие варианты включают предположение, что необходимо найти все компоненты, нет компонентов или некоторый определённый подмножество доступных компонентов.
Введено в версии 3.24: Ключевое слово REGISTRY_VIEW определяет, какие представления реестра следует запросить. Это ключевое слово имеет смысл только на платформах Windows и будет проигнорировано на всех остальных. Формально, целевой пакет сам определяет, как интерпретировать информацию о представлении реестра.
Введено в версии 3.24: Указание ключевого слова GLOBAL повысит все импортированные цели до глобального уровня в импортируемом проекте. Альтернативно, эту функциональность можно включить, установив переменную CMAKE_FIND_PACKAGE_TARGETS_GLOBAL.
Аргумент [version] запрашивает версию, с которой должен быть совместим найденный пакет. Существует две возможные формы его спецификации:
- Единая версия в формате
major[.minor[.patch[.tweak]]], где каждый компонент — числовое значение. - Диапазон версий в формате
versionMin...[<]versionMax, гдеversionMinиversionMaxимеют тот же формат и ограничения по компонентам, что и единичная версия, при этом компоненты должны быть целыми числами. По умолчанию оба крайних значения включены. Указав<, верхнее крайнее значение будет исключено. Диапазоны версий поддерживаются только с CMake 3.19 и более поздними версиями.
Опция EXACT запрашивает, чтобы версия совпадала точно. Эта опция несовместима с указанием диапазона версий.
Если при рекурсивном вызове внутри модуля поиска не указано [version] и/или список компонентов, соответствующие аргументы автоматически передаются из внешнего вызова (включая флаг EXACT для [version]). Поддержка версий в настоящее время предоставляется только на основе пакета (см. раздел «Выбор версии» ниже). Когда указан диапазон версий, но пакет спроектирован только для ожидания одной версии, пакет проигнорирует верхнее крайнее значение диапазона и учтёт только нижнее крайнее значение диапазона.
См. документацию команды cmake_policy() для обсуждения параметра NO_POLICY_SCOPE.
Новая версия 3.24: Ключевое слово BYPASS_PROVIDER разрешено только при вызове find_package() поставщиком зависимостей. Он может использоваться поставщиками для непосредственного вызова встроенной реализации find_package() и предотвратить повторное перенаправление этого вызова. Будущие версии CMake могут обнаружить попытки использования этого ключевого слова из мест, отличных от поставщика зависимостей, и остановить выполнение с ошибкой fatal.
Полная подпись
find_package(<PackageName> [version] [EXACT] [QUIET]
[REQUIRED] [[COMPONENTS] [components...]]
[OPTIONAL_COMPONENTS components...]
[CONFIG|NO_MODULE]
[GLOBAL]
[NO_POLICY_SCOPE]
[BYPASS_PROVIDER]
[NAMES name1 [name2 ...]]
[CONFIGS config1 [config2 ...]]
[HINTS path1 [path2 ... ]]
[PATHS path1 [path2 ... ]]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[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_INSTALL_PREFIX]
[NO_CMAKE_SYSTEM_PACKAGE_REGISTRY]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH])
Параметр CONFIG, синонимичный параметр NO_MODULE, или использование параметров, не указанных в основной подписи, все применяют режим Pure Config. В режиме Pure Config команда пропускает поиск в режиме Module и сразу переходит к поиску в режиме Config.
Поиск в режиме Config пытается найти файл конфигурации, предоставляемый пакетом. В кэш-запись под названием <PackageName>_DIR записывается каталог, содержащий этот файл. По умолчанию команда ищет пакет с именем <PackageName>. Если указан параметр NAMES, вместо <PackageName> используются имена, следующие за ним. Эти имена также учитываются при определении перенаправления вызова на пакет, предоставляемый модулем FetchContent.
Команда ищет файл под названием <PackageName>Config.cmake или <lowercasePackageName>-config.cmake для каждого указанного имени. Заменяющий набор возможных имён файлов конфигурации можно указать с помощью параметра CONFIGS. Процедура поиска в режиме Config указана ниже. После нахождения проверяется любое ограничение версии, и если оно выполняется, файл конфигурации читается и обрабатывается CMake. Поскольку файл предоставляется пакетом, он уже знает расположение содержимого пакета. Полный путь к файлу конфигурации хранится в переменной cmake <PackageName>_CONFIG.
Все файлы конфигурации, которые CMake рассматривал при поиске пакета с подходящей версией, хранятся в переменной <PackageName>_CONSIDERED_CONFIGS, а связанные версии — в переменной <PackageName>_CONSIDERED_VERSIONS.
Если файл конфигурации пакета не найден, CMake сгенерирует ошибку, описывающую проблему, если не указан аргумент QUIET. Если указан REQUIRED, и пакет не найден, генерируется ошибка fatal, и этап конфигурации прекращает выполнение. Если <PackageName>_DIR был установлен в каталог, не содержащий файл конфигурации, CMake проигнорирует его и начнёт поиск заново.
Создатели пакетов, предоставляющих файлы конфигурации CMake, должны присваивать имена и устанавливать их таким образом, чтобы Процедура поиска в режиме Config, описанная ниже, находила их без необходимости использования дополнительных параметров.
Процедура поиска в режиме Config
Примечание
Когда используется режим Config, эта процедура поиска применяется независимо от того, была ли использована полная или основная подпись.
Новая версия 3.24: Все вызовы find_package() (даже в режиме Module) сначала ищут файл конфигурации пакета в каталоге CMAKE_FIND_PACKAGE_REDIRECTS_DIR. Модуль FetchContent или даже сам проект могут записывать файлы в это расположение, чтобы перенаправить вызовы find_package() на контент, уже предоставленный проектом. Если файл конфигурации пакета не найден в этом расположении, поиск продолжается в соответствии с логикой, описанной ниже.
CMake строит набор возможных префиксов установки для пакета. Под каждым префиксом ищутся несколько каталогов для файла конфигурации. Таблицы ниже показывают каталоги, которые ищутся. Каждая запись предназначена для системных деревьев установки, следуя соглашениям Windows (W), UNIX (U) или Apple (A) :
Запись | Соглашение |
|---|---|
| W |
| W |
| W |
| W |
| W |
| U |
| U |
| U |
| W/U |
| W/U |
| W/U |
На системах, поддерживающих macOS FRAMEWORK и BUNDLE, следующие каталоги ищутся в Frameworks или Application Bundles, содержащих файл конфигурации:
Запись | Соглашение |
|---|---|
| A |
| A |
| A |
| A |
| A |
| A |
Во всех случаях <name> рассматривается как нечувствительный к регистру и соответствует любому из указанных имён (<PackageName> или имена, заданные параметром NAMES).
Если хотя бы один компилируемый язык включён, могут быть выполнены архитектурно-специфические поиски каталогов lib/<arch> и lib* в соответствии с целевой архитектурой компилятора в следующем порядке:
-
lib/<arch> -
Ищется, если переменная
CMAKE_LIBRARY_ARCHITECTUREзадана. -
lib64 -
Ищется на 64-битных платформах (
CMAKE_SIZEOF_VOID_Pравно 8) и свойствоFIND_LIBRARY_USE_LIB64_PATHSустановлено вTRUE. -
lib32 -
Ищется на 32-битных платформах (
CMAKE_SIZEOF_VOID_Pравно 4) и свойствоFIND_LIBRARY_USE_LIB32_PATHSустановлено вTRUE. -
libx32 -
Ищется на платформах, использующих ABI x32, если свойство
FIND_LIBRARY_USE_LIBX32_PATHSустановлено вTRUE. -
lib -
Всегда ищется.
Изменено в версии 3.24: На платформе Windows можно включить запросы к реестру в качестве части каталогов, указанных с помощью ключевых слов HINTS и PATHS, используя специальный синтаксис. Такие спецификации будут проигнорированы на всех остальных платформах.
Новое в версии 3.24: REGISTRY_VIEW может быть указано для управления запросами к регистру Windows, указанными как часть PATHS и HINTS.
Укажите, какие представления реестра должны быть запрошены. Этот параметр имеет смысл только на платформах Windows и будет проигнорирован на других. При отсутствии указания используется представление TARGET, когда политика CMP0134 NEW. Обратитесь к CMP0134 за сведениями о представлении по умолчанию, когда политика OLD.
-
64 -
Запрос 64-битного реестра. В 32-битных системах Windows всегда возвращает строку
/REGISTRY-NOTFOUND. -
32 -
Запрос 32-битного реестра.
-
64_32 -
Запрос обоих представлений (
64и32) и генерация пути для каждого. -
32_64 -
Запрос обоих представлений (
32и64) и генерация пути для каждого. -
HOST -
Запрос реестра, соответствующего архитектуре хоста:
64в 64-битных системах Windows и32в 32-битных системах Windows. -
TARGET -
Запрос реестра, соответствующего архитектуре, заданной переменной
CMAKE_SIZEOF_VOID_P. Если она не определена, используется представлениеHOST. -
BOTH -
Запрос обоих представлений (
32и64). Порядок зависит от следующих правил: Если переменнаяCMAKE_SIZEOF_VOID_Pопределена, используется следующее представление в зависимости от её значения:-
8:64_32 -
4:32_64
Если переменная
CMAKE_SIZEOF_VOID_Pне определена, используется архитектура хоста:- 64-бит:
64_32 - 32-бит:
32
-
Если PATH_SUFFIXES задано, суффиксы добавляются к каждой (W) или (U) директории поочерёдно.
Этот набор директорий предназначен для работы с проектами, предоставляющими файлы конфигурации в своих деревьях установки. Директории, помеченные (W), предназначены для установки в Windows, где префикс может указывать на корень каталога установки приложения. Директории, помеченные (U), предназначены для установки на платформах UNIX, где префикс общий для нескольких пакетов. Это всего лишь соглашение, поэтому все директории (W) и (U) всё равно ищутся на всех платформах. Директории, помеченные (A), предназначены для установки на платформах Apple. Переменные CMAKE_FIND_FRAMEWORK и CMAKE_FIND_APPBUNDLE определяют порядок предпочтения.
Набор префиксов установки строится следующим образом. Если NO_DEFAULT_PATH указано, все NO_* опции активируются.
-
Поиск префиксов, уникальных для текущего
<PackageName>, в котором осуществляется поиск. См. политикуCMP0074.Новое в версии 3.12.
В частности, префиксы поиска, указанные в следующих переменных, в порядке:
-
<PackageName>_ROOTПеременная CMake, где<PackageName>— это имя пакета, сохраняющее регистр. -
<PACKAGENAME>_ROOTПеременная CMake, где<PACKAGENAME>— это имя пакета в верхнем регистре. См. политикуCMP0144.Новое в версии 3.27.
-
<PackageName>_ROOTПеременная среды, где<PackageName>— это имя пакета, сохраняющее регистр. -
<PACKAGENAME>_ROOTПеременная среды, где<PACKAGENAME>— это имя пакета в верхнем регистре. См. политикуCMP0144.Новое в версии 3.27.
Переменные корня пакета поддерживаются как стек, поэтому если вызов происходит изнутри модуля поиска, пути корня модуля родителя также будут просматриваться после путей текущего пакета. Это можно пропустить, если
NO_PACKAGE_ROOT_PATHпередано или путем установкиCMAKE_FIND_USE_PACKAGE_ROOT_PATHна значениеFALSE. -
-
Пути поиска, указанные в переменных кэша CMake. Они предназначены для использования в командной строке с
-DVAR=VALUE. Значения интерпретируются как списки, разделённые точкой с запятой. Это можно пропустить, еслиNO_CMAKE_PATHпередано или путем установкиCMAKE_FIND_USE_CMAKE_PATHна значение %%%CODE_BLOCK_180%%: -
Пути поиска, указанные в переменных среды CMake. Они предназначены для установки в конфигурации командной оболочки пользователя и поэтому используют системный разделитель путей (
;в Windows и:в UNIX). Это можно пропустить, еслиNO_CMAKE_ENVIRONMENT_PATHпередано или путем установкиCMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATHна значение %%%CODE_BLOCK_188%%:<PackageName>_DIRCMAKE_PREFIX_PATHCMAKE_FRAMEWORK_PATHCMAKE_APPBUNDLE_PATH
- Пути поиска, указанные параметром
HINTS. Обычно это пути, вычисленные с помощью анализа системы, такие как подсказка, полученная из расположения уже найденного элемента. Жестко закодированные предположения должны быть указаны параметромPATHS. -
Поиск по стандартным системным переменным среды. Это можно пропустить, если
NO_SYSTEM_ENVIRONMENT_PATHпередано или путем установкиCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATHна значениеFALSE. Элементы пути, оканчивающиеся на/binили/sbin, автоматически преобразуются в их родительские каталоги:PATH
-
Поиск по путям, хранящимся в реестре пакетов CMake Пользовательского реестра пакетов. Это можно пропустить, если
NO_CMAKE_PACKAGE_REGISTRYпередано или путем установки переменнойCMAKE_FIND_USE_PACKAGE_REGISTRYна значениеFALSEили устаревшей переменнойCMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRYна значениеTRUE.Подробные сведения о пользовательском реестре пакетов см. в руководстве
cmake-packages(7). -
Поиск по переменным CMake, определённым в файлах платформы для текущей системы. Поиск по
CMAKE_INSTALL_PREFIXиCMAKE_STAGING_PREFIXможно пропустить, еслиNO_CMAKE_INSTALL_PREFIXпередано или путем установкиCMAKE_FIND_USE_INSTALL_PREFIXна значениеFALSE. Все эти местоположения можно пропустить, еслиNO_CMAKE_SYSTEM_PATHпередано или путем установкиCMAKE_FIND_USE_CMAKE_SYSTEM_PATHна значение %%%CODE_BLOCK_214%%:Пути платформы, которые содержатся в этих переменных, обычно включают расположения, содержащие установленное программное обеспечение. Например,
/usr/localдля платформ на базе UNIX. -
Поиск по путям, хранящимся в реестре пакетов CMake Системного реестра пакетов. Это можно пропустить, если
NO_CMAKE_SYSTEM_PACKAGE_REGISTRYпередано или путем установкиCMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRYпеременной на значениеFALSEили устаревшей переменнойCMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRYна значениеTRUE.Подробные сведения о системном реестре пакетов см. в руководстве
cmake-packages(7). - Поиск по путям, указанным параметром
PATHS. Обычно это жестко закодированные предположения.
Переменные CMAKE_IGNORE_PATH, CMAKE_IGNORE_PREFIX_PATH, CMAKE_SYSTEM_IGNORE_PATH и CMAKE_SYSTEM_IGNORE_PREFIX_PATH также могут привести к игнорированию некоторых из вышеперечисленных расположений.
Новое в версии 3.16: Добавлены переменные CMAKE_FIND_USE_<CATEGORY> для глобального отключения различных мест поиска.
Переменная 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 может быть отключён или сделан REQUIRED:
- Установка переменной
CMAKE_DISABLE_FIND_PACKAGE_<PackageName>вTRUEотключает пакет. Это также отключает перенаправление на пакет, предоставляемый модулемFetchContent. - Установка переменной
CMAKE_REQUIRE_FIND_PACKAGE_<PackageName>вTRUEделает пакет REQUIRED.
Установка обеих переменных одновременно в TRUE является ошибкой.
Выбор версии в режиме конфигурации
Примечание
При использовании режима конфигурации этот процесс выбора версии применяется независимо от того, был ли задан полный или базовый подпись.
При указании аргумента [version] режим конфигурации будет искать только версию пакета, которая заявляет о совместимости с запрошенной версией (см. спецификацию формата). При указании опции EXACT может быть найдена только версия пакета, утверждающая точное соответствие запрошенной версии. CMake не устанавливает никакой конвенции для значения версий. Версии пакетов проверяются файлами "version", предоставляемыми самими пакетами или модулем FetchContent. Для файла конфигурации кандидата <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_FIND_VERSION_RANGE -
Полная строка запрошенного диапазона версий
-
PACKAGE_FIND_VERSION_RANGE_MIN -
Это указывает, должна ли нижняя граница диапазона версий включаться или исключаться. В настоящее время единственное поддерживаемое значение для этой переменной —
INCLUDE. -
PACKAGE_FIND_VERSION_RANGE_MAX -
Это указывает, должна ли верхняя граница диапазона версий включаться или исключаться. Поддерживаемые значения для этой переменной —
INCLUDEиEXCLUDE. -
PACKAGE_FIND_VERSION_MIN -
Полная строка запрошенной версии нижней границы диапазона
-
PACKAGE_FIND_VERSION_MIN_MAJOR -
Главная версия нижней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MIN_MINOR -
Вспомогательная версия нижней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MIN_PATCH -
Версия исправления нижней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MIN_TWEAK -
Версия доработки нижней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MIN_COUNT -
Количество компонент версии нижней границы, от 0 до 4
-
PACKAGE_FIND_VERSION_MAX -
Полная строка запрошенной версии верхней границы диапазона
-
PACKAGE_FIND_VERSION_MAX_MAJOR -
Главная версия верхней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MAX_MINOR -
Вспомогательная версия верхней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MAX_PATCH -
Версия исправления верхней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MAX_TWEAK -
Версия доработки верхней границы, если запрошена, иначе 0
-
PACKAGE_FIND_VERSION_MAX_COUNT -
Количество компонент версии верхней границы, от 0 до 4
Независимо от того, задана ли одна версия или диапазон версий, переменная PACKAGE_FIND_VERSION_COMPLETE будет определена и будет содержать полную запрошенную строку версии, как задано.
Файл версии проверяет, удовлетворяет ли он запрошенной версии, и устанавливает эти переменные:
-
PACKAGE_VERSION -
Полная предоставленная строка версии
-
PACKAGE_VERSION_EXACT -
Истина, если версия соответствует точно
-
PACKAGE_VERSION_COMPATIBLE -
Истина, если версия совместима
-
PACKAGE_VERSION_UNSUITABLE -
Истина, если не подходит ни как какая версия
Эти переменные проверяются командой 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.
Переменные интерфейса файла пакета
При загрузке модуля поиска или файла конфигурации пакета find_package определяет переменные для предоставления информации о параметрах вызова (и восстанавливает их исходное состояние перед возвратом):
-
CMAKE_FIND_PACKAGE_NAME -
Искомый
<PackageName> -
<PackageName>_FIND_REQUIRED -
Истина, если был задан параметр
REQUIRED -
<PackageName>_FIND_QUIETLY -
Истина, если был задан параметр
QUIET -
<PackageName>_FIND_REGISTRY_VIEW -
Запрашиваемый вид, если был задан параметр
REGISTRY_VIEW -
<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 -
Истина, если был задан параметр
EXACT -
<PackageName>_FIND_COMPONENTS -
Список указанных компонентов (обязательные и необязательные)
-
<PackageName>_FIND_REQUIRED_<c> -
Истина, если компонент
<c>является обязательным, ложь, если компонент<c>является необязательным
Если задан диапазон версий, переменные версии выше будут содержать значения, основанные на нижней границе диапазона версии. Это делается для сохранения совместимости с пакетами, которые не реализованы, чтобы ожидать диапазоны версий. Кроме того, диапазон версий будет описан следующими переменными:
-
<PackageName>_FIND_VERSION_RANGE -
Полная запрашиваемая строка диапазона версий
-
<PackageName>_FIND_VERSION_RANGE_MIN -
Определяет, включается или исключается нижняя граница диапазона версии. В настоящее время
INCLUDE— единственное поддерживаемое значение. -
<PackageName>_FIND_VERSION_RANGE_MAX -
Определяет, включается или исключается верхняя граница диапазона версии. Возможные значения для этой переменной —
INCLUDEилиEXCLUDE. -
<PackageName>_FIND_VERSION_MIN -
Полная запрашиваемая строка версии нижней границы диапазона
-
<PackageName>_FIND_VERSION_MIN_MAJOR -
Основная версия нижней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MIN_MINOR -
Вспомогательная версия нижней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MIN_PATCH -
Версия исправления нижней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MIN_TWEAK -
Версия доработки нижней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MIN_COUNT -
Количество компонентов версии нижней границы, от 0 до 4
-
<PackageName>_FIND_VERSION_MAX -
Полная запрашиваемая строка версии верхней границы диапазона
-
<PackageName>_FIND_VERSION_MAX_MAJOR -
Основная версия верхней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MAX_MINOR -
Вспомогательная версия верхней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MAX_PATCH -
Версия исправления верхней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MAX_TWEAK -
Версия доработки верхней границы, если запрошена, иначе 0
-
<PackageName>_FIND_VERSION_MAX_COUNT -
Количество компонентов версии верхней границы, от 0 до 4
Независимо от того, задана ли одна версия или диапазон версий, переменная <PackageName>_FIND_VERSION_COMPLETE будет определена и содержать полную запрашиваемую строку версии, как указано.
В режиме модуля загруженный модуль поиска отвечает за обработку запроса, подробно описанного в этих переменных; см. модуль поиска для получения подробностей. В режиме конфигурации find_package обрабатывает параметры REQUIRED, QUIET, и [version] автоматически, но оставляет обработку компонентов файлу конфигурации пакета таким образом, который имеет смысл для пакета. Файл конфигурации пакета может установить <PackageName>_FOUND в ложь, чтобы сообщить find_package о том, что требования к компоненту не выполнены.
© 2000–2024 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/v3.29/command/find_package.html