@@ -26,7 +26,7 @@ use crate::{
26
26
env:: { cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env} ,
27
27
project_json:: { Crate , CrateArrayIdx } ,
28
28
sysroot:: { SysrootCrate , SysrootMode } ,
29
- toolchain_info:: { rustc_cfg, target_data_layout, target_tuple, QueryConfig } ,
29
+ toolchain_info:: { rustc_cfg, target_data_layout, target_tuple, version , QueryConfig } ,
30
30
utf8_stdout, CargoConfig , CargoWorkspace , CfgOverrides , InvocationStrategy , ManifestPath ,
31
31
Package , ProjectJson , ProjectManifest , Sysroot , TargetData , TargetKind , WorkspaceBuildScripts ,
32
32
} ;
@@ -150,27 +150,6 @@ impl fmt::Debug for ProjectWorkspace {
150
150
}
151
151
}
152
152
153
- fn get_toolchain_version (
154
- current_dir : & AbsPath ,
155
- sysroot : & Sysroot ,
156
- tool : Tool ,
157
- extra_env : & FxHashMap < String , String > ,
158
- prefix : & str ,
159
- ) -> Result < Option < Version > , anyhow:: Error > {
160
- let cargo_version = utf8_stdout ( & mut {
161
- let mut cmd = Sysroot :: tool ( sysroot, tool, current_dir) ;
162
- cmd. envs ( extra_env) ;
163
- cmd. arg ( "--version" ) ;
164
- cmd
165
- } )
166
- . with_context ( || format ! ( "Failed to query rust toolchain version at {current_dir}, is your toolchain setup correctly?" ) ) ?;
167
- anyhow:: Ok (
168
- cargo_version
169
- . get ( prefix. len ( ) ..)
170
- . and_then ( |it| Version :: parse ( it. split_whitespace ( ) . next ( ) ?) . ok ( ) ) ,
171
- )
172
- }
173
-
174
153
impl ProjectWorkspace {
175
154
pub fn load (
176
155
manifest : ProjectManifest ,
@@ -249,12 +228,10 @@ impl ProjectWorkspace {
249
228
. ok_or_else ( || Some ( "Failed to discover rustc source for sysroot." . to_owned ( ) ) ) ,
250
229
None => Err ( None ) ,
251
230
} ;
252
- let targets = target_tuple:: get (
253
- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
254
- config. target . as_deref ( ) ,
255
- & config. extra_env ,
256
- )
257
- . unwrap_or_default ( ) ;
231
+ let toolchain_config = QueryConfig :: Cargo ( & sysroot, cargo_toml) ;
232
+ let targets =
233
+ target_tuple:: get ( toolchain_config, config. target . as_deref ( ) , & config. extra_env )
234
+ . unwrap_or_default ( ) ;
258
235
let rustc = rustc_dir. and_then ( |rustc_dir| {
259
236
info ! ( workspace = %cargo_toml, rustc_dir = %rustc_dir, "Using rustc source" ) ;
260
237
match CargoWorkspace :: fetch_metadata (
@@ -291,21 +268,19 @@ impl ProjectWorkspace {
291
268
}
292
269
}
293
270
} ) ;
294
- let toolchain = get_toolchain_version (
295
- cargo_toml. parent ( ) ,
296
- & sysroot,
297
- Tool :: Cargo ,
298
- & config. extra_env ,
299
- "cargo " ,
300
- ) ?;
301
- let rustc_cfg = rustc_cfg:: get (
302
- QueryConfig :: Cargo ( & sysroot, cargo_toml) ,
303
- targets. first ( ) . map ( Deref :: deref) ,
304
- & config. extra_env ,
305
- ) ;
271
+ let toolchain = version:: get ( toolchain_config, & config. extra_env )
272
+ . inspect_err ( |e| {
273
+ tracing:: error!( %e,
274
+ "failed fetching toolchain version for {cargo_toml:?} workspace"
275
+ )
276
+ } )
277
+ . ok ( )
278
+ . flatten ( ) ;
279
+ let rustc_cfg =
280
+ rustc_cfg:: get ( toolchain_config, targets. first ( ) . map ( Deref :: deref) , & config. extra_env ) ;
306
281
let cfg_overrides = config. cfg_overrides . clone ( ) ;
307
282
let data_layout = target_data_layout:: get (
308
- QueryConfig :: Cargo ( & sysroot , cargo_toml ) ,
283
+ toolchain_config ,
309
284
targets. first ( ) . map ( Deref :: deref) ,
310
285
& config. extra_env ,
311
286
) ;
@@ -355,19 +330,7 @@ impl ProjectWorkspace {
355
330
& config. sysroot_query_metadata ,
356
331
) ;
357
332
let query_config = QueryConfig :: Rustc ( & sysroot, project_json. path ( ) . as_ref ( ) ) ;
358
- let toolchain = match get_toolchain_version (
359
- project_json. path ( ) ,
360
- & sysroot,
361
- Tool :: Rustc ,
362
- & config. extra_env ,
363
- "rustc " ,
364
- ) {
365
- Ok ( it) => it,
366
- Err ( e) => {
367
- tracing:: error!( "{e}" ) ;
368
- None
369
- }
370
- } ;
333
+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
371
334
372
335
let target = config. target . as_deref ( ) ;
373
336
let rustc_cfg = rustc_cfg:: get ( query_config, target, & config. extra_env ) ;
@@ -397,22 +360,10 @@ impl ProjectWorkspace {
397
360
None => Sysroot :: empty ( ) ,
398
361
} ;
399
362
400
- let toolchain =
401
- match get_toolchain_version ( dir, & sysroot, Tool :: Rustc , & config. extra_env , "rustc " ) {
402
- Ok ( it) => it,
403
- Err ( e) => {
404
- tracing:: error!( "{e}" ) ;
405
- None
406
- }
407
- } ;
408
-
409
- let targets = target_tuple:: get (
410
- QueryConfig :: Cargo ( & sysroot, detached_file) ,
411
- config. target . as_deref ( ) ,
412
- & config. extra_env ,
413
- )
414
- . unwrap_or_default ( ) ;
415
- let query_config = QueryConfig :: Rustc ( & sysroot, dir. as_ref ( ) ) ;
363
+ let query_config = QueryConfig :: Cargo ( & sysroot, detached_file) ;
364
+ let toolchain = version:: get ( query_config, & config. extra_env ) . ok ( ) . flatten ( ) ;
365
+ let targets = target_tuple:: get ( query_config, config. target . as_deref ( ) , & config. extra_env )
366
+ . unwrap_or_default ( ) ;
416
367
let rustc_cfg = rustc_cfg:: get ( query_config, None , & config. extra_env ) ;
417
368
let data_layout = target_data_layout:: get ( query_config, None , & config. extra_env ) ;
418
369
0 commit comments