FIDL 编译器和工具

编译器接口

概览

FIDL 编译器分为一个前端和多个后端。编译器一次处理一个库。前端使用库(以及所有传递依赖项)的 FIDL 声明,执行语义分析,并输出库的中间表示。后端会使用中间表示形式,并为库生成特定于语言的绑定。

前端

前端是一个名为 fidlc 的命令行程序。fidlc 编译器具有以下标志:

  • --json JSON_PATH。如果存在,此标志会指示 fidlc 在给定路径输出库的中间表示。中间表示法是符合特定架构的 JSON。中间表示形式用作各种后端的输入。

  • --name LIBRARY_NAME。如果存在,此标志会指示 fidlc 验证正在编译的库是否具有给定名称。此标志有助于在构建系统中库的声明与库的实际内容之间进行交叉检查。

  • --files [FIDL_FILE...]...。每个 --files [FIDL_FILE...] 参数块都描述一个库,所有这些库都必须共用同一个顶级库名称声明。库必须按依赖关系顺序呈现,后面的库可以使用前面库中的声明,但反之则不行。系统只会为最终库生成输出,而不会为其每个依赖项生成输出。

所有标志也可以通过响应文件(表示为 @responsefile)提供。responsefile 处的文件内容将被解释为以空格分隔的实参列表。响应文件不能嵌套,并且必须是唯一的参数。

后端

后端是一个名为 fidlgen 的命令行程序。fidlgen 编译器具有以下标志:

  • --json。必需。库的中间表示法的路径。中间表示法是符合特定架构的 JSON。

  • --generators。必需。要在给定库上运行的生成器的逗号分隔列表。支持以下生成器:cpp、dart 和 rust。

  • --output-base。必需。此生成器生成的文件名的基本名称。生成器通过向此文件名添加扩展名来创建文件。例如,cpp 后端会生成两个文件,一个具有 .h 扩展名,另一个具有 .cc 扩展名。

  • --include-base。必需。计算 C 和 C++ #include 指令时所依据的基准目录。例如,当 cpp 后端生成 #include 指令以从 .cc 文件引用 .h 文件时,后端会创建相对于此目录的 #include 路径。

限制

对于 cpp 后端,生成的 .h 文件必须可作为 #include <fuchsia/cpp/$LIBRARY_NAME.h> 包含在内,其中 $LIBRARY_NAME 是相应 FIDL 库的名称。通常,这意味着 --output-base 标志的值为 $INCLUDE_BASE/fuchsia/cpp/$LIBRARY_NAME,其中 $INCLUDE_BASE 是 --include-base 标志的值。

Linter

FIDL linter 是一个命令行程序,可处理一个或多个 FIDL 文件,并针对可编译(技术上有效的 FIDL)但似乎违反 FIDL 样式指南或 FIDL API 准则中的规则的内容发出警告。它会强制执行样式规范,并在可能的情况下强制执行可通过机械方式检测的评分标准指南。

可读性非常重要,而风格是可读性的一个组成部分。此外,遵循这些指南有助于确保 FIDL API 的跨语言可移植性。

使用 fx lint

Fuchsia 包含 fx lint 命令,该命令会自动为一组指定文件中的每个文件选择并运行适当的代码 Linter。fx lint 会将扩展名为 .fidl 的文件打包,并将所有文件一起传递给 FIDL linter 命令 fidl-lint。

建议使用 fx lint 调用 FIDL linter,理想情况下,应在上传新的 FIDL 库或对现有 FIDL 进行更改之前运行。在没有任何参数的情况下,fx lint 将在您最近的 git commit 中的所有文件上运行所有可用的 Linter。

fx lint

如需查看其他可用选项,请运行以下命令:

fx lint --help

格式设置工具

FIDL 格式化程序是一个命令行程序,用于设置 .fidl 文件的格式。它会自动内置到 fx format-code 命令中,该命令会设置任何修改后的 FIDL 文件的格式:

fx format-code