mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			100 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
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
 | 
						|
}
 |