find_program¶
简写签名为
find_program (<VAR> name1 [path1 path2 ...])
通用签名为
find_program (
<VAR>
name | NAMES name1 [name2 ...] [NAMES_PER_DIR]
[HINTS [path | ENV var]...]
[PATHS [path | ENV var]...]
[REGISTRY_VIEW (64|32|64_32|32_64|HOST|TARGET|BOTH)]
[PATH_SUFFIXES suffix1 [suffix2 ...]]
[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]
)
此命令用于查找程序。将创建一个名为 <VAR> 的缓存条目(如果指定了 NO_CACHE,则为普通变量)来存储此命令的结果。如果找到程序,结果将存储在变量中,除非清除该变量,否则不会重复搜索。如果没有找到任何内容,结果将是 <VAR>-NOTFOUND。
选项包括
NAMES为程序指定一个或多个可能的名称。
当使用此选项指定带版本后缀和不带版本后缀的名称时,我们建议首先指定不带版本号的名称,以便在找到发行版提供的包之前找到本地构建的包。
HINTS,PATHS除了默认位置外,还指定要搜索的目录。
ENV var子选项从系统环境变量读取路径。3.24 版本中的更改: 在
Windows平台上,可以使用 专用语法 将注册表查询作为目录的一部分。此类规范将在所有其他平台上被忽略。REGISTRY_VIEW在 3.24 版本中添加。
指定必须查询的注册表视图。此选项仅在
Windows平台上有意义,在其他平台上将被忽略。未指定时,当CMP0134策略为NEW时,使用BOTH视图。当策略为OLD时,请参阅CMP0134以获取默认视图。64查询64位注册表。在32位Windows上,它始终返回字符串
/REGISTRY-NOTFOUND。32查询32位注册表。
64_32查询两个视图(
64和32)并为每个视图生成一个路径。32_64查询两个视图(
32和64)并为每个视图生成一个路径。HOST查询与主机架构匹配的注册表:64 位 Windows 上为
64,32 位 Windows 上为32。TARGET查询与
CMAKE_SIZEOF_VOID_P变量指定的架构匹配的注册表。如果未定义,则回退到HOST视图。BOTH查询两个视图(
32和64)。顺序取决于以下规则:如果定义了CMAKE_SIZEOF_VOID_P变量,则根据此变量的内容使用以下视图8:64_324:32_64
如果未定义
CMAKE_SIZEOF_VOID_P变量,则依赖于主机的架构64位:
64_3232位:
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_CACHE3.21 版本新增。
搜索结果将存储在普通变量中,而不是缓存条目中。
注意
如果变量在调用前已经设置(作为普通变量或缓存变量),则不会进行搜索。
警告
此选项应谨慎使用,因为它会大大增加重复配置步骤的成本。
REQUIRED在 3.18 版本中新增。
如果未找到任何内容,则停止处理并显示错误消息,否则下次使用同一变量调用 find_program 时将再次尝试搜索。
4.1 版本新增: 当启用
CMAKE_FIND_REQUIRED变量时,每个 find_program 命令都将被视为REQUIRED。OPTIONAL在 4.1 版本中新增。
忽略
CMAKE_FIND_REQUIRED的值,如果未找到任何内容,则继续而不显示错误消息。与REQUIRED不兼容。
如果指定了 NO_DEFAULT_PATH,则不会向搜索添加其他路径。如果未指定 NO_DEFAULT_PATH,则搜索过程如下
如果从 find 模块或通过调用
find_package(<PackageName>)加载的任何其他脚本中调用,则搜索当前正在查找的包特有的前缀。请参阅策略CMP0074。3.12 版本新增。
具体来说,按以下顺序搜索以下变量指定的路径
<PackageName>_ROOTCMake 变量,其中<PackageName>是大小写保留的包名称。<PACKAGENAME>_ROOTCMake 变量,其中<PACKAGENAME>是大写的包名称。请参阅策略CMP0144。在 3.27 版本中新增。
<PackageName>_ROOT环境变量,其中<PackageName>是大小写保留的包名称。<PACKAGENAME>_ROOT环境变量,其中<PACKAGENAME>是大写的包名称。请参阅策略CMP0144。在 3.27 版本中新增。
包根变量作为堆栈维护,因此如果从嵌套的 find 模块或配置包中调用,则在当前模块或包的路径之后搜索来自父 find 模块或配置包的根路径。换句话说,搜索顺序将是
<CurrentPackage>_ROOT、ENV{<CurrentPackage>_ROOT}、<ParentPackage>_ROOT、ENV{<ParentPackage>_ROOT}等。如果传递NO_PACKAGE_ROOT_PATH或将CMAKE_FIND_USE_PACKAGE_ROOT_PATH设置为FALSE,则可以跳过此操作。如果从通过
find_package(<PackageName>)加载的 find 模块中调用,则<PackageName>_ROOTCMake 变量和<PackageName>_ROOT环境变量中的每个<prefix>的<prefix>/[s]bin。
在 cmake 特定的缓存变量中指定的搜索路径。这些路径旨在与
-DVAR=value一起在命令行上使用。这些值被解释为 以分号分隔的列表。如果传递NO_CMAKE_PATH或将CMAKE_FIND_USE_CMAKE_PATH设置为FALSE,则可以跳过此操作。CMAKE_PREFIX_PATH中每个<prefix>的<prefix>/[s]bin
在 cmake 特定的环境变量中指定的搜索路径。这些路径旨在在用户的 shell 配置中设置,因此使用主机原生的路径分隔符(Windows 上为
;,UNIX 上为:)。如果传递NO_CMAKE_ENVIRONMENT_PATH或将CMAKE_FIND_USE_CMAKE_ENVIRONMENT_PATH设置为FALSE,则可以跳过此操作。CMAKE_PREFIX_PATH中每个<prefix>的<prefix>/[s]bin
搜索
HINTS选项指定的路径。这些路径应该是通过系统自省计算出来的路径,例如由已找到的另一个项目的位置提供的提示。硬编码的猜测应该使用PATHS选项指定。搜索标准系统环境变量。如果传递
NO_SYSTEM_ENVIRONMENT_PATH或将CMAKE_FIND_USE_SYSTEM_ENVIRONMENT_PATH设置为FALSE,则可以跳过此操作。PATH本身中的目录。
搜索当前系统平台文件中定义的 cmake 变量。如果传递
NO_CMAKE_INSTALL_PREFIX或将CMAKE_FIND_USE_INSTALL_PREFIX设置为FALSE,则可以跳过对CMAKE_INSTALL_PREFIX和CMAKE_STAGING_PREFIX的搜索。如果传递NO_CMAKE_SYSTEM_PATH或将CMAKE_FIND_USE_CMAKE_SYSTEM_PATH设置为FALSE,则可以跳过所有这些位置。CMAKE_SYSTEM_PREFIX_PATH中每个<prefix>的<prefix>/[s]bin
这些变量包含的平台路径通常包括已安装的软件位置。例如,UNIX 平台上的
/usr/local。搜索 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})