bazel工具入门(一)

这篇具有很好参考价值的文章主要介绍了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/…:all foo目录下所有软件包中的所有规则目标
//foo/…: * foo目录下所有软件包中的所有目标(规则和文件)
//foo/…:all-targets foo目录下所有软件包中的所有目标(规则和文件)
//… 工作区中所有软件包的目标,这不包括外部代码库中的目标
//…: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文章来源地址https://www.toymoban.com/news/detail-569148.html

到了这里,关于bazel工具入门(一)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 自动驾驶预测-决策-规划-控制学习(5):图像分割与语义分割入门

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 对于图像的分析,传统的检测任务,比如这幅图的人,用标注框来表示。 而图像分割,则是针对每一个像素都可以被认定为不同的语义信息,比如这里红色区域的像素点属于人,蓝色属于天空,浅绿色

    2024年01月18日
    浏览(33)
  • AI大模型应用入门实战与进阶:22. AI大模型的实战项目:自动驾驶

    自动驾驶技术是人工智能领域的一个重要分支,它涉及到计算机视觉、机器学习、深度学习、路径规划、控制理论等多个领域的知识和技术。自动驾驶的目标是让汽车在人类的指导下或者无人指导下自主地完成驾驶任务,从而提高交通安全和效率。 自动驾驶技术的发展历程可

    2024年02月19日
    浏览(35)
  • 自动驾驶路径规划控制ros移植Apollo和autoware规控算法可跑工程(适合入门学习和实战)

    自动驾驶路径规划控制ros1和ros2移植Apollo和autoware规控算法可跑工程(适合入门学习,科研和实战),不仅包括移植Apollo和autoware规划算法,还包括其他规划算法,与carla联合仿真实现规划控制,autoware-carla联合仿真,Lanelet高精度地图构建,强化学习等等,基本涵盖了公司算法

    2024年02月10日
    浏览(35)
  • 自动驾驶路径规划控制ros移植Apollo和autoware规控算法可跑工程(适合入门学习,科研和实战)

    自动驾驶路径规划控制ros1和ros2移植Apollo和autoware规控算法可跑工程(适合入门学习,科研和实战),不仅包括移植Apollo和autoware规划算法,还包括其他规划算法,与carla联合仿真实现规划控制,autoware-carla联合仿真,Lanelet高精度地图构建,强化学习等等,基本涵盖了公司算法

    2024年02月08日
    浏览(37)
  • Linux基础开发工具之Linux自动项目构建工具的使用

    目录 前言 1.make/makefile 1.1 依赖关系/依赖方法 2.原理 3.项目清理  4.make的执行问题  5.相关简单的符号介绍 总结   之前给大家介绍了我们在开发过程中所需要使用到的编辑器vim,以及编译器gcc/g++的使用,但是我相信大家在使用过程会发现我们在每次编写好一份代码时总是需

    2024年02月13日
    浏览(29)
  • 自动化运维工具Ansible教程(一)【入门篇】

    ansible 学习大纲 Ansible 是一个开源的自动化工具,用于配置管理、应用部署和任务执行。它以简单、可读性强的 YAML 格式的 Playbooks 为基础,使得自动化任务变得简单、可维护和可扩展。 简单易用 :Ansible 的设计目标之一是简单易用。它使用 YAML 语法定义任务和配置,无需编

    2024年02月09日
    浏览(36)
  • 【自动驾驶】【零基础】基础自动驾驶控制算法笔记

    本文接近25000字 从理论到实践,全部零基础开始,一步一步完成自动驾驶车辆控制基础 感谢:忠厚老实的老王 下面是他的主页:忠厚老实的老王的个人空间_哔哩哔哩_bilibili 目录 第一讲  绪论 第二讲  三个坐标系与运动学方程 一、控制原理 二、三个坐标系 三、左手系与右

    2023年04月21日
    浏览(36)
  • 自动驾驶技术综述1:自动驾驶算法软件架构介绍

    前言: 自动驾驶技术是一个庞大的工程体系,软件架构、功能算法、控制规划、感知识别、建图定位、电气架构、车载控制器、验证体系等等,有太多的角度可以去切入。对于自动驾驶功能与算法开发,自动驾驶功能的分级是很重要的,自动驾驶的功能衍变就是随着自动驾驶

    2024年02月06日
    浏览(32)
  • 【Linux工具篇】项目自动构建化工具-make/Makefile

    个人主页:平行线也会相交 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创 收录于专栏【Linux专栏】🎈 本专栏旨在分享学习Linux的一点学习心得,欢迎大家在评论区讨论💌 make是一个命令,而Makefile是当前目录的一个文件 。 make/Makefile 是完成大型项目非常

    2024年02月16日
    浏览(21)
  • 【Apollo】阿波罗自动驾驶:塑造自动驾驶技术的未来

    前言    Apollo (阿波罗)是一个开放的、完整的、安全的平台,将帮助汽车行业及自动驾驶领域的合作伙伴结合车辆和硬件系统,快速搭建一套属于自己的自动驾驶系统。 开放能力、共享资源、加速创新、持续共赢是 Apollo 开放平台的口号。百度把自己所拥有的强大、成熟、

    2024年02月12日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包