gpt4 book ai didi

cmake - 如果未构建目标则跳过 CTest

转载 作者:行者123 更新时间:2023-12-02 17:00:10 26 4
gpt4 key购买 nike

在 CMake 中,可以使用 add_subdirectory(foo EXCLUDE_FROM_ALL)排除在 foo 下定义的目标默认情况下构建,除非其他目标需要它们,如下所示:

add_subdirectory(foo EXCLUDE_FROM_ALL)
add_custom_target(wanted_foo_targets ALL DEPENDS
bar_tool # only build bar_tool from foo
)

假设 foo定义了两个目标,bar_toolfoo_tool , 并测试每个:

add_test(NAME test_foo_tool COMMAND foo_tool) 
add_test(NAME test_bar_tool COMMAND bar_tool)

构建整体项目时,foo_tool未构建,因为它不是任何东西的依赖项,而是 bar_tool构建是因为它是 wanted_foo_targets 的依赖项.

但是 CTest 仍然注册了 test_foo_tool工具,现在失败了,因为 foo_tool不存在。

我可以删除/隐藏/跳过引用未构建目标的测试吗?我知道我可以使测试命令类似于 [ -f foo_tool ] && foo_tool但这会错误地表明测试已通过。

如果我可以从父目录执行此操作,而无需修改内部测试的设置方式,则可加分 foo .就我而言,foo是第三方提供的项目,我不想在他们编写新测试时维护他们的代码补丁。

最佳答案

这可以通过使用 SKIP_RETURN_CODE 来完成测试属性与小型测试驱动程序脚本(您已经考虑使用)相结合。

在源代码目录下添加名为test_driver.sh的测试驱动脚本,内容如下:

#!/bin/sh
if [ -x "$1" ] ; then exec "$1" ; else exit 127 ; fi

脚本检查是否存在作为第一个参数传递的测试可执行文件,如果不存在则退出并返回错误代码 127(也称为“未找到命令”)。

在您的 CMakeLists.txt 中按以下方式添加测试:

add_test(NAME test_foo_tool COMMAND "${CMAKE_SOURCE_DIR}/test_driver.sh" $<TARGET_FILE:foo_tool>)
set_tests_properties(test_foo_tool PROPERTIES SKIP_RETURN_CODE 127)

当您在缺少可执行文件 foo_tool 的情况下运行测试时,ctest 会将 test_foo_tool 报告为跳过的测试,而不是失败的测试。

$ ctest 
...
Start 1: test_foo_tool
1/2 Test #1: test_foo_tool ....................***Skipped 0.01 sec
Start 2: test_bar_tool
2/2 Test #2: test_bar_tool .................... Passed 0.01 sec

100% tests passed, 0 tests failed out of 2

Total Test time (real) = 0.03 sec

The following tests did not run:
1 - test_foo_tool (Skipped)

关于cmake - 如果未构建目标则跳过 CTest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54525943/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com