diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index af75faf698e..d6649d0521c 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -16,7 +16,6 @@ //! never get replaced. use std::env; -use std::io; use std::path::PathBuf; use std::process::Command; use std::str::FromStr; @@ -147,22 +146,15 @@ fn main() { eprintln!("libdir: {:?}", libdir); } - if let Some(mut on_fail) = on_fail { - let e = match cmd.status() { - Ok(s) if s.success() => std::process::exit(0), - e => e, - }; - println!("\nDid not run successfully: {:?}\n{:?}\n-------------", e, cmd); - status_code(&mut on_fail).expect("could not run the backup command"); - std::process::exit(1); - } + let start = Instant::now(); + let status = { + let errmsg = format!("\nFailed to run:\n{:?}\n-------------", cmd); + cmd.status().expect(&errmsg) + }; if env::var_os("RUSTC_PRINT_STEP_TIMINGS").is_some() { if let Some(crate_name) = crate_name { - let start = Instant::now(); - let status = cmd.status().unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); let dur = start.elapsed(); - let is_test = args.iter().any(|a| a == "--test"); eprintln!( "[RUSTC-TIMING] {} test:{} {}.{:03}", @@ -171,21 +163,27 @@ fn main() { dur.as_secs(), dur.subsec_millis() ); - - match status.code() { - Some(i) => std::process::exit(i), - None => { - eprintln!("rustc exited with {}", status); - std::process::exit(0xfe); - } - } } } - let code = status_code(&mut cmd).unwrap_or_else(|_| panic!("\n\n failed to run {:?}", cmd)); - std::process::exit(code); -} + if status.success() { + std::process::exit(0); + // note: everything below here is unreachable. do not put code that + // should run on success, after this block. + } + println!("\nDid not run successfully: {}\n{:?}\n-------------", status, cmd); -fn status_code(cmd: &mut Command) -> io::Result { - cmd.status().map(|status| status.code().unwrap()) + if let Some(mut on_fail) = on_fail { + on_fail.status().expect("Could not run the on_fail command"); + } + + // Preserve the exit code. In case of signal, exit with 0xfe since it's + // awkward to preserve this status in a cross-platform way. + match status.code() { + Some(i) => std::process::exit(i), + None => { + eprintln!("rustc exited with {}", status); + std::process::exit(0xfe); + } + } }