过程宏存在于它们自己的 crate 中,这些 crate 是为开发机器编译的(以便在编译使用它们的 crate 时可以执行它们)。过程宏 crate 中的任何条件编译指令将相应地基于它们的编译环境,而不是调用 crate 的编译环境。
当然,这样的宏可以扩展到包含条件编译指令的标记,然后将在调用 crate 的编译的上下文中对其进行评估——然而,这并不总是可行或可取的。
如果希望扩展令牌本身成为调用板条箱编译环境的某个功能,则需要宏在其运行时确定该环境(这当然是调用板条箱的编译时间)。std::env
显然是该模块的完美用例。
但是, rustc 没有设置任何环境变量。而 Cargo 集只有有限的几个。特别是,一些关键信息(如目标架构/操作系统等)根本不存在。
我很欣赏调用板条箱中的构建脚本可以为宏设置环境变量然后读取,但这给调用板条箱的作者带来了不令人满意的负担。
proc 宏作者有什么方法可以获得有关调用 crate 的编译环境的运行时信息(我最感兴趣的目标架构和操作系统)?