GN 根目標

Fuchsia 版本使用 GN 的全新 root_patterns 功能,大幅改善 縮減 GN 和 Ninja 建構圖表的大小。大幅提高 gn gen 時間縮短,以及 Ninja 啟動時間。

不過,在剖析 BUILD.gn 檔案時,這項功能會變更 GN 的預設行為 藉此令人驚訝本文件將說明相關做法。

GN 預設行為

由於歷史因素,GN 會將 BUILD.gn 檔案中定義的每個目標執行個體化 在預設工具鍊中評估後者時,即使沒有 完全仰賴系統

舉例來說,以下三個 BUILD.gn 檔案分別定義兩個目標: 但有兩個依附元件

 _//BUILD.gn____    _//foo/BUILD.gn__    _//bar/BUILD.gn_
|               |  |                 |  |                |
|   A           |  |         D -------------> E          |
|               |  |                 |  |                |
|      B --------------> C           |  |         F      |
|_______________|  |_________________|  |________________|

GN 剖析這項建構計畫時,會發生下列情況:

  • GN 會先載入並評估 //BUILD.gn。因為這樣 使用預設的工具鍊,它會為 該檔案,例如 //:A//:B

  • GN 會遵循剛建立目標的依附元件,因為 //:B 依附於 //foo:C,因此會先載入 //foo/BUILD.gn 評估這個分數

  • 由於該 API 仍位於預設工具鍊中,因此會將所有容器執行個體化 並建立 //foo:C//foo:D 即使後者不是 //:A//:B 的依附元件

  • 系統會再次遵循依附元件,並載入 //bar/BUILD.gn。 並在這裡建立所有指定目標,因此//bar:E//bar:F

這就會產生最終的建構圖,其中包含許多目標 (如果 //BUILD.gn 代表 圖表。

GN root_patterns

您可以變更這項預設行為, .gn 檔案中的 root_patterns, 或使用 --root-pattern=<pattern> 指令列選項 (只需 內容)。

這些類別定義了目標標籤模式清單,用於篩選 的非依附元件目標,出現在評估的 BUILD.gn 個檔案中 預設工具鍊來建立。

例如,在相同版本中使用 gn gen --root-pattern=//:* 計劃將以下列方式變更 GN 的行為:

  • GN 會先載入 //BUILD.gn 並進行評估。因為 建立檔案中的任何目標 因為比對模式相符 (//:* 實際上代表「任何目標」 於 //BUILD.gn)。因此系統會像之前一樣建立 //:A//:B

  • GN 遵循依附元件,然後載入 //foo/BUILD.gn 並評估 基礎架構這會建立 //foo:C,因為這是 先前建立的目標之一但「不會」 建立 //foo:D,因為其標籤與模式 //:* 不符。

  • GN 沒有建立「//foo:D」,因此停止在這裡作業,所以沒有理由 載入「//bar:BUILD.gn

因此,GN 建立了 3 個目標,而不是在最終建構圖表中建立 6 個目標。

實際成果

在實務上,使用這項功能可縮減 GN 版本的大小 有明顯的圖形,也加快 gn gen 的時間。適用對象 例如使用 fx set minimal.x64 設定:

                        Default     --root-pattern=//:*    Reduction

Target count             183761              48375          -73%
Ninja files size (MiB)    571.7              180.2          -68%
`fx set` peak RAM (GiB)    5.02               2.89          -42%
`gn gen` time (s)          14.9               6.15          -58%
`fx set` time (s)          16.0               6.77          -57%

//:root_targets 目標。

//BUILD.gn 檔案現在定義了名為 root_targets 的頂層目標 可用來將依附元件新增至絕對必要的目標 位於建構圖中 其他依附於建構圖表時

這對某些情況至關重要:

  • 使用輸出內容的一些特殊 generated_file() 目標 做為其他目標的隱含輸入,但無法相互依賴 。

  • 硬式編碼基礎架構工具會不斷建構的幾個目標 。

  • 某些建構工具設定預期的目標, 並未在 universe_package_labels 中列出 他們只是因為其他必要目標而假設其存在 同一個 BUILD.gn 檔案中定義的資源

新增至這份清單時,請盡量最小化。建議您最好隨時找到 取自任何其他頂層的真實遞移依附元件 如果真的需要「永遠」目標,也可指定//BUILD.gn 所定義。