@@ -58,6 +58,28 @@ impl fmt::Display for TestKind {
5858 }
5959}
6060
61+ fn try_run ( build : & Build , cmd : & mut Command ) {
62+ if build. flags . cmd . no_fail_fast ( ) {
63+ if !build. try_run ( cmd) {
64+ let failures = build. delayed_failures . get ( ) ;
65+ build. delayed_failures . set ( failures + 1 ) ;
66+ }
67+ } else {
68+ build. run ( cmd) ;
69+ }
70+ }
71+
72+ fn try_run_quiet ( build : & Build , cmd : & mut Command ) {
73+ if build. flags . cmd . no_fail_fast ( ) {
74+ if !build. try_run_quiet ( cmd) {
75+ let failures = build. delayed_failures . get ( ) ;
76+ build. delayed_failures . set ( failures + 1 ) ;
77+ }
78+ } else {
79+ build. run_quiet ( cmd) ;
80+ }
81+ }
82+
6183/// Runs the `linkchecker` tool as compiled in `stage` by the `host` compiler.
6284///
6385/// 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) {
6789 let compiler = Compiler :: new ( 0 , host) ;
6890
6991 let _time = util:: timeit ( ) ;
70- build . run ( build. tool_cmd ( & compiler, "linkchecker" )
71- . arg ( build. out . join ( host) . join ( "doc" ) ) ) ;
92+ try_run ( build , build. tool_cmd ( & compiler, "linkchecker" )
93+ . arg ( build. out . join ( host) . join ( "doc" ) ) ) ;
7294}
7395
7496/// 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) {
87109 let _time = util:: timeit ( ) ;
88110 let mut cmd = Command :: new ( build. tool ( & Compiler :: new ( 0 , host) , "cargotest" ) ) ;
89111 build. prepare_tool_cmd ( compiler, & mut cmd) ;
90- build . run ( cmd. arg ( & build. cargo )
91- . arg ( & out_dir)
92- . env ( "RUSTC" , build. compiler_path ( compiler) )
93- . env ( "RUSTDOC" , build. rustdoc ( compiler) ) )
112+ try_run ( build , cmd. arg ( & build. cargo )
113+ . arg ( & out_dir)
114+ . env ( "RUSTC" , build. compiler_path ( compiler) )
115+ . env ( "RUSTDOC" , build. rustdoc ( compiler) ) ) ;
94116}
95117
96118/// Runs `cargo test` for `cargo` packaged with Rust.
@@ -107,6 +129,9 @@ pub fn cargo(build: &Build, stage: u32, host: &str) {
107129
108130 let mut cargo = build. cargo ( compiler, Mode :: Tool , host, "test" ) ;
109131 cargo. arg ( "--manifest-path" ) . arg ( build. src . join ( "src/tools/cargo/Cargo.toml" ) ) ;
132+ if build. flags . cmd . no_fail_fast ( ) {
133+ cargo. arg ( "--no-fail-fast" ) ;
134+ }
110135
111136 // Don't build tests dynamically, just a pain to work with
112137 cargo. env ( "RUSTC_NO_PREFER_DYNAMIC" , "1" ) ;
@@ -115,7 +140,7 @@ pub fn cargo(build: &Build, stage: u32, host: &str) {
115140 // available.
116141 cargo. env ( "CFG_DISABLE_CROSS_TESTS" , "1" ) ;
117142
118- build . run ( cargo. env ( "PATH" , newpath) ) ;
143+ try_run ( build , cargo. env ( "PATH" , newpath) ) ;
119144}
120145
121146/// Runs the `tidy` tool as compiled in `stage` by the `host` compiler.
@@ -135,7 +160,7 @@ pub fn tidy(build: &Build, host: &str) {
135160 if build. config . quiet_tests {
136161 cmd. arg ( "--quiet" ) ;
137162 }
138- build . run ( & mut cmd) ;
163+ try_run ( build , & mut cmd) ;
139164}
140165
141166fn testdir ( build : & Build , host : & str ) -> PathBuf {
@@ -286,7 +311,7 @@ pub fn compiletest(build: &Build,
286311 build. ci_env . force_coloring_in_ci ( & mut cmd) ;
287312
288313 let _time = util:: timeit ( ) ;
289- build . run ( & mut cmd) ;
314+ try_run ( build , & mut cmd) ;
290315}
291316
292317/// Run `rustdoc --test` for all documentation in `src/doc`.
@@ -362,9 +387,9 @@ fn markdown_test(build: &Build, compiler: &Compiler, markdown: &Path) {
362387 cmd. arg ( "--test-args" ) . arg ( test_args) ;
363388
364389 if build. config . quiet_tests {
365- build . run_quiet ( & mut cmd) ;
390+ try_run_quiet ( build , & mut cmd) ;
366391 } else {
367- build . run ( & mut cmd) ;
392+ try_run ( build , & mut cmd) ;
368393 }
369394}
370395
@@ -419,6 +444,9 @@ pub fn krate(build: &Build,
419444 cargo. arg ( "--manifest-path" )
420445 . arg ( build. src . join ( path) . join ( "Cargo.toml" ) )
421446 . arg ( "--features" ) . arg ( features) ;
447+ if test_kind. subcommand ( ) == "test" && build. flags . cmd . no_fail_fast ( ) {
448+ cargo. arg ( "--no-fail-fast" ) ;
449+ }
422450
423451 match krate {
424452 Some ( krate) => {
@@ -478,7 +506,7 @@ pub fn krate(build: &Build,
478506 krate_remote ( build, & compiler, target, mode) ;
479507 } else {
480508 cargo. args ( & build. flags . cmd . test_args ( ) ) ;
481- build . run ( & mut cargo) ;
509+ try_run ( build , & mut cargo) ;
482510 }
483511}
484512
@@ -499,7 +527,7 @@ fn krate_emscripten(build: &Build,
499527 if build. config . quiet_tests {
500528 cmd. arg ( "--quiet" ) ;
501529 }
502- build . run ( & mut cmd) ;
530+ try_run ( build , & mut cmd) ;
503531 }
504532}
505533
@@ -521,7 +549,7 @@ fn krate_remote(build: &Build,
521549 cmd. arg ( "--quiet" ) ;
522550 }
523551 cmd. args ( & build. flags . cmd . test_args ( ) ) ;
524- build . run ( & mut cmd) ;
552+ try_run ( build , & mut cmd) ;
525553 }
526554}
527555
@@ -637,6 +665,9 @@ pub fn bootstrap(build: &Build) {
637665 . current_dir ( build. src . join ( "src/bootstrap" ) )
638666 . env ( "CARGO_TARGET_DIR" , build. out . join ( "bootstrap" ) )
639667 . env ( "RUSTC" , & build. rustc ) ;
668+ if build. flags . cmd . no_fail_fast ( ) {
669+ cmd. arg ( "--no-fail-fast" ) ;
670+ }
640671 cmd. arg ( "--" ) . args ( & build. flags . cmd . test_args ( ) ) ;
641- build . run ( & mut cmd) ;
672+ try_run ( build , & mut cmd) ;
642673}
0 commit comments