"BLADE是一个统一的构建系统,旨在解决传统Makefile维护困难、编译速度慢等问题,提供简洁的接口,支持C++项目,并具备模块依赖性分析、依赖自动传递、构建缓存等功能。该系统旨在解放程序员,通过工具优化非创造性的技术工作,提高开发效率。"
BLADE构建系统由搜索广告平台部的俞欢和基础架构部的陈峰、彭崇在2011年4月推出,主要针对当时Makefile维护复杂、依赖关系难以管理以及编译速度慢等挑战。BLADE的目标是创建一个统一的代码构建环境,加快构建速度,同时保持易用性和可扩展性,以支持如远程和并行编译等构建模式。
BLADE的关键特性包括:
1. **模块依赖性分析**:它能够自动分析构建目标的依赖关系,仅执行必要的构建步骤。
2. **依赖自动传递**:开发者只需声明直接依赖,BLADE会自动处理间接依赖。
3. **构建缓存**:BLADE缓存整个构建过程,允许跨用户共享,显著提高重复构建的速度。
4. **终端输出增强**:在终端显示构建过程时,使用彩色高亮,使输出更易读。
5. **错误处理**:当发生错误时,关键行会被高亮,方便快速定位问题。
6. **批量测试运行**:支持方便地批量运行测试,提高测试效率。
在性能方面,BLADE的表现优于传统的Makefile。以一个包含700多个源文件、27万行代码的common库为例,BLADE的构建速度远超Makefile,尤其是在开启缓存后,重构建时间缩短到仅8秒。
BLADE的使用环境需要遵循统一的代码布局约定。核心配置文件是名为`BUILD`的文件,位于代码树的根目录,且每个代码树只能有一个`BLADE_ROOT`文件。`BUILD`文件描述当前目录下的目标(targets)及其依赖关系,每个target可以依赖本目录或其他目录的targets,依赖关系会自动传递。`BUILD`文件内容自解释,不涉及如`import`等嵌套概念。
BLADE目前支持以下类型的targets:
1. **cc_library**:用于创建C++静态或动态库。
2. **cc_binary**:用于构建C++可执行程序。
3. **cc_test**:构建C++测试用例,通常与自动化测试框架配合使用。
4. **proto_library**:处理protobuf协议缓冲区编译。
5. **lex_yacc_library**:处理词法分析器和语法分析器生成的库。
6. **java_jar**:构建Java JAR文件。
7. **resource_library**:处理资源文件,如图片、文本等。
BLADE作为一个高效、灵活的构建系统,为C++项目提供了强大的支持,简化了构建流程,提升了开发效率。