我正在尝试bazel coverage //my:test
输出覆盖数据文件,使用自定义 C 规则构建并使用自定义 clang 工具链。
对于 Bazel 的原生 C 规则,这是一个已解决的问题。cc_library
我可以使用和原生规则构建覆盖输出,方法cc_test
是运行以下命令并设置 env:
export BAZEL_USE_LLVM_NATIVE_COVERAGE=1
export GCOV=/path/to/llvm-profdata
export BAZEL_LLVM_COV=/path/to/llvm-cov
export CC=/path/to/clang
bazel coverage //my:test --experimental_generate_llvm_lcov --combined_report=lcov
测试目标有一个coverage.dat
文件输出,也有一个组合的 dat 报告文件。我注意到cc_library
目标返回一个InstrumentedFilesInfo
提供程序,该提供程序具有在编译期间填充了文件输出的“元数据文件”属性。.gcno
我正在使用cc_common
Starlark 库来构建自定义 C 规则,并且我的编译操作是通过cc_common.compile()
. 虽然*.gcno
文件是 Bazel 期望从此操作 [0] 输出的输出,但 compile 函数不会*.gcno
File
在编译上下文或编译输出中返回任何对象,因此将它们用作另一个操作的输入/在提供程序中返回/添加到目标的运行文件是不可能。
我知道这些.dat
文件是使用*.gcno
编译输出和*.gcda
沙盒测试执行输出生成的,并结合在collect_cc_coverage.sh脚本中。在我的规则实现的管道中缺少某些东西,无法通过返回由构造的提供程序来修复,coverage_common.instrumented_files_info()
并声明额外的输出cc_common.compile()
目前是不可能的。
[0]:在添加文件的地方运行coverage
而不是test
具有工具链功能,输出文件并出现在.--compile
.gcno
bazel-out
我的问题:
- 有没有人有为自定义 C 规则实现代码覆盖的经验?
- 如何让我的测试可执行文件接收
.gcno
文件、生成.gcda
文件并使用我的工具链将两者结合起来生成.dat
符合原生 C 规则的文件?(这个问题不需要.gcno
- 涉及 profraw/profdata 的解决方案同样有效。)