Blade - 騰訊開源的構建系統 c/c++編譯環境
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow
也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!
typhoon-bladeBlade is an advanced building system developed with python, majorly for C/C++
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
刀是什麼樣的刀?
諸位看到標題,千萬不要以為我是模仿《鋒利的JQuery》,或者什麼書籍,而是因為,介紹Blade的文章,標題不得不這樣。
Blade由騰訊颱風雲端計算平臺出品,大約在2012年下半年開源,它是一把專用於構建軟體的寶刀。Blade的字面意義應該是"刀鋒",意思是使用該軟體構建軟體更加強大,更加便捷。該系列寶刀,最早應該是由Google這位頂級刀匠打造而成,當年事蹟見諸網際網路記載:
http://google-engtools.blogspot.hk/2011/08/build-in-cloud-how-build-system-works.html
http://mike-bland.com/2012/10/01/tools.html#tools-blaze-forge-srcfs-objfs
聽說Google內部打磨的寶刀,其名為"火焰刀",英文名為"Blaze",一樣是鋒芒畢露,炙熱灼物,其面世後,以其熊熊烈焰,統一了google內部的軟體編譯方式。騰訊出品的blade, 英文寫法,只有一字之差,不過"火焰""刀鋒"各得風流,雖說取名有點像偶像致敬的意思,但是也是鋒芒不讓。
提起google的寶刀,其實到google洗練過幾年武學的IT牛人們,在遠走他方後,也都各自打磨了一把。我的前東家,就成績打磨過一把類似的寶劍,取名"Ymake",名字是雖然樸拙了一些,但是假如你見過他們亮出過寶刀,也會被其鋒芒所吸引。在雲壤的江湖朋友們,都稱道其"活兒好"。
就網際網路上能搜尋到的鑄刀祕訣而言,我能搜尋到的,應該是我的前任授業恩師放出去的,其實他應該還沒有加入雲壤。專案地址為:
https://code.google.com/p/qa52/
其BUILD語法,雖然還沒有簡潔到極致,但是功能上似乎看起來也已經有模有樣。
其示例的BUILD檔案如下所示:
假如你仔細瞅瞅,會發現語法已經基本接近google開放出來的BUILD檔案示例。
好吧,花了九牛二虎之力,追溯了blade的歷史掌故,卻還沒點到題上。言歸正傳,blade其實是一個多語言的構建工具,之所以使用"構建",而不是"編譯"兩字,實在是因為軟體構建並不僅僅是軟體編譯,而非我喜歡故弄玄虛。Blade除了編譯軟體以外,還奉上了很多其它的福利,比如集成了單元測試,效能測試等。這正如一把好刀,不僅應該能殺人,還且最好能力最短的時間內殺死對方,刀光一起,人已倒地,但是刀不流血,刀已回鞘。
那麼,Blade藏身何處,不急,以下就是它的所在:
https://code.google.com/p/typhoon-blade/
https://github.com/chen3feng/typhoon-blade
目前該專案與陳峰維護,其微博名為"陳三豐",雖然我猜測可能是由於"陳峰"這個名字已經被他人搶先使用,繼而只好採用拆字法,將"峰"一分為二,是為"三豐",不過從名字看,倒也和大俠張三丰很有淵源,就此而言,blade(刀鋒)由他維護倒是最妙不過了。
刀鋒的鋒芒在哪裡?
既然號稱刀鋒,那麼其鋒芒何在?為什麼有了make這把天下聞名的好刀,還要試試blade的鋒芒?
那麼下面就在歷數一下blade的不同凡響處。
天下武功,唯快不破
江湖上最知名的刀,無不以快而聞名,blade的一個好處,也是其編譯速度快,快得益於幾個方面:
1,可以進行並行編譯和並行測試,
2,使用了ccache等庫,可以將編譯中間結果進行快取。
3,如果使用了distcc模式,則可以享有更多的用於編譯的硬體資源。聽說google內部的blaze有三個模式,一個是Local,一個是distcc,一個是Forge,按理說,forge模式由於執行在大規模的叢集中,編譯的速度應該最為快。
刀雖為刀,卻不僅僅是刀
在仙劍奇俠傳四中,寶劍望舒,被男主角雲天河各種虐待,從獵野豬、烤肉、劈柴到射箭、御劍,無所不用其極。而一把好刀,其功能自然不應該侷限與殺人見血。
Blade作為一個構建工具,其作用不僅僅是替代make和makefile,且聽我細細道來:
1,Blade是軟體工程的利器,有助於模組化,模組化的力度控制自如,對於提高系統的可維護性,複雜性的隔離,程式碼複用的最大化,都有很大的好處。
2,Blade提供了單元測試的最佳使用方式。
假若單元測試和程式碼是分離的,編譯程式碼和執行測試各自為政,那麼往往測試只是測試,很難對開發有什麼幫助,因為很多時候,雖然有測試程式碼,但是測試卻很少被執行,或者時過境遷後,測試多有失效。大家假如編譯過一些開源專案的話,可能就會有類似的經驗,編譯完靜態庫,拿到靜態庫檔案就完了,很少有人去執行所有的單元測試,確保所有的測試都能執行通過。
有了Blade,通過cc_test將gtest_main.a預設連結,使得單元測試的程式碼簡化到極致。同時,主要執行blade test target,就能在編譯完目標程式後,執行(而且可併發執行)相應的單元測試,以隨時跟進程式碼是否已經偏離了該有的軌道,開發是否早已脫繮狂奔。
只要釋出部署時,使用上Blade test target, 那麼就可以保證,上線的模組,能夠通過所有單元測試用例的驗證把關。Blade整合單元測試,提供cc_test,看似功能簡單,但是正是這個簡單的功能,使得測試驅動開發,開發者測試等理念,能夠在google全功能範圍內得到認同並貫徹實現。
3,blade實現了遞迴編譯。
Blade build …即可對當前目錄及其子目錄下的所有編譯物件進行編譯。該功能雖然小,但是卻很實用。在一個十幾人的團隊中,百萬行級別的程式碼規模,只有遞迴編譯功能,可以很方便地實現一個迴圈編譯工具,當某個模組編譯失敗,或者某個單元測試失敗後,自動發出郵件通知相關的開發人員,以保證頻繁的開發提交程式碼成為開發。當然,相關的功能,可以通過類似hudson之類的軟體完成。不過blade 遞迴編譯,對中小規模的程式碼而言,基本已經遊刃有餘。
4,blade 實現了依賴查詢。
Blade query可以查詢依賴到某個模組的所有模組,這個對於程式碼重構而言,是個不錯的功能。假如你在重構code base,或者是修改介面,或者是fix bug,或者是改進效能,
都可能使得使用到該庫的相關模組,集體罷工,單元測試無法通過。這時候,假如使用上blade query,你就可能編譯相關模組,使得你提交的程式碼,不會給其它模組帶來麻煩。
5,blade綁定了靜態程式碼審查功能。
對整個專案而言,嚴把質量關非常重要,因為一旦一些爛程式碼進去了,清掃牛糞的工作將會非常痛苦而且艱鉅。這裡的異己分子,可能包括bug,風格差異迥異等。
Blade 會在進行編譯之前,會所有被變更的編碼,使用指定的靜態程式碼審查功能進行程式碼審查。C++程式碼審查指令碼,google cpplint較為知名,地址為:
http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py
當然,每個公司都可以定製其自己的檢查指令碼,以符合其自己的程式碼風格等。
Blade繫結該功能,可以避免出現一些常見的Bug,統一團隊的程式碼風格,對公司工程文化的塑造有潤物細無聲之效。
6,blade是編譯的統一入口,並且是開放的
這點是最重要的,也是blade的鋒芒所在。因為Blade是統一的編譯如果,因此修改統一的編譯選項,設定統一的編譯警告級別,實現cc_test等全部成為可能。
只要願意,你不僅可以在編譯前實現程式碼審查,也可以在編譯時設定不同的引數,選擇指定的編譯器,更可以在編譯後,執行單元測試,統計單元測試覆蓋率,當可以定製各種操作。
因為統一,所以要升級編譯器,使用統一的警告級別等牽一髮而動全身的動作成為可能。因為開發,實現cc_test, cc_benchmark, proto_library, thrift_library成為可能。
好使的刀,方為好刀
假如刀雖然,但是太笨重,使用起來彷彿破解機關,這隻有寂寞的高手才能使用了,普通人得知,如同廢鐵。因此,好使的刀,才是好刀。
Blade之所以好使,在於其採用了足夠簡潔的語法,比如下面便是編譯一個靜態庫libencoding.a的語法描述:
cc_library(
name = 'encoding',
srcs = [
'ascii.cpp',
'base64.cpp',
'hex.cpp',
'percent.cpp',
'shell.cpp',
],
deps = [
'//toft/base/string:string',
'//thirdparty/stringencoders:stringencoders'
]
)
你需要的只有三件事,要打造的刀叫什麼刀,它需要使用什麼特別的原料,它需要依賴哪些現成的原料。也就是name, srcs,deps, 換言之,就是編譯物件名,編譯需要的原始檔,需要依賴的其它靜態庫。你需要描述的有且僅有他們。怎麼編譯,編譯選項,在哪裡編譯,中間產物是什麼,中間產物放在哪裡,你通通不需要關注。刀一出鞘,東西已在那,躺在了你希望它在的所在,熱乎乎的,等你去品嚐。
這種簡單到極致的語法,好處卻有很多。比如:
1, 容易學習,容易記憶,你需要記憶的只有name, srcs,deps等掰著十指都能數的過來的關鍵字和規則,剩下的就是,告訴它用到哪些程式碼檔案,用到了哪些外部的庫。
相比Makefile繁瑣的語法,BUILD檔案可謂清爽宜人。
2,簡化到了極致的好處是,各種cc_library可以在力度中間輕鬆轉換,因此使用了BUILD檔案後,模組劃分會更加合理,哪怕有一個檔案,其它模組可能可以使用上,你也可以方便地將它打包到一個靜態庫中,這樣其它地方只要依賴上這個cc_library,就可以坐享其成。
我曾經見識過各種thrift檔案,protobuf檔案散落在程式碼各個目錄甚至分支中,如果使用上thrift_library, proto_library,將thrift檔案定義出細粒度的library,則可以避免因Makefile中頻繁描述thrift/protobuf原始檔生成與編譯的痛苦。
羞於告訴他人的是,我至今都對Makefile不太熟悉,不過所幸,Blade已經開源,我從此不必也不像和Makefile再打交道,我也沒有必要告訴別人說,我認識Makefile這個哥們。
寶刀待屠龍
江湖中向來有"武林至尊,寶刀屠龍,號令天下,莫敢不從,倚天不出,誰與爭鋒."的說法,blade既然是一把絕世好刀,在倚天劍面世之前,各位江湖好友,不妨試試其刀鋒如何!
給我老師的人工智慧教程打call!http://blog.csdn.net/jiangjunshow
你好! 這是你第一次使用 **Markdown編輯器** 所展示的歡迎頁。如果你想學習如何使用Markdown編輯器, 可以仔細閱讀這篇文章,瞭解一下Markdown的基本語法知識。新的改變
我們對Markdown編輯器進行了一些功能拓展與語法支援,除了標準的Markdown編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:
- 全新的介面設計 ,將會帶來全新的寫作體驗;
- 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
- 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
- 全新的 KaTeX數學公式 語法;
- 增加了支援甘特圖的mermaid語法1 功能;
- 增加了 多螢幕編輯 Markdown文章功能;
- 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
- 增加了 檢查列表 功能。
功能快捷鍵
撤銷:Ctrl/Command + Z
重做:Ctrl/Command + Y
加粗:Ctrl/Command + B
斜體:Ctrl/Command + I
標題:Ctrl/Command + Shift + H
無序列表:Ctrl/Command + Shift + U
有序列表:Ctrl/Command + Shift + O
檢查列表:Ctrl/Command + Shift + C
插入程式碼:Ctrl/Command + Shift + K
插入連結:Ctrl/Command + Shift + L
插入圖片:Ctrl/Command + Shift + G
合理的建立標題,有助於目錄的生成
直接輸入1次#,並按下space後,將生成1級標題。
輸入2次#,並按下space後,將生成2級標題。
以此類推,我們支援6級標題。有助於使用TOC
語法後生成一個完美的目錄。
如何改變文字的樣式
強調文字 強調文字
加粗文字 加粗文字
標記文字
刪除文字
引用文字
H2O is是液體。
210 運算結果是 1024.
插入連結與圖片
連結: link.
圖片:
帶尺寸的圖片:
當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。
如何插入一段漂亮的程式碼片
去部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片
.
// An highlighted block var foo = 'bar';
生成一個適合你的列表
- 專案
- 專案
- 專案
- 專案
- 專案1
- 專案2
- 專案3
- 計劃任務
- 完成任務
建立一個表格
一個簡單的表格是這麼建立的:
專案 | Value |
---|---|
電腦 | $1600 |
手機 | $12 |
導管 | $1 |
設定內容居中、居左、居右
使用:---------:
居中
使用:----------
居左
使用----------:
居右
第一列 | 第二列 | 第三列 |
---|---|---|
第一列文字居中 | 第二列文字居右 | 第三列文字居左 |
SmartyPants
SmartyPants將ASCII標點字元轉換為“智慧”印刷標點HTML實體。例如:
TYPE | ASCII | HTML |
---|---|---|
Single backticks | 'Isn't this fun?' |
‘Isn’t this fun?’ |
Quotes | "Isn't this fun?" |
“Isn’t this fun?” |
Dashes | -- is en-dash, --- is em-dash |
– is en-dash, — is em-dash |
建立一個自定義列表
- Markdown
- Text-to- HTML conversion tool
- Authors
- John
- Luke
如何建立一個註腳
一個具有註腳的文字。2
註釋也是必不可少的
Markdown將文字轉換為 HTML。
KaTeX數學公式
您可以使用渲染LaTeX數學表示式 KaTeX:
Gamma公式展示 是通過尤拉積分
你可以找到更多關於的資訊 LaTeX 數學表示式here.
新的甘特圖功能,豐富你的文章
gantt
dateFormat YYYY-MM-DD
title Adding GANTT diagram functionality to mermaid
section 現有任務
已完成 :done, des1, 2014-01-06,2014-01-08
進行中 :active, des2, 2014-01-09, 3d
計劃一 : des3, after des2, 5d
計劃二 : des4, after des3, 5d
- 關於 甘特圖 語法,參考 這兒,
UML 圖表
可以使用UML圖表進行渲染。 Mermaid. 例如下面產生的一個序列圖::
這將產生一個流程圖。:
- 關於 Mermaid 語法,參考 這兒,
FLowchart流程圖
我們依舊會支援flowchart的流程圖:
- 關於 Flowchart流程圖 語法,參考 這兒.
匯出與匯入
匯出
如果你想嘗試使用此編輯器, 你可以在此篇文章任意編輯。當你完成了一篇文章的寫作, 在上方工具欄找到 文章匯出 ,生成一個.md檔案或者.html檔案進行本地儲存。
匯入
如果你想載入一篇你寫過的.md檔案或者.html檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。
註腳的解釋 ↩︎