一、编译和安装
推荐使用第一种方式获得bazel二进制
1.1 从源码从头构建
先安装Java环境,可以参考
ubuntu22.04安装Java
sudo apt install gcc zip unzip python3-dev python3
wget https://github.com/bazelbuild/bazel/releases/download/6.2.1/bazel-6.2.1-dist.zip
unzip bazel-6.2.1-dist.zip -d bazel-6.2.1
cd bazel-6.2.1
env EXTRA_BAZEL_ARGS="--tool_java_runtime_version=local_jdk" bash ./compile.sh
sudo cp output/bazel /usr/local/bin
1.2 从源码使用bazel构建
git clone https://github.com/bazelbuild/bazel.git
bazel build //src:bazel-dev
# or
bazel build //src:bazel --compilation_mode=opt
1.3 从github下预编译二进制
wget https://github.com/bazelbuild/bazel/releases/download/6.2.1/bazel-6.2.1-linux-x86_64
二、bazel初体验
git clone https://github.com/xiedeacc/bazel_template.git
cd bazel_template
bazel-6.2.1 build //...
可以看到通过分析阶段后,bazel将在项目创建bazel-bazel_template(项目名字)、bazel-bin、bazel-out、bazel-testlogs四个链接。
bazel-bazel_template -> /root/.cache/bazel/_bazel_root/3cc3667db65d3962fd47349fc07381e2/execroot/bazel_template
bazel-bin -> /root/.cache/bazel/_bazel_root/3cc3667db65d3962fd47349fc07381e2/execroot/bazel_template/bazel-out/k8-opt/bin
bazel-out -> /root/.cache/bazel/_bazel_root/3cc3667db65d3962fd47349fc07381e2/execroot/bazel_template/bazel-out
bazel-testlogs -> /root/.cache/bazel/_bazel_root/3cc3667db65d3962fd47349fc07381e2/execroot/bazel_template/bazel-out/k8-opt/testlogs
其中3cc3667db65d3962fd47349fc07381e2是根据项目路径算出的hash值,所以假如想把A机器的编译缓存拷贝到另一台机器B上,则只需要项目路径保持一致,bazel版本保持一致,B就可以直接用编译缓存。
- bazel-bazel_template: 构建根目录,此目录下的external文件夹包含各个依赖项目的源文件,每个项目名字和workspace或者MODULE.bazel中项目名字保持一致
- bazel-bin: 构建完成后生成的二进制文件等
- bazel-out: 构建中间过程产生的文件,比如genrule生成的文件会产生于此目录。需要注意假如某个源文件依赖于构建中间过程产生的文件的话,需要注意引入的路径,假如路径引入不正确,可能找不到对应的文件
- bazel-testlogs: 单测产生的日志
三、bazel对C++开发体验的提升
- 不再需要安装各种库,直接源码依赖,减少了运维工作量,以及不同版本操作系统和链接带来的各种问题。
- 源码通过链接放在项目目录中,可以方便查看依赖项目源码
- 通过配置cpplint,可以在单测中集成代码风格检查
- 通过配置.bazelrc,可以在单测中集成内存泄漏检查
四、bazel常用命令行
bazel build //... #构建所有target
bazel build //:all #构建所有target, :all等同于某个包及其子包的所有target
bazel build //src/server:all #构建server这个包下面所有target
bazel test //... #执行所有单测
bazel run //src/server/debug #运行src/server/debug这个二进制target
bazel clean #清理编译缓存,注意不会清理依赖项目的编译缓存
bazel clean --expunge #清理所有编译缓存,包括依赖项目的
日常99.99%的时间,只会用到这些命令后,所以从上手bazel的角度来讲,完全没必要把bazel的文档都看一遍