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。必需。要针对指定库运行的生成器的逗号分隔列表。支持以下生成器:cppgodartrust

  • --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 命令,该命令可自动为一组指定文件中的每个文件选择并运行相应的代码检查器。fx lint 将文件与 .fidl 扩展名捆绑在一起,并将所有这些文件一起传递给 FIDL 代码检查器命令 fidl-lint

fx lint 是调用 FIDL linter 的推荐方式,最好在上传新的 FIDL 库或更改现有 FIDL 之前运行。如果不带任何实参,fx lint 将对最新 git commit 中的所有文件运行所有可用的代码检查工具。

fx lint

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

fx lint --help

格式设置工具

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

fx format-code