1. 程式人生 > >Blade - 騰訊開源的構建系統 c/c++編譯環境

Blade - 騰訊開源的構建系統 c/c++編譯環境

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow

也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!

                typhoon-blade

Blade 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 檔案中列入依賴:

  1. cc_library(
  2.     name = 'foo',
  3.     srcs = ...
  4.     deps = ':common'
  5. )
複製程式碼 那麼對於使用foo的程式,如果沒有直接用到common,那麼久只需要列出foo,並不需要列出common。

  1. cc_binary(
  2.     name = 'my_app',
  3.     srcs = ...
  4.     deps = ':foo'
  5. )
複製程式碼 這樣當你的庫實現發生變化,增加或者減少庫時,並不需要通知庫的使用者一起改動,Blade自動維護這層間接的依賴關係。當構建my_app時,也會自動檢查foo和common是否也需要更新。

說道易用性,除了依賴關係的自動維護,Blade還可以做到,只要一行命令,就能把整個目錄樹的編譯連線單元測試就可以全部搞定。例如:

遞迴構建和測試common目錄下所有的目標
  1. $ blade test common...
複製程式碼 以32位模式構建和測試
  1. $ blade test -m32 common...
複製程式碼 以除錯模式構建和測試
  1. $ blade test -pdebug common...
複製程式碼 顯然,你可以組合這些標誌
  1. $ 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作為一個構建工具,其作用不僅僅是替代makemakefile,且聽我細細道來:

1Blade是軟體工程的利器,有助於模組化,模組化的力度控制自如,對於提高系統的可維護性,複雜性的隔離,程式碼複用的最大化,都有很大的好處。

2Blade提供了單元測試的最佳使用方式。

假若單元測試和程式碼是分離的,編譯程式碼和執行測試各自為政,那麼往往測試只是測試,很難對開發有什麼幫助,因為很多時候,雖然有測試程式碼,但是測試卻很少被執行,或者時過境遷後,測試多有失效。大家假如編譯過一些開源專案的話,可能就會有類似的經驗,編譯完靜態庫,拿到靜態庫檔案就完了,很少有人去執行所有的單元測試,確保所有的測試都能執行通過。

有了Blade,通過cc_testgtest_main.a預設連結,使得單元測試的程式碼簡化到極致。同時,主要執行blade test target,就能在編譯完目標程式後,執行(而且可併發執行)相應的單元測試,以隨時跟進程式碼是否已經偏離了該有的軌道,開發是否早已脫繮狂奔。

只要釋出部署時,使用上Blade test target, 那麼就可以保證,上線的模組,能夠通過所有單元測試用例的驗證把關。Blade整合單元測試,提供cc_test,看似功能簡單,但是正是這個簡單的功能,使得測試驅動開發,開發者測試等理念,能夠在google全功能範圍內得到認同並貫徹實現。

3blade實現了遞迴編譯。

Blade build …即可對當前目錄及其子目錄下的所有編譯物件進行編譯。該功能雖然小,但是卻很實用。在一個十幾人的團隊中,百萬行級別的程式碼規模,只有遞迴編譯功能,可以很方便地實現一個迴圈編譯工具,當某個模組編譯失敗,或者某個單元測試失敗後,自動發出郵件通知相關的開發人員,以保證頻繁的開發提交程式碼成為開發。當然,相關的功能,可以通過類似hudson之類的軟體完成。不過blade 遞迴編譯,對中小規模的程式碼而言,基本已經遊刃有餘。

4blade 實現了依賴查詢。

Blade query可以查詢依賴到某個模組的所有模組,這個對於程式碼重構而言,是個不錯的功能。假如你在重構code base,或者是修改介面,或者是fix bug,或者是改進效能,

都可能使得使用到該庫的相關模組,集體罷工,單元測試無法通過。這時候,假如使用上blade query,你就可能編譯相關模組,使得你提交的程式碼,不會給其它模組帶來麻煩。

5blade綁定了靜態程式碼審查功能。

對整個專案而言,嚴把質量關非常重要,因為一旦一些爛程式碼進去了,清掃牛糞的工作將會非常痛苦而且艱鉅。這裡的異己分子,可能包括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編輯器功能,我們增加了如下幾點新功能,幫助你用它寫部落格:

  1. 全新的介面設計 ,將會帶來全新的寫作體驗;
  2. 在創作中心設定你喜愛的程式碼高亮樣式,Markdown 將程式碼片顯示選擇的高亮樣式 進行展示;
  3. 增加了 圖片拖拽 功能,你可以將本地的圖片直接拖拽到編輯區域直接展示;
  4. 全新的 KaTeX數學公式 語法;
  5. 增加了支援甘特圖的mermaid語法1 功能;
  6. 增加了 多螢幕編輯 Markdown文章功能;
  7. 增加了 焦點寫作模式、預覽模式、簡潔寫作模式、左右區域同步滾輪設定 等功能,功能按鈕位於編輯區域與預覽區域中間;
  8. 增加了 檢查列表 功能。

功能快捷鍵

撤銷: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.

圖片: Alt

帶尺寸的圖片: Alt

當然,我們為了讓使用者更加便捷,我們增加了圖片拖拽功能。

如何插入一段漂亮的程式碼片

部落格設定頁面,選擇一款你喜歡的程式碼片高亮樣式,下面展示同樣高亮的 程式碼片.

// An highlighted block var foo = 'bar'; 

生成一個適合你的列表

  • 專案
    • 專案
      • 專案
  1. 專案1
  2. 專案2
  3. 專案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公式展示 Γ ( n ) = ( n 1 ) ! n N \Gamma(n) = (n-1)!\quad\forall n\in\mathbb N 是通過尤拉積分

Γ ( z ) = 0 t z 1 e t d t   . \Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt\,.

你可以找到更多關於的資訊 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檔案,在上方工具欄可以選擇匯入功能進行對應副檔名的檔案匯入,
繼續你的創作。


  1. mermaid語法說明 ↩︎

  2. 註腳的解釋 ↩︎