Fuchsia 專用的 Ninja 改善項目

Fuchsia 建構系統使用自訂的 Ninja 二進位檔,為開發人員體驗提供多項改善。請參閱本頁的說明。

提振精神

如要瞭解針對 Fuchsia 自訂 Ninja 的動機,請參閱 RFC-0153

簡單來說,一些功能可以讓 Fuchsia 開發人員大幅受益,但在上游版本上難以使用。

所有 Fuchsia 專屬的變更都會在本機 Ninja Git 鏡像的本機 fuchsia-rfc-0153 分支版本中執行,並定期重新建構,以便以 GitHub 提取要求的形式,輕鬆將其傳送至上游專案,如 RFC 的「策略」部分所述。

功能:執行中指令的狀態

將環境中的 NINJA_STATUS_MAX_COMMANDS 設為絕對正整數,以便在智慧終端機中執行時,在狀態行下方查看最長執行指令的資料表,以及這些指令經過的時間。例如,使用 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> 以將永久模式相關記錄傳送至指定檔案路徑。

  • core.x64 建構設定而言,每個伺服器程序目前大約需要 1 GiB 的 RAM。精確數據取決於 Ninja 圖表的大小,這取決於您的 args.gn 設定。

  • 每個 Ninja 建構目錄最多只能由一個伺服器程序提供。但是,使用多個建構目錄時,可能有多個程序。

  • Ninja 工具 (例如 ninja -C <dir> -t commands <target>) 尚未在伺服器上執行,因此仍會使用緩慢啟動速度。日後會修正這個問題 以加快查詢速度

即將解決的已知錯誤 / 警告:

  • 在同一個目錄中混合永久與非永久版本可能會混淆伺服器,因為系統無法正確偵測 Ninja 建構作業和 Deps 記錄的獨立變更。這個問題將會修復。

    解決方法:先使用 -t server stop 停止伺服器,然後再在您的環境中取消設定 NINJA_PERSISTENT_MODE

  • 「快速啟動」需要幾秒鐘的時間。目前,每個漸進式建構作業仍需要針對建構圖中的所有檔案呼叫 stat(),目前需要幾秒鐘的時間。未來將透過主機作業系統的 inotify / kqueue 式檔案系統監看功能修正這項錯誤,改為在只修改少數檔案時立即開始。

  • 不支援 Windows (目前)。這是由於 Win32 技術限制,因此無法將主控台控點複製到其他程序。這主要是上游 Ninja 團隊的問題,因為 Fuchsia 在 Windows 上不會進行開發。