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 版本中变更:
.bat
和.cmd
脚本现在通过在命令行前添加cmd /c call
来显式地通过命令解释器执行。之前,它们通过cmd /c
隐式执行,没有call
,这是 CreateProcessW 的未文档化行为。
使用
INPUT_*
、OUTPUT_*
和ERROR_*
选项来重定向 stdin、stdout 和 stderr。对于多个命令的**顺序执行**,请使用多个
execute_process
调用,每个调用都带有一个COMMAND
参数。WORKING_DIRECTORY
命名的目录将设置为子进程的当前工作目录。
TIMEOUT
在指定的秒数(允许小数)后,所有未完成的子进程将被终止,并且
RESULT_VARIABLE
将被设置为一个提到“超时”的字符串。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
命名的变量将设置为标准输出和标准错误管道的内容。如果为两个管道命名了相同的变量,它们的输出将按照产生的顺序合并。
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-8
在 3.11 版本中添加。
使用 UTF-8 代码页。
这是自 CMake 3.31 以来的默认值。请参阅策略
CMP0176
。UTF8
使用 UTF-8 代码页。不鼓励使用此名称,建议使用
UTF-8
以匹配 UTF-8 RFC 命名约定。
COMMAND_ERROR_IS_FATAL <ANY|LAST|NONE>
在 3.19 版本中添加。
跟随
COMMAND_ERROR_IS_FATAL
的选项决定了遇到错误时的行为ANY
如果命令列表中的任何命令失败,则
execute_process()
命令将以错误停止。LAST
如果命令列表中的最后一个命令失败,则
execute_process()
命令将以错误停止。列表前面较早的命令不会导致致命错误。NONE
在 4.0 版本中添加。
无论任何命令是否失败,
execute_process()
命令都不会以错误停止。
在 4.0 版本中添加: 如果未提供,则检查
CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL
变量。如果未设置该变量,则默认为NONE
。如果提供了RESULT_VARIABLE
或RESULTS_VARIABLE
,则CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL
将被忽略。