如何在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
相关产品推荐
相关产品推荐

