@@ -6,7 +6,7 @@ use std::fmt::Write;
6
6
use std:: path:: PathBuf ;
7
7
use std:: process:: { self , Command } ;
8
8
9
- use rustc_build_sysroot:: { BuildMode , SysrootBuilder , SysrootConfig } ;
9
+ use rustc_build_sysroot:: { BuildMode , SysrootBuilder , SysrootConfig , SysrootStatus } ;
10
10
use rustc_version:: VersionMeta ;
11
11
12
12
use crate :: util:: * ;
@@ -137,32 +137,52 @@ pub fn setup(
137
137
// not apply `RUSTFLAGS` to the sysroot either.
138
138
let rustflags = & [ "-Cdebug-assertions=off" , "-Coverflow-checks=on" ] ;
139
139
140
- // Do the build.
141
- if print_sysroot || quiet {
142
- // Be silent.
143
- } else {
140
+ let notify = || {
144
141
let mut msg = String :: new ( ) ;
145
142
write ! ( msg, "Preparing a sysroot for Miri (target: {target})" ) . unwrap ( ) ;
146
143
if verbose > 0 {
147
144
write ! ( msg, " in {}" , sysroot_dir. display( ) ) . unwrap ( ) ;
148
145
}
149
146
write ! ( msg, "..." ) . unwrap ( ) ;
150
- if only_setup {
147
+
148
+ if print_sysroot || quiet {
149
+ // Be silent.
150
+ } else if only_setup {
151
151
// We want to be explicit.
152
152
eprintln ! ( "{msg}" ) ;
153
153
} else {
154
154
// We want to be quiet, but still let the user know that something is happening.
155
155
eprint ! ( "{msg} " ) ;
156
156
}
157
- }
158
- SysrootBuilder :: new ( & sysroot_dir, target)
157
+ } ;
158
+
159
+ // Do the build.
160
+ let status = SysrootBuilder :: new ( & sysroot_dir, target)
159
161
. build_mode ( BuildMode :: Check )
160
162
. rustc_version ( rustc_version. clone ( ) )
161
163
. sysroot_config ( sysroot_config)
162
164
. rustflags ( rustflags)
163
165
. 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) =>
166
186
if print_sysroot {
167
187
show_error ! ( "failed to build sysroot" )
168
188
} else if only_setup {
@@ -171,15 +191,9 @@ pub fn setup(
171
191
show_error ! (
172
192
"failed to build sysroot; run `cargo miri setup` to see the error details"
173
193
)
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
+ } ,
182
195
}
196
+
183
197
if print_sysroot {
184
198
// Print just the sysroot and nothing else to stdout; this way we do not need any escaping.
185
199
println ! ( "{}" , sysroot_dir. display( ) ) ;
0 commit comments