91 lines
3.2 KiB
Diff
91 lines
3.2 KiB
Diff
From 72cd8aedc2901d6a6b598eadc001cc39040ae487 Mon Sep 17 00:00:00 2001
|
|
From: Josh Stone <jistone@redhat.com>
|
|
Date: Wed, 12 Dec 2018 16:51:31 -0800
|
|
Subject: [PATCH] Try to get the target triple from rustc itself
|
|
|
|
The prior method was trying to pick the triple out of the sysroot path.
|
|
A FIXME comment already notes that this doesn't work with custom
|
|
toolchains in rustup. It also fails with distro-installed toolchains,
|
|
where the sysroot may simply be `/usr`.
|
|
|
|
The output of `rustc -Vv` is a more reliable source, as it contains a
|
|
line like `host: x86_64-unknown-linux-gnu`. This should be enough to
|
|
identify the triple for any `rustc`, but just in case, the path-based
|
|
code is kept as a fallback.
|
|
---
|
|
src/loader.rs | 41 ++++++++++++++++++++++++++++++++++++++---
|
|
1 file changed, 38 insertions(+), 3 deletions(-)
|
|
|
|
diff --git a/src/loader.rs b/src/loader.rs
|
|
index 645c95139164..fe92bef1c596 100644
|
|
--- a/src/loader.rs
|
|
+++ b/src/loader.rs
|
|
@@ -108,9 +108,33 @@ impl AnalysisLoader for CargoAnalysisLoader {
|
|
}
|
|
}
|
|
|
|
+fn extract_target_triple(sys_root_path: &Path) -> String {
|
|
+ // First try to get the triple from the rustc version output,
|
|
+ // otherwise fall back on the rustup-style toolchain path.
|
|
+ extract_rustc_host_triple()
|
|
+ .unwrap_or_else(|| extract_rustup_target_triple(sys_root_path))
|
|
+}
|
|
+
|
|
+fn extract_rustc_host_triple() -> Option<String> {
|
|
+ let rustc = env::var("RUSTC").unwrap_or(String::from("rustc"));
|
|
+ let verbose_version = Command::new(rustc)
|
|
+ .arg("--verbose")
|
|
+ .arg("--version")
|
|
+ .output()
|
|
+ .ok()
|
|
+ .and_then(|out| String::from_utf8(out.stdout).ok())?;
|
|
+
|
|
+ // Extracts the triple from a line like `host: x86_64-unknown-linux-gnu`
|
|
+ verbose_version
|
|
+ .lines()
|
|
+ .find(|line| line.starts_with("host: "))
|
|
+ .and_then(|host| host.split_whitespace().nth(1))
|
|
+ .map(String::from)
|
|
+}
|
|
+
|
|
// FIXME: This can fail when using a custom toolchain in rustup (often linked to
|
|
// `/$rust_repo/build/$target/stage2`)
|
|
-fn extract_target_triple(sys_root_path: &Path) -> String {
|
|
+fn extract_rustup_target_triple(sys_root_path: &Path) -> String {
|
|
// Extracts nightly-x86_64-pc-windows-msvc from
|
|
// $HOME/.rustup/toolchains/nightly-x86_64-pc-windows-msvc
|
|
let toolchain = sys_root_path
|
|
@@ -169,7 +193,7 @@ mod tests {
|
|
r#"C:\Users\user\.rustup\toolchains\nightly-x86_64-pc-windows-msvc"#,
|
|
);
|
|
assert_eq!(
|
|
- extract_target_triple(path),
|
|
+ extract_rustup_target_triple(path),
|
|
String::from("x86_64-pc-windows-msvc")
|
|
);
|
|
}
|
|
@@ -180,8 +204,19 @@ mod tests {
|
|
"/home/user/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu",
|
|
);
|
|
assert_eq!(
|
|
- extract_target_triple(path),
|
|
+ extract_rustup_target_triple(path),
|
|
String::from("x86_64-unknown-linux-gnu")
|
|
);
|
|
}
|
|
+
|
|
+ #[test]
|
|
+ fn target_triple() {
|
|
+ let sys_root_path = sys_root_path();
|
|
+ let target_triple = extract_target_triple(&sys_root_path);
|
|
+ let target_path = sys_root_path
|
|
+ .join("lib")
|
|
+ .join("rustlib")
|
|
+ .join(&target_triple);
|
|
+ assert!(target_path.is_dir(), "{:?} is not a directory!", target_path);
|
|
+ }
|
|
}
|
|
--
|
|
2.19.2
|
|
|