execute_process¶
执行一个或多个子进程。
execute_process(COMMAND <cmd1> [<arguments>]
[COMMAND <cmd2> [<arguments>]]...
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[RESULT_VARIABLE <variable>]
[RESULTS_VARIABLE <variable>]
[OUTPUT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[INPUT_FILE <file>]
[OUTPUT_FILE <file>]
[ERROR_FILE <file>]
[OUTPUT_QUIET]
[ERROR_QUIET]
[COMMAND_ECHO <where>]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ENCODING <name>]
[ECHO_OUTPUT_VARIABLE]
[ECHO_ERROR_VARIABLE]
[COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>])
运行给定的一个或多个命令序列。
命令作为管道并发执行,每个进程的标准输出管道连接到下一个进程的标准输入。所有进程使用同一个标准错误管道。
execute_process 在 CMake 配置项目期间、构建系统生成之前运行命令。使用 add_custom_target() 和 add_custom_command() 命令来创建在构建时运行的自定义命令。
选项
COMMAND子进程命令行。
CMake 直接使用操作系统 API 执行子进程
在 POSIX 平台上,命令行以
argv[]风格的数组传递给子进程。不执行中间 shell,因此像>这样的 shell 操作符被视为普通参数。在 Windows 平台上,命令行被编码为一个字符串,以便使用 CommandLineToArgvW 的子进程能够解码原始参数。
如果命令运行的是
.exe、.com或其他可执行文件,则不执行中间命令解释器,因此像>这样的 shell 操作符被视为普通参数。如果命令运行的是
.bat或.cmd脚本,它将通过cmd命令解释器执行。命令解释器不使用 CommandLineToArgvW,因此脚本接收到的一些参数可能会有额外的引号。版本 4.0 中已更改: 现在通过在命令行前加上
cmd /c call来显式通过命令解释器执行.bat和.cmd脚本。之前,它们是通过cmd /c隐式执行的,没有call,这是 CreateProcessW 的未公开行为。
使用
INPUT_*、OUTPUT_*和ERROR_*选项来重定向标准输入、标准输出和标准错误。对于多个命令的顺序执行,请使用多个
execute_process调用,每个调用只有一个COMMAND参数。WORKING_DIRECTORY指定的目录将被设置为子进程的当前工作目录。如果未给出,子进程的工作目录将不确定。
TIMEOUT在指定的秒数(允许小数)后,所有未完成的子进程将被终止,并且
RESULT_VARIABLE将被设置为包含“timeout”的字符串。RESULT_VARIABLE该变量将被设置为包含最后一个子进程的结果。这将是最后一个子进程的整数返回码或描述错误条件的字符串。
RESULTS_VARIABLE <variable>3.10 版本新增。
该变量将被设置为包含所有进程的结果,作为一个分号分隔的列表,按给定的
COMMAND参数的顺序排列。每个条目将是相应子进程的整数返回码或描述错误条件的字符串。INPUT_FILE <file><file>将连接到第一个COMMAND进程的标准输入管道。OUTPUT_FILE <file><file>将连接到最后一个COMMAND进程的标准输出管道。ERROR_FILE <file><file>将连接到所有COMMAND进程的标准错误管道。
版本 3.3 中已添加: 如果 OUTPUT_FILE 和 ERROR_FILE 指定了同一个 <file>,那么它将同时用于标准输出和标准错误管道。
OUTPUT_QUIET,ERROR_QUIET在
OUTPUT_VARIABLE上的标准输出或在ERROR_VARIABLE上的标准错误未连接(无变量内容)。*_FILE和ECHO_*_VARIABLE选项不受影响。OUTPUT_VARIABLE,ERROR_VARIABLE指定的变量将分别用标准输出和标准错误的管道内容填充。如果为两个管道指定了同一个变量,它们的输出将按产生顺序合并。
OUTPUT_STRIP_TRAILING_WHITESPACE,ERROR_STRIP_TRAILING_WHITESPACE从存储在相应的
OUTPUT_VARIABLE和ERROR_VARIABLE变量的值末尾移除空白字符。ECHO_OUTPUT_VARIABLE,ECHO_ERROR_VARIABLE在 3.18 版本中新增。
标准输出或标准错误不会被专门重定向到指定的变量。
输出将复制到指定的变量,同时也会输出到标准输出或标准错误,类似于 Unix 命令
tee。
注意
如果为同一个管道指定了多个 OUTPUT_* 或 ERROR_* 选项,则其优先级未定义。如果未给出 OUTPUT_* 或 ERROR_* 选项,输出将与 CMake 进程本身对应的管道共享。
COMMAND_ECHO <where>版本 3.15 新增。
正在运行的命令将被回显到
<where>,其中<where>被设置为STDERR、STDOUT或NONE之一。请参阅CMAKE_EXECUTE_PROCESS_COMMAND_ECHO变量,以了解在没有此选项时控制默认行为的方法。ENCODING <name>版本 3.8 新增。
在 Windows 上,用于解码进程输出的编码。在其他平台上忽略。有效的编码名称包括:
NONE不进行解码。这假设进程输出的编码方式与 CMake 的内部编码(UTF-8)相同。
这是 CMake 3.14 及更早版本的默认设置。
AUTO使用当前活动的控制台的代码页,如果不可用,则使用 ANSI。
这是 CMake 3.15 至 3.30 版本的默认设置。
ANSI使用 ANSI 代码页。
OEM使用原始设备制造商(OEM)代码页。
UTF-83.11 版本新增。
使用 UTF-8 代码页。
这是 CMake 3.15.1 和更高版本的默认设置。请参阅策略
CMP0176。UTF8使用 UTF-8 代码页。为了符合 UTF-8 RFC 的命名约定,建议使用
UTF-8而不是此名称。
COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>3.19 版本新增。
跟随
COMMAND_ERROR_IS_FATAL的选项决定了在遇到错误时的行为。ANY如果命令列表中的任何命令失败,
execute_process()命令将以错误终止。LAST如果命令列表中的最后一个命令失败,
execute_process()命令将以错误终止。列表中的较早命令不会导致致命错误。NONE4.0 版本新增。
无论任何命令是否失败,
execute_process()命令都不会以错误终止。
版本 4.0 中已添加: 如果未提供,将检查
CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL变量。如果未设置该变量,则默认值为NONE。如果提供了RESULT_VARIABLE或RESULTS_VARIABLE,则忽略CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL。