Windows下CMake通过Bash执行Shell脚本无法获取退出码
CMake配置阶段执行Bash脚本无法获取正确退出码
问题重现
在CMake配置阶段调用Bash脚本时,脚本明确返回退出码1,但CMake始终返回结果0,无法识别执行失败,COMMAND_ERROR_IS_FATAL也未触发。
CMake代码
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
已确认脚本确实运行,但CMake无法捕获Bash的退出码。
解决方案
1. 确保脚本路径传递正确
使用绝对路径调用脚本,避免路径解析异常:
execute_process ( COMMAND ${BASH_EXECUTABLE} "${CMAKE_SOURCE_DIR}/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 )
2. 使用bash -c执行脚本
通过-c参数让Bash直接执行命令,确保退出码正确传递:
execute_process ( COMMAND ${BASH_EXECUTABLE} -c "./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 )
3. 修复脚本换行符问题
若脚本使用Windows风格的CRLF换行符,Bash可能无法正确解析shebang导致执行异常,需将脚本换行符改为LF格式。
4. 给脚本添加执行权限(Git Bash环境)
在Git Bash中执行以下命令赋予脚本执行权限:
chmod +x ${CMAKE_SOURCE_DIR}/exit1.sh
内容的提问来源于stack exchange,提问作者Klypto
相关产品推荐
相关产品推荐

