// 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. #![deny(warnings)] use std::process::{Command, Stdio}; use std::path::{Path, PathBuf}; pub fn run(cmd: &mut Command) { println!("running: {:?}", cmd); run_silent(cmd); } pub fn run_silent(cmd: &mut Command) { let status = match cmd.status() { Ok(status) => status, Err(e) => fail(&format!("failed to execute command: {}", e)), }; if !status.success() { fail(&format!("command did not execute successfully: {:?}\n\ expected success, got: {}", cmd, status)); } } pub fn gnu_target(target: &str) -> String { match target { "i686-pc-windows-msvc" => "i686-pc-win32".to_string(), "x86_64-pc-windows-msvc" => "x86_64-pc-win32".to_string(), "i686-pc-windows-gnu" => "i686-w64-mingw32".to_string(), "x86_64-pc-windows-gnu" => "x86_64-w64-mingw32".to_string(), s => s.to_string(), } } pub fn cc2ar(cc: &Path, target: &str) -> Option { if target.contains("msvc") { None } else if target.contains("musl") { Some(PathBuf::from("ar")) } else { let parent = cc.parent().unwrap(); let file = cc.file_name().unwrap().to_str().unwrap(); for suffix in &["gcc", "cc", "clang"] { if let Some(idx) = file.rfind(suffix) { let mut file = file[..idx].to_owned(); file.push_str("ar"); return Some(parent.join(&file)); } } Some(parent.join(file)) } } pub fn output(cmd: &mut Command) -> String { let output = match cmd.stderr(Stdio::inherit()).output() { Ok(status) => status, Err(e) => fail(&format!("failed to execute command: {}", e)), }; if !output.status.success() { panic!("command did not execute successfully: {:?}\n\ expected success, got: {}", cmd, output.status); } String::from_utf8(output.stdout).unwrap() } fn fail(s: &str) -> ! { println!("\n\n{}\n\n", s); std::process::exit(1); }