是否发现当前的默认目标?

时间:2018-10-25 19:44:06

标签: rust

我要override a build script,这意味着添加一个如下所示的配置节:

[target.x86_64-unknown-linux-gnu.foo]
rustc-link-search = ["/path/to/foo"]
rustc-link-lib = ["foo"]
root = "/path/to/foo"
key = "value"

但是我使用的是Mac,因此x86_64-unknown-linux-gnu不是正确的目标三元组。

我如何发现当前正在使用的目标三重锈钢或货物?

rustc --print cfg打印出一个似乎与三元组不对应的值的列表(尤其是其中没有unknown)。

rustc --print target-list显示所有可用的目标;我只想要默认值。

7 个答案:

答案 0 :(得分:4)

rustc --print cfg将输出如下内容:

$ rustc --print cfg
debug_assertions
target_arch="x86_64"
target_endian="little"
target_env="gnu"
target_family="unix"
target_feature="fxsr"
target_feature="sse"
target_feature="sse2"
target_os="linux"
target_pointer_width="64"
target_vendor="unknown"
unix

目标是<arch>-<vendor>-<os>-<env>

答案 1 :(得分:1)

使用最新的Rustc编译器:

$ rustc -Z unstable-options --print target-spec-json | grep llvm-target

答案 2 :(得分:1)

对我有用的东西(受罗德里戈的回答启发)

RUSTC_BOOTSTRAP=1 rustc -Z unstable-options --print target-spec-json | python3 -c 'import json,sys;obj=json.load(sys.stdin);print(obj["llvm-target"])'

RUSTC_BOOTSTRAP = 1绕过通常只允许在夜间分支上使用某些功能的检查。我还使用了正确的json解析器而不是grep。

答案 3 :(得分:1)

也许不是特别优雅,但是我发现它可以工作:

rustup show | grep default | grep -Po "^[^-]+-\K\S+"

答案 4 :(得分:1)

cargo 使用 rustc -vV 来检测默认的目标三元组 (source)。我们可以做同样的事情:

use std::process::Command;

use anyhow::{format_err, Context, Result};
use std::str;

fn get_target() -> Result<String> {
    let output = Command::new("rustc")
        .arg("-vV")
        .output()
        .context("Failed to run rustc to get the host target")?;
    let output = str::from_utf8(&output.stdout).context("`rustc -vV` didn't return utf8 output")?;

    let field = "host: ";
    let host = output
        .lines()
        .find(|l| l.starts_with(field))
        .map(|l| &l[field.len()..])
        .ok_or_else(|| {
            format_err!(
                "`rustc -vV` didn't have a line for `{}`, got:\n{}",
                field.trim(),
                output
            )
        })?
        .to_string();
    Ok(host)
}

fn main() -> Result<()> {
    let host = get_target()?;
    println!("target triple: {}", host);
    Ok(())
}

答案 5 :(得分:0)

如果您使用rustup来管理Rust安装,它将告诉您当前的默认目标:

macbookpro$ rustup target list | grep '(default)' | awk '{print $1}'
x86_64-apple-darwin

linux-mint$ rustup target list | grep '(default)' | awk '{print $1}'
x86_64-unknown-linux-gnu

还请注意,rustup show active-toolchain将显示stable-x84_64-apple-darwin之类的内容,其中包括当前目标(在stable-nightly-之后)。

答案 6 :(得分:0)

我编写了很多跨平台的 shell 脚本或 Python 程序,需要检查我当前的 Rust 默认目标三元组。不过,我不喜欢手动搜索字符串值。

为了更容易获得默认的目标三元组,我将 konstin's answer 打包成一个命令行工具。

您可以通过以下方式安装:

cargo install default-target

然后您只需运行以下程序即可使用该程序:

default-target

它会返回您当前的目标三元组。类似于 x86_64-apple-darwinx86_64-unknown-linux-gnu

您可以在 crates.iodocs.rsGitHub 上找到有关板条箱的更多详细信息。