浏览基于 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 命令列出 基于 Bazel 和 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++ 客户端库提供了实用的功能, 构建块。但是,与 FIDL 不同 文件(用于描述系统在运行时必须提供的服务)、 客户端库中的代码(无论是以源代码还是预构建的形式)永远不会 是 Fuchsia 平台的组成部分,因此必须直接添加到 Fuchsia 软件包中 。

包括所有客户端库、头文件 (.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 Driver Samples 代码库 (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 软件包的标签。

以下示例命令会输出生成的 build 工件的列表 (针对 iwlwifi 驱动程序软件包):

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

附录

bazel 查询和 bazel cquery 之间的区别

bazel query 命令会返回不可配置目标的相关信息; 因此无法列出生成的 build 工件。另一方面, bazel cquery 命令会返回在 特定构建配置。

默认情况下,bazel cquery 命令使用的 build 配置 与主机系统的架构相符。例如,在 x64 上 Linux 主机,则 bazel cquery 命令会列出 Fuchsia/x64 工件但是,Bazel 允许使用命令行标志来更改 build 配置。例如,bazel cquery --cpu=aarch64 命令可以是 用于列出 x64 主机上的 Fuchsia/arm64 工件。顺便说一下, 这也适用于 bazel build 命令。例如: bazel build --cpu=aarch64 命令可用于生成 Fuchsia/arm64 x64 主机上有一个工件。

但有一个难点 在 Bazel 中构建构建配置例如, 建议使用 --config=fuchsia_arm64 而不是使用前面提到的 --cpu=aarch64 标志。这可能取决于 在 .bazelrc 文件中指定项目设置。

从 Fuchsia 源代码树到基于 Fuchsia-SDK 的项目的 FIDL 文件和客户端库流

Fuchsia SDK 流程图

图 1. 从 Fuchsia 源到各种资源的文件和库流 基于 Bazel 和 Fuchsia-SDK 的 Fuchsia 项目。

以下序列描述了某些 FIDL 文件和客户端库 从 Fuchsia 源代码树 (fuchsia.git) 中选择,并变为 适用于基于 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 之外的其他构建系统