find 查找 Bazel 构建覆盖率文件的一个☝️坑

2024-06-21 07:20

本文主要是介绍find 查找 Bazel 构建覆盖率文件的一个☝️坑,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Bazel 是由 Google 开发的一个高效、可扩展的开源构建和测试工具,主要用于管理大型代码库。它支持多语言(如 C++, Java, Python)和多平台构建,通过强大的构建缓存和并行化机制显著提高构建速度。

背景

利用Bazel构建项目时,想要通过它生成覆盖率报告,其中有一个关键文件,是在构建项目时一并生成的gcno类型的文件。但是,利用find查找却无法找到。

# 设定参数生成覆盖率文件
$bazel build --copt=--coverage --linkopt=-lgcov --spawn_strategy=standalone --genrule_strategy=standalone --collect_code_coverage   //main:hello_test
DEBUG: Rule 'gtest' indicated that a canonical reproducible form can be obtained by modifying arguments commit = "58d77fa8070e8cec2dc1ed015d66b454c8d78850" and dropping ["branch"]
DEBUG: Repository gtest instantiated at:/apsara/jiaomian.wjw/bazel-example/examples-main/cpp-tutorial/stage-test/WORKSPACE:2:15: in <toplevel>
Repository rule git_repository defined at:/apsara/jiaomian.wjw/.cache/bazel/_bazel_jiaomian.wjw/85047200f6c215149976ede38a6439b5/external/bazel_tools/tools/build_defs/repo/git.bzl:189:33: in <toplevel>
INFO: Analyzed target //main:hello_test (77 packages loaded, 1220 targets configured).
INFO: Found 1 target...
Target //main:hello_test up-to-date:bazel-bin/main/hello_test
INFO: Elapsed time: 1815.686s, Critical Path: 5.57s
INFO: 29 processes: 10 internal, 19 local.
INFO: Build completed successfully, 29 total actions$find . -name "*.gcno"
# 寻找不到任何东西

尝试了各种办法,看了各种文档教程,无论是折腾参数还是修改.bazelrc文件,都无法生成gcno文件。
当然,gcda也查不到。

排查

在保存构建产物的过程中,进行了将产物重定向到build目录的操作,此时在build下查找gcda,竟然找到了。

$find -name '*.gcda'
./external/gtest/_objs/gtest/gmock-internal-utils.pic.gcda
./external/gtest/_objs/gtest/gmock-cardinalities.pic.gcda
./external/gtest/_objs/gtest/gtest-typed-test.pic.gcda
./external/gtest/_objs/gtest/gtest-matchers.pic.gcda
./external/gtest/_objs/gtest/gtest-filepath.pic.gcda
./external/gtest/_objs/gtest/gtest-assertion-result.pic.gcda
./external/gtest/_objs/gtest/gtest-printers.pic.gcda
./external/gtest/_objs/gtest/gmock-matchers.pic.gcda
./external/gtest/_objs/gtest/gtest-port.pic.gcda
./external/gtest/_objs/gtest/gtest-death-test.pic.gcda
./external/gtest/_objs/gtest/gmock-spec-builders.pic.gcda
./external/gtest/_objs/gtest/gmock.pic.gcda
./external/gtest/_objs/gtest/gtest-test-part.pic.gcda
./external/gtest/_objs/gtest/gtest.pic.gcda
./external/gtest/_objs/gtest_main/gmock_main.pic.gcda
./main/_objs/hello_test/hello_test.pic.gcda

结合bazel文档提到,它的产物是以符号连接的形式生成在工作区(WORDKSPACE)中的。
到项目根目录查看内容:

$ls -l
total 172
lrwxrwxrwx 1 jiaomian.wjw users    128 Jun  5 20:12 bazel-bin -> /apsara/jiaomian.wjw/.cache/bazel/_bazel_jiaomian.wjw/85047200f6c215149976ede38a6439b5/execroot/_main/bazel-out/k8-fastbuild/bin
lrwxrwxrwx 1 jiaomian.wjw users    111 Jun  5 20:12 bazel-out -> /apsara/jiaomian.wjw/.cache/bazel/_bazel_jiaomian.wjw/85047200f6c215149976ede38a6439b5/execroot/_main/bazel-out
lrwxrwxrwx 1 jiaomian.wjw users    101 Jun  5 20:12 bazel-stage-test -> /apsara/jiaomian.wjw/.cache/bazel/_bazel_jiaomian.wjw/85047200f6c215149976ede38a6439b5/execroot/_main
lrwxrwxrwx 1 jiaomian.wjw users    133 Jun  5 20:12 bazel-testlogs -> /apsara/jiaomian.wjw/.cache/bazel/_bazel_jiaomian.wjw/85047200f6c215149976ede38a6439b5/execroot/_main/bazel-out/k8-fastbuild/testlogs
drwxr-xr-x 2 jiaomian.wjw users   4096 Jun  5 09:50 main
-rw-r--r-- 1 jiaomian.wjw users    399 Jun  5 19:40 MODULE.bazel
-rw-r--r-- 1 jiaomian.wjw users 145955 Jun  5 20:12 MODULE.bazel.lock
-rw-r--r-- 1 jiaomian.wjw users    188 Jun  5 09:51 WORKSPACE

果然,这几个bazel的产物都是符号连接。
而find指令默认不会进入软连接进行查找。

解决办法

给find增加-L参数即可

$find -L -name '*.gcno'
./bazel-bin/external/gtest/_objs/gtest/gmock.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-printers.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-filepath.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-typed-test.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gmock-spec-builders.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gmock-internal-utils.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-assertion-result.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gmock-matchers.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-test-part.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-matchers.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-death-test.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gmock-cardinalities.pic.gcno
./bazel-bin/external/gtest/_objs/gtest/gtest-port.pic.gcno
./bazel-bin/external/gtest/_objs/gtest_main/gmock_main.pic.gcno
./bazel-bin/main/_objs/hello_test/hello_test.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-printers.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-filepath.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-typed-test.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-spec-builders.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-internal-utils.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-assertion-result.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-matchers.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-test-part.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-matchers.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-death-test.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-cardinalities.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-port.pic.gcno
./bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest_main/gmock_main.pic.gcno
./bazel-out/k8-fastbuild/bin/main/_objs/hello_test/hello_test.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-printers.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-filepath.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-typed-test.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-spec-builders.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-internal-utils.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-assertion-result.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-matchers.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-test-part.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-matchers.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-death-test.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gmock-cardinalities.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest/gtest-port.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/external/gtest/_objs/gtest_main/gmock_main.pic.gcno
./bazel-stage-test/bazel-out/k8-fastbuild/bin/main/_objs/hello_test/hello_test.pic.gcno

看,这不是很多吗:)

这篇关于find 查找 Bazel 构建覆盖率文件的一个☝️坑的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1080565

相关文章

一文详解如何从零构建Spring Boot Starter并实现整合

《一文详解如何从零构建SpringBootStarter并实现整合》SpringBoot是一个开源的Java基础框架,用于创建独立、生产级的基于Spring框架的应用程序,:本文主要介绍如何从... 目录一、Spring Boot Starter的核心价值二、Starter项目创建全流程2.1 项目初始化(

使用Java实现通用树形结构构建工具类

《使用Java实现通用树形结构构建工具类》这篇文章主要为大家详细介绍了如何使用Java实现通用树形结构构建工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录完整代码一、设计思想与核心功能二、核心实现原理1. 数据结构准备阶段2. 循环依赖检测算法3. 树形结构构建4. 搜索子

使用Python和python-pptx构建Markdown到PowerPoint转换器

《使用Python和python-pptx构建Markdown到PowerPoint转换器》在这篇博客中,我们将深入分析一个使用Python开发的应用程序,该程序可以将Markdown文件转换为Pow... 目录引言应用概述代码结构与分析1. 类定义与初始化2. 事件处理3. Markdown 处理4. 转

Linux find 命令完全指南及核心用法

《Linuxfind命令完全指南及核心用法》find是Linux系统最强大的文件搜索工具,支持嵌套遍历、条件筛选、执行动作,下面给大家介绍Linuxfind命令完全指南,感兴趣的朋友一起看看吧... 目录一、基础搜索模式1. 按文件名搜索(精确/模糊匹配)2. 排除指定目录/文件二、根据文件类型筛选三、时间

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Java使用Mail构建邮件功能的完整指南

《Java使用Mail构建邮件功能的完整指南》JavaMailAPI是一个功能强大的工具,它可以帮助开发者轻松实现邮件的发送与接收功能,本文将介绍如何使用JavaMail发送和接收邮件,希望对大家有所... 目录1、简述2、主要特点3、发送样例3.1 发送纯文本邮件3.2 发送 html 邮件3.3 发送带

Python结合Flask框架构建一个简易的远程控制系统

《Python结合Flask框架构建一个简易的远程控制系统》这篇文章主要为大家详细介绍了如何使用Python与Flask框架构建一个简易的远程控制系统,能够远程执行操作命令(如关机、重启、锁屏等),还... 目录1.概述2.功能使用系统命令执行实时屏幕监控3. BUG修复过程1. Authorization

nginx-rtmp-module构建流媒体直播服务器实战指南

《nginx-rtmp-module构建流媒体直播服务器实战指南》本文主要介绍了nginx-rtmp-module构建流媒体直播服务器实战指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. RTMP协议介绍与应用RTMP协议的原理RTMP协议的应用RTMP与现代流媒体技术的关系2

Python中构建终端应用界面利器Blessed模块的使用

《Python中构建终端应用界面利器Blessed模块的使用》Blessed库作为一个轻量级且功能强大的解决方案,开始在开发者中赢得口碑,今天,我们就一起来探索一下它是如何让终端UI开发变得轻松而高... 目录一、安装与配置:简单、快速、无障碍二、基本功能:从彩色文本到动态交互1. 显示基本内容2. 创建链

Golang使用etcd构建分布式锁的示例分享

《Golang使用etcd构建分布式锁的示例分享》在本教程中,我们将学习如何使用Go和etcd构建分布式锁系统,分布式锁系统对于管理对分布式系统中共享资源的并发访问至关重要,它有助于维护一致性,防止竞... 目录引言环境准备新建Go项目实现加锁和解锁功能测试分布式锁重构实现失败重试总结引言我们将使用Go作