// Copyright 2015 The Rust Project Developers. See the COPYRIGHT // file at the top-level directory of this distribution and at // http://rust-lang.org/COPYRIGHT. // // Licensed under the Apache License, Version 2.0 or the MIT license // , at your // option. This file may not be copied, modified, or distributed // except according to those terms. use std::env; use std::path::{Path, PathBuf}; use std::fs; use std::process::Command; use bootstrap::{dylib_path, dylib_path_var}; use filetime::FileTime; pub fn staticlib(name: &str, target: &str) -> String { if target.contains("windows-msvc") { format!("{}.lib", name) } else { format!("lib{}.a", name) } } pub fn mtime(path: &Path) -> FileTime { fs::metadata(path).map(|f| { FileTime::from_last_modification_time(&f) }).unwrap_or(FileTime::zero()) } pub fn cp_r(src: &Path, dst: &Path) { for f in t!(fs::read_dir(src)) { let f = t!(f); let path = f.path(); let name = path.file_name().unwrap(); let dst = dst.join(name); if t!(f.file_type()).is_dir() { let _ = fs::remove_dir_all(&dst); t!(fs::create_dir(&dst)); cp_r(&path, &dst); } else { let _ = fs::remove_file(&dst); t!(fs::hard_link(&path, dst)); } } } /// Given an executable called `name`, return the filename for the /// executable for a particular target. pub fn exe(name: &str, target: &str) -> String { if target.contains("windows") { format!("{}.exe", name) } else { name.to_string() } } pub fn is_dylib(name: &str) -> bool { name.ends_with(".dylib") || name.ends_with(".so") || name.ends_with(".dll") } pub fn libdir(target: &str) -> &'static str { if target.contains("windows") {"bin"} else {"lib"} } pub fn add_lib_path(path: Vec, cmd: &mut Command) { let mut list = dylib_path(); for path in path { list.insert(0, path); } cmd.env(dylib_path_var(), t!(env::join_paths(list))); } #[allow(dead_code)] // this will be used soon pub fn up_to_date(src: &Path, dst: &Path) -> bool { let threshold = mtime(dst); let meta = t!(fs::metadata(src)); if meta.is_dir() { dir_up_to_date(src, &threshold) } else { FileTime::from_last_modification_time(&meta) <= threshold } } fn dir_up_to_date(src: &Path, threshold: &FileTime) -> bool { t!(fs::read_dir(src)).map(|e| t!(e)).all(|e| { let meta = t!(e.metadata()); if meta.is_dir() { dir_up_to_date(&e.path(), threshold) } else { FileTime::from_last_modification_time(&meta) < *threshold } }) }