附属文件生成
本章解释 Roplat 的 two-pass 机制和双本地后端。
为什么需要 two-pass
build.rs 执行早于过程宏完整展开,构建脚本不能直接读取宏结果。
因此采用两阶段:
-
Pass 1: Extraction
-
子进程
cargo check -
宏在
ROPLAT_PHASE=EXTRACT下写出 manifest -
Pass 2: Generation
-
roplat_build读取 manifest -
生成节点/消息/桥接文件
-
Native Build
-
根据配置选择
cc或cmake - 编译 C++ 桥接和附加本地源
清单类型
msg:透明消息opaque:不透明数据node:多语言节点
当前生成规则
-
节点
-
系统文件可覆盖
-
用户文件首次生成后不覆盖
-
透明消息
-
生成系统管理文件(默认 C 头文件)
-
不透明数据
-
默认只生成目标语言用户文件
- Rust 侧仅保留类型标记
双本地后端
roplat_build 提供统一配置入口,后端可切换:
-
cc -
轻量、依赖少
-
适合简单桥接
-
cmake -
适合复杂 C++ 依赖
- 可配合
find_package接入 Eigen/OpenCV 等
build.rs 典型写法
use roplat_build::{BuildOrchestrator, NativeBackend, NativeBuildConfig};
fn main() {
if std::env::var("ROPLAT_PHASE").as_deref() == Ok("EXTRACT") {
return;
}
let backend = NativeBackend::from_env("ROPLAT_NATIVE_BACKEND")
.unwrap_or(NativeBackend::Cc);
let native = NativeBuildConfig::new()
.backend(backend)
.library_name("roplat_nodes_cpp")
.include_dir("cpp/src");
BuildOrchestrator::new()
.native_build(native)
.build()
.expect("Code generation failed");
}
建议
- 新人默认先用
cc跑通链路。 - 确认业务需要后再迁移
cmake。 - 每次改动后执行
cargo clippy --workspace --all-targets -- -D warnings。