execute_process
是 CMake 中一个非常强大的命令,用于在构建过程中执行外部程序或脚本。它提供了丰富的选项来控制执行过程,并可以捕获输出、错误和返回码。以下是 execute_process
的详细解析:
基本语法
bash
execute_process(
COMMAND <command>...>
[WORKING_DIRECTORY <directory>]
[TIMEOUT <seconds>]
[COMMAND_ECHO <SILENT|NORMAL|DETAILED>]
[RESULT_VARIABLE <variable>]
[ERROR_VARIABLE <variable>]
[ERROR_STRIP_TRAILING_WHITESPACE]
[ERROR_CODE <variable>]
[ERROR_CODE_VARIABLE <variable>]
[ERROR_FILE <file>]
[ERROR_FILE_STRIP_TRAILING_WHITESPACE]
[OUTPUT_VARIABLE <variable>]
[OUTPUT_STRIP_TRAILING_WHITESPACE]
[OUTPUT_FILE <file>]
[OUTPUT_FILE_STRIP_TRAILING_WHITESPACE]
[INPUT <string|list>]
[INPUT_DATA <string|list>]
)
参数详解
- COMMAND : 要执行的命令及其参数。可以是一个字符串或列表形式。例如:
COMMAND make install
或COMMAND {CMAKE_COMMAND} -P ${CMAKE_SOURCE_DIR}/cmake_install.cmake
。 - WORKING_DIRECTORY : 设置命令执行时的工作目录。例如:
WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
。 - TIMEOUT : 设置命令执行的超时时间(以秒为单位)。如果命令在指定时间内未完成,则会被终止。例如:
TIMEOUT 60
。 - COMMAND_ECHO : 控制是否在执行命令时打印命令行。可选值为
SILENT
,NORMAL
,DETAILED
。默认为NORMAL
。SILENT
: 不打印任何信息。NORMAL
: 打印命令名称和第一个参数。DETAILED
: 打印完整的命令行。
- RESULT_VARIABLE : 存储命令执行结果的变量。如果命令成功执行,该变量将被设置为
TRUE
;否则为FALSE
。 - ERROR_VARIABLE : 存储命令标准错误输出的变量。可以与
ERROR_STRIP_TRAILING_WHITESPACE
一起使用来去除末尾的空白字符。 - ERROR_STRIP_TRAILING_WHITESPACE : 如果设置了此选项,将从
ERROR_VARIABLE
中去除末尾的空白字符。 - ERROR_CODE : 存储命令返回码的变量。如果命令成功执行,该变量将被设置为
0
;否则为非零值。 - ERROR_CODE_VARIABLE: 存储命令返回码的变量名。
- ERROR_FILE : 将命令的标准错误输出重定向到指定的文件。可以与
ERROR_FILE_STRIP_TRAILING_WHITESPACE
一起使用来去除末尾的空白字符。 - ERROR_FILE_STRIP_TRAILING_WHITESPACE : 如果设置了此选项,将从
ERROR_FILE
中去除末尾的空白字符。 - OUTPUT_VARIABLE : 存储命令标准输出的变量。可以与
OUTPUT_STRIP_TRAILING_WHITESPACE
一起使用来去除末尾的空白字符。 - OUTPUT_STRIP_TRAILING_WHITESPACE : 如果设置了此选项,将从
OUTPUT_VARIABLE
中去除末尾的空白字符。 - OUTPUT_FILE : 将命令的标准输出重定向到指定的文件。可以与
OUTPUT_FILE_STRIP_TRAILING_WHITESPACE
一起使用来去除末尾的空白字符。 - OUTPUT_FILE_STRIP_TRAILING_WHITESPACE : 如果设置了此选项,将从
OUTPUT_FILE
中去除末尾的空白字符。 - INPUT: 向命令的标准输入提供数据。可以是字符串或列表形式。
- INPUT_DATA : 类似于
INPUT
,但允许使用更复杂的数据类型,例如列表。
示例
- 简单示例:
cpp
execute_process(
COMMAND echo "Hello, World!"
OUTPUT_VARIABLE output
)
message("Output: ${output}")
带工作目录和超时:
cpp
execute_process(
COMMAND ls /nonexistent/path
WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
TIMEOUT 5
RESULT_VARIABLE result
)
if (result)
message("Command succeeded")
else()
message("Command failed or timed out")
endif()
- 捕获标准输出和错误输出:
bash
execute_process(
COMMAND ls /nonexistent/path
OUTPUT_VARIABLE output
ERROR_VARIABLE error
)
message("Output: ${output}")
message("Error: ${error}")
- 重定向输出到文件:
bash
execute_process(
COMMAND ls /nonexistent/path
OUTPUT_FILE ${CMAKE_BINARY_DIR}/output.txt
ERROR_FILE ${CMAKE_BINARY_DIR}/error.txt
)
通过这些参数和示例,你可以看到 execute_process
命令在 CMake 中的强大功能,它可以帮助你在构建过程中灵活地执行外部命令并处理其输出。