Spec-Zone.ru › CMake 3.29

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]). Поддержка версий в настоящее время предоставляется только на основе пакета (см. раздел «Выбор версии» ниже). Когда указан диапазон версий, но пакет спроектирован только для ожидания одной версии, пакет проигнорирует верхнее крайнее значение диапазона и учтёт только нижнее крайнее значение диапазона.

END_OF_DOCUMENT_MARKER

См. документацию команды 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) :

Запись

Соглашение

<prefix>/

W

<prefix>/(cmake|CMake)/

W

<prefix>/<name>*/

W

<prefix>/<name>*/(cmake|CMake)/

W

<prefix>/<name>*/(cmake|CMake)/<name>*/ [1]

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

[1]

Новая версия 3.25.

На системах, поддерживающих macOS FRAMEWORK и BUNDLE, следующие каталоги ищутся в Frameworks или Application Bundles, содержащих файл конфигурации:

Запись

Соглашение

<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> и 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_* опции активируются.

  1. Поиск префиксов, уникальных для текущего <PackageName>, в котором осуществляется поиск. См. политику CMP0074.

    Новое в версии 3.12.

    В частности, префиксы поиска, указанные в следующих переменных, в порядке:

    1. <PackageName>_ROOT Переменная CMake, где <PackageName> — это имя пакета, сохраняющее регистр.
    2. <PACKAGENAME>_ROOT Переменная CMake, где <PACKAGENAME> — это имя пакета в верхнем регистре. См. политику CMP0144.

      Новое в версии 3.27.

    3. <PackageName>_ROOT Переменная среды, где <PackageName> — это имя пакета, сохраняющее регистр.
    4. <PACKAGENAME>_ROOT Переменная среды, где <PACKAGENAME> — это имя пакета в верхнем регистре. См. политику CMP0144.

      Новое в версии 3.27.

    Переменные корня пакета поддерживаются как стек, поэтому если вызов происходит изнутри модуля поиска, пути корня модуля родителя также будут просматриваться после путей текущего пакета. Это можно пропустить, если NO_PACKAGE_ROOT_PATH передано или путем установки CMAKE_FIND_USE_PACKAGE_ROOT_PATH на значение FALSE.

  2. Пути поиска, указанные в переменных кэша CMake. Они предназначены для использования в командной строке с -DVAR=VALUE. Значения интерпретируются как списки, разделённые точкой с запятой. Это можно пропустить, если NO_CMAKE_PATH передано или путем установки CMAKE_FIND_USE_CMAKE_PATH на значение %%%CODE_BLOCK_180%%:

    • CMAKE_PREFIX_PATH
    • CMAKE_FRAMEWORK_PATH
    • CMAKE_APPBUNDLE_PATH
  3. Пути поиска, указанные в переменных среды CMake. Они предназначены для установки в конфигурации командной оболочки пользователя и поэтому используют системный разделитель путей (; в Windows и : в UNIX). Это можно пропустить, если NO_CMAKE_ENVIRONMENT_PATH передано или путем установки CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH на значение %%%CODE_BLOCK_188%%:

    • <PackageName>_DIR
    • CMAKE_PREFIX_PATH
    • CMAKE_FRAMEWORK_PATH
    • CMAKE_APPBUNDLE_PATH
  4. Пути поиска, указанные параметром HINTS. Обычно это пути, вычисленные с помощью анализа системы, такие как подсказка, полученная из расположения уже найденного элемента. Жестко закодированные предположения должны быть указаны параметром PATHS.
  5. Поиск по стандартным системным переменным среды. Это можно пропустить, если NO_SYSTEM_ENVIRONMENT_PATH передано или путем установки CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH на значение FALSE. Элементы пути, оканчивающиеся на /bin или /sbin, автоматически преобразуются в их родительские каталоги:

    • PATH
  6. Поиск по путям, хранящимся в реестре пакетов CMake Пользовательского реестра пакетов. Это можно пропустить, если NO_CMAKE_PACKAGE_REGISTRY передано или путем установки переменной CMAKE_FIND_USE_PACKAGE_REGISTRY на значение FALSE или устаревшей переменной CMAKE_FIND_PACKAGE_NO_PACKAGE_REGISTRY на значение TRUE.

    Подробные сведения о пользовательском реестре пакетов см. в руководстве cmake-packages(7).

  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%%:

    • CMAKE_SYSTEM_PREFIX_PATH
    • CMAKE_SYSTEM_FRAMEWORK_PATH
    • CMAKE_SYSTEM_APPBUNDLE_PATH

    Пути платформы, которые содержатся в этих переменных, обычно включают расположения, содержащие установленное программное обеспечение. Например, /usr/local для платформ на базе UNIX.

  8. Поиск по путям, хранящимся в реестре пакетов CMake Системного реестра пакетов. Это можно пропустить, если NO_CMAKE_SYSTEM_PACKAGE_REGISTRY передано или путем установки CMAKE_FIND_USE_SYSTEM_PACKAGE_REGISTRY переменной на значение FALSE или устаревшей переменной CMAKE_FIND_PACKAGE_NO_SYSTEM_PACKAGE_REGISTRY на значение TRUE.

    Подробные сведения о системном реестре пакетов см. в руководстве cmake-packages(7).

  9. Поиск по путям, указанным параметром 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

Spec-Zone.ru

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