在 build.rs 中触发宏扩展

Loc*_*cke 6 rust rust-macros

我想使用板条箱cpp创建一个宏,但是该板条箱存在宏扩展问题。

语境

该包的工作原理是获取cpp!{ ... }内联 C 代码的宏,将其内容编译为函数,并用结果函数替换宏调用。这是通过cpp_build::build("src/lib.rs")调用build.rs.

问题

正如板条箱作者所述,cpp!宏是在宏扩展发生之前编译的。这意味着它将尝试按原样解释宏的参数并在宏声明内部进行扩展。

build.rs有没有办法在调用函数之前触发特定宏或文件内部的扩展cpp_build

小智 0

实现这一目标的方法是不使用宏(技术上)。syncrate 有一个parse_file可以从构建脚本调用的函数。然后您必须遍历语法树并找到实际的宏调用。syn有一个visit功能(请参阅模块文档),它将帮助您这样做。当您使用 定位宏调用时syn,您可以直接运行宏。

然后,您需要提供您自己的宏版本(如果它们不是您的),这些宏通过删除proc_macro属性Cargo.toml并将这些版本添加到dev-dependencies.

请注意,这仅在您没有询问宏中嵌套的宏时才起作用cpp!{}- 如果您询问宏的内部结构,则宏的内部在语义上只能被视为令牌流(即使它是纯 Rust 代码),并且 syn 会给出你就是这样。syn::parse如果内部代码是有效的 Rust,则需要手动重新处理它。如果是 C/C++,您必须供应商并扩展具有 Rust 宏支持的 C/C++ 解析器 - 但您可能可以采取更好/更简单的方法。