Bazel

Bazel

简介

Bazel是Google开源的自动化构建工具,

特点

  • 构建快。支持增量编译。对依赖关系进行了优化,从而支持并发执行。

  • 可构建多种语言。bazel可用来构建Java C++ Android ios等很多语言和框架,并支持mac windows linux等不同平台

  • 可伸缩。可处理任意大小的代码库,可处理多个库,也可以处理单个库

  • 可扩展。使用bazel扩展语言可支持新语言和新平台。

项目结构

bazel顶层,也就是根目录下为工作区workspace,workspace下包含多个package,每个package又包含多个编译目标target。

  • workspace

    要进行构建的文件系统,根目录下必须包含一个文件名为WORKSPACE的文件,即使它内容为空。它指明了构建的根目录。文件系统中包括源文件,头文件,输出目录的符号链接等。WORKSPACE采用类似Python的语法

  • package

    一个WORKSPACE工作区下可以包括多个包package,每个package可以实现一个子模块,从而让各个模块进行解耦。每个package下必须包含一个BUILD文件,它指定了package的编译构建规则。

    BUILD文件也是采用的类似Python的语法,它定义了编译规则,lib依赖等各项规则。其中有些命令专属于BUILD文件,有些则是bazel语法通用的,如WORKSPACE文件中也可以使用。主要方法调用如下

    • tf_cc_binary:目标文件编译规则,为一个二进制可执行文件。name必须唯一,srcs指定了源文件,linkopts指定了链接规则,deps指定了依赖文件

    • cc_library:库文件编译规则,name指定了编译为库文件后的文件名,srcs和hdrs指定源文件和头文件,deps指定需要依赖的其他文件

    • tf_cc_test:测试文件规则

    • package:通用方法,定义的值会作用到下面的每个子rule中。default_visibility指定了这个包的默认可见规则。可见的情况下才能被其他package调用。

    • licenses:通用方法,默认的license

    • load:通用方法,加载.bzl文件

    • filegroup:通用方法,为多个编译目标target指定一个名字,glob是一个帮助函数,指定了目录中哪些文件会include,哪些会exclude。visibility指定了target的可见性,也就是可以被哪些package调用

  • label

    包的名称叫做标签,用来标识一个包package。标签由两部分组成,一部分为包名my/app/main, 一部分为包构建的目标名app_binary。每个标签用来唯一标示包构建的目标,从而在被其他包使用时可以标识出来。同一个包下,标签可以省略包名部分,如:app_binary表示同一个包下的目标。不同包之间,则千万不能省略包名。

  • target

    包package是一个容器,组成它的元素称为目标,分为文件和规则。文件分为两种,一种为程序员写的源代码,一种为构建工具生成的文件。规则定义了如何利用输入来构建得到输出,如上面的BUILD。输入一般是源文件,库文件等,输出则一般是生成的构建目标文件。

命令

1
$ bazel build //...
updatedupdated2024-05-102024-05-10