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 的用法,以下是相關資訊的連結: