本页面介绍如何搭配使用 Fuchsia SDK 和 Bazel 构建系统,在主机上为 Fuchsia 项目识别和定位 FIDL 文件、客户端库和构建工件。
在基于 Fuchsia SDK 的开发环境中开发 Fuchsia 组件时,开发者使用 Fuchsia SDK 中包含的以下接口和库:
利用开发环境中可用的这些接口和库,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 的项目
图 1. 从 Fuchsia 来源到各种基于 Bazel 和 Fuchsia SDK 的 Fuchsia 项目的文件和库流。
下面的步骤说明了如何从 Fuchsia 源代码树 (fuchsia.git
) 中选择一些 FIDL 文件和客户端库,并使其在基于 Bazel 和 Fuchsia SDK 的项目中可用:
- Fuchsia 源代码树构建了新版 Fuchsia IDK(集成器开发套件),其中包含 FIDL 文件、库、头文件等的集合。
- Fuchsia IDK 与 Bazel 构建系统集成相结合,用于创建新版 Fuchsia SDK。
- 新的 Fuchsia SDK 已发布,项目集成商可使用该功能。
- 项目集成商下载最新的 Fuchsia SDK,并将 SDK 的全部或选定内容发布到其 Fuchsia 项目代码库(通常通过自动化)。
- 开发者在更新开发环境(随后下载项目中的最新更改)时,即可访问 Fuchsia SDK 的新内容。
这些 FIDL 文件和客户端库的目录结构和布局可能因 Fuchsia 项目而异,尤其是当项目使用除 Bazel 以外的其他构建系统时。