微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在自定义 Bazel C 规则中实现基于 clang 的代码覆盖率

如何解决在自定义 Bazel C 规则中实现基于 clang 的代码覆盖率

我正在尝试让 bazel coverage //my:test 输出覆盖数据文件,使用自定义 C 规则构建并使用自定义 clang 工具链。

对于 Bazel 的原生 C 规则,这是一个解决的问题。我可以通过使用 env set 运行以下命令,使用 cc_librarycc_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 举报,一经查实,本站将立刻删除。