Fuchsia 專用的 Ninja 改善項目

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 多行狀態範例

請注意:

  • 在 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 上進行。