Bazel是google开发的一个开源编译工具,类似与makefile的功能。Bazel支持多种语言的项目(比如C/C++ /Python),并为多种平台构建输出。Bazel支持跨多个存储库的大型代码库以及大量用户。
Bazel的安装
官方文档就是个很好的介绍https://docs.bazel.build/versions/1.2.0/install.html
比如在ubuntu上的安装过程如下截图 ( https://docs.bazel.build/versions/1.2.0/install-ubuntu.html )
Bazel github路径 https://github.com/bazelbuild/bazel/releases
Bazel的工作方式
- 加载BUILD与目标有关的文件。
- 分析输入及其 依赖项,应用指定的构建规则,并生成操作 图。
- 在输入上执行构建操作,直到产生最终的构建输出为止。
简单使用
Bazel 编译主要需要BUILD 和WORKSPACE两个文件。
bazel在编译时,主要依赖BUILD文件,下面为一个例子:
首先我们新建立一个文件夹 test (mkdir test)
然后创建一个空的文件,叫做WORKSPACE (vi WORKSPACE),bazel编译需要依靠此文件划出工作区域, bazel指令只能在含有workspace文件的目录下运行。复杂项目在workspace文件中,可能需要添加外部依赖(external dependence)比如gitlab去下载依赖包。
创建一个hello.cc
#include <ctime> #include <string> #include <iostream>
std::string get_greet(const std::string& who){ return "Hello " + who; }
int main(){ std::string who = "world"; std::cout<<get_greet(who) << std::endl; return 0; } |
创建一个BUILD文件(vi BUILD)
BUILD cc_binary( name="hello", srcs=["hello.cc"], ) |
编译此文件, bazel build hello,生成的可执行文件会位于bazel-bin文件夹下
然后执行 bazel-bin/hello, 就可以得到执行结果了。
Hello world
下面为第二个例子,讲解依赖关系:
同样的过程,改写hello.cc, 我们去掉get_greet 函数
#include <ctime> #include <string> #include <iostream> #include "greet.h"
int main(){ std::string who = "world"; std::cout<<get_greet(who) << std::endl; return 0; } |
创建greet.h和greet.cc
#include "greet.h" #include <string>
std::string get_greet(const std::string& who) { return "Hello " + who; }
#include <string> std::string get_greet(const std::string &thing); |
改写BUILD
cc_library( name = "greet", srcs = ["greet.cc"], hdrs = ["greet.h"], )
cc_binary( name = "hello", srcs = ["hello.cc"], deps = [":greet"], ) |
bazel运行结果不变。
bazel编译,主要就是完成BUILD文件的改写,test这个文件夹,叫做一个package,里面有两个target(greet,hello),复杂的project,会有多个文件夹,也就是package。pacakge之间,也是通过deps相连,同时还可以设置 visiblity = ["//xxx"],表示本package对谁可见。
注意事项
cc_library生成一个lib文件,cc_binary得到的是一个可执行文件。git_repository用于git目录文件的拉取。
执行bazel build的命令行中,可以增加一些编译选项。
-s 选项用于在bazel编译时 在终端显示具体的编译命令(一般命令都很长,显示会有点多)
--cxxopt='-O0' 选项用于选择 编译器优化等级
--cxxopt='-D xxx' 用于加 define选项
注意 如果要加多个 –cxxopt 选项,需要分开写,不能写成--cxxopt='-O0 -D xxx '
--cxxopt='-g' 选项并不能使得最后生成的可执行文件可用gdb调式。
bazel build ... --compilation_mode=dbg 加这个选项,最后生成的可执行文件才能使用 gdb进行调试。类似于 g++编译时,要加 -g的编译选项。参考http://www.voidcn.com/article/p-nuxuhqlm-bve.html
Bazel BUILD 文件中 好像不能 有 tab 制表符,需要用 空格来替代
Bazel 中 //工作空间的根标识符,也就是你的WORKSPACE文件的路径
https://docs.bazel.build/versions/master/tutorial/cpp.html
Bazel官方 https://docs.bazel.build/versions/1.2.0/tutorial/cpp.html