Ninja构建系统初探
Ninja構建系統概述
Ninja是一個專注于速度的小型構建系統。它與其他構建系統在兩個主要方面有所不同:一是它被設計為由更高級別的構建系統生成.ninja文件作為其輸入;二是它被設計為盡可能快地執行構建任務。
為什么需要Ninja這么一個新的構建系統?如果說其他構建系統是高級語言的話,那么Ninja的目標是成為匯編語言。盡管Ninja的工程文件是人類可讀的,但是并特別適合人工編寫,往往是從其他構建系統的工程文件自動生成Ninja的工程文件。Ninja的工程文件可以快速地進行增量構建。
Ninja將文件的相互依賴關系(通常是源代碼和輸出可執行文件之間的依賴關系)作為輸入,并快速協調構建它們。Ninja 包含描述任意依賴關系圖所需的最基本功能,但它的語法不支持表達復雜的決策,因為構建系統一旦需要做決策就會變慢。
Ninja與生成 .ninja 輸入文件的獨立程序配合起來使用。獨立的.ninja文件生成程序(如 autotools 項目中的 ./configure)可以分析系統依賴關系,并預先做出盡可能多的決策,以便使增量構建保持快速。除了自動工具之外,甚至諸如"我應該使用哪個編譯器標志?"或"我應該構建調試版本或發布版本?"之類的構建時決策也屬于 .ninja 文件生成器。這是Ninja構建速度特別快的原因。
特別說明一下,Ninja比其他構建系統更快,因為它非常非常簡單。當你創建項目的 .ninja 文件時必須明確地告訴 Ninja 需要執行的操作。
Ninja vs. Make
Ninja在設計思想和實際功能上都非常接近Make,它們都使用文件時間戳之間的簡單依賴關系。
Make的功能比較復雜,包括很多規則、函數和遍歷搜索等功能。Make的語言被設計成由人類編寫的Makefile。
相比之下,Ninja除了用于正確的構建之外幾乎沒有任何其他功能,最復雜的工作都由.ninja輸入文件的生成器來完成。
但相比Make,Ninja也增加了一些功能。
Ninja 特別支持在構建時發現額外的依賴項,從而可以輕松地為 C/C++ 代碼獲取正確的頭文件。
更改編譯標志將導致輸出重新生成,因為輸出隱式依賴于用于生成它們的命令行。
規則可以提供正在運行的命令的簡短描述,因此您可以在構建時打印例如CC foo.o而不是長命令行。
構建工作始終并行運行。默認情況下,根據系統具有的 CPU 核數決定并行執行的線程數。
命令輸出始終是緩沖的。這意味著并行運行的命令不會交錯其輸出,當命令失敗時,我們可以將其失敗輸出打印在產生故障的完整命令行旁邊。
Ninja相對于Make盡管已經加速了編譯構建過程,但是對于像Android、Linux內核、LLVM等大型項目來說,編譯構建所消耗的時間對于整個團隊的開發效率的影響依然不容小覷,因此我們希望能將Ninja改造為支持分布式編譯構建的工具,有興趣的小伙伴可以來一起探討。
參考資料
https://ninja-build.org/
總結
以上是生活随笔為你收集整理的Ninja构建系统初探的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习笔记之——晶振选型主要参数和外接匹配
- 下一篇: 昆仑通态与欧姆龙温控器 台达变频器 采用