代码之家  ›  专栏  ›  技术社区  ›  Roger Lipscombe

发现当前默认目标?

  •  0
  • Roger Lipscombe  · 技术社区  · 6 年前

    我想 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 不是正确的目标。

    我如何发现当前使用的是哪个target triple rustc或cargo?

    rustc --print cfg 打印似乎与三元组不对应的值列表(没有 unknown 特别是在那里)。

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

    2 回复  |  直到 3 年前
        1
  •  8
  •   Roger Lipscombe    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> .

        2
  •  3
  •   konstin    3 年前

    货物用途 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(())
    }
    
        3
  •  3
  •   gauteh tpg2114    3 年前

    基于@konstin answer :

    $ rustc -vV | sed -n 's|host: ||p'
    

    这给了你类似的东西:

    x86_64-unknown-linux-gnu
    
        4
  •  2
  •   plugwash    4 年前

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

    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。

        5
  •  2
  •   Alex    4 年前

    也许它并不特别优雅,但我发现这很管用:

    rustup show | grep default | grep -Po "^[^-]+-\K\S+"
    
        6
  •  1
  •   rodrigo    6 年前

    使用最新的rustc编译器:

    $ rustc -Z unstable-options --print target-spec-json | grep llvm-target
    
        7
  •  0
  •   James Mishra    3 年前

    我编写了很多跨平台的shell脚本或Python程序,这些脚本或程序需要检查我当前的默认目标。不过,我不喜欢手动将字符串值变灰。

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

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

    cargo install default-target
    

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

    default-target
    

    它将返回您当前的目标值三倍。差不多 x86_64-apple-darwin x86_64-unknown-linux-gnu .

    您可以在上找到关于板条箱的更多详细信息 crates.io , docs.rs GitHub .