如何让CMake忽略自定义目标的命令执行返回值?
解决CMake自定义目标中忽略命令返回值的问题
嘿,我懂你遇到的这个麻烦!在Windows 7 + TDMGCC MinGW32 + 最新版Ninja的环境下,你加的那个自定义单元测试目标,只要test1.exe执行失败返回错误码,Ninja就直接终止构建了,哪怕失败输出已经写到结果文件里了对吧?
要让CMake忽略单个命令的返回值,其实只要给每个可能失败的命令套一层Windows cmd的包装,强制让它返回0就好。具体改法如下:
把你原来的ADD_CUSTOM_TARGET改成这样:
ADD_CUSTOM_TARGET(unittest_run COMMAND cmd /c "test1.exe > result.testresult || exit 0" COMMAND cmd /c "test2.exe >> result.testresult || exit 0" COMMAND type result.testresult )
原理说明:
cmd /c用来执行后面的字符串命令;|| exit 0是关键:如果前面的test1.exe执行失败(返回非0错误码),就执行exit 0,让整个cmd命令的返回码变成0,这样CMake和Ninja就会认为这条命令执行成功,不会终止后续的构建流程;- 这样不管test1.exe成功还是失败,test2.exe都会正常执行,最后也能正常输出结果文件的内容。
如果你的环境用的是MinGW自带的bash shell(比如Git Bash),那语法要换成bash的写法:test1.exe > result.testresult || true,不过看你的描述应该是用的Windows默认cmd,所以上面的方案完全适用。
内容的提问来源于stack exchange,提问作者mgiaco
相关产品推荐
相关产品推荐

