如何在不使用构建脚本的情况下将可执行文件的完整目标三元组作为编译时常量?

Kor*_*nel 7 cross-compiling rust rust-cargo

我正在编写一个 Cargo helper 命令,它需要知道 Rust/Cargo 使用的默认目标三元组(我认为它与主机的目标三元组相同)。理想情况下,它应该是一个编译时常量。

ARCH常数,但不是完整的三倍。例如,它不区分软浮点和硬浮点 ARM ABI。

env!("TARGET")将是理想的,但它仅用于构建脚本,而不是 lib/bin 目标。我可以使用build.rs动态源代码生成(将值写入 中的.rs文件OUT_DIR)将其传递给 lib ,但只是为了获得编译器无论如何都必须知道的一个字符串,这似乎是一种沉重的攻击。

有没有更直接的方法可以在用 Cargo 构建的 lib/bin 目标中获取当前目标三元组?

Ish*_*ain 4

构建脚本将一些附加输出打印到文件中,因此您无法确定构建脚本仅打印$TARGET.

相反,在 build.rs 中尝试类似的操作:

fn main() {
    println!(
        "cargo:rustc-env=TARGET={}",
        std::env::var("TARGET").unwrap()
    );
}
Run Code Online (Sandbox Code Playgroud)

这将获取构建脚本中环境变量的值$TARGET并对其进行设置,以便在程序启动时可以访问它。

在我的 main.rs 中:

const TARGET: &str = env!("TARGET");
Run Code Online (Sandbox Code Playgroud)

现在我可以在程序中访问目标三元组。如果您使用此技术,您将只读取TARGET环境变量的值,而不会读取其他内容。