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