You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bazel中使用自定义覆盖率工具Squish Coco实现C++代码覆盖率

解决Bazel保留Squish Coco插装文件的方案

1. 给CC规则明确声明额外输出

Bazel会自动清理未标记为输出的中间文件,所以得直接告诉它哪些文件需要保留:

  • 针对cc_library,除了默认的.o文件,把.o.csmes也加到输出列表里。可以在工具链的编译动作配置里指定,比如定义编译动作时,将.o.csmes作为输出项之一。
  • 针对cc_binary和cc_test,同理添加.csmes作为额外输出。

编译动作配置示例:

compile_action = ctx.actions.run(
    executable = coco_wrapper,
    arguments = compile_args,
    inputs = compile_inputs,
    outputs = [obj_file, obj_file + ".csmes"],  # 明确包含.o.csmes文件
    mnemonic = "CocoCompile",
)

2. 用输出组指定保留文件

可以定义一个专门的输出组,把所有.csmes相关文件归到组里,构建时通过参数让Bazel保留它们:

  • 在BUILD文件里给目标添加output_groups声明:
cc_library(
    name = "mylib",
    srcs = ["mylib.cc"],
    output_groups = {
        "coco_coverage": [":mylib.o.csmes"],
    },
)
  • 构建时加上参数:bazel build --output_groups=coco_coverage //path/to:target

3. 修复链接阶段的依赖问题

链接时出现undefined reference to '__cs_tb...',本质是没把Squish Coco的运行时库链进去。在工具链的链接动作配置里,把Coco的运行时库加入链接参数:

link_action = ctx.actions.run(
    executable = coco_link_wrapper,
    arguments = link_args + ["-lCocoRuntime"],  # 替换成你实际用的Coco库名称
    inputs = link_inputs,
    outputs = [binary_file, binary_file + ".csmes"],
    mnemonic = "CocoLink",
)

4. 自定义规则简化配置(可选)

如果修改工具链觉得麻烦,可以写自定义Bazel规则(比如coco_cc_library、coco_cc_binary),把额外输出声明、链接依赖这些逻辑封装进去,后续用的时候直接调用自定义规则就行。


内容的提问来源于stack exchange,提问作者CodeMonkey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 11:55:16