在build.rs中触发宏展开

6
我想使用crate cpp 创建一个宏,但是这个crate与宏扩展存在问题。
背景:该crate通过获取内联C代码的cpp!{ ... }宏,将其内容编译为函数,并用结果函数替换宏调用。这由在build.rs中调用cpp_build::build("src/lib.rs")触发。
问题:如该crate的作者所述,cpp!宏在宏扩展之前被编译。这意味着它将尝试直接解释宏的参数并展开它们。
是否有一种方法可以在调用cpp_build函数之前触发特定宏或文件的扩展?
1个回答

0
要实现这一点,就不能使用宏(从技术上讲)。syn crate有一个parse_file函数,你可以从构建脚本中调用它。然后,你需要遍历语法树并找到实际的宏调用。syn有一个visit特性(参见模块文档),可以帮助你做到这一点。当你用syn定位到宏调用时,可以直接运行宏。
然后,你需要将宏的自己版本(如果它们不是你自己的)打包到构建脚本中,通过从Cargo.toml中移除proc_macro属性,并将这些版本添加到dev-dependencies中。
请注意,这仅适用于不涉及嵌套在cpp!{}宏内部的宏的情况 - 如果涉及到这种情况,宏的内部只能在语义上被视为一个标记流(即使它是普通的Rust代码),syn将提供给你这样的结果。如果它是有效的Rust代码,你需要使用syn::parse手动重新处理内部代码。如果是C/C++代码,你将需要使用Rust宏支持来扩展和集成一个C/C++解析器 - 但可能有更好/更简单的方法可供选择。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接