在CMake中检查`execute_process`的退出状态。

27

在我的cmake文件中,我使用execute_process命令运行一个命令。我想检查它是否失败了。但它不会打印任何内容到stderr

到目前为止,我一直使用一个bash脚本来运行该命令,然后使用$? == 1检查退出状态。

有没有办法在cmake中类似地做一些事情?

execute_process(COMMAND "runThis")
if("{$?}" EQUAL 1)
    message( FATAL_ERROR "Bad exit status")
endif()

我使用cmake 3.12.1版本

3个回答

24

您可以通过 execute_process 命令的 RESULT_VARIABLE 选项获取执行进程的退出状态。根据该选项的文档

该变量将被设置为包含运行进程的结果。这将是最后一个子进程的整数返回代码或描述错误情况的字符串。

例如:

execute_process(COMMAND "runThis" RESULT_VARIABLE ret)
if(ret EQUAL "1")
    message( FATAL_ERROR "Bad exit status")
endif()

根据@caldfir的回答,if(ret AND NOT ret EQUAL 0) - Andriy Makukha

10

文档指出RESULT_VARIABLE 可以用于检查execute_process的状态。由于它可能包含字符串或退出代码,在检查错误时应考虑两者。

以下是一个将其付诸实践的示例:

# good
execute_process(
  COMMAND cmake --version
  RESULT_VARIABLE STATUS
  OUTPUT_VARIABLE OUTPUT1 
  ERROR_QUIET )
if(STATUS AND NOT STATUS EQUAL 0)
  message(STATUS "FAILED: ${STATUS}")
else()
  message(STATUS "SUCCESS: ${OUTPUT1}")
endif()

# nonzero exit code
execute_process(
  COMMAND cmake -G xxxx
  RESULT_VARIABLE STATUS
  OUTPUT_VARIABLE OUTPUT2 
  ERROR_QUIET )
if(STATUS AND NOT STATUS EQUAL 0)
  message(STATUS "FAILED: ${STATUS}")
else()
  message(STATUS "SUCCESS: ${OUTPUT2}")
endif()

# bad command
execute_process(
  COMMAND xxxx
  RESULT_VARIABLE STATUS
  OUTPUT_VARIABLE OUTPUT3 
  ERROR_QUIET )
if(STATUS AND NOT STATUS EQUAL 0)
  message(STATUS "FAILED: ${STATUS}")
else()
  message(STATUS "SUCCESS: ${OUTPUT3}")
endif()

输出:

SUCCESS: cmake version 3.18.0-rc3

CMake suite maintained and supported by Kitware (kitware.com/cmake).

FAILED: 1
FAILED: The system cannot find the file specified

8

cmake的execute_process命令,在出错时退出

自从cmake 3.19版本,我们有了选项COMMAND_ERROR_IS_FATAL

execute_process(COMMAND echo hello COMMAND_ERROR_IS_FATAL ANY)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接