Blade——一个腾讯开源的C++工程构建利器

6,511 阅读2分钟

这是我参与8月更文挑战的第6天,活动详情查看:8月更文挑战

简介

Blade是一个方便易用高性能的现代化代码构建系统,特别适合公司内的大规模代码库的敏捷构建,内置了对多种编程语言及单元测试框架的直接支持。

GitHub - chen3feng/blade-build: Blade is a powerful build system from Tencent, supports many mainstream programming languages, such as C/C++, java, scala, python, protobuf...

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的其他特性进行进一步的总结与分享。