给公司建网站 深圳宁波男科医院哪家比较好
本文简单记录下 Bazel 使用过程中的一些知识点。
目录
文章目录
- 目录
 - Bazel 目录结构
 - BUILD 构建规则
 - 常用构建规则
 
- Bazel 命令
 - bazel build
 - bazel query
 
- Mac 安装 Bazel
 
Bazel 是谷歌推出的一个开源的构建工具,工作原理与 make、maven 或 gradle 等其他构建工具类似。但是与其他工具不同的是,Bazel 支持多语言。
Bazel 也是增量编译,即只编译修改的文件,未修改的文件不会被重新编译。
Bazel 目录结构
helloworld/|-- WORKSPACE|-- main.cpp| |-- hello| | |-- BUILD| | |-- hello.cpp| |-- world| | |-- BUILD| | |-- world.cpp
 
- 含有 WORKSPACE 文件的目录称为工作区 
workspace,一个项目中workspace只能有一个。 - 含有 BUILD文件的目录称为 
package,package可以有多个。 - BUILD 文件中的内容为构建规则。bazel 使用 package 下的 BUILD 这个文件指定的编译规则,来编译生成目标。
 
BUILD 构建规则
参考:
- 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,
)
 
Bazel 命令
参考:https://bazel.build/reference/command-line-reference?hl=zh-cn
| 命令 | 描述 | 
|---|---|
| bazel build | 编译 | 
| bazel test | 测试 | 
| build run | 运行,相当于 bazel build + bazel test | 
bazel build
示例:
bazel build //main:hello-world
 
//main 是相对路径,相对于当前工作区间的路径。如果是 @//main,则表示相对于主工作区间 workspace 的路径。
hello-world 是目标 target 。
bazel query
- 查看指定目标的依赖关系
 
bazel query --notool_deps --noimplicit_deps "deps(//main:hello-world)" --output graph
 
上面的命令可以查看指定目标的依赖关系,可以将输出拷贝粘贴到 GraphViz 可视化展示。
Mac 安装 Bazel
可以通过 Homebrew 安装 Bazel :
brew install bazel
 
如果本机没有 homebrew ,可以通过如下命令安装(可能需要科学上网):
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
