官方文档:bazel官方文档
bazel简介
bazel是Google开源的一套编译构建工具,广泛应用于Google内部。
主要优点:
1 构建快。支持增量编译。对依赖关系进行了优化,从而支持并发执行。
2 可构建多种语言。bazel可用来构建Java C++ Android ios等很多语言和框架,并支持mac windows linux等不同平台
3 可伸缩。可处理任意大小的代码库,可处理多个库,也可以处理单个库
4 可扩展。使用bazel扩展语言可支持新语言和新平台。
整体结构
1.workspace
workspace是表示整个项目的,也叫repo,必须在项目的根目录下建一个WORKSPACE文件来定义项目的根目录,bazel会忽略所有项目子目录下的WORKSPACE文件。主要用来声明项目所依赖的库。
2.package
package是项目中的模块,也就是一个一个包,包在组织上比较随意,可以根据项目需求来定,你想哪个文件夹中的东西成为一个包,就在那个文件夹的目录里创建一个BUILD文件即可,包的管理范围包括子目录里的东西,但不包括子包所包括的内容。如下:
.../project/
WORKSPACE
lib/
BUILD
...
src/
BUILD
...
other1/
BUILD
other2/
...
则lib, src以及other1都是packages,但other1目录里的东西不属于src包,但other2里的东西都属于src包。包和包之间的内容不重叠,不包含。
3.build
BUILD文件用于告知Bazel如何编译,要输出什么样的二进制文件或库;BUILD文件中的每一条编译指令被称为一个target,它指向一系列的源文件和依赖,一个target也可以指向别的target。
//stage1
cc_binary(
name = "hello-world", //target
srcs = ["hello-world.cc"], //源文件是ello-world.cc
)
//stage2
cc_binary(
name = "hello-greet", //第一个target
srcs = ["hello-greet.cc"], //源文件
hdrs = ["hello-greet.h"], //头文件
)
cc_binary(
name = "hello-world", //第二个target,一个BUILD文件可以有多个target
srcs = ["hello-world.cc"], //源文件
deps = [":hello-greet"], //依赖于hello-greet,也就是说要先生成hello-greet再生成hello-world
)
//stage3:包含两个package:main和lib
//1.main下的BUILD
cc_binary(
name = "hello-time",
srcs = ["hello-time.cc"],
hdrs = ["hello-time.h"],
visibility = ["//main:__pkg__"], //默认情况下,targets只对同一个BUILD文件里的其他tagets可见,现在设置为所有target可见
)
//2.lib下的BUILD
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = "hello-world.cc",
deps = [":hello-greet", //依赖于本文件夹下的target:hello-greet
"//lib:hello-time" //依赖于lib文件夹下的target:hello-time
],
)
其中,binary代表bin文件的构建结构,library代表库的构建结构,具体字段可以查阅官方文档。
note
1.bazel在构建一些大型项目时,总会需要依赖于外部的库,如git repository和http等,需要在workspace中声明好依赖关系,在构建过程中会先从给出的路径中预下载至本地保存。注意!当依赖的外部库发生变化时bazel无法及时更新内容,需要先进行bazel clean --expunge.