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 命令,用于自动为一组指定文件选择并运行相应的代码 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