3

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

当然,这样的宏可以扩展到包含条件编译指令的标记,然后将在调用 crate 的编译的上下文中对其进行评估——然而,这并不总是可行或可取的。

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

但是, rustc 没有设置任何环境变量。而 Cargo 集只有有限的几个。特别是,一些关键信息(如目标架构/操作系统等)根本不存在。

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

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

4

1 回答 1

3

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

#[cfg_attr(all(target_os = "linux"), my_macro(linux = true ))]
#[cfg_attr(not(target_os = "linux"), my_macro(linux = false))]
// ...

一个黑客,但它的工作原理。

于 2019-10-01T07:30:44.627 回答