CMake通过bash在Windows上执行shell脚本的execute_process会吃掉退出代码

cgvd09ve  于 2023-03-18  发布在  Windows
关注(0)|答案(1)|浏览(297)

我使用这个CMake是为了在配置阶段运行一个跨平台的shell脚本:

find_program(BASH_EXECUTABLE bash
        NAMES bash git-bash
        HINTS
            "C:/Program Files/Git/bin"
        REQUIRED
    )

    execute_process (
        COMMAND ${BASH_EXECUTABLE} "exit1.sh"
        WORKING_DIRECTORY ${CMAKE_SOURCE_DIR}
        COMMAND_ERROR_IS_FATAL ANY
        OUTPUT_VARIABLE RESULTSV_OUT
        ERROR_VARIABLE RESULTSV_ERR
        ECHO_OUTPUT_VARIABLE
        ECHO_ERROR_VARIABLE
        RESULT_VARIABLE RESULTSV_VARY
    )
    message("MESSAGE OUTPUT IS ${RESULTSV_OUT}" )
    message("MESSAGE ERROR IS ${RESULTSV_ERR}" )
    message("MESSAGE RESULTS IS ${RESULTSV_VARY}" )

结果总是:

1> [CMake] MESSAGE OUTPUT IS 
1> [CMake] MESSAGE ERROR IS 
1> [CMake] MESSAGE RESULTS IS 0

尽管exit1.sh只是一个文件

#!/usr/bin/bash
exit 1

命令确实运行了,我已经能够用更大的脚本来确认它。它在一个新的bash窗口中运行,但我不明白为什么CMake无法从bash获得这个退出代码。
COMMAND_ERROR_IS_FATAL似乎也无法识别命令失败。

zpqajqem

zpqajqem1#

我相信git-bash.exe是Git Bash的终端模拟器 Package 器(它启动一个Mintty终端,并将Git-Bash的Bash作为shell)。请参见https://superuser.com/q/1104567/1749748
请注意,您可能必须在更改后重新配置构建系统/使用新的CMake缓存重新配置构建系统,因为find_program默认情况下会缓存它找到的结果(或者您可以使用NO_CACHE关闭其缓存,但请阅读the docs中的警告标签,了解您可能不想这样做的原因(性能原因))。

相关问题