【Bazel】Bazel 学习笔记
【Bazel】Bazel 学习笔记
本文简单记录下 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 构建规则
参考:
- /reference/be/c-cpp?hl=zh-cn
构建规则 | 描述 |
---|---|
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"],hdrs = ["hello-greet.h"],
)cc_binary(name = "hello-world",srcs = ["hello-world"],deps = [":hello-greet",],
)
常用构建规则
● 在目标中包含多个文件
cc_library(name = "build-all-the-files",srcs = glob(["*"]),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"],deps = [":mylib"],linkstatic = 1, # default value
)cc_binary(name = "second",srcs = ["second"],deps = [":mylib"],linkstatic = 0,
)
Bazel 命令
参考:/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 .sh)"
最新文章
- macOS文本编辑器 BBEdit 最新 for mac
- 浪潮服务器安装操作系统
- JAVA基础7:数组
- 修改kernel驱动配置文件
- 电子零部件工厂的WMS系统:业务特点、产品特点与优势
- IntelliJ IDEA 安装 GitHub Copilot插件 (最新)
- Python 如何实现迭代器设计模式?什么是迭代器(Iterator)设计模式?
- HTTP 常见的请求头
- MATLAB中train函数用法
- 模拟接口数据之使用Fetch方法实现
- Changes to Captions: An Attentive Network forRemote Sensing Change Captioning
- thinkphp6 只有默认页能访问 其他404 其他模块404
- AI大模型低成本快速定制秘诀:RAG和向量数据库
- 【算法】新的开始(Kruskal算法,虚拟源点)
- 关于redis的一些基础知识 1
- 东莞松山湖数据中心
- 人工智能与发电玻璃:未来能源技术的融合