bazel 安装和使用
文章目录
- 1. 安装
- 2. 使用
- 1. 例子a:单个target 编译
- 2. 例子b: 多个 target 的编译
- 3. 例子c: 多个 package 的编译
- 三. 参考
1. 安装
- bazel.build
seivl@seivl-Default-string:~$ bazel --version
bazel 4.0.0
2. 使用
使用Bazel编译项目
- Bazel提供了一些编译的例子:bazelbuild/examples 。
其中 examples/cpp-tutorial
目录下包含了这么些文件:
seivl@seivl-Default-string:~/examples/cpp-tutorial$ tree -L 3
.
├── README.md
├── stage1
│ ├── main
│ │ ├── BUILD
│ │ └── hello-world.cc
│ ├── README.md
│ └── WORKSPACE
├── stage2
│ ├── main
│ │ ├── BUILD
│ │ ├── hello-greet.cc
│ │ ├── hello-greet.h
│ │ └── hello-world.cc
│ ├── README.md
│ └── WORKSPACE
└── stage3├── lib│ ├── BUILD│ ├── hello-time.cc│ └── hello-time.h├── main│ ├── BUILD│ ├── hello-greet.cc│ ├── hello-greet.h│ └── hello-world.cc├── README.md└── WORKSPACE
以 stage1
来举例:
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage1$ tree -L 2
.
├── main
│ ├── BUILD
│ └── hello-world.cc
├── README.md
└── WORKSPACE
WORKSPACE
存放名为
WORKSPACE
的文件的目录,是整个工程的根目录。换言之,整个工程的根目录由WORKSPACE
来标识。整个工程的根目录也被叫做 workspaceWORKSPACE
文件为空即可
BUILD
在 workspace下,考虑每一个子目录:如果存放了名为 BUILD
的文件,那么这个目录就是一个 package,意思是一个包。
BUILD
文件内容:它的内容包括设定的编译 target,比如 cc_binary 表示一个可执行文件,cc_library 表示一个库;每个 target 里又包括 name 等字段:
- name 自己定义就好
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",],
)
1. 例子a:单个target 编译
先看一下 cpp-tutorial/stage1/main/BUILD
文件:
load("@rules_cc//cc:defs.bzl", "cc_binary")cc_binary(name = "hello-world",srcs = ["hello-world.cc"],
)
进入到 cpp-tutorial/stage1
目录下
在工程根目录,也就是包含 WORKSPACE 文件的那个目录,执行然后运行以下指令
执行 bazel 构建
sudo bazel build //main:hello-world
结果:
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage1$ sudo bazel build //main:hello-world
INFO: Analyzed target //main:hello-world (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:bazel-bin/main/hello-world
INFO: Elapsed time: 0.150s, Critical Path: 0.00s
INFO: 1 process: 1 internal.
INFO: Build completed successfully, 1 total action
看一下此时的目录,生成了一些文件:
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage1$ tree -L 1
.
├── bazel-bin
├── bazel-out
├── bazel-stage1
├── bazel-testlogs
├── main
├── README.md
└── WORKSPACE
表示让 bazel 去构建 main 这个 package 下的 hello-world 这一 target
随后,会在当前 workspace_下,生成 bazel-bin bazel-out bazel-stage1 bazel-testlogs 这几个文件
然后运行:
bazel-bin/main/hello-world
结果
world
Hello world
Mon May 10 21:46:23 2021
- 关系
2. 例子b: 多个 target 的编译
├── stage2├── main│ ├── BUILD│ ├── hello-greet.cc│ ├── hello-greet.h│ └── hello-world.cc├── README.md└── WORKSPACE
进入 stage2 看一下 BUILD 文件
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",],
)
bazel 首先编译了 hello-greet
这个库(利用Bazel内置的cc_library编译指令),然后编译 hello-world
这个二进制文件。hello-world
这个 target
的 deps
属性告诉 bazel,要构建 hello-world
这个二进制文件需要 hello-greet
这个库。
编译一下
sudo bazel build //main:hello-world
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage2$ sudo bazel build //main:hello-world
[sudo] seivl 的密码:
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (15 packages loaded, 55 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:bazel-bin/main/hello-world
INFO: Elapsed time: 5.027s, Critical Path: 0.64s
INFO: 7 processes: 4 internal, 3 processwrapper-sandbox.
INFO: Build completed successfully, 7 total actions
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage2$ tree -L 2.
├── bazel-bin
├── bazel-out
├── bazel-stage2
├── bazel-testlogs
├── main
│ ├── BUILD
│ ├── hello-greet.cc
│ ├── hello-greet.h
│ └── hello-world.cc
├── README.md
└── WORKSPACE
运行:
bazel-bin/main/hello-world
结果:
world
Hello world
Mon May 10 22:23:47 2021
- 关系
3. 例子c: 多个 package 的编译
└── stage3├── lib│ ├── BUILD│ ├── hello-time.cc│ └── hello-time.h├── main│ ├── BUILD│ ├── hello-greet.cc│ ├── hello-greet.h│ └── hello-world.cc├── README.md└── WORKSPACE
现在有两个子目录了,每个子目录中都包含了 BUILD
文件
因此,对于 bazel 来说,整个工作区现在就包含了两个 package:lib 和 main
- lib 的 BUILD
load("@rules_cc//cc:defs.bzl", "cc_library")cc_library(name = "hello-time",srcs = ["hello-time.cc"],hdrs = ["hello-time.h"],visibility = ["//main:__pkg__"],
)
- main 的 BUILD
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","//lib:hello-time",],
)
可以看出 hello-world 这个 main package 中的 target 依赖于 lib package 中的 hello-time target(即target label为://lib:hello-time
)
bazel 是通过 deps 这个属性知道自己的依赖项的。那么现在依赖图就变成了下图的样子:
ps:注意到
lib/BUILD
文件中 将hello-time
这个target
显式可见了(通过visibility
属性)。这是因为默认情况下,targets 只对同一个 BUILD文件里的其他 targets 可见
编译一下:
sudo bazel build //main:hello-world
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage3$ sudo bazel build //main:hello-world
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:hello-world (16 packages loaded, 58 targets configured).
INFO: Found 1 target...
Target //main:hello-world up-to-date:bazel-bin/main/hello-world
INFO: Elapsed time: 5.268s, Critical Path: 0.63s
INFO: 8 processes: 4 internal, 4 processwrapper-sandbox.
INFO: Build completed successfully, 8 total actions
运行结果:
seivl@seivl-Default-string:~/examples/cpp-tutorial/stage3$ bazel-bin/main/hello-world
Hello world
Mon May 10 22:33:54 2021
三. 参考
- tutorial
bazel 安装和使用相关推荐
- Windows 安装Bazel (安装过程中报远程服务器错,先记下来方法)
安装bazel,先安装 Chocolatey. 以管理员权限启动cmd 粘贴如下代码,安装chocolatey. @"%SystemRoot%\System32\WindowsPowerSh ...
- ubuntu 18.04.4 安装 bazel
文章目录 ubuntu 18.04.4 安装 bazel 使用二进制安装程序 1: 安装所需的软件包 2: 运行安装程序 3: 设置环境 ubuntu 18.04.4 安装 bazel 使用二进制安装 ...
- Ubuntu下bazel卸载与安装
bazel 卸载 1.卸载 sudo rm -rf /usr/bin/bazel sudo rm -rf ~/bin sudo rm -rf /usr/bin/bazel 2.注释~/.bashrc ...
- bazel 的安装与卸载
bazel 安装 安装依赖 sudo apt install g++ unzip zip 如果想要构建 java 代码,则需要安装一个 jdk: # Ubuntu 16.04 (LTS) uses O ...
- centos7安装bazel,亲测可行
1.先决条件:openjdk1.8 ,openjdk-devel1.8 我使用了最新的java11,因为需要javac程序,所以需要安装devel包: sudo yum install java-11 ...
- ubuntu18.04安装bazel
官方安装文档: https://docs.bazel.build/versions/4.0.0/install-ubuntu.html 我们使用官方推荐的第一种 第 1 步:添加 Bazel 分发 U ...
- deepin10.15安装cuda10.1.168 cudnn7.6.1 tensorflow_gpu1.4.0
deepin10.15安装cuda10.1.168 cudnn7.6.1 tensorflow_gpu1.4.0 最近入坑deepin操作系统,基于debian9,和Ubuntu具有一样的操作习惯,由 ...
- 解决Bazel:Error: LinkageError occurred while loading main class com.google.devtools.build.lib.bazel.
解决Bazel安装错误:Error: LinkageError occurred while loading main class com.google.devtools.build.lib.baze ...
- Bazel 与 gtest:构建一个最简单的测试驱动开发环境
Bazel 介绍 Google 自家的构建工具,相比 CMake 的优势,主要是多语言构建和相比 Make 语法有更好的可读性.最著名的使用 Bazel 的项目大概是 Tensorflow 吧.目前生 ...
最新文章
- 注册HttpSessionListener失效原因
- php mysql建表_mysql建表测试
- python中有很多包管理工具有哪些不是_C 语言中有没有类似 Python 中 pip 的包管理工具?...
- OpenCore引导配置说明第十五版-基于OpenCore-0.6.8-04-06正式版
- 基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测
- 《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
- Ubuntu触摸屏校准命令
- Eclipse Theia:Eclipse的继承者?
- 读书笔记--正面管教
- (纪中)008. Oliver的成绩(score)【高精度】
- nlohmann json用法
- 互联网安全初创企业Cylance获 1 亿美元融资
- Oracle 反向键索引的原理和用途(减少索引热点块)
- 电动车NFC一键启动(仪表总成、电源锁)_Ci522 Ci523_小体积超低成本13.56M非接触式读写器芯片
- SOA部署:反常道而行之
- IE6.0.2800.1106 和 IE6.0.2800.1106
- 网上,手机上.流行滴谜语!
- MUMPS在CentOS下的安装
- python 微信手气红包
- word同类标题另起一页