bazel工具入门(一)

bazel工具是Google内部构建工具Blaze的开源实现,属于编译打包工具,和maven、ant等类似。
构建系统时,程序员一般写一个buildfile文件来描述系统,通常buildfile命名为BUILD。

cc_library(name = "hdmap_input",srcs = ["hdmap_input.cc"],hdrs = ["hdmap_input.h"],deps = ["//modules/common/math:geometry","//modules/map/hdmap",# For personal convenience, some dependencies are omitted here......."//modules/perception/lib/config_manager",],
)cc_test(name = "hdmap_input_test",size = "small",srcs = ["hdmap_input_test.cc"],deps = [":hdmap_input","@com_google_googletest//:gtest_main",......"//modules/perception/lib/config_manager",],
)

在Bazel中,BUILD文件定义了targets。上面的两个targets分别是cc_library和cc_test。每个target对应着Bazel能够创建的一种制品(artifact)。
其中library能够生成被其他library或者others所使用的内容,test能够生产测试library或者其他的文件。
每个target都有一个name属性,方便它在命令行和其他target中被引用。src属性是必须被编译的相关源文件,用来生成对应的target artifact。deps属性是前置必须先构建或链接的依赖。【依赖关系可以限制在当前的packege以内(例如,hdmap_input_test依赖:hdmap_input),也可以是在同一个源代码层级中的不同package(例如,hdmap_input_test依赖于//modules/perception/lib/config_manager),或者源代码层级之外的第三方artifact(例如,hdmap_input_test依赖于@com_google_googletest//:gtest_main)。】

每个源代码层级(source hierarchy)都被称为一个workspace,并由根目录下的一个WORKSPACE文件来标示。

和Ant一样,用户也需要使用bazel的命令行工具来进行构建。例如,为了构建hdmap_input这个target,用户需要执行:

bazel build :hdmap_input

在首次运行上面的命令的时候,bazel工具会执行下面工作:
(1)解析当前workspace中的每一个BUILD文件,创建各个artifact之间的依赖关系图;
(2)用上面创建的图来决定hdmap_input的依赖转换关系,即hdmap_input所依赖的每个target,及每个target依赖的其他target,如此递归;
(3)根据具体的定义,按顺序构建或下载每一个依赖。bazel工具在这里首先会构建没有任何依赖的target,并保持跟踪对于每个target来说还有哪些依赖需要构建。一旦一个target的所有依赖都已经构建好了以后,bazel就开始构建该target。该过程持续到hdmap_input的每一个依赖都被构建完成。
(4)链接所有上一步中所生成的依赖,构建hdmap_input来生成最后的可执行二进制文件。

bazel的其他相关技巧

  • 对工具的依赖

很多构建都依赖于安装在自己机器上的各种工具,由于工具版本和安装环境等因素,实现跨机器的构建就会变得比较困难。如果项目还使用了不同的语言,并针对不同平台进行构建或编译,而每个平台要求略有差异的工具来完成相似工作,这个问题就更加明显。(这里涉及到两个问题:环境依赖平台针对性。)

bazel处理第一个问题的方式是把工具作为target所依赖的一部分。当前workspace中每个cc_library依赖于一个编译器,但也可以在workspace层面进行配置。每次当bazel构建一个library的时候,它首先检查特定的编译器是否在已知位置存在,如果没有的话首先下载。和其他依赖一样,如果编译器发生变化,所有依赖于它的artifact都需要重建。bazel中定义的每一类target都是用同样的策略来声明它需要运行的工具,确保无论什么样的环境下bazel都能够正确初始化。

bazel解决第二个平台独立性问题的方式是使用工具链。targets并不直接依赖于工具本身,而是依赖于工具链的类型。一个工具链包括一组工具和其他相关属性,用于定义某个类型的target如何在特定平台上构建。workspace可以根据主机和目标平台定义所使用的特定工具链。

  • 扩展构建系统

bazel允许通过自定义规则(custom rules)来扩展所支持的target类型。
要定义一个bazel的rule,首先要定义rule需要的input(以BUILD文件中传递的参数形式)和该rule所生成的output。并且还要定义该rule所要生成的actions。每个action同样也要声明input和output,运行一个特定可执行文件或在文件中写入特定字符串,并能够通过input/output连接到其他的action。这也意味着在bazel里面,action是最底层的可编辑单元(lowest-level composable unit)–只要一个action只使用它所声明的input/output,它就能做任何它想做的事情,而bazel则会负责对action进行规划安排并在合适的时候缓存其执行结果。

#########################################

bazel常用命令

#########################################
首先要有一个workspace,即WORKSPACE文件(每个bazel项目对应一个WORKSPACE文件。注意在bazel中,WORKSPACE指的是一个包括了单个或多个项目所有源文件的目录,然后在这个目录下要放一个WORKSPACE文件)。
其次要有一个BUILD文件,其描述了构建输出及依赖。

使用bazel构建程序

构建一个目标

输入bazel build,后跟要构建的目标。

$ bazel build //foo

发出构建 //foo 的命令后,会看到类似于以下内容的输出:

INFO: Analyzed target //foo:foo (14 packages loaded, 48 targets configured).
INFO: Found 1 target...
Target //foo:foo up-to-date:bazel-bin/foo/foo
INFO: Elapsed time: 9.905s, Critical Path: 3.25s
INFO: Build completed successfully, 6 total actions
构建多个目标

bazel允许通过多种方式指定要构建的目标,这些统称为“目标模式”。

// 开头的所有目标模式都将相对于当前工作区workspace进行解析。

//foo/bar:wiz只有一个目标 //foo/bar:wiz
//foo/bar等同于//foo/bar:bar
//foo/bar:all软件包foo/bar中的所有规则目标
//foo/…foo目录下所有软件包中的所有规则目标
//foo/…:allfoo目录下所有软件包中的所有规则目标
//foo/…: *foo目录下所有软件包中的所有目标(规则和文件)
//foo/…:all-targetsfoo目录下所有软件包中的所有目标(规则和文件)
//…工作区中所有软件包的目标,这不包括外部代码库中的目标
//…:all顶级软件包中的所有目标(如果workspace的根目录存在BUILD文件)

不以 // 开头的目标模式相对于当前工作目录进行解析。

:foo等同于//foo:foo
bar:wiz等同于//foo/bar:wiz
bar/wiz等同于:### 如果foo/bar/wiz是软件包,则为//foo/bar/wiz:wiz ### 如果foo/bar是软件包,则为//foo/bar:wiz ### 否则为//foo:bar/wiz
bar:all等同于//foo/bar:all
:all等同于//foo:all
…:all等同于//foo/…:all
等同于//foo/…:all
bar/…:all等同于//foo/bar/…:all

foo/... 是package是上方的通配符,表示以递归方式在 foo 目录下(针对软件包路径的所有根目录)的所有软件包。
:all 是目标上方的通配符,用于匹配软件包中的所有规则。
这两种字符可以组合使用,如在 foo/...:all 中一样。当同时使用这两个通配符时,这可以简化为 foo/...

此外, :* (或 :all-targets)是与匹配的软件包中的每个目标(包括通常不由任何规则构建的文件)匹配的通配符。

这意味着 :* 表示 :all 的超集。:all 通配符用于典型构建。

bazel还支持使用斜杠代替标签语法所需的冒号;在使用Bash文件名扩展时,这通常很方便。例如,foo/bar/wiz 等同于 //foo/bar:wiz (如果有软件包 foo/bar)或 //foo:bar/wiz (如果存在软件包 foo)。

许多bazel命令都接受目标模式列表作为参数,并且它们都遵循前缀否定运算符 - 。这可用于从上述参数指定的集合中减去一组目标。(注意:这意味着顺序很重要。)例如,

$ bazel build foo/... bar/...

指“在 foo 下构建所有目标,在 bar 下构建所有目标”,而

$ bazel build -- foo/... -foo/bar/...

指“构建 foo 下的所有目标,但不知 foo/bar 下”。(其中 -- 参数是必需的,可以防止以 - 开头的后续参数被解释为其他选项。)
需要注意的是,以这种方式减去目标时,并不能保证它们不会被构建,因为它们可能是未减去的目标的依赖项。

参考:
https://zhuanlan.zhihu.com/p/262497747
https://bazel.google.cn/versions/6.1.0/run/build?hl=fr&authuser=19#getting-help

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringBoot项目从0到1配置logback日志打印

大家好!我是sum墨,一个一线的底层码农,平时喜欢研究和思考一些技术相关的问题并整理成文,限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。 以下是正文! 一、写文背景 我们在写后端…

安卓进度条:ProgressBar和Seekbar

一、ProgressBar进度条介绍 ProgressBar 是 Android 中的一个进度条控件,用于显示正在进行的任务的进度。它可以以水平或圆形的形式展示进度,并提供了多种样式和属性来满足不同的需求。 相关属性: android:progress:设置进度条的…

无重复字符的最长子串

给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。 示例 1: 输入: s "abcabcbb" 输出: 3 解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。 示例 2: 输入: s "bbbbb" 输出: 1 解释: 因为…

计数排序

计数排序 排序步骤 1、以最大值和最小值的差值加一为长度创建一个新数组 2、将索引为0对应最小值,索引为1对应最小值1,索引为2对应最小值2,以此类推,将索引对应最小值到最大值之间所有的值 3、遍历一遍,遇到一个数字…

计算机网络 - http协议 与 https协议(2)

前言 本篇介绍了构造http请求的的五种方式,简单的使用postman构造http请求,进一步了解https, 学习https的加密过程,了解对称密钥与非对称密钥对于加密是如何进行的,如有错误,请在评论区指正,让我们一起交流…

云计算相关概念

文章目录 一、云计算的三种部署模式:公有云、私有云、混合云--区别和特性二、华为云:简介、主要业务、特点和优势、不同场景和行业中的应用三、华为云-三剑客:IaaS、PaaS、SaaS 一、云计算的三种部署模式:公有云、私有云、混合云–…

webpack插件安装

webpack插件安装 1、html-webpack-plugin插件2 、css-loader和style-loader插件3、less-load插件 1、html-webpack-plugin插件 1、下载插件 yarn add html-webpack-plugin -D2、webpack.config.js添加配置 *const HtmlWebpackPlugin require(html-webpack-plugin); const p…

SpringBoot+JWT实现单点登录解决方案

一、什么是单点登录? 单点登录是一种统一认证和授权机制,指在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的系统,不需要重新登录验证。 单点登录一般用于互相授信的系统,实现单一位置登录,其他信任的…

机器学习技术(五)——特征工程与模型评估

机器学习技术(五)——特征工程与模型评估(2️⃣) 文章目录 机器学习技术(五)——特征工程与模型评估(:two:)二、模型评估1、Accuracy score2、Confusion matrix混淆矩阵1、多值2、二值 3、Hamming loss4、Precision, recall and F…

跑通代码Dual-Key

《Dual-Key Multimodal Backdoors for Visual Question Answering》 github链接 总概括: 1.使用编码网络生成trigger图片2.将trigger添加到良性图片样本上3.提取图像特征后保存4.训练 f:feature d:data make_specs.py 用于自动生成规范…

基于Matlab的电池和电阻为负载的MPPT升压转换器设计(附上源码仿真)

随着可再生能源的快速发展,太阳能光伏系统成为了一种常见的清洁能源解决方案。然而,由于天气和环境的变化,光伏系统的输出功率会发生波动。为了最大限度地利用光伏系统的能量,最大功率点跟踪(MPPT)技术被广…

python 打包项目(包含.ui文件,.dll文件)为exe可执行文件

目录 1. 背景 2. 生成.spec文件: 3. 编辑.spec文件: 4. 最后生成单个可执行文件.exe: 5 补充:<

深度学习笔记之Transformer(八)Transformer模型架构基本介绍

机器学习笔记之Transformer——Transformer模型架构基本介绍 引言回顾&#xff1a;简单理解&#xff1a; Seq2seq \text{Seq2seq} Seq2seq模型架构与自编码器自注意力机制 Transformer \text{Transformer} Transformer架构关于架构的简单认识多头注意力机制包含掩码的多头注意力…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

libvirt 热迁移流程及参数介绍

01 热迁移基本原理 1.1 热迁移概念 热迁移也叫在线迁移&#xff0c;是指虚拟机在开机状态下&#xff0c;且不影响虚拟机内部业务正常运行的情况下&#xff0c;从一台宿主机迁移到另外一台宿主机上的过程。 1.2 虚拟机数据传输预拷贝和后拷贝 预拷贝(pre-copy)&#xff1a; …

Windows如何恢复已删除的Word文档?

案例&#xff1a;可以恢复已删除的Word文档吗&#xff1f; “大家好&#xff0c;我遇到了一个问题&#xff0c;需要大家的帮助。昨天我编辑了一个Word文档并保存到了桌面上&#xff0c;但当我今天再次打开电脑时&#xff0c;它就不见了&#xff01;昨天工作完成后&#xff…

Sentinel 规则详解

Sentinel 规则 流控规则 flow1、QPS流控2、并发线程数流控3、流控模式4、流控效果 熔断&#xff08;降级&#xff09;规则 degrade1、慢调用比例2、异常比例3、异常数 热点规则 param-flow授权规则 authority1、应用场景2、自定义来源3、授权规则配置 系统规则 前言&#xff1a…

JMeter进行WebSocket压力测试

背景 之前两篇内容介绍了一下 WebSocket 和 SocketIO 的基础内容。之后用 Netty-SocketIO 开发了一个简单的服务端&#xff0c;支持服务端主动向客户端发送消息&#xff0c;同时也支持客户端请求&#xff0c;服务端响应方式。本文主要想了解一下服务端的性能怎么样&#xff0c;…

4.6.tensorRT基础(1)-实际模型上onnx文件的各种操作

目录 前言1. onnx1.1 读取节点1.2 修改节点1.3 替换节点1.4 删除节点1.5 修改input和output1.6 预处理的接入 总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#…

ChatGPT如何助力DevOps|用例解读

DevOps 是一种方法论&#xff0c;旨在提高软件开发和 IT 运营团队的协作和效率。DevOps 涉及各种任务和流程的自动化&#xff0c;例如规划、编码、测试、部署、监控和故障排除。然而&#xff0c;其中一些任务和流程仍然有大量任务需要人工手动处理&#xff0c;而这会减慢软件产…