diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index e11f7bd089f6c..d048645d4d530 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -232,12 +232,6 @@ fn main() { if let Some(rpath) = rpath { cmd.arg("-C").arg(format!("link-args={}", rpath)); } - - if let Ok(s) = env::var("RUSTFLAGS") { - for flag in s.split_whitespace() { - cmd.arg(flag); - } - } } if target.contains("pc-windows-msvc") { diff --git a/src/bootstrap/check.rs b/src/bootstrap/check.rs index d51e3102d8ad0..5483b6a914b29 100644 --- a/src/bootstrap/check.rs +++ b/src/bootstrap/check.rs @@ -58,6 +58,28 @@ impl fmt::Display for TestKind { } } +fn try_run(build: &Build, cmd: &mut Command) { + if build.flags.cmd.no_fail_fast() { + if !build.try_run(cmd) { + let failures = build.delayed_failures.get(); + build.delayed_failures.set(failures + 1); + } + } else { + build.run(cmd); + } +} + +fn try_run_quiet(build: &Build, cmd: &mut Command) { + if build.flags.cmd.no_fail_fast() { + if !build.try_run_quiet(cmd) { + let failures = build.delayed_failures.get(); + build.delayed_failures.set(failures + 1); + } + } else { + build.run_quiet(cmd); + } +} + /// Runs the `linkchecker` tool as compiled in `stage` by the `host` compiler. /// /// This tool in `src/tools` will verify the validity of all our links in the @@ -67,8 +89,8 @@ pub fn linkcheck(build: &Build, host: &str) { let compiler = Compiler::new(0, host); let _time = util::timeit(); - build.run(build.tool_cmd(&compiler, "linkchecker") - .arg(build.out.join(host).join("doc"))); + try_run(build, build.tool_cmd(&compiler, "linkchecker") + .arg(build.out.join(host).join("doc"))); } /// Runs the `cargotest` tool as compiled in `stage` by the `host` compiler. @@ -87,10 +109,10 @@ pub fn cargotest(build: &Build, stage: u32, host: &str) { let _time = util::timeit(); let mut cmd = Command::new(build.tool(&Compiler::new(0, host), "cargotest")); build.prepare_tool_cmd(compiler, &mut cmd); - build.run(cmd.arg(&build.cargo) - .arg(&out_dir) - .env("RUSTC", build.compiler_path(compiler)) - .env("RUSTDOC", build.rustdoc(compiler))) + try_run(build, cmd.arg(&build.cargo) + .arg(&out_dir) + .env("RUSTC", build.compiler_path(compiler)) + .env("RUSTDOC", build.rustdoc(compiler))); } /// Runs `cargo test` for `cargo` packaged with Rust. @@ -107,6 +129,9 @@ pub fn cargo(build: &Build, stage: u32, host: &str) { let mut cargo = build.cargo(compiler, Mode::Tool, host, "test"); cargo.arg("--manifest-path").arg(build.src.join("src/tools/cargo/Cargo.toml")); + if build.flags.cmd.no_fail_fast() { + cargo.arg("--no-fail-fast"); + } // Don't build tests dynamically, just a pain to work with cargo.env("RUSTC_NO_PREFER_DYNAMIC", "1"); @@ -115,7 +140,7 @@ pub fn cargo(build: &Build, stage: u32, host: &str) { // available. cargo.env("CFG_DISABLE_CROSS_TESTS", "1"); - build.run(cargo.env("PATH", newpath)); + try_run(build, cargo.env("PATH", newpath)); } /// Runs the `tidy` tool as compiled in `stage` by the `host` compiler. @@ -135,7 +160,7 @@ pub fn tidy(build: &Build, host: &str) { if build.config.quiet_tests { cmd.arg("--quiet"); } - build.run(&mut cmd); + try_run(build, &mut cmd); } fn testdir(build: &Build, host: &str) -> PathBuf { @@ -286,7 +311,7 @@ pub fn compiletest(build: &Build, build.ci_env.force_coloring_in_ci(&mut cmd); let _time = util::timeit(); - build.run(&mut cmd); + try_run(build, &mut cmd); } /// Run `rustdoc --test` for all documentation in `src/doc`. @@ -362,9 +387,9 @@ fn markdown_test(build: &Build, compiler: &Compiler, markdown: &Path) { cmd.arg("--test-args").arg(test_args); if build.config.quiet_tests { - build.run_quiet(&mut cmd); + try_run_quiet(build, &mut cmd); } else { - build.run(&mut cmd); + try_run(build, &mut cmd); } } @@ -419,6 +444,9 @@ pub fn krate(build: &Build, cargo.arg("--manifest-path") .arg(build.src.join(path).join("Cargo.toml")) .arg("--features").arg(features); + if test_kind.subcommand() == "test" && build.flags.cmd.no_fail_fast() { + cargo.arg("--no-fail-fast"); + } match krate { Some(krate) => { @@ -478,7 +506,7 @@ pub fn krate(build: &Build, krate_remote(build, &compiler, target, mode); } else { cargo.args(&build.flags.cmd.test_args()); - build.run(&mut cargo); + try_run(build, &mut cargo); } } @@ -499,7 +527,7 @@ fn krate_emscripten(build: &Build, if build.config.quiet_tests { cmd.arg("--quiet"); } - build.run(&mut cmd); + try_run(build, &mut cmd); } } @@ -521,7 +549,7 @@ fn krate_remote(build: &Build, cmd.arg("--quiet"); } cmd.args(&build.flags.cmd.test_args()); - build.run(&mut cmd); + try_run(build, &mut cmd); } } @@ -637,6 +665,9 @@ pub fn bootstrap(build: &Build) { .current_dir(build.src.join("src/bootstrap")) .env("CARGO_TARGET_DIR", build.out.join("bootstrap")) .env("RUSTC", &build.rustc); + if build.flags.cmd.no_fail_fast() { + cmd.arg("--no-fail-fast"); + } cmd.arg("--").args(&build.flags.cmd.test_args()); - build.run(&mut cmd); + try_run(build, &mut cmd); } diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index fe4e18ab622cd..f100baa5d2ca7 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -61,6 +61,7 @@ pub enum Subcommand { Test { paths: Vec, test_args: Vec, + no_fail_fast: bool, }, Bench { paths: Vec, @@ -141,7 +142,10 @@ To learn more about a subcommand, run `./x.py -h`"); // Some subcommands get extra options match subcommand.as_str() { - "test" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); }, + "test" => { + opts.optflag("", "no-fail-fast", "Run all tests regardless of failure"); + opts.optmulti("", "test-args", "extra arguments", "ARGS"); + }, "bench" => { opts.optmulti("", "test-args", "extra arguments", "ARGS"); }, _ => { }, }; @@ -263,6 +267,7 @@ Arguments: Subcommand::Test { paths: paths, test_args: matches.opt_strs("test-args"), + no_fail_fast: matches.opt_present("no-fail-fast"), } } "bench" => { @@ -342,6 +347,13 @@ impl Subcommand { _ => Vec::new(), } } + + pub fn no_fail_fast(&self) -> bool { + match *self { + Subcommand::Test { no_fail_fast, .. } => no_fail_fast, + _ => false, + } + } } fn split(s: Vec) -> Vec { diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 01235fe30bd65..2fe6a2a3ae89f 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -79,6 +79,7 @@ extern crate toml; #[cfg(unix)] extern crate libc; +use std::cell::Cell; use std::cmp; use std::collections::HashMap; use std::env; @@ -88,7 +89,7 @@ use std::io::Read; use std::path::{PathBuf, Path}; use std::process::Command; -use build_helper::{run_silent, run_suppressed, output, mtime}; +use build_helper::{run_silent, run_suppressed, try_run_silent, try_run_suppressed, output, mtime}; use util::{exe, libdir, add_lib_path, OutputFolder, CiEnv}; @@ -180,6 +181,7 @@ pub struct Build { is_sudo: bool, src_is_git: bool, ci_env: CiEnv, + delayed_failures: Cell, } #[derive(Debug)] @@ -274,6 +276,7 @@ impl Build { is_sudo: is_sudo, src_is_git: src_is_git, ci_env: CiEnv::current(), + delayed_failures: Cell::new(0), } } @@ -784,6 +787,22 @@ impl Build { run_suppressed(cmd) } + /// Runs a command, printing out nice contextual information if it fails. + /// Exits if the command failed to execute at all, otherwise returns its + /// `status.success()`. + fn try_run(&self, cmd: &mut Command) -> bool { + self.verbose(&format!("running: {:?}", cmd)); + try_run_silent(cmd) + } + + /// Runs a command, printing out nice contextual information if it fails. + /// Exits if the command failed to execute at all, otherwise returns its + /// `status.success()`. + fn try_run_quiet(&self, cmd: &mut Command) -> bool { + self.verbose(&format!("running: {:?}", cmd)); + try_run_suppressed(cmd) + } + /// Prints a message if this build is configured in verbose mode. fn verbose(&self, msg: &str) { if self.flags.verbose() || self.config.verbose() { diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index ce1f63b4233e2..6b9a6347d2272 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -184,7 +184,7 @@ pub fn llvm(build: &Build, target: &str) { configure_compilers(&mut cfg); if env::var_os("SCCACHE_ERROR_LOG").is_some() { - cfg.env("RUST_LOG", "sccache=info"); + cfg.env("RUST_LOG", "sccache=warn"); } // FIXME: we don't actually need to build all LLVM tools and all LLVM diff --git a/src/bootstrap/step.rs b/src/bootstrap/step.rs index 16029a8a0cccd..9e8b08a23b7e9 100644 --- a/src/bootstrap/step.rs +++ b/src/bootstrap/step.rs @@ -28,6 +28,7 @@ use std::collections::{BTreeMap, HashSet, HashMap}; use std::mem; +use std::process; use check::{self, TestKind}; use compile; @@ -1174,8 +1175,8 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd? let (kind, paths) = match self.build.flags.cmd { Subcommand::Build { ref paths } => (Kind::Build, &paths[..]), Subcommand::Doc { ref paths } => (Kind::Doc, &paths[..]), - Subcommand::Test { ref paths, test_args: _ } => (Kind::Test, &paths[..]), - Subcommand::Bench { ref paths, test_args: _ } => (Kind::Bench, &paths[..]), + Subcommand::Test { ref paths, .. } => (Kind::Test, &paths[..]), + Subcommand::Bench { ref paths, .. } => (Kind::Bench, &paths[..]), Subcommand::Dist { ref paths } => (Kind::Dist, &paths[..]), Subcommand::Install { ref paths } => (Kind::Install, &paths[..]), Subcommand::Clean => panic!(), @@ -1268,6 +1269,13 @@ invalid rule dependency graph detected, was a rule added and maybe typo'd? self.build.verbose(&format!("executing step {:?}", step)); (self.rules[step.name].run)(step); } + + // Check for postponed failures from `test --no-fail-fast`. + let failures = self.build.delayed_failures.get(); + if failures > 0 { + println!("\n{} command(s) did not execute successfully.\n", failures); + process::exit(1); + } } /// From the top level targets `steps` generate a topological ordering of diff --git a/src/build_helper/lib.rs b/src/build_helper/lib.rs index da00b970da977..ea6a822e360a4 100644 --- a/src/build_helper/lib.rs +++ b/src/build_helper/lib.rs @@ -42,35 +42,49 @@ pub fn run(cmd: &mut Command) { } pub fn run_silent(cmd: &mut Command) { + if !try_run_silent(cmd) { + std::process::exit(1); + } +} + +pub fn try_run_silent(cmd: &mut Command) -> bool { let status = match cmd.status() { Ok(status) => status, Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), }; if !status.success() { - fail(&format!("command did not execute successfully: {:?}\n\ - expected success, got: {}", - cmd, - status)); + println!("\n\ncommand did not execute successfully: {:?}\n\ + expected success, got: {}\n\n", + cmd, + status); } + status.success() } pub fn run_suppressed(cmd: &mut Command) { + if !try_run_suppressed(cmd) { + std::process::exit(1); + } +} + +pub fn try_run_suppressed(cmd: &mut Command) -> bool { let output = match cmd.output() { Ok(status) => status, Err(e) => fail(&format!("failed to execute command: {:?}\nerror: {}", cmd, e)), }; if !output.status.success() { - fail(&format!("command did not execute successfully: {:?}\n\ - expected success, got: {}\n\n\ - stdout ----\n{}\n\ - stderr ----\n{}\n", - cmd, - output.status, - String::from_utf8_lossy(&output.stdout), - String::from_utf8_lossy(&output.stderr))); + println!("\n\ncommand did not execute successfully: {:?}\n\ + expected success, got: {}\n\n\ + stdout ----\n{}\n\ + stderr ----\n{}\n\n", + cmd, + output.status, + String::from_utf8_lossy(&output.stdout), + String::from_utf8_lossy(&output.stderr)); } + output.status.success() } pub fn gnu_target(target: &str) -> String { diff --git a/src/ci/docker/run.sh b/src/ci/docker/run.sh index a9b1167b6faf7..4f34a7214cbc6 100755 --- a/src/ci/docker/run.sh +++ b/src/ci/docker/run.sh @@ -79,6 +79,7 @@ exec docker \ --env DEPLOY_ALT=$DEPLOY_ALT \ --env LOCAL_USER_ID=`id -u` \ --env TRAVIS=${TRAVIS-false} \ + --env TRAVIS_BRANCH \ --volume "$HOME/.cargo:/cargo" \ --volume "$HOME/rustsrc:$HOME/rustsrc" \ --privileged \ diff --git a/src/ci/run.sh b/src/ci/run.sh index 08f5939ef7908..549e804603c07 100755 --- a/src/ci/run.sh +++ b/src/ci/run.sh @@ -23,6 +23,10 @@ fi ci_dir=`cd $(dirname $0) && pwd` source "$ci_dir/shared.sh" +if [ "$TRAVIS" == "true" ] && [ "$TRAVIS_BRANCH" != "auto" ]; then + RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-quiet-tests" +fi + RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-sccache" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --disable-manage-submodules" RUST_CONFIGURE_ARGS="$RUST_CONFIGURE_ARGS --enable-locked-deps" diff --git a/src/doc/book b/src/doc/book index 97422981c53a0..f746084b09906 160000 --- a/src/doc/book +++ b/src/doc/book @@ -1 +1 @@ -Subproject commit 97422981c53a00f7c3d6584d363443117f179fff +Subproject commit f746084b099060f55ac5e7d8050797593fcedd6e diff --git a/src/doc/nomicon b/src/doc/nomicon index 6fa139b1630a9..c0e8c56d76bdf 160000 --- a/src/doc/nomicon +++ b/src/doc/nomicon @@ -1 +1 @@ -Subproject commit 6fa139b1630a9bb95dcd60cfc90aff9c19e54580 +Subproject commit c0e8c56d76bdf6bd16c64338f81c04d48c60f117 diff --git a/src/doc/reference b/src/doc/reference index f7a108dfa9e90..876582e9d0fbd 160000 --- a/src/doc/reference +++ b/src/doc/reference @@ -1 +1 @@ -Subproject commit f7a108dfa9e90b07821700c55d01f08a9adf005c +Subproject commit 876582e9d0fbdc9cecb03133c28db96e9ff8c844