@@ -6,7 +6,7 @@ use std::fmt::Write;
66use std:: path:: PathBuf ;
77use std:: process:: { self , Command } ;
88
9- use rustc_build_sysroot:: { BuildMode , SysrootBuilder , SysrootConfig } ;
9+ use rustc_build_sysroot:: { BuildMode , SysrootBuilder , SysrootConfig , SysrootStatus } ;
1010use rustc_version:: VersionMeta ;
1111
1212use crate :: util:: * ;
@@ -137,32 +137,52 @@ pub fn setup(
137137 // not apply `RUSTFLAGS` to the sysroot either.
138138 let rustflags = & [ "-Cdebug-assertions=off" , "-Coverflow-checks=on" ] ;
139139
140- // Do the build.
141- if print_sysroot || quiet {
142- // Be silent.
143- } else {
140+ let notify = || {
144141 let mut msg = String :: new ( ) ;
145142 write ! ( msg, "Preparing a sysroot for Miri (target: {target})" ) . unwrap ( ) ;
146143 if verbose > 0 {
147144 write ! ( msg, " in {}" , sysroot_dir. display( ) ) . unwrap ( ) ;
148145 }
149146 write ! ( msg, "..." ) . unwrap ( ) ;
150- if only_setup {
147+
148+ if print_sysroot || quiet {
149+ // Be silent.
150+ } else if only_setup {
151151 // We want to be explicit.
152152 eprintln ! ( "{msg}" ) ;
153153 } else {
154154 // We want to be quiet, but still let the user know that something is happening.
155155 eprint ! ( "{msg} " ) ;
156156 }
157- }
158- SysrootBuilder :: new ( & sysroot_dir, target)
157+ } ;
158+
159+ // Do the build.
160+ let status = SysrootBuilder :: new ( & sysroot_dir, target)
159161 . build_mode ( BuildMode :: Check )
160162 . rustc_version ( rustc_version. clone ( ) )
161163 . sysroot_config ( sysroot_config)
162164 . rustflags ( rustflags)
163165 . cargo ( cargo_cmd)
164- . build_from_source ( & rust_src)
165- . unwrap_or_else ( |err| {
166+ . when_build_required ( notify)
167+ . build_from_source ( & rust_src) ;
168+ match status {
169+ Ok ( SysrootStatus :: AlreadyCached ) =>
170+ if only_setup && !( print_sysroot || quiet) {
171+ eprintln ! (
172+ "A sysroot for Miri is already available in `{}`." ,
173+ sysroot_dir. display( )
174+ ) ;
175+ } ,
176+ 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+ }
184+ }
185+ Err ( err) =>
166186 if print_sysroot {
167187 show_error ! ( "failed to build sysroot" )
168188 } else if only_setup {
@@ -171,15 +191,9 @@ pub fn setup(
171191 show_error ! (
172192 "failed to build sysroot; run `cargo miri setup` to see the error details"
173193 )
174- }
175- } ) ;
176- if print_sysroot || quiet {
177- // Be silent.
178- } else if only_setup {
179- eprintln ! ( "A sysroot for Miri is now available in `{}`." , sysroot_dir. display( ) ) ;
180- } else {
181- eprintln ! ( "done" ) ;
194+ } ,
182195 }
196+
183197 if print_sysroot {
184198 // Print just the sysroot and nothing else to stdout; this way we do not need any escaping.
185199 println ! ( "{}" , sysroot_dir. display( ) ) ;
0 commit comments