【问题标题】:Check exit status of `execute_process` in cmake检查cmake中`execute_process`的退出状态
【发布时间】:2018-08-29 12:00:39
【问题描述】:

在我的 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

【问题讨论】:

    标签: cmake


    【解决方案1】:

    您可以通过使用RESULT_VARIABLE 选项的execute_process 调用来找到正在执行的进程的退出状态。来自选项的documentation

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

    例子:

    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)
    【解决方案2】:

    documentation 表示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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 2016-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多