文章目录

  • 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 来标识。整个工程的根目录也被叫做 workspace

  • WORKSPACE 文件为空即可

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 这个 targetdeps 属性告诉 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 安装和使用相关推荐

  1. Windows 安装Bazel (安装过程中报远程服务器错,先记下来方法)

    安装bazel,先安装 Chocolatey. 以管理员权限启动cmd 粘贴如下代码,安装chocolatey. @"%SystemRoot%\System32\WindowsPowerSh ...

  2. ubuntu 18.04.4 安装 bazel

    文章目录 ubuntu 18.04.4 安装 bazel 使用二进制安装程序 1: 安装所需的软件包 2: 运行安装程序 3: 设置环境 ubuntu 18.04.4 安装 bazel 使用二进制安装 ...

  3. Ubuntu下bazel卸载与安装

    bazel 卸载 1.卸载 sudo rm -rf /usr/bin/bazel sudo rm -rf ~/bin sudo rm -rf /usr/bin/bazel 2.注释~/.bashrc ...

  4. bazel 的安装与卸载

    bazel 安装 安装依赖 sudo apt install g++ unzip zip 如果想要构建 java 代码,则需要安装一个 jdk: # Ubuntu 16.04 (LTS) uses O ...

  5. centos7安装bazel,亲测可行

    1.先决条件:openjdk1.8 ,openjdk-devel1.8 我使用了最新的java11,因为需要javac程序,所以需要安装devel包: sudo yum install java-11 ...

  6. ubuntu18.04安装bazel

    官方安装文档: https://docs.bazel.build/versions/4.0.0/install-ubuntu.html 我们使用官方推荐的第一种 第 1 步:添加 Bazel 分发 U ...

  7. 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具有一样的操作习惯,由 ...

  8. 解决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 ...

  9. Bazel 与 gtest:构建一个最简单的测试驱动开发环境

    Bazel 介绍 Google 自家的构建工具,相比 CMake 的优势,主要是多语言构建和相比 Make 语法有更好的可读性.最著名的使用 Bazel 的项目大概是 Tensorflow 吧.目前生 ...

最新文章

  1. 注册HttpSessionListener失效原因
  2. php mysql建表_mysql建表测试
  3. python中有很多包管理工具有哪些不是_C 语言中有没有类似 Python 中 pip 的包管理工具?...
  4. OpenCore引导配置说明第十五版-基于OpenCore-0.6.8-04-06正式版
  5. 基于BP神经网络模型在matlab上实现对中国每年出生人口数量的预测
  6. 《ANSYS Workbench有限元分析实例详解(静力学)》——2.5 Windows界面相应操作
  7. Ubuntu触摸屏校准命令
  8. Eclipse Theia:Eclipse的继承者?
  9. 读书笔记--正面管教
  10. (纪中)008. Oliver的成绩(score)【高精度】
  11. nlohmann json用法
  12. 互联网安全初创企业Cylance获 1 亿美元融资
  13. Oracle 反向键索引的原理和用途(减少索引热点块)
  14. 电动车NFC一键启动(仪表总成、电源锁)_Ci522 Ci523_小体积超低成本13.56M非接触式读写器芯片
  15. SOA部署:反常道而行之
  16. IE6.0.2800.1106 和 IE6.0.2800.1106
  17. 网上,手机上.流行滴谜语!
  18. MUMPS在CentOS下的安装
  19. python 微信手气红包
  20. word同类标题另起一页

热门文章

  1. DevStream 开源社区——相识、相知、相爱
  2. 预编码ZF,MMSE,THP准则线性预编码误码率仿真
  3. 每天一本书 | Head First Java 中文版 【第13本】
  4. 华纳云分享服务器带宽计算方法原理和其重要性
  5. 独具一格的办公神器,良心推荐!
  6. Ubuntu远程桌面连接
  7. 【Python】爬虫初体验,40行代码爬取双色球2003年至今的开奖号码
  8. 计算机毕业论文有必要建模吗,本科毕业论文真的有必要吗?
  9. git revert 怎么使用
  10. 如何设置excel表格表头冻结_excel表格怎样让表头固定不动,看完就明白了