| use std::path::{Path, PathBuf}; |
| use std::process::{Command, Stdio}; |
| |
| pub(crate) fn get_host_triple(rustc: &Path) -> String { |
| let version_info = |
| Command::new(rustc).stderr(Stdio::inherit()).args(&["-vV"]).output().unwrap().stdout; |
| String::from_utf8(version_info) |
| .unwrap() |
| .lines() |
| .to_owned() |
| .find(|line| line.starts_with("host")) |
| .unwrap() |
| .split(":") |
| .nth(1) |
| .unwrap() |
| .trim() |
| .to_owned() |
| } |
| |
| pub(crate) fn get_toolchain_name() -> String { |
| let active_toolchain = Command::new("rustup") |
| .stderr(Stdio::inherit()) |
| .args(&["show", "active-toolchain"]) |
| .output() |
| .unwrap() |
| .stdout; |
| String::from_utf8(active_toolchain).unwrap().trim().split_once(' ').unwrap().0.to_owned() |
| } |
| |
| pub(crate) fn get_cargo_path() -> PathBuf { |
| if let Ok(cargo) = std::env::var("CARGO") { |
| return PathBuf::from(cargo); |
| } |
| let cargo_path = Command::new("rustup") |
| .stderr(Stdio::inherit()) |
| .args(&["which", "cargo"]) |
| .output() |
| .unwrap() |
| .stdout; |
| Path::new(String::from_utf8(cargo_path).unwrap().trim()).to_owned() |
| } |
| |
| pub(crate) fn get_rustc_path() -> PathBuf { |
| if let Ok(rustc) = std::env::var("RUSTC") { |
| return PathBuf::from(rustc); |
| } |
| let rustc_path = Command::new("rustup") |
| .stderr(Stdio::inherit()) |
| .args(&["which", "rustc"]) |
| .output() |
| .unwrap() |
| .stdout; |
| Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned() |
| } |
| |
| pub(crate) fn get_rustdoc_path() -> PathBuf { |
| if let Ok(rustdoc) = std::env::var("RUSTDOC") { |
| return PathBuf::from(rustdoc); |
| } |
| let rustc_path = Command::new("rustup") |
| .stderr(Stdio::inherit()) |
| .args(&["which", "rustdoc"]) |
| .output() |
| .unwrap() |
| .stdout; |
| Path::new(String::from_utf8(rustc_path).unwrap().trim()).to_owned() |
| } |
| |
| pub(crate) fn get_default_sysroot(rustc: &Path) -> PathBuf { |
| let default_sysroot = Command::new(rustc) |
| .stderr(Stdio::inherit()) |
| .args(&["--print", "sysroot"]) |
| .output() |
| .unwrap() |
| .stdout; |
| Path::new(String::from_utf8(default_sysroot).unwrap().trim()).to_owned() |
| } |
| |
| // FIXME call once for each target and pass result around in struct |
| pub(crate) fn get_file_name(rustc: &Path, crate_name: &str, crate_type: &str) -> String { |
| let file_name = Command::new(rustc) |
| .stderr(Stdio::inherit()) |
| .args(&[ |
| "--crate-name", |
| crate_name, |
| "--crate-type", |
| crate_type, |
| "--print", |
| "file-names", |
| "-", |
| ]) |
| .output() |
| .unwrap() |
| .stdout; |
| let file_name = String::from_utf8(file_name).unwrap().trim().to_owned(); |
| assert!(!file_name.contains('\n')); |
| assert!(file_name.contains(crate_name)); |
| file_name |
| } |