proc宏可以确定调用编译的目标吗?

egg*_*yal 4 macros compilation environment-variables rust rust-proc-macros

过程宏存在于它们自己的 crate 中,这些 crate 是为开发机器编译的(以便在编译使用它们的 crate 时可以执行它们)。过程宏包中的任何条件编译指令将相应地基于编译环境,而不是调用包的编译环境。

\n\n

当然,此类宏可以扩展为包含条件编译指令的标记,然后将在调用包的编译\xe2\x80\x94的上下文中对这些指令进行评估,但是,这并不总是可能或理想的。

\n\n

如果希望扩展令牌本身成为调用包的编译环境的某个函数,则需要宏在其运行时确定该环境(当然是调用包的编译) -时间)。显然是该模块的完美用例std::env

\n\n

然而,rustc 不设置任何环境变量;而货物套装数量有限。特别是,一些关键信息(如目标架构/操作系统等)根本不存在。

\n\n

我很欣赏调用包中的构建脚本可以为宏设置环境变量然后读取,但这给调用包作者带来了令人不满意的负担。

\n\n

有没有什么方法可以让 proc 宏作者获得有关调用包的编译环境的运行时信息(我最感兴趣的目标体系结构和操作系统)?

\n

egg*_*yal 6

我通过递归到第二个 proc 宏调用来有点不优雅地解决了这个问题,其中第一个调用添加了#[cfg_attr]带有文字布尔参数的属性,然后可以在第二个调用中访问这些属性:

#[cfg_attr(all(target_os = "linux"), my_macro(linux = true ))]
#[cfg_attr(not(target_os = "linux"), my_macro(linux = false))]
// ...
Run Code Online (Sandbox Code Playgroud)

一个黑客,但它有效。