Quantcast
Channel: Sam的技术Blog
Viewing all articles
Browse latest Browse all 158

Bazel详解初探

$
0
0
作者: 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
那就会生成静态库和动态库各一个。





 

Viewing all articles
Browse latest Browse all 158

Trending Articles