如何解决CMake:在测试目标之前清理覆盖目录
我正在使用 CMake + clang 进行 C++ 项目。我现在想将基于源的覆盖率与我的单元测试集成。使用正确的标志进行编译时,原始覆盖率数据会根据 LLVM_PROFILE_FILE
环境变量给出的模式放入文件中。由于我使用 catch2 作为测试框架,因此我调用:
catch_discover_tests(
my_test
PROPERTIES ENVIRONMENT LLVM_PROFILE_FILE=coverage/my_test_%p.profraw
)
运行 test
目标时,这将在 .profraw
目录中为每个测试进程放置一个 coverage
。我还添加了一个自定义 coverage
目标,将这些文件合并到一个 .profdata
文件中:
add_custom_command(
OUTPUT coverage/my_test.profdata
COMMAND llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
)
add_custom_target(coverage DEPENDS coverage/my_test.profdata)
这已经足够了。但是,如果我现在再次运行 test
目标并忘记清除其间的 coverage
目录,则运行 coverage
目标将合并来自多次测试运行的数据。这不是我想要的,所以我想确保在测试运行之前始终删除 coverage
目录。但我不知道该怎么做,我试过了:
add_custom_target(
clean_coverage_dir
COMMAND ${CMAKE_COMMAND} -E rm -rf coverage
)
add_dependencies(test clean_coverage_dir)
在 catch_discover_tests
之后,但结果是:
Cannot add target-level dependencies to non-existent target "test".
我能做什么?我应该完全使用不同的方法吗?
解决方法
如果有人感兴趣,我已经找到了一种明显的解决方案:
add_custom_target(
test_coverage
COMMAND ${CMAKE_COMMAND} -E rm -rf coverage &&
${CMAKE_CTEST_COMMAND} --force-new-ctest-process &&
llvm-profdata merge -sparse coverage/*.profraw -o coverage/my_test.profdata
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。