我如何查询rustc以获得主机三元组?

kd3sttzy  于 2023-02-04  发布在  其他
关注(0)|答案(4)|浏览(110)

当使用gcc时,我可以通过运行gcc -dumpmachine来得到gcc认为是我的主机的三元组,在我当前的系统上,这将得到x86_64-linux-gnu
我如何获得稳定的rustc来打印我的主机三重?(在本例中为x86_64-unknown-linux-gnu
rustc的文档中除了--print--version之外似乎没有包含任何相关的内容,也没有生成主机目标三元组。

    • 澄清**:到目前为止,关于nightly有两个答案,我想强调的是,这个问题是专门针对 * stable * rustc编译器的。
tsm1rwdh

tsm1rwdh1#

rustc --version --verbose

将给予如下输出:

rustc 1.35.0-nightly (474e7a648 2019-04-07)
binary: rustc
commit-hash: 474e7a6486758ea6fc761893b1a49cd9076fb0ab
commit-date: 2019-04-07
host: x86_64-unknown-linux-gnu
release: 1.35.0-nightly
LLVM version: 8.0

其中host是你的目标三元组。

um6iljoc

um6iljoc2#

使用Rust nightly,您可以打印“目标规范JSON”:

$ rustc +nightly -Z unstable-options --print target-spec-json
{
  "arch": "x86_64",
  "cpu": "x86-64",
  "data-layout": "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128",
  "dynamic-linking": true,
  "env": "gnu",
  "executables": true,
  "has-elf-tls": true,
  "has-rpath": true,
  "is-builtin": true,
  "linker-flavor": "gcc",
  "linker-is-gnu": true,
  "llvm-target": "x86_64-unknown-linux-gnu",
  "max-atomic-width": 64,
  "os": "linux",
  "position-independent-executables": true,
  "pre-link-args": {
    "gcc": [
      "-Wl,--as-needed",
      "-Wl,-z,noexecstack",
      "-m64"
    ]
  },
  "relro-level": "full",
  "stack-probes": true,
  "target-c-int-width": "32",
  "target-endian": "little",
  "target-family": "unix",
  "target-pointer-width": "64",
  "vendor": "unknown"
}

要在命令行上解析目标三元组,可以使用jq这样的工具:

$ rustc +nightly -Z unstable-options --print target-spec-json | jq -r '."llvm-target"'
x86_64-unknown-linux-gnu

这还不稳定(因此需要-Z unstable-options编译器选项),但将来可能会稳定,该特性是在#38061中添加的。

s1ag04yj

s1ag04yj3#

rustc(从版本1.45.2开始)似乎没有提供任何获取主机目标三元组的方法。
作为一种变通方法,我决定使用strace和一个小的伪程序来欺骗编译器显示主机三元组;rustc根据预编译库的平台三元组将预编译库存储在单独的目录中。
这是我最后得到的:

strace -f -e trace=file rustc <(echo "fn main(){};") 2>&1 | \
   grep -E "(libstd-.*\.rlib)|(libcore-.*\.rlib)" | \
   sed -E  "s:^.*\"/.*/([^/]+-[^/]+(-[/^]+(-[^/]+)?)?)/.*\".*$:\1:g;t;d" | \
   sort | uniq

它的工作原理与您所期望的一样,在64位Linux系统上使用gnu ABI rust安装生成x86_64-unknown-linux-gnu
从理论上讲,这应该适用于任何版本的rustc。我可以确认它适用于rustc 1. 43. 0(随Ubuntu 18. 04一起提供)和1. 45. 2。
以下是使用此命令时需要注意的一些注意事项:
1.这个命令需要bash,因为我使用的是<(..)结构,这个命令可以修改为使用显式的临时文件,但代价是更加复杂。
1.如果编译器试图访问主机以外平台的文件,此命令将生成多个目标三元组。这是故意的。如果这是一个问题,您可以使用基于启发式的方法,通过使用uniq(与--count一起使用)、sorthead来选择访问次数最多的三元组。
1.用于过滤三元组的正则表达式并不像我希望的那样严格。如果三元组遵循正式的规范,它可能会进一步缩小。如果我能找到一些时间,我会在稍后更新。
干杯!

tp5buhyn

tp5buhyn4#

我已经写了一个rustc_host板条箱,允许这样做!
示例:

extern crate rustc_host;

fn main() {
    let host_triple = rustc_host::from_cli()
        .expect("failed to get host triple from rustc");
    println!("host triple: {}", host_triple);
}

相关问题