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

问题描述 投票:0回答:4

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

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

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

是否有更直接的方法来获取使用 Cargo 构建的 lib/bin 目标中的当前目标三元组?

rust cross-compiling rust-cargo
4个回答
4
投票

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

$TARGET
的输出。

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

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

这将获取构建脚本中

$TARGET
环境变量的值并对其进行设置,以便在程序启动时可以访问它。

在我的 main.rs 中:

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

现在我可以在程序中访问目标三元组。如果您使用此技术,您将仅读取

TARGET
环境变量的值,而不会读取其他内容。


2
投票

我认为除了通过构建脚本之外,不会公开这一点。在

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);
}

0
投票

如果您只想知道安装了哪个目标,请运行:

rustup target list --installed


0
投票

如果其他人遇到这个问题,Shnatsel 制作了一个非常适合我的箱子。使用与接受的答案相同的方法,但不会弄乱你的 build.rs,因为它是一个板条箱。提供目标三元组和编译主机三元组。

下载量很大,所以我一定是唯一一个找不到它的人,所以我将其添加到这里供后代使用(:

https://crates.io/crates/current_platform

© www.soinside.com 2019 - 2024. All rights reserved.