浏览基于 Bazel 和 Fuchsia-SDK 的开发环境

本页面介绍如何搭配使用 Fuchsia SDK 和 Bazel 构建系统,在主机上为 Fuchsia 项目识别和定位 FIDL 文件、客户端库和构建工件。

在基于 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-and-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 目标。

如需列出开发环境中可用的 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-and-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 组件和二进制文件(例如驱动程序二进制文件)。
  • 调试符号 - 对调试消息和日志进行符号化处理时需要使用。

在开发环境中生成这些 build 工件的确切位置取决于 Fuchsia 项目的配置。如需确定这些位置,请检查项目的 Bazel 构建系统的设置。例如,默认情况下,SDK 驱动程序示例代码库 (fuchsia-drivers) 会将 Bazel 构建工件存储在主机的 $HOME/.cache/bazel 目录中。

使用 Bazel 命令列出构建工件

在基于 Bazel-和-Fuchsia-SDK 的开发环境中,您还可以使用 Bazel 命令列出和找到特定 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 命令会返回有关不可配置目标的信息;因此,它无法列出生成的 build 工件。另一方面,bazel cquery 命令会返回在特定 build 配置中评估的目标的相关信息。

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

不过,有一个难点在于,在 Bazel 中更改 build 配置的方式有很多种。例如,针对特定 Fuchsia CPU 架构进行配置的正确方法是使用 --config=fuchsia_arm64,而不是使用提到的 --cpu=aarch64 标志。这可能取决于 .bazelrc 文件中的项目设置。

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

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 以外的其他构建系统时。