Fuchsia 建構系統使用自訂的 Ninja 二進位檔,可改善開發人員體驗。本頁面將說明這些功能。
提振精神
RFC-0153 詳細說明瞭為 Fuchsia 自訂 Ninja 的原因。
簡而言之,有許多功能可為 Fuchsia 開發人員帶來重大助益,但這些功能在上游版本中難以取得。
所有 Fuchsia 專屬變更都會在 本機 Ninja git 鏡像的本機 fuchsia-rfc-0153
分支上執行,並定期重新建立基礎,方便以 GitHub 提取要求的形式傳送至上游專案,如 RFC 的策略部分所述。
功能:執行指令的狀態
將環境中的 NINJA_STATUS_MAX_COMMANDS
設為絕對正整數,讓 Ninja 在智慧型終端機中執行時,在狀態列下方列印一份表格,其中列出執行時間最長的指令,以及所需的時間。例如,使用 export NINJA_STATUS_MAX_COMMANDS=4
時,狀態可能會如下所示:
[0/28477](260) STAMP host_x64/obj/tools/configc/configc_sdk_meta_generated_file.stamp
0.4s | STAMP obj/sdk/zircon_sysroot_meta_verify.stamp
0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...chsia.media/cpp/fuchsia.media_cpp_common.common_types.cc.o
0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...fuchsia.media/cpp/fuchsia.media_cpp.natural_messaging.cc.o
0.4s | CXX obj/BUILD_DIR/fidling/gen/sdk/fidl/fuchsia.me...dia/cpp/fuchsia.media_cpp_natural_types.natural_types.cc.o
下方動畫圖片顯示實際執行時的樣貌:
請注意:
在 Ninja 的模擬執行或詳細呼叫中,這項功能會自動停用 (也就是使用
-n
或--verbose
標記)。如果 Ninja 未在互動式 / 智慧型終端機中執行,這項功能就會自動停用。
執行主控台指令時,這項功能也會暫停 (在執行 Bazel 動作時,可在上述範例中看到)。
這項功能可輕鬆呈現建構作業中的瓶頸,也就是會導致其他指令無法並行執行的長時間指令。
根據預設,指令表會每秒更新 10 次,這對於瞭解哪些長指令會影響建構作業非常有幫助。您可以將 NINJA_STATUS_REFRESH_MILLIS
設為以毫秒為單位的小數值,藉此變更重新整理週期 (如果時間間隔小於 100,系統會忽略,因為經過的時間只會以小數點後一位數字的形式顯示)。
功能:持續模式可縮短啟動時間
在環境中設定 NINJA_PERSISTENT_MODE=1
,加快後續的 Ninja 叫用作業。這項功能可讓 Ninja 啟動背景伺服器程序,讀取一次建構資訊清單,然後在後續建構作業之間,將建構圖保留在記憶體中。
請注意:
這項功能應完全透明,且不會影響 Ninja 的行為。如果您發現問題或差異,請透過
fuchsia-build-team@google.com
與我們聯絡!系統會自動偵測輸入
.ninja
檔案的任何變更。在這種情況下,現有伺服器會關閉,系統會自動啟動新的伺服器。變更 GN 建構檔案或執行jiri update
後,不需要額外的使用者互動。伺服器程序會在閒置 5 分鐘後正常關閉。如要變更這項延遲時間,請在環境中設定
NINJA_PERSISTENT_TIMEOUT_SECONDS=<count>
。使用
fx build -t server status
擷取目前建構目錄的伺服器狀態。使用
fx build -t server stop
明確停止任何正在執行的伺服器例項。設定
NINJA_PERSISTENT_LOG_FILE=<path>
,將與持續性模式相關的記錄傳送至指定的檔案路徑。每個伺服器程序目前會使用約 1 GiB 的 RAM 來進行
core.x64
建構設定。具體數字取決於 Ninja 圖表的大小,而圖表大小則取決於args.gn
設定。每個 Ninja 建構目錄最多可由一個伺服器程序提供服務。但使用多個建構目錄時,可能會有多個程序。
Ninja 工具 (例如
ninja -C <dir> -t commands <target>
) 尚未在伺服器上執行,因此仍會使用較慢的啟動程序。我們會在日後修正這個問題,加快查詢速度。
已知的錯誤 / 警告,將會解決:
在同一個目錄中混合使用永久和非永久版本,可能會讓伺服器產生混淆,因為系統無法正確偵測 Ninja 版本和依附元件記錄的獨立變更。我們會修正這個問題。
解決方法:在環境中取消設定
NINJA_PERSISTENT_MODE
之前,請使用-t server stop
停止伺服器。「快速啟動」功能需要幾秒鐘的時間。目前,每個增量建構作業仍需針對建構圖表中的所有檔案呼叫 stat(),這項作業目前需要幾秒鐘的時間。我們日後會修正這個問題,方法是使用主機作業系統的 inotify / kqueue 檔案系統監控功能,在只有少數檔案經過修改時立即啟動。
目前無法在 Windows 上運作。這是因為 Win32 技術限制,無法將控制台句柄複製到其他程序。這主要是上游 Ninja 團隊的問題,因為 Fuchsia 開發作業並未在 Windows 上進行。