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 显式地通过命令解释器执行。以前,它们通过 CreateProcessW 的未文档化行为隐式地通过 cmd /c 执行,不带 call

使用 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_FILEERROR_FILE 都指定了相同的 <file>,则它将用于标准输出和标准错误管道。

OUTPUT_QUIET, ERROR_QUIET

标准输出到 OUTPUT_VARIABLE 或标准错误到 ERROR_VARIABLE 不连接(无变量内容)。*_FILEECHO_*_VARIABLE 选项不受影响。

OUTPUT_VARIABLE, ERROR_VARIABLE

命名变量将分别设置为标准输出和标准错误管道的内容。如果两个管道命名了同一个变量,则它们的输出将按生成顺序合并。

OUTPUT_STRIP_TRAILING_WHITESPACE, ERROR_STRIP_TRAILING_WHITESPACE

从存储在相应 OUTPUT_VARIABLEERROR_VARIABLE 变量中的值的末尾移除空白字符。

ECHO_OUTPUT_VARIABLE, ECHO_ERROR_VARIABLE

在 3.18 版本中新增。

标准输出或标准错误不会被独占重定向到指定的变量。

输出将复制到指定的变量,并同时输出到标准输出或标准错误,类似于 Unix 命令 tee

注意

如果为同一管道提供了多个 OUTPUT_*ERROR_* 选项,则优先级未指定。如果未提供 OUTPUT_*ERROR_* 选项,则输出将与 CMake 进程本身的相应管道共享。

COMMAND_ECHO <where>

版本 3.15 新增。

正在运行的命令将回显到 <where>,其中 <where> 设置为 STDERRSTDOUTNONE 之一。有关在未指定此选项时的默认行为的控制方式,请参阅 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_VARIABLERESULTS_VARIABLE,则忽略 CMAKE_EXECUTE_PROCESS_COMMAND_ERROR_IS_FATAL