22
33use std:: env;
44use std:: ffi:: OsStr ;
5- use std:: fmt:: Write ;
65use std:: path:: PathBuf ;
76use std:: process:: { self , Command } ;
87
@@ -24,6 +23,7 @@ pub fn setup(
2423 let only_setup = matches ! ( subcommand, MiriCommand :: Setup ) ;
2524 let ask_user = !only_setup;
2625 let print_sysroot = only_setup && has_arg_flag ( "--print-sysroot" ) ; // whether we just print the sysroot path
26+ let show_setup = only_setup && !print_sysroot;
2727 if !only_setup {
2828 if let Some ( sysroot) = std:: env:: var_os ( "MIRI_SYSROOT" ) {
2929 // Skip setup step if MIRI_SYSROOT is explicitly set, *unless* we are `cargo miri setup`.
@@ -115,18 +115,16 @@ pub fn setup(
115115 // `config.toml`.
116116 command. env ( "RUSTC_WRAPPER" , "" ) ;
117117
118- if only_setup && !print_sysroot {
118+ if show_setup {
119119 // Forward output. Even make it verbose, if requested.
120+ command. stdout ( process:: Stdio :: inherit ( ) ) ;
121+ command. stderr ( process:: Stdio :: inherit ( ) ) ;
120122 for _ in 0 ..verbose {
121123 command. arg ( "-v" ) ;
122124 }
123125 if quiet {
124126 command. arg ( "--quiet" ) ;
125127 }
126- } else {
127- // Suppress output.
128- command. stdout ( process:: Stdio :: null ( ) ) ;
129- command. stderr ( process:: Stdio :: null ( ) ) ;
130128 }
131129
132130 command
@@ -137,22 +135,25 @@ pub fn setup(
137135 // not apply `RUSTFLAGS` to the sysroot either.
138136 let rustflags = & [ "-Cdebug-assertions=off" , "-Coverflow-checks=on" ] ;
139137
138+ let mut after_build_output = String :: new ( ) ; // what should be printed when the build is done.
140139 let notify = || {
141- let mut msg = String :: new ( ) ;
142- write ! ( msg, "Preparing a sysroot for Miri (target: {target})" ) . unwrap ( ) ;
143- if verbose > 0 {
144- write ! ( msg, " in {}" , sysroot_dir. display( ) ) . unwrap ( ) ;
145- }
146- write ! ( msg, "..." ) . unwrap ( ) ;
147-
148- if print_sysroot || quiet {
149- // Be silent.
150- } else if only_setup {
151- // We want to be explicit.
152- eprintln ! ( "{msg}" ) ;
153- } else {
154- // We want to be quiet, but still let the user know that something is happening.
155- eprint ! ( "{msg} " ) ;
140+ if !quiet {
141+ eprint ! ( "Preparing a sysroot for Miri (target: {target})" ) ;
142+ if verbose > 0 {
143+ eprint ! ( " in {}" , sysroot_dir. display( ) ) ;
144+ }
145+ if show_setup {
146+ // Cargo will print things, so we need to finish this line.
147+ eprintln ! ( "..." ) ;
148+ after_build_output = format ! (
149+ "A sysroot for Miri is now available in `{}`.\n " ,
150+ sysroot_dir. display( )
151+ ) ;
152+ } else {
153+ // Keep all output on a single line.
154+ eprint ! ( "... " ) ;
155+ after_build_output = format ! ( "done\n " ) ;
156+ }
156157 }
157158 } ;
158159
@@ -167,31 +168,17 @@ pub fn setup(
167168 . build_from_source ( & rust_src) ;
168169 match status {
169170 Ok ( SysrootStatus :: AlreadyCached ) =>
170- if only_setup && ! ( print_sysroot || quiet ) {
171+ if !quiet && show_setup {
171172 eprintln ! (
172173 "A sysroot for Miri is already available in `{}`." ,
173174 sysroot_dir. display( )
174175 ) ;
175176 } ,
176177 Ok ( SysrootStatus :: SysrootBuilt ) => {
177- if print_sysroot || quiet {
178- // Be silent.
179- } else if only_setup {
180- eprintln ! ( "A sysroot for Miri is now available in `{}`." , sysroot_dir. display( ) ) ;
181- } else {
182- eprintln ! ( "done" ) ;
183- }
178+ // Print what `notify` prepared.
179+ eprint ! ( "{after_build_output}" ) ;
184180 }
185- Err ( err) =>
186- if print_sysroot {
187- show_error ! ( "failed to build sysroot" )
188- } else if only_setup {
189- show_error ! ( "failed to build sysroot: {err:?}" )
190- } else {
191- show_error ! (
192- "failed to build sysroot; run `cargo miri setup` to see the error details"
193- )
194- } ,
181+ Err ( err) => show_error ! ( "failed to build sysroot: {err:?}" ) ,
195182 }
196183
197184 if print_sysroot {
0 commit comments