作者: Sam (甄峰) sam_code@hotmail.com
0. Bazel 简介:
Bazel是个构建工具,它是Google开发并开源的一套软件。 与Make,
Maven和Gradle等构建工具类似。
Make使用Makefile, Maven使用xml,
Gradle则使用Groovy来指出如何编译哪些源文件,资源文件到目标。
Bazel则使用人类可读的高级构建语言来构建任意规模的软件。
0.1:Bazel优点如下:
1. Bazel
使用抽象的,人类可读的语言来描述项目在高级语义级别的构建属性。比Makefile,xml可以构建更复杂的项目。(和Gradle如何,Sam还不敢说)
2. Bazel快速可靠。只重建必要的东西。
3. Bazel支持多平台。在Linux, Windows, MacOS上可以运行。
且在同一个项目中为多个平台构建二进制文件。
4. Bazel可扩展。未来可以支持更多的平台和语言。
5. Bazel支持C, Java,iOS, Go和各种其它语言平台。
0.2:Bazel 安装:
在Fedora下:
dnf copr enable vbatts/bazel
dnf install bazel
在Ubuntu下:
https://github.com/bazelbuild/bazel/releases
1. Bazel几个概念:
A. 工作区(WORKSPACE):
WORKSPACE是Bazel一个概念,它实质上是一个目录。这个目录是bazel工作时的一个基准目录。
Bazel规定,项目源文件和Bazel构建出的目标文件,均放在此目录。
要把一个目录设置为WORKSPACE, 则必须在此目录创建一个新的空文件,名为WORKSPACE.
Bazel构建项目时,所有的输入项和依赖项,必须位于同一个工作区内。
每个工作目录内,可以有多个项目(目录)。
bazel 编译或者执行其它命令时,是在WORKSPACE中。
B. BUILD文件:
BUILD文件的作用类似 Makefile之于Make, xml文件之于Maven,
.gradle文件之于Gradle.
BUILD文件中包含bazel的各种不同类型的指令,其中包含构建规则,它指出Bazel如何利用给定的输入,构建出指定的输出。如利用什么.cpp文件,构建出库或者可执行程序。
2. Bazel的使用:
编译:
bazel build
//src:target
显示编译:
bazel build -s
//src:target
bazel build -s //src:V4L2_Utils --verbose_failures
clean;
bazel clean
3. BUILD 规则:
BUILD文件和Makefile在Make中的地位相同。但它更复杂。
Sam以V4L2_Utils为例,说明其基本实用方法。也把它的复杂指出表现出来。以供下一步研究。
Sam创建一个V4L2_Utils目录。 这个目录中,包含src目录,其中包含v4l2_utils.cpp,
v4l2_utils.h . 在各个平台上,在各个构建模型下(Linux-Makefile,
Android-NDK),它会构成一个动态库---libV4L2_Utils.so.
还有一个main.cpp,它用来使用和验证这个动态库。
为了使用bazel, Sam构建了工作目录。在V4L2_Utils目录内,创建了WORKSPACE文件。
V4L2_Utils
-----------
src , WORKSPACE
src
---------
main.cpp V4L2_Utils.cpp,
V4L2_Utils.h BUILD
BUILD内容如下:
cc_library(
name =
"V4L2_Utils",
srcs =
["v4l2_util.cpp"],
hdrs =
["v4l2_util.h"],
)
cc_binary(
name =
"Test_V4L2",
srcs =
["main.cpp"],
deps = [
":V4L2_Utils",
],
)
看起来很简单,其实内部不少玄机。
比如:
cc_library,直观认为,这就是创建一个动态或者静态库。
cc_binary直观认为,这就是创建一个可执行程序。
可实际不是这样:
$bazel build //src:Test_V4L2
时, 我们认为既然它依赖于V4L2_Utils,那应该创建一个库,然后在编译可执行文件吧?
其实不是,它会把v4l2_utils.o 和main.o编译到一起,合并成一个可执行程序。
但如果:
$bazel build //src:V4L2_Utils
那就会生成静态库和动态库各一个。