本文档概述了可用于查看生成的 FIDL 绑定代码的方法。如需了解 FIDL 定义如何转换为目标语言代码的一般信息,请参阅绑定参考。
在整个指南中,我们都将使用 FIDL 库 fuchsia.io 作为运行示例。它在 //sdk/fidl/fuchsia.io 中定义。
查看生成的代码
本部分介绍如何直接访问生成的代码文件。
GN build
如果您想查看 Fuchsia build 中特定目标的生成输出,可以先构建相关目标,然后在 build 输出中检查生成的文件。本部分中的说明假定目标是使用标准 fidl GN 模板定义的,并且 build 目录已设置为默认路径 (out/default)。fx status 可用于查找当前的 build 目录。
您可以在 GN build 的 fidling 工具链中找到大多数 FIDL 输出。对于 fuchsia.io,输出的根是 out/default/fidling/gen/sdk/fidl/fuchsia.io。本文档的其余部分将此目录称为根目录。其结构如下:
out/default/fidling/gen/sdk/fidl/fuchsia.io
├── fuchsia.io.fidl.json
└── fuchsia.io
├── fidl_fuchsia_io.rs
├── fuchsia.io.fidl
│ └── impl.go
├── c
│ └── fuchsia
│ └── io
│ └── c
│ ├── fidl.h
│ ├── fidl.client.c
│ └── fidl.server.c
├── cpp
│ └── fidl
│ └── fuchsia.io
│ └── cpp
│ ├── common_types.cc
│ ├── common_types.h
│ ├── driver
│ │ ├── fidl.h
│ │ ├── natural_messaging.cc
│ │ ├── natural_messaging.h
│ │ ├── wire.h
│ │ ├── wire_messaging.cc
│ │ └── wire_messaging.h
│ ├── fidl.h
│ ├── hlcpp_conversion.h
│ ├── markers.h
│ ├── natural_messaging.cc
│ ├── natural_messaging.h
│ ├── natural_types.cc
│ ├── natural_types.h
| ├── test_base.h
│ ├── type_conversions.cc
│ ├── type_conversions.h
│ ├── wire.h
│ ├── wire_messaging.cc
│ ├── wire_messaging.h
│ ├── wire_test_base.h
│ ├── wire_types.cc
│ └── wire_types.h
└── hlcpp
└── fuchsia
└── io
└── cpp
├── fidl.h
├── fidl.cc
└── fidl_test_base.h
许多生成的代码路径似乎都包含重复的目录名称,例如 .../fuchsia.io/fuchsia.io/...。这是因为 FIDL 库通常在以库命名的目录中定义,并具有以库命名的目标。第一个 fuchsia.io 来自目录,第二个来自 GN 目标名称。
JSON IR
JSON IR 会在根目录中生成,文件名为 ${target_name}.fidl.json。例如,对于 fuchsia.io:
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io.fidl.json
Rust
Rust 绑定在根目录中生成为 ${target_name}/${rust_name}.rs,其中 ${rust_name} 是通过将库名称中的点替换为下划线派生而来的。例如,对于 fuchsia.io:
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/fidl_fuchsia_io.rs
Go
Go 绑定在根目录中生成为 ${target_name}/${library_name}.fidl/impl.go。例如,对于 fuchsia.io:
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/fuchsia.io.fidl/impl.go
C++
新的 C++ 绑定使用根目录的子目录中的源代码布局,遵循以下模式:${target_name}/${binding_flavor}/fuchsia.io/cpp。
这样一来,C++ 会输出 wire_types.h、wire_types.cc、wire_messaging.h、wire_messaging.cc、wire.h 和 wire_test_base.h 以使用线类型,并输出 natural_types.h、natural_types.cc、natural_messaging.h、natural_messaging.cc、test_base.h、fidl.h 以将自然类型与线类型搭配使用。
common_types.h 和 markers.h 在有线和自然类型之间共享。
例如,将 fuchsia.io 与 C++ 绑定搭配使用会创建以下文件:
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/markers.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/common_types.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/common_types.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire_types.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire_types.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire_messaging.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire_messaging.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/wire_test_base.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/natural_types.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/natural_types.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/natural_messaging.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/natural_messaging.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/test_base.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/type_conversions.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/type_conversions.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/hlcpp_conversion.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/cpp/fidl/fuchsia.io/cpp/fidl.h
随着新的 C++ 绑定逐渐成形,将有更多绑定遵循此模式。 如需了解如何生成尚未统一的绑定,请参阅下文。
HLCPP 和 C
HLCPP 和 C 绑定是在根目录的子目录中生成的,遵循 ${target_name}/${binding_flavor}/fuchsia/io 模式。从那里开始,
- HLCPP 输出
cpp/fidl.cc、cpp/fidl.h和cpp/fidl_test_base.h。 - C 输出
c/fidl.client.c、c/fidl.server.c和fidl.h。
例如,将 fuchsia.io 与 HLCPP 绑定搭配使用会创建以下文件:
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/hlcpp/fuchsia/io/cpp/fidl.cc
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/hlcpp/fuchsia/io/cpp/fidl.h
out/default/fidling/gen/sdk/fidl/fuchsia.io/fuchsia.io/hlcpp/fuchsia/io/cpp/fidl_test_base.h
查看生成的文档
Rust
Fuchsia 中使用的所有 Rust crate(包括 FIDL 库的 Rust 绑定)的文档都托管在 https://fuchsia.dev/go/rustdoc 上。您可以使用 fx rustdoc-link 生成离线文档。