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

How to get executable's full target triple as a compile-time constant without using a build script?

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

ARCH 个常量,但不是完整的三元组。例如,它不区分软浮点和硬浮点 ARM ABI。

env!("TARGET") 是理想的,但它仅针对构建脚本设置,而不是 lib/bin 目标。我可以通过 build.rs 和动态源代码生成将它传递给 lib(将值写入 OUT_DIR 中的 .rs 文件),但这似乎是一个沉重的黑客攻击无论如何编译器都必须知道的字符串。

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

我不认为这是通过构建脚本公开的。在没有 "dynamic source code generation" 的情况下获得目标三元组的简洁方法是 build.rs:

fn main() {
    print!("{}", std::env::var("TARGET").unwrap());
}

src/main.rs中:

const TARGET: &str = include_str!(concat!(env!("OUT_DIR"), "/../output"));

fn main() {
    println!("target = {:?}", TARGET);
}

构建脚本将一些 additional output 打印到文件中,因此您不能确定构建脚本只打印 $TARGET 的输出。

相反,在 build.rs 中尝试这样的事情:

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

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

在我的 main.rs:

const TARGET: &str = env!("TARGET");

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

如果您只想知道安装了哪个目标,运行:rustup target list --installed