find_program
Краткая форма записи:
find_program (<VAR> <name> [<path>...])
Общая форма записи:
find_program (
<VAR>
{<name> | NAMES <name>... [NAMES_PER_DIR]}
[HINTS {<path> | ENV <var>}...]
[PATHS {<path> | ENV <var>}...]
[REGISTRY_VIEW {64|32|64_32|32_64|HOST|TARGET|BOTH}]
[PATH_SUFFIXES <suffix>...]
[VALIDATOR <function>]
[DOC "cache documentation string"]
[NO_CACHE]
[REQUIRED|OPTIONAL]
[NO_DEFAULT_PATH]
[NO_PACKAGE_ROOT_PATH]
[NO_CMAKE_PATH]
[NO_CMAKE_ENVIRONMENT_PATH]
[NO_SYSTEM_ENVIRONMENT_PATH]
[NO_CMAKE_SYSTEM_PATH]
[NO_CMAKE_INSTALL_PREFIX]
[CMAKE_FIND_ROOT_PATH_BOTH |
ONLY_CMAKE_FIND_ROOT_PATH |
NO_CMAKE_FIND_ROOT_PATH]
) Эта команда используется для поиска программы.
Перед поиском find_program проверяет, определена ли переменная <VAR>. Если переменная не определена, выполняется поиск. Если переменная определена и ее значение равно NOTFOUND или заканчивается на -NOTFOUND, выполняется поиск. Если переменная содержит любое другое значение, поиск не выполняется.
Примечание
Переменная VAR считается определенной, если она доступна в текущей области видимости. Подробные сведения об областях видимости и взаимодействии обычных переменных с записями кэша см. в документации по переменным cmake-language(7).
Результаты поиска будут сохранены в записи кэша с именем <VAR>. При последующих вызовах find_program будет проверяться эта запись кэша, если указано то же <VAR>. Эта оптимизация гарантирует, что успешный поиск не будет выполняться повторно, пока запись кэша не будет unset().
Если программа найдена, в записи кэша <VAR> будет сохранено значение, полученное в результате поиска. Если ничего не найдено, будет сохранено значение <VAR>-NOTFOUND.
Доступны следующие параметры:
-
NAMES -
Указывает одно или несколько возможных имен программы.
При указании имен с суффиксом версии и без него рекомендуется сначала указать имя без версии, чтобы пакеты, собранные локально, находились раньше пакетов, предоставляемых дистрибутивами.
-
HINTS, PATHS -
Указывает каталоги для поиска в дополнение к расположениям по умолчанию. Подпараметр
ENV varсчитывает пути из системной переменной среды.Изменено в версии 3.24: На платформе
Windowsв качестве каталогов можно указывать запросы к реестру, используя специальный синтаксис. Такие спецификации будут игнорироваться на всех остальных платформах. -
REGISTRY_VIEW -
Добавлено в версии 3.24.
Указывает, какие представления реестра следует запрашивать. Этот параметр имеет смысл только на платформах
Windowsи игнорируется на остальных. Если параметр не указан, используется представлениеBOTH, когда политикаCMP0134имеет значениеNEW. Сведения о представлении по умолчанию, используемом, когда политика имеет значениеOLD, см. в описании политикиCMP0134.-
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 -
Указывает дополнительные подкаталоги для проверки внутри каждого из рассматриваемых каталогов.
-
VALIDATOR -
Добавлено в версии 3.25.
Указывает
function(), которая будет вызвана для каждого найденного элемента-кандидата (указатьmacro()нельзя: это приведет к ошибке). Функции-валидатору будут переданы два аргумента: имя переменной результата и абсолютный путь к элементу-кандидату. Элемент будет принят и поиск завершится, если только функция не установит значение переменной результата в false в вызывающей области видимости. При входе в функцию-валидатор переменная результата будет содержать значение true.function(my_check validator_result_var item) if(NOT item MATCHES ...) set(${validator_result_var} FALSE PARENT_SCOPE) endif() endfunction() find_program (result NAMES ... VALIDATOR my_check)Обратите внимание: если используется результат из кэша, поиск пропускается, а все параметры
VALIDATORигнорируются. Результат из кэша не обязан проходить проверку функцией-валидатором. -
DOC -
Указывает строку документации для записи кэша
<VAR>. -
NO_CACHE -
Добавлено в версии 3.21.
Результат поиска будет сохранен в обычной переменной, а не в записи кэша.
Примечание
find_program по-прежнему будет проверять
<VAR>как обычно: сначала переменную, а затем запись кэша. Если любая из них указывает на успешный предыдущий поиск, поиск выполняться не будет.Предупреждение
Используйте этот параметр с осторожностью, поскольку он может значительно увеличить затраты на повторные этапы конфигурирования.
-
REQUIRED -
Добавлено в версии 3.18.
Прерывает обработку с сообщением об ошибке, если ничего не найдено; в противном случае поиск будет повторен при следующем вызове find_program с той же переменной.
Добавлено в версии 4.1: Каждая команда find_program будет считаться
REQUIRED, если включена переменнаяCMAKE_FIND_REQUIRED. -
OPTIONAL -
Добавлено в версии 4.1.
Игнорирует значение
CMAKE_FIND_REQUIREDи продолжает работу без сообщения об ошибке, если ничего не найдено. Несовместим сREQUIRED.
Если указан параметр NO_DEFAULT_PATH, дополнительные пути к поиску не добавляются. Если параметр NO_DEFAULT_PATH не указан, поиск выполняется следующим образом:
-
Если команда вызвана из модуля поиска или любого другого скрипта, загруженного вызовом
find_package(<PackageName>), выполняется поиск префиксов, уникальных для текущего искомого пакета. См. политикуCMP0074.Добавлено в версии 3.12.
В частности, выполняется поиск путей, указанных следующими переменными, в указанном порядке:
-
переменная CMake
<PackageName>_ROOT, где<PackageName>— имя пакета с сохранением регистра. -
переменная CMake
<PACKAGENAME>_ROOT, где<PACKAGENAME>— имя пакета в верхнем регистре. См. политикуCMP0144.Добавлено в версии 3.27.
-
переменная среды
<PackageName>_ROOT, где<PackageName>— имя пакета с сохранением регистра. -
переменная среды
<PACKAGENAME>_ROOT, где<PACKAGENAME>— имя пакета в верхнем регистре. См. политикуCMP0144.Добавлено в версии 3.27.
Корневые переменные пакета поддерживаются в виде стека, поэтому при вызове из вложенных модулей поиска или пакетов конфигурации корневые пути из родительского модуля поиска или пакета конфигурации будут проверяться после путей из текущего модуля или пакета. Иными словами, порядок поиска будет таким:
<CurrentPackage>_ROOT,ENV{<CurrentPackage>_ROOT},<ParentPackage>_ROOT,ENV{<ParentPackage>_ROOT}и т. д. Этот этап можно пропустить, передавNO_PACKAGE_ROOT_PATHили установив переменнуюCMAKE_FIND_USE_PACKAGE_ROOT_PATHв значениеFALSE.-
<prefix>/[s]binдля каждого<prefix>в переменной CMake<PackageName>_ROOTи переменной среды<PackageName>_ROOT, если команда вызвана из модуля поиска, загруженного командойfind_package(<PackageName>)
-
переменная CMake
-
Поиск путей, указанных в специальных переменных кэша CMake. Они предназначены для использования в командной строке с параметром
-DVAR=value. Значения интерпретируются как списки, разделенные точками с запятой. Этот этап можно пропустить, передавNO_CMAKE_PATHили установив переменнуюCMAKE_FIND_USE_CMAKE_PATHв значениеFALSE.-
<prefix>/[s]binдля каждого<prefix>вCMAKE_PREFIX_PATH CMAKE_PROGRAM_PATHCMAKE_APPBUNDLE_PATH
-
-
Поиск путей, указанных в специальных переменных среды CMake. Предполагается, что их значения задаются в конфигурации командной оболочки пользователя, поэтому в них используется собственный для хоста разделитель путей (
;в Windows и:в UNIX). Этот этап можно пропустить, передавNO_CMAKE_ENVIRONMENT_PATHили установив переменнуюCMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATHв значениеFALSE.-
<prefix>/[s]binдля каждого<prefix>вCMAKE_PREFIX_PATH CMAKE_PROGRAM_PATHCMAKE_APPBUNDLE_PATH
-
- Поиск по путям, указанным параметром
HINTS. Это должны быть пути, полученные путем анализа системы, например подсказка на основе расположения другого уже найденного элемента. Предположительные пути, заданные явно, следует указывать с помощью параметраPATHS. -
Поиск в стандартных системных переменных среды. Этот этап можно пропустить, передав
NO_SYSTEM_ENVIRONMENT_PATHили установив переменнуюCMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATHв значениеFALSE.- Каталоги, указанные непосредственно в
PATH.
- Каталоги, указанные непосредственно в
-
Поиск в переменных 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в значениеFALSE.-
<prefix>/[s]binдля каждого<prefix>вCMAKE_SYSTEM_PREFIX_PATH CMAKE_SYSTEM_PROGRAM_PATHCMAKE_SYSTEM_APPBUNDLE_PATH
Пути платформы, содержащиеся в этих переменных, указывают на расположения, в которых обычно находится установленное программное обеспечение. Например,
/usr/localна платформах на основе UNIX. -
- Поиск по путям, указанным параметром PATHS или в краткой форме команды. Обычно это предположительные пути, заданные явно.
Переменные CMAKE_IGNORE_PATH, CMAKE_IGNORE_PREFIX_PATH, CMAKE_SYSTEM_IGNORE_PATH и CMAKE_SYSTEM_IGNORE_PREFIX_PATH также могут привести к игнорированию некоторых из перечисленных выше расположений.
Добавлено в версии 3.16: Добавлены переменные CMAKE_FIND_USE_<CATEGORY>_PATH для глобального отключения различных расположений поиска.
В macOS переменные CMAKE_FIND_FRAMEWORK и CMAKE_FIND_APPBUNDLE определяют порядок предпочтения компонентов пакетов в стиле Apple и Unix.
Переменная 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_PROGRAM. Это поведение можно вручную переопределить для отдельного вызова с помощью параметров:
-
CMAKE_FIND_ROOT_PATH_BOTH -
Выполняет поиск в описанном выше порядке.
-
NO_CMAKE_FIND_ROOT_PATH -
Не использует переменную
CMAKE_FIND_ROOT_PATH. -
ONLY_CMAKE_FIND_ROOT_PATH -
Выполняет поиск только в каталогах с перенесенным корнем и каталогах внутри
CMAKE_STAGING_PREFIX.
Порядок поиска по умолчанию для типичных случаев использования организован от наиболее специфичного к наименее специфичному. Проекты могут переопределить этот порядок, просто вызвав команду несколько раз с параметрами NO_*:
find_program (<VAR> NAMES name PATHS <paths>... NO_DEFAULT_PATH) find_program (<VAR> NAMES name)
После успешного вызова переменная результата будет установлена и сохранена в кэше, поэтому повторный поиск выполняться не будет.
Если для параметра NAMES указано несколько значений, по умолчанию эта команда рассматривает по одному имени за раз и ищет его во всех каталогах. Параметр NAMES_PER_DIR указывает команде рассматривать по одному каталогу за раз и искать в нем все имена.
Набор файлов, считающихся программами, зависит от платформы:
- В Windows расширения имен файлов проверяются в следующем порядке:
.com,.exe, затем без расширения. - В системах, отличных от Windows, расширения имен файлов не рассматриваются, однако файлы должны иметь право на выполнение (см. политику
CMP0109).
Чтобы искать скрипты, явно укажите расширение:
if(WIN32)
set(_script_suffix .bat)
else()
set(_script_suffix .sh)
endif()
find_program(MY_SCRIPT NAMES my_script${_script_suffix})
© 2000–2026 Kitware, Inc. and Contributors
Licensed under the BSD 3-clause License.
https://cmake.org/cmake/help/latest/command/find_program.html