如果您需要从 Rust 调用某些 C 或 C++ API,可以使用 bindgen,该工具可根据 C 和 C++ 标头生成 Rust 代码。如需了解更多文档,请参阅 bindgen 用户指南。
生成 Rust 绑定
Fuchsia 提供 rustc_bindgen_golden GN 模板,用于从 C/C++ 标头生成 Rust 绑定,并确保这些绑定始终保持最新状态。此模板在 build 期间运行 bindgen,并将输出与已签入的“黄金”文件进行比较。
1. 定义 GN 目标
导入模板并在 BUILD.gn 中定义 rustc_bindgen_golden 目标。
例如,请参阅 //src/lib/usb_rs/BUILD.gn:
import("//build/rust/rustc_bindgen.gni")
rustc_bindgen_golden("my_bindings_golden") {
header = "my_header.h"
checked_in_source = "src/bindings.rs"
# Optional: configure bindgen behavior
# e.g., allowlist, denylist, raw_lines, etc.
# see //build/rust/rustc_bindgen.gni for all options
}
2. 配置 Rust 目标
您必须将黄金目标添加到使用绑定的 Rust 目标的 validations 参数中,以确保检查在构建过程中运行:
rustc_library("my_library") {
edition = "2024"
sources = [
"src/lib.rs",
"src/bindings.rs",
]
# ...
validations = [ ":my_bindings_golden" ]
}
在 Rust 代码中,您随后可以使用生成的绑定(例如 mod bindings;)。
3. 更新已签入的绑定
如果 C 标头发生更改,构建将会失败,因为生成的绑定将不再与已签入的文件匹配。build 输出将显示 diff(差异比较)以及有关如何更新文件的说明。
如需更新已签入的文件,您可以执行以下任一操作:
- 使用 build 失败消息中提供的
cp命令,将生成的文件复制到已签入的文件上。 使用
update_goldensGN 实参设置为true的方式重新构建:fx set ... --args=update_goldens=true fx build在 build 完成并更新文件后,将
update_goldens实参恢复为false(或将其移除),以确保捕获未来的不匹配情况。