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

jopen 9年前發布 | 31K 次閱讀 項目構建 blade

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. )

  6. </ol> </div> </div> 那么對于使用foo的程序,如果沒有直接用到common,那么久只需要列出foo,并不需要列出common。


    1. cc_binary(
    2.     name = 'my_app',
    3.     srcs = ...
    4.     deps = ':foo'
    5. )

    6. </ol> </div> 復制代碼 </div> 這樣當你的庫實現發生變化,增加或者減少庫時,并不需要通知庫的用戶一起改動,Blade自動維護這層間接的依賴關系。當構建my_app時,也會自動檢查foo和common是否也需要更新。

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

      遞歸構建和測試common目錄下所有的目標

      1. $ blade test common...
      2. </ol> </div> </div> 以32位模式構建和測試

        1. $ blade test -m32 common...
        2. </ol> </div> </div> 以調試模式構建和測試

          1. $ blade test -pdebug common...
          2. </ol> </div> </div> 顯然,你可以組合這些標志

            1. $ blade test -m32 -pdebug common...
            2. </ol> </div> </div> 特點

                        自動分析頭文件依賴關系,構建受影響的代碼。
                        增量編譯和鏈接,只構建因變更受影響而需要構建的。
                        自動計算庫的間接依賴,庫的作者只需要寫出直接依賴,構建時自動檢查所依賴的庫是否需要重新構建。
                        在任意代碼樹的任意子目錄下都能構建。
                        支持一次遞歸構建多個目錄下的所有目標,也支持只構建任意的特定的目標。
                        無論構建什么目標,這些目標所依賴的目標也會被自動連坐更新。
                        內置 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

             本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
             轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
             本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!