《使用bazel构建支持多语言的编译系统》

一. 背景

之前的一篇博客介绍了使用腾讯开源编译工具blade构建系统的内容 [使用BLADE构建c++工程管理], 最后提到了balde其实源于google的Bazel。最近google开源的深度学习的框架Tensorflow也是使用该工具构建。本文会给出示例,展示如何使用bazel来维护较为复杂的系统的编译

二. 安装

bazel只支持linux和mac os系统。并且需要JDK 8。下载installer,执行如下命令即可

$ chmod +x install-version-os.sh
$ ./install-version-os.sh --user

bazel工具的原理
bazel跟docker类似也采用了CS的架构,bazel命令作为客户端启动编译的时候会启动一个java的服务进程用来做真正的编译任务。

《使用bazel构建支持多语言的编译系统》_第1张图片
bazel server

这样做的好处是更好的全局调度和复用中间结果(BUILD,DAG依赖分析)。

三. 示例

bazel和blade使用方式十分类似,只是在功能上更加的完整,支持更多的语言

  1. 一个有简单依赖的java后端服务WORKSPACE
《使用bazel构建支持多语言的编译系统》_第2张图片
目录结构

说明
在工程的根目录需要一个文件WORKSPACE,里面可以是空,也可以配置整个工程的配置和对外的依赖。注意子目录中,每个package需要有一个BUILD

《使用bazel构建支持多语言的编译系统》_第3张图片
BUILD内容

说明
java_library定义了一个java的库,会产出一个jar文件供其他模块调用, *_library会默认使用对应的build rule
name:产出的目标库的名称
srcs: 功能代码
visibility:这个选项控制了这个库的使用权限验证,这里规定了只有这个目录/src/main/java/com/example/cmdline下面的代码才能访问本lib

  1. tensorflow中的一个工程
《使用bazel构建支持多语言的编译系统》_第4张图片
tensorflow目录结构
《使用bazel构建支持多语言的编译系统》_第5张图片
WORKSPACE内容

说明
new_http_archive等以new_*开头的表示依赖外部不适用bazel来管理的工程。对应的http_archive表示以bazel的工程。
bind表示依赖的别名
如果不是用bind,那么本工程要想依赖external的格式是: @coworkers-project//:some-lib
使用这个命令可以拉取全部的external依赖

bazel fetch //...

《使用bazel构建支持多语言的编译系统》_第6张图片
根目录的BUILD文件内容

说明
package:定义了包对于整个子目录都可见
sh_binary:将可执行的sh文件集合打包
py_library:打包可执行的python文件集合
filegroup:打包其他的资源性文件

四. 支持更多的语言

《使用bazel构建支持多语言的编译系统》_第7张图片
bazel支持的语言

说明
这里面包括了流行的服务器端语言c++,java,go,py等等。也包含了对android和ios工程的支持,十分全面。

你可能感兴趣的:(《使用bazel构建支持多语言的编译系统》)