探索以 Bazel 和 Fuchsia-SDK 為基礎的開發環境

本頁說明如何在主體機器上找出 FIDL 檔案、用戶端程式庫,以及在主體機器上使用 Fuchsia SDK 搭配 Bazel 建構系統,為 Fuchsia 專案建構構件。

在以 Fuchsia SDK 為基礎的開發環境中開發 Fuchsia 元件時,開發人員會使用 Fuchsia SDK 中包含的介面和程式庫:

  • FIDL 檔案 – 在 Fuchsia 上執行程式所使用的處理序間通訊 (IPC) 通訊協定的介面。
  • 用戶端程式庫 - 提供 Fuchsia API 之功能和構成元素的程式庫。

Bazel 建構系統可在開發環境中使用這些介面和程式庫,因此可以在主機上建構含有 Fuchsia 元件的 Fuchsia 套件,並在主機上產生建構構件

以 Fuchsia SDK 為基礎的專案中的 FIDL 檔案

請先執行 bazel build 指令,在本機專案設定中建立 FIDL 檔案的符號連結,例如:

bazel build @fuchsia_sdk//:ffx

您可以在本機專案結帳頁面的以下目錄中,找到以 Bazel-和-Fuchsia SDK 為基礎的專案所納入的所有 FIDL 檔案 (.fidl

<YOUR_PROJECT_CHECKOUT_DIR>/bazel-<PROJECT_NAME>/external/fuchsia_sdk/fidl

如要在主機上找出 <YOUR_PROJECT_CHECKOUT_DIR>/bazel-<PROJECT_NAME> 的絕對路徑,您可以執行 bazel info output_base 指令。

如要進一步瞭解每個 FIDL 介面,請參閱 FIDL 參考資料頁面

使用 Bazel 指令列出 FIDL 目標

您也可以使用 Bazel 指令,列出以 Bazel-and-Fuchsia SDK 為基礎的開發環境。

如要列出開發環境中可用的 FIDL 目標,請使用下列範本執行 bazel query 指令:

bazel query 'ATTR(<GENERATOR_FUNCTION>, <FUCHSIA_FIDL_LIBRARY>, <PATH>)'

請參閱下列指令範例:

  • 請列出本機專案結帳內容最上方 FIDL 目錄中的所有目標:

    $ bazel query '@fuchsia_sdk//fidl/...'
    
  • 列出特定 FIDL 通訊協定目錄中的所有目標:

    $ bazel query '@fuchsia_sdk//fidl/fuchsia.auth/...'
    
  • 列出最上方 FIDL 目錄中所有產生的 C++ 程式庫:

    $ bazel query 'kind(cc_library, @fuchsia_sdk//fidl/...)'
    

    Fuchsia 為每個 FIDL 目標產生多個 cc_library 目標。因此,這些指令通常會輸出一份龐大的清單。請考慮使用 grep 指令篩選輸出內容。

以 Fuchsia SDK 為基礎的專案中的用戶端程式庫

Fuchsia SDK 內含 C++ 用戶端程式庫,可在 Fuchsia 可用 API 上提供實用功能和建構模塊。不過,與 FIDL 檔案 (用於描述系統必須在執行階段提供的服務) 不同,用戶端程式庫的程式碼 (無論是原始碼或預先建構的形式) 一律不是 Fuchsia 平台的一部分,因此必須在建構時直接加入 Fuchsia 套件。

在以 Bazel 和-Fuchsia SDK 為基礎的專案中,所有用戶端程式庫、標頭檔案 (.h) 和預先建構的檔案 (.so) 都位於本機專案結帳頁面的下列目錄中:

<YOUR_PROJECT_CHECKOUT_DIR>/bazel-<PROJECT_NAME>/external/fuchsia_sdk/arch
<YOUR_PROJECT_CHECKOUT_DIR>/bazel-<PROJECT_NAME>/external/fuchsia_sdk/pkg

如要進一步瞭解每個用戶端程式庫,請參閱標頭檔案中的註解。

透過 Bazel 建構系統建構構件

在以 Bazel 和-Fuchsia SDK 為基礎的開發環境中執行 bazel build 指令時,Bazel 建構系統會編譯目標 Fuchsia 軟體 (在 BUILD.bazel 檔案中指定),並產生下列建構構件:

  • Fuchsia 套件 (.far):包含新建構的 Fuchsia 元件和二進位檔 (例如驅動程式庫二進位檔)。
  • 「偵錯符號」 – 必須針對偵錯訊息和記錄進行符號化處理。

這些建構構件在開發環境中產生的確切位置取決於您的 Fuchsia 專案的設定。如要找出這些位置,請檢查專案 Bazel 建構系統的設定。舉例來說,SDK 驅動程式庫程式範例存放區 (fuchsia-drivers) 會將 Bazel 建構構件儲存在主體的 $HOME/.cache/bazel 目錄中,

使用 Bazel 指令列出建構構件

您也可以使用 Bazel 指令,在以 Bazel-和-Fuchsia SDK 為基礎的開發環境中,列出並尋找特定 Fuchsia 套件的所有建構構件。

如要列出為開發環境中新建的 Fuchsia 套件產生的所有建構構件,請使用下列範本執行 bazel cquery 指令:

bazel cquery <PATH:TARGET> --output files

更改下列內容:

  • PATH:開發環境中目標 Fuchsia 套件的目錄路徑。
  • TARGET:目標 Fuchsia 套件的標籤。

以下範例指令會輸出為 iwlwifi 驅動程式庫套件產生的建構構件清單:

$ bazel cquery //third_party/iwlwifi/platform:iwlwifi_pkg --output files

附錄

bazel 查詢和 bazel cquery 的差異

bazel query 指令會傳回無法設定目標的相關資訊,因此,無法列出產生的建構構件。另一方面,bazel cquery 指令會傳回在特定建構設定中評估的目標相關資訊。

根據預設,bazel cquery 指令使用的建構設定與您主機系統的架構相符。舉例來說,在 x64 Linux 主機上,bazel cquery 指令會列出 Fuchsia/x64 構件。不過,Bazel 允許使用指令列標記來變更建構設定。例如,bazel cquery --cpu=aarch64 指令可用來列出 x64 主機上的 Fuchsia/arm64 構件。對了,這也適用於 bazel build 指令。舉例來說,bazel build --cpu=aarch64 指令可用來在 x64 主機上產生 Fuchsia/arm64 構件。

然而,其中一個困難性是 Bazel 中的建構設定變更方式有很多種。舉例來說,為特定 Fuchsia CPU 架構進行設定的正確方式可能是使用 --config=fuchsia_arm64,而不是使用上述的 --cpu=aarch64 標記。這取決於 .bazelrc 檔案中的專案設定。

從 Fuchsia 來源樹狀結構到採用 Fuchsia SDK 型專案的 FIDL 檔案和用戶端程式庫流程

Fuchsia SDK 流程圖表

圖 1. 從 Fuchsia 來源到以 Bazel 和-Fuchsia SDK 為基礎的不同 Fuchsia 專案的檔案和程式庫流程。

以下順序說明系統如何從 Fuchsia 來源樹狀結構 (fuchsia.git) 中選取部分 FIDL 檔案和用戶端程式庫,並在以 Bazel 和-Fuchsia SDK 為基礎的專案中開放使用:

  1. Fuchsia 來源樹狀結構建構了新版 Fuchsia IDK (整合商開發套件),內含 FIDL 檔案、程式庫、標頭等集合。
  2. Fuchsia IDK 結合 Bazel 建構系統整合,建立新版 Fuchsia SDK。
  3. 新版 Fuchsia SDK 已發布,並可供專案整合商使用。
  4. 專案整合商會下載最新的 Fuchsia SDK,並將所有或所選 SDK 內容發布至他們的 Fuchsia 專案存放區 (通常是透過自動化)。
  5. 開發人員更新開發環境時,可以存取 Fuchsia SDK 的新內容 (進而下載專案的最新變更)。

這些 FIDL 檔案和用戶端程式庫的目錄結構與版面配置可能會因 Fuchsia 專案而異,特別是當專案使用 Bazel 以外的建構系統時。