xiedeacc
发布于 2023-12-24 / 21 阅读
0
0

bazel那些事——安装、概览、常用命令

一、编译和安装

推荐使用第一种方式获得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的文档都看一遍


评论