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>]
[ENVIRONMENT <variable=value>...]
[ENVIRONMENT_MODIFICATION <env-mod-op>...]
[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来显式地通过命令行解释器执行。在此之前,它们是通过 CreateProcessW 的未记录行为,隐式地通过cmd /c(不带call)执行。
使用
INPUT_*、OUTPUT_*和ERROR_*选项来重定向 stdin、stdout 和 stderr。若要顺序执行多个命令,请使用多个
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 上,用于解码进程输出的编码方式。在其他平台上被忽略。有效的编码名称包括:
ENVIRONMENT <variable=value>...4.4 版本新增。
向子进程的环境中添加环境变量定义。每个条目必须采用
NAME=value的形式,并在execute_process()调用期间将NAME设置为value。这些条目按顺序处理。如果同一个变量名被多次给定,则以最后一个值为准。
ENVIRONMENT_MODIFICATION <env-mod-op>...4.4 版本新增。
将一个或多个
ENVIRONMENT_MODIFICATION操作应用于子进程的环境。每个操作按给定的顺序应用,解析失败会被视为错误。如果同时指定了这两个选项,环境变量修改会在
ENVIRONMENT条目之后应用。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将被忽略。