嘗試新的構造系統 Ninja

Ninja 是 Chrome 項目的構建工具,用來替換經典工具 make,目前這個開源工具已經被不少其它項目採用。據項目做者描述,建立這個新的構建工具,主要是爲了提高大型項目的編譯速度。python

因爲 Ninja 的設計目標之一是「必須易於嵌入大型構建系統」,因此,像寫 Makfile 那樣手寫規則文件,並非它的目標; Ninja 的項目做者說,Ninja 構建文件使用的語言「簡單到了不便於人類書寫」的程度。Ninja 的規則文件中,並無條件語句或是基於文件後綴的規則,相反,有的僅僅是一個個列表。這些列表記錄了確切的輸入文件路徑,以及所產生的確切結果。由於這種簡單的表達並不須要額外的解釋,因此,在運行時,這些規則文件可以被快速載入。 windows

因此,一般狀況下,使用 Ninja 時須要一個額外的工具,來實現高層次的構建概念理解。好在已經有不少現成的工具來完成這件事,好比鼎鼎大名 CMAKE,已經能夠直接生成 Ninja 的規則文件。工具

今天實驗用到另外一個超小的基於 Python 的工具,pyrate-build。項目做者描述它是一個「build file generator targeting Ninja」。ui

 

1. 安裝spa

Ninja 並不須要額外的依賴,你能夠直接使用相應平臺的二進制文件,Linux 或者 Windows;安裝不安裝的都無所謂。固然,Linux 下最好仍是用 apt-get 之類的安裝。它的 windows  可執行文件只有 500k。設計

pyrate-build 的安裝更簡單,它只須要一個文件。因此,一樣的,你也能夠直接把它放到編譯目錄下。或者使用 pip 來安裝。code

我這裏在 Linux 下做的實驗,Ninja 是用 apt 裝的,pyrate-build 腳本直接放在了編譯目錄下。blog

 

2. 編譯ip

只嘗試了 pyrate-build 官網上的實驗:get

$ echo -e '#include <cstdio>\nint main() { printf("Ahoy World!"); return 0; }' > test.cpp
$ echo -e "executable('test', 'test.cpp')" > build.py
$ python pyrate build.py
$ ninja
$ ./test

而後,修改了 build 目錄,對 build.py 作了簡單修改。

default_context.basepath = 'build'
default_context.basepath_object_file = 'build/obj'
executable('test', 'test.cpp')

固然,指定目錄彷佛還有不少其餘的方式,暫不做深刻研究。

 

因此,若是你在 windows 下組織一個獨立於 IDE 的新項目,你只須要一個 500k 的二進制文件,以及一個 python 腳本,就能夠輕鬆組織構建啦~

 

想用 Ninja 做爲單片機的構建工具,可是供應商的編譯器不支持生成 depfile,因此考慮先使用 gcc 做爲 depfile 的生成工具。下面的腳本實驗可行,考慮有空了進行整合:

CC = C:\Tools\mingw\bin\gcc
source_path=..\02_SW\01_Sources\
opts=-MMD -MF
CC_FLAGS = -I$source_path\02_MCAL\ -I$source_path\03_MCAL_generated -I$source_path\04_OS -MM
rule dep_gen
  command = $CC $CC_FLAGS $in $opts $out
  description = dep_gen(c) $out

build build/obj/Adc.c.d: dep_gen $source_path\02_MCAL\Adc.c
build build/obj/Base.c.d: dep_gen $source_path\02_MCAL\Base.c
相關文章
相關標籤/搜索