这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战
简介
Blade是一个方便易用高性能的现代化代码构建系统,特别适合公司内的大规模代码库的敏捷构建,内置了对多种编程语言及单元测试框架的直接支持。
Blade是腾讯公司陈老师开发的一款构建系统,主要的目标是对linux下的大型c++项目进行声明周期管理与构建,在腾讯内部广泛应用于腾讯广告系统、微信后台服务、腾讯游戏后台服务、腾讯基础架构。
通过每个“库”级别的BUILD文件定义的构建目标“target”,Blade将整个代码库构建为一个个library,通过“target”的名称相互依赖,当构建目标所依赖的库有更新时,会自动进行重新编译,而没有更新的部分则会直接使用上次的编译结果进行链接,这样自动管理依赖更新,大大加速了编译速度。
上面干巴巴的说总是说不清楚的,我们直接看看Blade是如何构建一个简单的c++工程的。
快速上手
在github的文档中详细介绍了Blade安装的过程,可以按照上述过程将Blade安装到自己的开发环境中,这里不再赘述。安装完成后终端运行blade —verison命令,如果正常显示了版本,则安装成功。
示例
单文件
首先我们创建一个hello world的c++源码
#include <iostream>
using namespace std;
int main() {
cout << "Hello world!" << endl;
return 0;
}
为了让Balde识别工程,我们需要创建一个空白的文件"BLADE_ROOT"。Blade在编译时会从当前的文件夹向上查找最近的BLADE_ROOT文件所在的位置,并将其当作工程的root。
然后我们来看看BUILD中的构建目标如何编写,BUILD中基本采用的python的语法,我们要编译一个c++的可执行目标,因此需要编写cc_binary规则:
cc_binary(
name = 'hello',
srcs = [
'hello.cc',
],
deps = []
)
在srcs中写入cc或cpp文件名,deps中列出依赖的target。
然后在终端运行blade build .后,即可对hello进行编译、链接,生成的二进制文件在build64_release文件夹下,打开运行即可看到我们熟悉的hello world
$ build build .
$ cd build64_release
$ ./hello
Target定位规则
在某个目标要依赖另一个目标时,需要准确的定位出依赖的路径,基本的定位规则如下:
//path/to/dep:target_name
“//”表示相对于项目root的路径;冒号之后是target的名称;如果当前的目标和依赖是在同一个路径下时,就不需要前面的路径,直接使用冒号+target即可。
:target_name
多目标
当我们构建一个静态库目标时,可以使用cc_library构建规则,构建后输出一个静态库。下面我们创建一个c++文件。
#include "say.h"
#include <iostream>
void say() {
std::cout << "Hello world!" << std::endl;
}
在头文件中声明一下say函数
#ifndef SAY_H_
#define SAY_H_
void say();
#endif
编写BUILD文件
cc_library(
name = 'say',
srcs = 'say.cc',
hdrs = ['say.h'],
visibility = ['PUBLIC'],
)
由于外部需要include这个头文件,所以在target中的hdrs中要列出该库对外开放的头文件,visibility则是限定了该库的使用范围,PUBLIC则表示所有的构建目标都可以依赖该库。
在hello.cc中使用了say库中的函数,因此构建目标的依赖需要加上say库
#include <iostream>
#include "say.h"
using namespace std;
int main() {
say();
return 0;
}
BUILD
cc_binary(
name = 'hello',
srcs = [
'hello.cc',
],
deps = [':say']
)
此时运行blade build .对当前文件夹下的构建目标进行构建,就可以看到blade首先将say静态链接库编译出来,然后再编译链接了main函数所在的hello构建目标,生成了hello可执行文件。
测试
Blade对测试驱动开发提供了完善的支持 ,可以通过命令自动运行测试程序。
使用构建目标cc_test即可构建一个基于gtest的测试目标,当运行blade test .时,即可对当前目录下的测试目标进行测试。
cc_test(
name = 'zookeeper_test',
srcs = 'zookeeper_test.cc',
)
小结
blade为c++提供了一个极为方便的构建工具,本文只是简单的介绍了一下blade用于构建c++工程的方法和对测试的支持,接下来我会对blade的其他特性进行进一步的总结与分享。