1 use std::path::{Path, PathBuf};
2 use std::process::{Command, Stdio};
3
get_host_triple(rustc: &Path) -> String4 pub(crate) fn get_host_triple(rustc: &Path) -> String {
5 let version_info =
6 Command::new(rustc).stderr(Stdio::inherit()).args(&["-vV"]).output().unwrap().stdout;
7 String::from_utf8(version_info)
8 .unwrap()
9 .lines()
10 .to_owned()
11 .find(|line| line.starts_with("host"))
12 .unwrap()
13 .split(":")
14 .nth(1)
15 .unwrap()
16 .trim()
17 .to_owned()
18 }
19
get_toolchain_name() -> String20 pub(crate) fn get_toolchain_name() -> String {
21 let active_toolchain = Command::new("rustup")
22 .stderr(Stdio::inherit())
23 .args(&["show", "active-toolchain"])
24 .output()
25 .unwrap()
26 .stdout;
27 String::from_utf8(active_toolchain).unwrap().trim().split_once(' ').unwrap().0.to_owned()
28 }
29
get_cargo_path() -> PathBuf30 pub(crate) fn get_cargo_path() -> PathBuf {
31 if let Ok(cargo) = std::env::var("CARGO") {
32 return PathBuf::from(cargo);
33 }
34 let cargo_path = Command::new("rustup")
35 .stderr(Stdio::inherit())
36 .args(&["which", "cargo"])
37 .output()
38 .unwrap()
39 .stdout;
40 Path::new(String::from_utf8(cargo_path).unwrap().trim()).to_owned()
41 }
42
get_rustc_path() -> PathBuf43 pub(crate) fn get_rustc_path() -> PathBuf {
44 if let Ok(rustc) = std::env::var("RUSTC") {
45 return PathBuf::from(rustc);
46 }
47 let rustc_path = Command::new("rustup")
48 .stderr(Stdio::inherit())
49 .args(&["which", "rustc"])
50 .output()
51 .unwrap()
52 .stdout;
53 Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned()
54 }
55
get_rustdoc_path() -> PathBuf56 pub(crate) fn get_rustdoc_path() -> PathBuf {
57 if let Ok(rustdoc) = std::env::var("RUSTDOC") {
58 return PathBuf::from(rustdoc);
59 }
60 let rustc_path = Command::new("rustup")
61 .stderr(Stdio::inherit())
62 .args(&["which", "rustdoc"])
63 .output()
64 .unwrap()
65 .stdout;
66 Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned()
67 }
68
get_default_sysroot(rustc: &Path) -> PathBuf69 pub(crate) fn get_default_sysroot(rustc: &Path) -> PathBuf {
70 let default_sysroot = Command::new(rustc)
71 .stderr(Stdio::inherit())
72 .args(&["--print", "sysroot"])
73 .output()
74 .unwrap()
75 .stdout;
76 Path::new(String::from_utf8(default_sysroot).unwrap().trim()).to_owned()
77 }
78
79 // FIXME call once for each target and pass result around in struct
get_file_name(rustc: &Path, crate_name: &str, crate_type: &str) -> String80 pub(crate) fn get_file_name(rustc: &Path, crate_name: &str, crate_type: &str) -> String {
81 let file_name = Command::new(rustc)
82 .stderr(Stdio::inherit())
83 .args(&[
84 "--crate-name",
85 crate_name,
86 "--crate-type",
87 crate_type,
88 "--print",
89 "file-names",
90 "-",
91 ])
92 .output()
93 .unwrap()
94 .stdout;
95 let file_name = String::from_utf8(file_name).unwrap().trim().to_owned();
96 assert!(!file_name.contains('\n'));
97 assert!(file_name.contains(crate_name));
98 file_name
99 }
100