本文简单记录下 Bazel 使用过程中的一些知识点。
Bazel 是谷歌推出的一个开源的构建工具,工作原理与 make、maven 或 gradle 等其他构建工具类似。但是与其他工具不同的是,Bazel 支持多语言。
Bazel 也是增量编译,即只编译修改的文件,未修改的文件不会被重新编译。
helloworld/
|-- WORKSPACE
|-- main.cpp
| |-- hello
| | |-- BUILD
| | |-- hello.cpp
| |-- world
| | |-- BUILD
| | |-- world.cpp
workspace
,一个项目中 workspace
只能有一个。package
,package
可以有多个。参考:
- https://bazel.build/reference/be/c-cpp?hl=zh-cn
- https://www.zhihu.com/column/c_1422338948081770496
构建规则 | 描述 |
---|---|
cc_binary | 生成可执行文件 |
cc_library | 生成库文件 |
cc_test | 运行,相当于 cc_binary + cc_library |
cc_import | 导入预先编译的库(静态库、共享库) |
name | 目标名称 |
srcs | 用以构建 C++ 目标所需要的文件列表 (包括头文件、源文件、编译中间文件) |
deps | 需要链接到目标的库,通常是 cc_library 目标 |
visibility | 声明当前 target 的可见性,即谁可以使用这个 target ,没有此参数(默认情况)时 target 仅对同一个 BUILD 文件中的其他 target 可见。visibility = ["//visibility:public"] 表明该库对所有包可见 |
linkstatic | 是否将依赖库静态编译到目标中 |
copts | 添加编译参数 |
示例:
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")
cc_library(
name = "hello-greet",
srcs = ["hello-greet.cc"],
hdrs = ["hello-greet.h"],
)
cc_binary(
name = "hello-world",
srcs = ["hello-world.cc"],
deps = [
":hello-greet",
],
)
● 在目标中包含多个文件
cc_library(
name = "build-all-the-files",
srcs = glob(["*.cc"]),
hdrs = glob(["*.h"]),
)
● 添加对已有库的依赖关系
# 写法1
cc_library(
name = "mylib",
srcs = ["mylib.so"],
hdrs = ["mylib.h"],
)
# 写法2
cc_import(
name = "mylib",
hdrs = ["mylib.h"],
static_library = "libmylib.a",
shared_library = "libmylib.so",
)
cc_binary(
name = "first",
srcs = ["first.cc"],
deps = [":mylib"],
linkstatic = 1, # default value
)
cc_binary(
name = "second",
srcs = ["second.cc"],
deps = [":mylib"],
linkstatic = 0,
)
参考:https://bazel.build/reference/command-line-reference?hl=zh-cn
命令 | 描述 |
---|---|
bazel build | 编译 |
bazel test | 测试 |
build run | 运行,相当于 bazel build + bazel test |
示例:
bazel build //main:hello-world
//main
是相对路径,相对于当前工作区间的路径。如果是 @//main
,则表示相对于主工作区间 workspace
的路径。
hello-world
是目标 target 。
bazel query --notool_deps --noimplicit_deps "deps(//main:hello-world)" --output graph
上面的命令可以查看指定目标的依赖关系,可以将输出拷贝粘贴到 GraphViz 可视化展示。
可以通过 Homebrew 安装 Bazel :
brew install bazel
如果本机没有 homebrew ,可以通过如下命令安装(可能需要科学上网):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"