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
所定義。