use fs_extra::dir::{copy, CopyOptions};
use std::fs;
use std::path::{Path, PathBuf};
use std::process::Command;
use std::str;
fn get_rustc_sysroot() -> PathBuf {
let rustc = Command::new("rustc")
.arg("--print")
.arg("sysroot")
.output()
.unwrap();
PathBuf::from(str::from_utf8(&rustc.stdout).unwrap().trim())
}
pub fn get_rust_src_dir() -> PathBuf {
let mut sysroot = get_rustc_sysroot();
sysroot.push("lib");
sysroot.push("rustlib");
sysroot.push("src");
sysroot.push("rust");
sysroot.push("src");
sysroot
}
pub fn get_local_sysroot_dir() -> PathBuf {
let mut x = PathBuf::new();
x.push("target");
x.push("sysroot");
fs::create_dir_all(&x).unwrap();
x.canonicalize().unwrap()
}
pub fn get_target_dir(mut base: PathBuf) -> PathBuf {
base.push("target");
base
}
pub fn get_output_dir<T: AsRef<Path>>(mut base: PathBuf, target: T) -> PathBuf {
base.push("lib");
base.push("rustlib");
base.push(target.as_ref().file_stem().unwrap());
base.push("lib");
fs::create_dir_all(&base).unwrap();
base
}
pub fn copy_host_tools(mut local_sysroot: PathBuf) {
let mut root = get_rustc_sysroot();
let host = root
.file_stem()
.unwrap()
.to_str()
.unwrap()
.split('-')
.skip(1)
.collect::<Vec<_>>()
.join("-");
local_sysroot.push("lib");
local_sysroot.push("rustlib");
local_sysroot.push(&host);
let src = {
root.push("lib");
root.push("rustlib");
root.push(&host);
root.push("bin");
root
};
let srcm = fs::metadata(&src).unwrap();
let tom = fs::metadata(&local_sysroot);
if let Ok(tom) = tom {
if tom.modified().unwrap() > srcm.modified().unwrap() {
return;
}
}
fs::create_dir_all(&local_sysroot).unwrap();
let mut options = CopyOptions::new();
options.overwrite = true;
copy(src, local_sysroot, &options).unwrap();
}