如何解决在自定义 Bazel C 规则中实现基于 clang 的代码覆盖率
我正在尝试让 bazel coverage //my:test
输出覆盖数据文件,使用自定义 C 规则构建并使用自定义 clang 工具链。
对于 Bazel 的原生 C 规则,这是一个已解决的问题。我可以通过使用 env set 运行以下命令,使用 cc_library
和 cc_test
原生规则构建覆盖输出:
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
文件输出,也有一个组合数据报告文件。我注意到 cc_library
目标返回一个 InstrumentedFilesInfo
提供程序,该提供程序的 "metadata files" 属性在编译期间填充了 .gcno
文件输出。
我正在使用 cc_common
Starlark 库来构建自定义 C 规则,并且我的编译操作是通过 cc_common.compile()
设置的。虽然 *.gcno
文件是 Bazel 期望从该操作 [0] 中获得的输出,但编译函数不会在编译上下文或编译输出中返回任何 *.gcno
File
对象,因此将它们用作输入另一个操作/返回提供者/添加到目标的运行文件是不可能的。
我了解 .dat
文件是使用 *.gcno
编译输出和 *.gcda
沙盒测试执行输出生成的,并组合在 collect_cc_coverage.sh 脚本中。我的规则实现的管道中缺少某些内容,无法通过返回由 coverage_common.instrumented_files_info()
构造的提供程序并声明 cc_common.compile()
的额外输出目前无法修复。
[0]:在 coverage
而不是 test
下运行具有工具链功能,其中添加了 --compile
,.gcno
文件被输出并出现在 {{1} }.
我的问题:
- 有没有人有过为自定义 C 规则实现代码覆盖率的经验?
- 如何让我的测试可执行文件接收
bazel-out
文件、生成.gcno
文件并使用我的工具链将两者结合以生成本机预期的.gcda
文件C规则? (此问题不需要.dat
- 涉及 profraw/profdata 的解决方案同样有效。)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。