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 (必填)。以半形逗號分隔的產生器清單,這些產生器會在指定程式庫上執行。支援的產生器如下:cppgodartrust

  • --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 指令,可自動為一組指定檔案選取並執行適當的程式碼檢查工具。fx lint 會將檔案與 .fidl 副檔名組合在一起,並將所有檔案一併傳遞至 FIDL 檢查工具指令 fidl-lint

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

fx lint

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

fx lint --help

格式設定工具

FIDL 格式器是指令列程式,可格式化 .fidl 檔案。這項功能會自動建構到 fx format-code 指令中,用於格式化任何修改過的 FIDL 檔案:

fx format-code