在 CMake 中,execute_process
命令用于执行外部进程并捕获其输出。如果子进程执行失败,即返回一个非零退出状态,你可以使用几种方法来处理这种情况:
-
检查返回码:
execute_process
命令会设置几个变量,包括RESULT_VARIABLE
指定的变量,它将包含子进程的退出状态。你可以通过检查这个变量来确定进程是否成功执行。execute_process( COMMAND your_command RESULT_VARIABLE result OUTPUT_VARIABLE output ERROR_VARIABLE error ) if(NOT result EQUAL 0) message(FATAL_ERROR "Command failed with output: ${output} and error: ${error}") endif()
-
捕获输出:通过
OUTPUT_VARIABLE
和ERROR_VARIABLE
捕获标准输出和标准错误输出。这可以帮助你了解失败的原因。execute_process( COMMAND your_command RESULT_VARIABLE result OUTPUT_VARIABLE output ERROR_VARIABLE error ) if(NOT result EQUAL 0) message(STATUS "Command output: ${output}") message(STATUS "Command error: ${error}") endif()
-
使用返回码作为条件:根据子进程的返回码来决定后续的 CMake 命令。例如,你可以使用条件语句来设置变量或执行不同的命令。
execute_process( COMMAND your_command RESULT_VARIABLE result ) if(result EQUAL 0) # 成功执行的代码 else() # 失败执行的代码 endif()
-
使用
FATAL_ERROR
:如果子进程的失败是不可恢复的,你可以使用message(FATAL_ERROR ...)
来使 CMake 脚本停止执行,并显示错误信息。 -
设置
WORKING_DIRECTORY
:有时子进程的执行依赖于当前的工作目录。确保WORKING_DIRECTORY
设置为子进程需要的正确路径。 -
使用
TIMEOUT
:如果子进程可能挂起或运行时间过长,可以使用TIMEOUT
选项来终止长时间运行的进程。 -
使用
ECHO
或ECHO_VARIABLE
:在执行命令前后使用message(ECHO ...)
或message(ECHO_VARIABLE ...)
来打印调试信息。 -
捕获和处理输出文件:如果子进程将输出写入到文件中,你可以检查这些文件是否存在或是否有预期的内容。
-
使用
COMMAND_ERROR_IS_FATAL
:这个选项可以设置为ANY
,使得任何错误都会导致 CMake 脚本停止执行。execute_process( COMMAND your_command COMMAND_ERROR_IS_FATAL ANY )
-
使用
TRY_COMPILE
:如果你在尝试编译某个项目或代码片段,TRY_COMPILE
内置命令会自动检查编译是否成功。
通过这些方法,可以有效地处理 execute_process
命令执行失败的情况,并根据失败的原因采取适当的行动。