Blade - 腾讯开源的构建系统 c/c++编译环境
jopen
9年前
Blade 是一个现代构建系统,期望的目标是强大而好用,把程序员从构建的繁琐中解放出来。
Blade 主要定位于linux下的大型C++项目,密切配合研发流程,比如单元测试,持续集成,覆盖率统计等。但像unix下的文本过滤程序一样,保持相对的独立性,可以单独运行。目前重点支持i386/x86_64 Linux,未来可以考虑支持其他的类unix系统。
在腾讯公司“台风”云计算平台开发过程中,为了解决 GNU Make,Autotools 的难用和繁琐的问题,我们开发了这个全新的构建系统,整个系统基于多个声明式的构建脚本,在构建脚本里,只需要声明要构建什么目标,目标的源代码,以及其直接依赖的其他目标,不需要说明如何构建。大大降低了使用难度,提高了开发效率。
首先,Blade解决了依赖问题。 当你在构建某些目标时,头文件有变化,会自动重新构建。 最方便的是,Blade也能追踪库文件的依赖关系。比如 库 foo 依赖库 common,那么在库 foo 的 BUILD 文件中列入依赖:
- cc_library(
- name = 'foo',
- srcs = ...
- deps = ':common'
- )
- cc_binary(
- name = 'my_app',
- srcs = ...
- deps = ':foo'
- )
说道易用性,除了依赖关系的自动维护,Blade还可以做到,只要一行命令,就能把整个目录树的编译连接单元测试就可以全部搞定。例如:
递归构建和测试common目录下所有的目标
- $ blade test common...
- $ blade test -m32 common...
- $ blade test -pdebug common...
- $ blade test -m32 -pdebug common...
自动分析头文件依赖关系,构建受影响的代码。
增量编译和链接,只构建因变更受影响而需要构建的。
自动计算库的间接依赖,库的作者只需要写出直接依赖,构建时自动检查所依赖的库是否需要重新构建。
在任意代码树的任意子目录下都能构建。
支持一次递归构建多个目录下的所有目标,也支持只构建任意的特定的目标。
无论构建什么目标,这些目标所依赖的目标也会被自动连坐更新。
内置 debug/release 两种构建类型。
彩色高亮构建过程中的错误信息。
支持 ccache
支持 distcc
支持基于构建多平台目标
支持构建时选择编译器(不同版本的gcc,clang等)
支持编译 protobuf,lex, yacc, swig
支持自定义规则
支持测试,在命令行跑多个测试
支持并行测试(多个测试进程并发运行)
支持增量测试(无需重新运行的测试程序自动跳过)
集成 gperftools,自动检测测试程序的内存泄露
构建脚本 vim 语法高亮
svn 式的子命令命令行接口。
支持 bash 命令行补全
用 Python 编写,无需编译,直接安装使用。
彻底避免以下问题:
头文件更新,受影响的模块没有重新构建。
被依赖的库需要更新,而构建时没有被更新,比如某子目录依赖遥远的某外部目录的代码,我在这个目录构建,外部目录的代码会被自动检查是否也需要重新构建。
致谢
Blade 是受 Google 官方博客发表的这篇文章的思想的启发而开发的: 云构建:构建系统是如何工作的
现阶段 Blade 生成 SCons 脚本进行构建,因此 Blade 的运行还需要依赖 SCons。
Python 是一种简单易用而又强大的语言,我们喜欢 Python。
Google 开放的一些库强大而好用,我们很喜欢,我们把对这些库的支持集成进了Blade中,既方便了库的使用,又增强了 Blade,这些库包括 protobuf,gtest, gproftools。
更多文档请参考 Wiki。
欢迎使用以及帮助我们改进Blade,我们期待你的贡献。
GAE 地址:http://code.google.com/p/typhoon-blade/
GitHub 地址:https://github.com/chen3feng/typhoon-blade