在Linux环境中安装部署好Bazel工具之后,就可以开始使用它来编译构建项目了,这类结合前面介绍的基本概念,我们来看一下一个基本的Bazel构建的项目大概实际构成如何。注意这里是单个package实例项目。
└──TestBazelPg
├── TimePrintfTest
│ ├── BUILD
│ ├── TestPrintfTime.cpp
├── ....待生成编译构建文件
└── WORKSPACE
这是一个有单个Package,单个源码文件的项目实例,当然在这个Package中根据项目需要可以有多个源码文件。
由于这是要定义的一个可执行文件的Target,那么必须得有一个main入口源文件参与编译可执行的c++程序。
项目文件构成如下:
1.空的WORKSPACE文件,后面使用到的情况再说明该文件用处,此处空着即可,必须要创建。
2.项目模块实例目录TimePrintfTest
1)源代码文件 TestPrintfTime.cpp
//简单的打印输出时间:
#include <ctime>
#include <string>
#include <iostream>
std::string get_greet(const std::string& who) {
return "Hello " + who;
}
void print_localtime() {
std::time_t result = std::time(nullptr);
std::cout << std::asctime(std::localtime(&result));
}
int main(int argc, char** argv) {
std::string who = "world";
if (argc > 1) {
who = argv[1];
}
std::cout << get_greet(who) << std::endl;
print_localtime();
return 0;
}
2)编译构建文件BUILD
cc_binary(
name = "TestPrintfTime",
srcs = ["TestPrintfTime.cpp"]
)
3)启动编译构建命令
bazel第一个使用的编译构建命令:bazel build (可以直接编译指定到各个target模块)
作为一个单实例单文件项目,进入项目工作空间TestBazelPg,编译构建命令运行如下:bazel build //TimePrintfTest:TestPrintfTime
根据查找的Target编译成功构建可执行程序,bazel会自己生成一套编译构建的目录来存放编译构建的结果文件。
4)查看编译构建生成的相关文件
bazel会在TestBazelPg的工作空间生成一套编译构建的目录和文件,“bazel-”起头的列表如下:
这些目录和文件可以看到都是来自一套指定的链接目录,这些在bazel server端生成的目录其实是采用的一套缓存机制来存放,确保编译构建的速度,尤其是大型工程,依赖多个Package实例的情况,已经编译构建的结果会缓存在bazel的Server端。
具体这些目录和文件的作用和用途,后面深入理解使用Bazel再去关注,当前先关注下输出的结果目录bazel-bin。
5)与Make体系的直观比较
写过c++的程序员都清楚,编写makefile,构建make工程一直是必备。当然make在众多的编译构建规则中也可以建立一套完整模板体系,让使用者每次不用关心太多的编译器提供的编译命令。
这些工作在Bazel工具中都已经封装完成,另外Bazel的编译构建规则通过BUILD文件来存放和运行。该文件中可以看出,一个个构建规则通过类似Python的函数方式封装好让我们使用者填写参数即可。
cc_binary( //表明构建一个可执行的c++程序的函数
name = "TestPrintfTime", //程序名
srcs = ["TestPrintfTime.cpp"] //程序main主程序源码文件
)
6)检验下编译构建的结果
既然是一个可执行程序,那么就去直接查找其生成的可执行文件测试运行下。
进入到bazel-bin目录,可以看到bazel为每个target生成了一个单独的目录,使用target名来命名。
再次进入该target中,会看到生成了相应的二进制可执行的c++程序“TestPrintfTime”,运行检验下:
3.来理解下bazel为每个项目编译构建额外生成的目录和文件的含义,加深下理解(这里需要注意下,Bazel生成配置目录是有用户态和Bazel的服务态区分的,因为Bazel的服务端使用了cache缓存)
这里只先介绍下用户态的构建生成目录,除非需要深入剖析Bazel本身,除此之外理解下用户态已经足够使用了,当然理解Bazel本身有助于更好的使用它。
└──TestBazelPg
├── TimePrintfTest
│ ├── BUILD
│ ├── TestPrintfTime.cpp
├── bazel-bin
├── bazel-genfiles
├── bazel-out
├── bazel-TestBazelPg
├── bazel-testlogs
└── WORKSPACE
用户态构建生成的一级目录主要为三个:
1)上述工程构建生成目录bazel-TestBazelPg为标准配置中的:
该目录链接了bazel为每个工作空间项目创建唯一构建目录下的项目实例根目录。
也就是该目录内部包含了其他所有为该项目实例构建的输出文件和目录,这里在实际目录中和内部的目录并齐展示只是为了突出访问的便利性(反正都是链接)
2)上述工程构建生成目录bazel-out为标准配置中的:
bazel-out是该项目工程目录下一个总的构建文件输出目录,该目录包括了bin和genfiles目录。
3)上述工程构建生成目录bazel-bin为标准配置中的:
bazel-bin为输出构建文件目录中存放可执行程序文件和lib文件地方。
4)上述工程构建生成目录bazel-genfiles为标准配置中的:
存放一些脚本输出生成的文件