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_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 的命名规范。

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() 命令将因错误而停止。列表中较早的命令失败不会导致致命错误。

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 将被忽略。