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

本頁說明如何找出及尋找 FIDL 檔案 (用戶端) 在主體機器中建構 Fuchsia 專案的資料庫並建構構件 使用 Fuchsia SDK 搭配 Bazel 建構系統。

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

  • FIDL 檔案 - 介面 適用於執行中程式所用的處理序間通訊 (IPC) 通訊協定 在 Fuchsia 的幫助下。
  • 用戶端程式庫 – 以程式庫為基礎提供功能和構成元素的程式庫 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 指令,列出其中的 FIDL 目標 以 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 套件中 建構容器

已納入所有用戶端程式庫、標頭檔案 (.h) 和預先建立的檔案 (.so) 您可以在下列目錄中找到以 Bazel-and-Fuchsia-SDK 為基礎的專案中。 畫面中有以下特徵:

<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 建構系統會編譯目標 軟體 (在 BUILD.bazel 檔案中指定),並產生下列內容 建構構件:

  • Fuchsia 套件 (.far) - 包含 新建構的 Fuchsia 元件和二進位檔 (例如驅動程式庫二進位檔)。
  • 偵錯符號:必須授予這項權限,才能將偵錯訊息符號化 和記錄檔

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

使用 Bazel 指令列出建構構件

您也可以使用 Bazel 指令,列出及尋找所有建構成果: 以 Bazel 和 Fuchsia SDK 為基礎的開發中特定的 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 指令可用來產生 Fuchsia/arm64 x64 主體機器上的構件

然而,其中一個問題是改變方法太多 執行 Bazel 的建構作業設定舉例來說 適用於特定 Fuchsia CPU 架構的 --config=fuchsia_arm64 而非使用上述的 --cpu=aarch64 旗標實際做法取決於 .bazelrc檔案中專案設定。

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

Fuchsia SDK 流程圖表

圖 1. 檔案和程式庫從 Fuchsia 來源到各種資料的流動 以 Bazel-and-Fuchsia-SDK 為基礎的 Fuchsia 專案。

以下順序說明部分 FIDL 檔案和用戶端程式庫 從 Fuchsia 來源樹狀結構 (fuchsia.git) 中選取後成為 適用於以 Bazel-and-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 以外的不同建構系統