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