最近在学Baidu Apollo需要用到Bazel进行编译,在此记录下Bazel的学过程,以及遇到的一些问题和心得。另外强烈推荐B站赵虚左老师的Cyber RT课程,里面对Bazel的使用有详细的教学。
下面的使用过程都是在Ubuntu 22.04上进行的,首先需要安装Bazek
sudo apt-get install bazel
另外最好在vs code中安装下bazel插件
首先介绍下Bazel
azel 是一个类似于 Make 的工具,是 Google 为其内部软件开发的特点量身定制的工具,如今 Google 使用它来构建内部大多数的软件。它的功能有诸多亮点:
多语言支持:目前 Bazel 默认支持 Java、Objective-C 和 C++,但可以被扩展到其他任何变成语言。
高级构建描述语言:项目是使用一种叫 BUILD 的语言来描述的,它是一种简洁的文本语言,它把一个项目视为一个集合,这个集合由一些互相关联的库、二进制文件和测试用例组成。相反,像 Make 这样的工具,需要去描述每个文件如何调用编译器。
多平台支持:同一套工具和相同的 BUILD 文件可以用来为不同的体系结构构建软件,甚至是不同的平台。在 Google,Bazel 被同时用在数据中心系统中的服务器应用和手机端的移动应用上。
可重复性:在 BUILD 文件中,每个库、测试用例和二进制文件都需要明确指定它们的依赖关系。当一个源码文件被修改时,Bazel 凭这些依赖来判断哪些部分需要重新构建,以及哪些任务可以并行进行。这意味着所有构建都是增量的,并且相同构建总是产生一样的结果。
可伸缩性:Bazel 可以处理大型项目;在 Google,一个服务器软件有十万行代码是很常见的,在什么都不改的前提下重新构建这样一个项目,大概只需要 200 毫秒。
对于为什么要重新发明一个构建工具而不直接使用 Make,Google 认为 Make 控制得太细,最终的结果完全依靠开发人员能正确编写规则。很久以前,Google 使用自动生成的臃肿的 Makefile 来构建他们的软件,速度太慢,结果不可靠,最终影响了研发人员的效率和公司的敏捷性。所以他们做了 Bazel。Bazel 的规则层次更高,比如,对于“Java 测试”、“C++ 二进制文件”,它都有定义好的内建规则,而这些规则都已经被无数的测试证明是正确和稳定的。
基于Bazel实现C++/Python编译
1. 新建工作目录
mkdir Proj
2.新建项目目录
注意此时需要建立:WORKSPACE文件,里面不用写任何内容
cd Proj
mkdir Pro1_main
touch WORKSPACE
编写源文件
#include <iostream>
int main()
{
std::cout<<"Hello Bazel!"<<std::endl;
return 0;
}
编写BUILD文件
此为C++编译命令
cc_binary(
name = "Hello",
srcs = ["main.cc"],
)
如果是python的话
py_binary(
name = "Hello",
srcs = ["main.py"],
)
最后文件目录如下:
3.编译源文件
切换到Proj目录下,如果不切换的话编译的文件目录会生成在主目录下,执行编译命令
bazel build Pro1_main/demo_CC/...
没有问题的话会如下:
目录更新为:
4.执行源文件
./bazel-bin/Pro1_main/demo_CC/Hello