Fuchsia 建構系統

總覽

Fuchsia 建構系統旨在為各種裝置建構啟動映像檔和可更新套件。為此,開發人員使用了 GN 這個中繼建構系統,產生 Ninja 耗用的建構檔案,用於執行實際建構作業。

請注意,Zircon 仍會使用不同的建構系統,但仍使用 GN 和 Ninja。

入門

如果您不熟悉 Fuchsia 的建構系統和 GN,請參閱使用 GN 建構一文,其中概述 GN 建構系統的基本原則。

主面板和產品

產生的映像檔內容會由面板和 Fuchsia 建構中最低起始設定的產品組合控制。主面板和產品可定義依附元件集,定義映像檔、更新和套件存放區中包含的套件。「主面板和產品」記錄了這些建構設定的結構和使用方式。

套書

組合是來源樹狀結構中部分相關套件的分組,例如所有工具或所有測試。如需套裝組合總覽,請參閱「套裝組合」。//bundles 中定義了一組頂層套裝組合。

建構目標

建構目標是在 BUILD.gn 檔案內定義,並分散在來源樹狀結構上。這些檔案使用類似 Python 的語法宣告可建構的物件:

import("//build/some/template.gni")

my_template("foo") {
  name = "foo"
  extra_options = "//my/foo/options"
  deps = [
    "//some/random/framework",
    "//some/other/random/framework",
  ]
}

可用指令 (使用 gn cli 工具叫用) 和結構 (內建目標宣告類型) 請參閱 GN 參考資料//build 專案.gni 檔案中也有數個自訂範本。

Fuchsia 定義許多自訂範本,以便支援定義及建構 Fuchsia 特定構件。

執行建構

最簡單的做法是使用 fx 工具,如 fx 工作流程中所述。請繼續閱讀,瞭解 fx 實際上執行了哪些操作。

本文件的其餘部分假設 PATH 中有 gnninja 指令。這些指令可分別在 prebuilt/third_party/gn/<platform>prebuilt/third_party/ninja/<platform> 中找到。或者,如果您不想修改 PATH,則可在所有叫用前加上 fx,例如 fx gnfx ninja

生成步驟

首先,選擇要建構的主面板和產品,設定主要建構構件:

fx gn gen $(fx get-build-dir) --args='import("//boards/x64.gni") import("//products/core.gni")'

這會建立包含 Ninja 檔案的建構目錄 (通常是 out/default)。

對等的 fx set 指令如下:

fx set core.x64

如需所有 GN 建構引數的清單,請執行:

fx gn args $(fx get-build-dir) --list

如需 select_variant 引數的說明文件,請參閱「變化版本」。

建構步驟

下一步是使用 Ninja 執行實際版本:

fx ninja -C $(fx get-build-dir)

這是 fx build 後端執行的內容。

重新建構中

如要在修改某些來源後重新建構樹狀結構,只要重新執行建構步驟即可。即使建構檔案有所變更,BUILD.gn 檔案依然有效,因為 GN 會新增 Ninja 目標來更新 Ninja 目標!對於用來設定建構作業的其他檔案也是如此。任何需要手動撤銷產生步驟的來源變更都是建構錯誤,因此應回報。

提示與秘訣

檢查 GN 目標的內容

fx gn desc $(fx get-build-dir) //path/to/my:target

尋找 GN 目標的參照

fx gn refs $(fx get-build-dir) //path/to/my:target

參照建構主機的目標

您需要將各種主機工具 (有些用於建構本身) 與最終映像檔一併建構。

如何從模組檔案參照主機工具鍊的建構目標:

//path/to/target(//build/toolchain:host_x64)

如何從 BUILD.gn 檔案中參照主機工具鍊的建構目標:

//path/to/target($host_toolchain)

僅建立特定目標

如果目標是在 GN 建構檔案中定義為 //foo/bar/blah:dash,則可以使用以下方式建構目標 (及其依附元件):

fx ninja -C $(fx get-build-dir) -j64 foo/bar/blah:dash

請注意,這項做法僅適用於預設工具鍊中的目標。

探索 Ninja 指定目標

GN 產生了大量文件,供 Ninja 指定。您可以使用以下方式存取說明文件:

fx gn help ninja_rules

您也可以透過以下方式瀏覽輸出目錄目前定義的 Ninja 目標組合:

fx ninja -C $(fx get-build-dir) -t browse

請注意,即使出現 Ninja 目標,也不代表系統會建構該目標,因為需要依附於「default」目標。

瞭解 Ninja 的用途

-d explain 新增至 Ninja 指令,使其說明其執行的每個步驟。

偵錯建構時間問題

執行建構時,Ninja 會保留可用於產生建構程序視覺化的記錄:

  1. 刪除輸出目錄 - 這是為了確保記錄只呈現您正要執行的建構疊代。
  2. 照常執行版本;
  3. 取得 https://github.com/nico/ninjatracing
  4. 執行 ninjatracing <output directory>/.ninja_log > trace.json
  5. 在 Chrome 的 about:tracing 中載入產生的 JSON 檔案。

疑難排解

系統並未建立我的 GN 目標!

請確定匯總至模組檔案中定義的標籤,否則建構系統將忽略此標籤。

GN 抱怨沒有「sysroot」。

您可能忘了執行「Build step」(建構) 的這兩個指令。

TODO(pylaligand):顯示預設目標路徑的指令

內部 GN 設定

TODO(pylaligand):.gn、預設目標、GN 標籤插入