如何让CMake的PASS_REGULAR_EXPRESSION检查stderr输出?
让CMake的PASS_REGULAR_EXPRESSION检查stderr输出的方法
你遇到的问题核心在于:默认情况下PASS_REGULAR_EXPRESSION仅匹配stdout内容,且直接在add_test的COMMAND中添加2>&1不会生效——因为CMake默认不会通过shell执行测试命令,重定向符号会被当作普通参数传递给可执行文件。以下是两种可行的解决办法:
方法一:使用TEST_INCLUDE_STDERR属性(推荐,CMake 3.10+)
CMake 3.10及以上版本提供了TEST_INCLUDE_STDERR属性,开启后会将stderr输出合并到stdout中,让PASS_REGULAR_EXPRESSION可以同时匹配两者的内容。配置示例:
add_test(NAME test COMMAND executable) set_tests_properties(test PROPERTIES WILL_FAIL true PASS_REGULAR_EXPRESSION "I was printed to stderr" TEST_INCLUDE_STDERR ON )
注意:需确保你的可执行文件确实会返回非0值,否则WILL_FAIL true会导致测试判定为失败,即便正则匹配成功。
方法二:通过shell执行命令(兼容旧版CMake)
如果你的CMake版本低于3.10,可以让测试命令通过shell执行,让shell解析重定向符号。跨平台写法可借助生成器表达式指定shell路径:
add_test(NAME test COMMAND $<SHELL_PATH:sh> -c "$<TARGET_FILE:executable> 2>&1") set_tests_properties(test PROPERTIES WILL_FAIL true PASS_REGULAR_EXPRESSION "I was printed to stderr" )
针对Windows系统,也可直接指定cmd /c:
add_test(NAME test COMMAND cmd /c "$<TARGET_FILE:executable> 2>&1")
这种方式通过shell包裹命令,让2>&1生效,将stderr重定向到stdout,进而被正则表达式匹配。
内容的提问来源于stack exchange,提问作者Aleksander Krauze
相关产品推荐
相关产品推荐

