FIDL 編譯器和工具

編譯器介面

總覽

FIDL 編譯器分為前端和多個後端。編譯器一次處理一個程式庫。前端會使用程式庫 (以及所有傳遞依附元件) 的 FIDL 宣告、執行語意分析,並輸出程式庫的中繼表示法。後端會使用中繼表示法,並為程式庫產生特定語言的繫結。

前端

前端是名為 fidlc 的指令列程式。fidlc 編譯器有下列旗標:

  • --json JSON_PATH。如果出現這個旗標,fidlc 會在指定路徑輸出程式庫的中繼表示法。中繼表示法是符合特定結構定義的 JSON。中繼表示法會做為各種後端的輸入內容。

  • --name LIBRARY_NAME。如果存在,這個旗標會指示 fidlc 驗證正在編譯的程式庫是否具有指定名稱。這個旗標可用於交叉檢查建構系統中的程式庫宣告和程式庫的實際內容。

  • --files [FIDL_FILE...]...。每個 --files [FIDL_FILE...] 引數區塊都會描述一個程式庫,且所有程式庫都必須共用相同的頂層程式庫名稱宣告。程式庫必須依依附元件順序顯示,後續程式庫可以使用前述程式庫的宣告,反之則不行。系統只會為最終程式庫產生輸出內容,不會為每個依附元件產生輸出內容。

所有旗標也可以透過回應檔案提供,表示為 @responsefile。responsefile 檔案的內容會解讀為以空格分隔的引數清單。回應檔案不得為巢狀結構,且必須是唯一引數。

後端

後端是名為 fidlgen 的指令列程式。fidlgen 編譯器有下列旗標:

  • --json (必填)。程式庫中繼表示法的路徑。中繼表示法是符合特定結構定義的 JSON。

  • --generators (必填)。以半形逗號分隔的產生器清單,用於在指定程式庫上執行。支援的產生器如下:cpp、dart 和 rust。

  • --output-base (必填)。這個產生器所產生檔案的基本檔案名稱。產生器會在這個檔案名稱中加入副檔名,藉此建立檔案。舉例來說,cpp 後端會產生兩個檔案,一個副檔名為 .h,另一個副檔名為 .cc。

  • --include-base (必填)。應計算 C 和 C++ #include 指令的基準目錄。舉例來說,當 cpp 後端產生 #include 指令,從 .cc 檔案參照 .h 檔案時,後端會建立相對於這個目錄的 #include 路徑。

限制

如果是 cpp 後端,產生的 .h 檔案必須可納入為 #include <fuchsia/cpp/$LIBRARY_NAME.h>,其中 $LIBRARY_NAME 是對應 FIDL 程式庫的名稱。一般來說,這表示 --output-base 旗標的值會是 $INCLUDE_BASE/fuchsia/cpp/$LIBRARY_NAME,其中 $INCLUDE_BASE 是 --include-base 旗標的值。

Linter

FIDL linter 是一種指令列程式,可處理一或多個 FIDL 檔案,並針對可編譯 (技術上有效的 FIDL) 但似乎違反 FIDL 樣式指南或 FIDL API 評量標準規則的內容發出警告。它會強制執行樣式慣例,並在可能的情況下,強制執行可透過機械偵測的評分標準指南。

可讀性很重要,而樣式是其中元件。此外,遵循這些指南有助於確保 FIDL API 的跨語言可攜性。

使用 fx lint

Fuchsia 包含 fx lint 指令,可自動為一組指定檔案選取並執行適當的程式碼 Linter。fx lint 會將副檔名為 .fidl 的檔案組合在一起,並一併傳遞至 FIDL Linter 指令 fidl-lint。

建議使用 fx lint 叫用 FIDL Linter,最好在上傳新的 FIDL 程式庫或變更現有 FIDL 之前執行。如果沒有任何引數,fx lint 會在最近的 git commit 中,對所有檔案執行所有可用的 Linter。

fx lint

如要查看其他可用選項,請執行:

fx lint --help

格式設定工具

FIDL 格式化工具是指令列程式,可格式化 .fidl 檔案。這項工具會自動內建於 fx format-code 指令中,可設定任何修改過的 FIDL 檔案格式:

fx format-code