2018/06/30 補充: Brett Wilson 的 Using GN build 是我目前看過對 GN 最棒的介紹,強力推薦!
好久之前介紹過 Ninja, 當時有提到 Ninja 通常是搭配 meta-build system (例如 CMake 或是 GYP) 來使用,這次要介紹的 GN 則是 Chromium project 用來取代 GYP 的新工具。
由於 GN 是用 C++ 撰寫,比起用 Python 寫的 GYP 快了將近 20 倍,GN 新的 DSL 的語法也被認為是比較好讀及維護的。
安裝 GN
由於 gn 目前還依賴 Chromium 裡的一些函式庫,目前比較方便的方式還是從 source 編譯,Linux/Mac 上可以依照下列步驟:
基本範例
建立 .gn
在 source project 的根目錄新增一個 .gn
檔,內容如下:
.gn
檔所在的目錄會被 GN 工具認定是 project 的 source root,.gn
的內容最基本就是用 buildconfig
來指定 build config 檔的位置,其中 //
開頭的字串就是用來指定相對於 source root 的路徑。
建立 build/BUILDCONFIG.gn
根據前面的設定,我們需要在 build/
下再新增加一個 BUILDCONFIG.gn
,內容如下:
第一行指定要使用的 toolchain,參數給的是一個 label,//build/toolchains:gcc
指的是 build/toolchains/BUILD.gn
裡面定義的 gcc
toolchain。第三行則是設定編譯 C++ 時會用到的命令列參數。
建立 build/toolchains/BUILD.gn
因爲 GN 沒有內建的 toolchain 規則,toolchain
裡的各種 tool
例如 cc
, cxx
, link
等必須自己指定:
可以注意一下之前提到的 cflags_cc
是怎麼被 tool cxx
使用的。
詳細的 toolchain 設定方式可以參考 Chromium 的做法。
建立 BUILD.gn
最後在 source root 新增一個 BUILD.gn
,內容如下:
設定 hello
執行檔應該由 main.cpp
編譯。
完整的範例
請參考 GitHub 上的這個 project。
建置
先用 gn gen
指定在 out/
目錄裡產生 ninja 檔:
$ gn gen out
Done. Wrote 2 targets from 3 files in 1ms
再執行 ninja 來 build code:
$ ninja -C out
ninja: Entering directory `out'
[2/2] LINK hello
以後有修改 gn 設定的話也不用重新執行 gn,ninja 會自動更新設定:
$ ninja -C out
ninja: Entering directory `out'
[1/1] Regenerating ninja files
[2/2] LINK hello
更了解 GN
萬事起頭難,如果你能把最基本的 GN 使用範例搞懂就是成功的第一步了。
如果想更深入了解 GN 的用法,以下是相關資訊的連結:
- 練習 GN 文檔裡的 Quick Start 範例
- 細讀 GN Language and Operation
- 參考 Chromium 的 build 設定