Blade是腾讯开发的一个开源构建工具,旨在简化大型项目的构建,能够自动分析依赖,集成了编译、链接、测试、静态代码检查等功能,支持C/C++, Java, Python, Scala, protobuf等多种语言。
Blade构建是增量,只有需要更新时才会去构建相应的目标及其依赖。并且支持 ccache,可以大幅度加快重新构建速度。Blade 能检查到安装了 ccache 并自动启用,通常无需配置。
Blade的安装非常简单,只需要一行命令,此外还需要安装ninja作为其后端:
curl <https://blade-build.github.io/install.sh> | bash
Blade 就会被下载到 ~/.cache/blade-build 目录下。它还会创建一个 ~/bin/blade 符号连接,这样就可以直接使用 blade 命令。
参考文档:https://zzy979.github.io/posts/blade-build-tool/
Blade要求项目有一个显式的根目录(称为工作空间),即BLADE_ROOT文件所在目录。根目录下是自己的模块子目录和第三方库目录,每个子目录下都有一个BUILD文件来声明该模块所包含的构建目标。
Blade获取当前工作空间的方法是,无论当前从哪一级子目录运行,都从当前目录开始向上查找BLADE_ROOT文件,有这个文件的目录即为工作空间。
以下一个项目目录结构示例:
my-project/
**BLADE_ROOT**
common/
string/
**BUILD**
algorithm.h
algorithm.cc
foo/
**BUILD**
foo.h
foo.cc
thirdparty/
gtest/
**BUILD**
gtest.h
gtest.cc
...
Blade会自动将项目根目录添加到头文件搜索路径,因此#include包含头文件的相对路径是基于项目根目录的,对于跨目录包含的头文件来说这样可以清楚地知道头文件所在位置。
例如,在上面的目录结构中,要在foo.cc中包含algorithm.h,直接写#include "common/string/algorithm.h"即可。
其他目录的依赖通过//表示根目录,如//dir:name。
"//path/to/dir:name"其他目录下的target,path为从BLADE_ROOT出发的路径,name为被依赖的目标名。":name" 当前BUILD文件内的target。"#name"系统库。直接写#跟名字即可,比如#pthread,#z分别相当于链接命令行上的-lpthread和-lz,但是会被传递给依赖这个库的其他目标。