CMake:在测试目标之前清理覆盖范围目录



我正在用CMake+crang开发一个C++项目。我现在想将基于源代码的覆盖与我的单元测试集成起来。当使用正确的标志进行编译时,原始覆盖率数据将根据LLVM_PROFILE_FILE环境变量给定的模式放入文件中。由于我使用catch2作为测试框架,因此我称之为:

catch_discover_tests(
my_test
PROPERTIES ENVIRONMENT LLVM_PROFILE_FILE=coverage/my_test_%p.profraw
)

当运行test目标时,这将在coverage目录中为每个测试进程放置一个.profraw。我还添加了一个自定义的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}
)

最新更新