概述
Blade 是一個現(xiàn)代構(gòu)建系統(tǒng),期望的目標是強大而好用,把程序員從構(gòu)建的繁瑣中解放出來。
Blade主要定位于linux下的大型C++項目,密切配合研發(fā)流程,比如單元測試,持續(xù)集成,覆蓋率統(tǒng)計等。但像unix下的文本過濾程序一樣,保持相對的獨立性,可以單獨運行。目前重點支持i386/x86_64 Linux,未來可以考慮支持其他的類Unix系統(tǒng)。
在騰訊公司“臺風”云計算平臺開發(fā)過程中,為了解決 GNU Make,Autotools 的難用和繁瑣的問題,我們開發(fā)了這個全新的構(gòu)建系統(tǒng),整個系統(tǒng)基于多個聲明式的構(gòu)建腳本,在構(gòu)建腳本里,只需要聲明要構(gòu)建什么目標,目標的源代碼,以及其直接依賴的其它目標,不需要說明如何構(gòu)建。大大降低了使用難度,提高了開發(fā)效率。
首先,Blade解決了依賴問題。
當你在構(gòu)建某些目標時,頭文件有變化,會自動重新構(gòu)建。
最方便的是,Blade也能追蹤庫文件的依賴關(guān)系。比如
庫 foo 依賴庫 common,那么在庫 foo 的 BUILD 文件中列入依賴:
cc_library(
name = 'foo',
srcs = ...,
deps = ':common'
)
那么對于使用foo的程序,如果沒有直接用到common,那么就只需要列出foo,并不需要列出common。
cc_binary(
name = 'my_app',
srcs = ...,
deps = ':foo'
)
這樣當你的庫實現(xiàn)發(fā)生變化,增加或者減少庫時,并不需要通知庫的用戶一起改動,Blade自動維護這層間接的依賴關(guān)系。當構(gòu)建my_app時,也會自動檢查foo和common是否也需要更新。
說到易用性,除了依賴關(guān)系的自動維護,Blade還可以做到,用戶只需要敲一行命令,就能把整個目錄樹的編譯鏈接和單元測試全部搞定。例如:
遞歸構(gòu)建和測試common目錄下所有的目標
$ blade test common...
以32位模式構(gòu)建和測試
$ blade test -m32 common...
以調(diào)試模式構(gòu)建和測試
$ blade test -pdebug common...
顯然,你可以組合這些標志
$ blade test -m32 -pdebug common...
特點
- 自動分析頭文件依賴關(guān)系,構(gòu)建受影響的代碼。
- 增量編譯和鏈接,只構(gòu)建因變更受影響而需要重新構(gòu)建的代碼。
- 自動計算庫的間接依賴,庫的作者只需要寫出直接依賴,構(gòu)建時自動檢查所依賴的庫是否需要重新構(gòu)建。
- 在任意代碼樹的任意子目錄下都能構(gòu)建。
- 支持一次遞歸構(gòu)建多個目錄下的所有目標,也支持只構(gòu)建任意的特定的目標。
- 無論構(gòu)建什么目標,這些目標所依賴的目標也會被自動連坐更新。
- 內(nèi)置 debug/release 兩種構(gòu)建類型。
- 彩色高亮構(gòu)建過程中的錯誤信息。
- 支持 ccache
- 支持 distcc
- 支持基于構(gòu)建多平臺目標
- 支持構(gòu)建時選擇編譯器(不同版本的gcc,clang等)
- 支持編譯 protobuf,lex, yacc, swig
- 支持自定義規(guī)則
- 支持測試,在命令行跑多個測試
- 支持并行測試(多個測試進程并發(fā)運行)
- 支持增量測試(無需重新運行的測試程序自動跳過)
- 集成 gperftools,自動檢測測試程序的內(nèi)存泄露
- 構(gòu)建腳本 vim 語法高亮
- svn 式的子命令命令行接口。
- 支持 bash 命令行補全
- 用 python 編寫,無需編譯,直接安裝使用。
徹底避免以下問題:
- 頭文件更新,受影響的模塊沒有重新構(gòu)建。
- 被依賴的庫需要更新,而構(gòu)建時沒有被更新,比如某子目錄依
致謝
- Blade 是受 Google 官方博客發(fā)表的這篇文章啟發(fā)而開發(fā)的:
云構(gòu)建:構(gòu)建系統(tǒng)是如何工作的 - 現(xiàn)階段 Blade 生成 SCons 腳本進行構(gòu)建,因此 Blade 的運行還需要依賴 SCons。
- Python 是一種簡單易用而又強大的語言,我們喜歡python。
- 為了支持python 2.6及更低版本,我們把python 2.7中的argparse.py放入了源碼包。
- Google 開放的一些庫強大而好用,我們很喜歡,我們把對這些庫的支持集成進了Blade中,既方便了庫的使用,又增強了 Blade,這些庫包括 glog, protobuf,gtest, gproftools。
更多文檔請參考Blade wiki。
應(yīng)用
自己嘗試使用scons
和Blade
分別編譯了一下my_consistent_hash。
scons編譯
項目文件(SConstruct
是scons
編譯所需的配置文件,相當于makefile
):
scons編譯所需配置文件SConstruct內(nèi)容(下面的Glob表示的是glob模式: 指 shell 所使用的簡化了的正則表達式。支持*,[],?,[0-9]等正則表達式的操作):
Program('conhash', Glob('*.cpp'),CCFLAGS='-std=c++11')
編譯:
編譯后該目錄下的文件:
run:
直接運行 ./conhash 即可
clean:
Blade編譯
項目文件(BUILD
是Blade
編譯所需的配置文件,相當于makefile
,Blade
獲取源代碼根的方法是,無論當前從哪一級子目錄運行,都從當前目錄開始向上查找BLADE_ROOT
文件,故在項目根目錄需要有BLADE_ROOT
文件,此處的BLADE_ROOT
用的是blade
里面自帶的,除了cc_config
中的內(nèi)容,增加了對C++11
的支持):
Blade
編譯所需配置文件BUILD
內(nèi)容:
編譯:
編譯后該目錄下的文件:
run:
切換至 build64_release 目錄下, 直接運行 ./conhash 即可
clean:
blade clean