@@ -22,38 +22,40 @@ use toolchain::{probe_for_binary, Tool};
22
22
23
23
use crate :: {
24
24
cargo_workspace:: CargoMetadataConfig , utf8_stdout, CargoWorkspace , ManifestPath ,
25
- SysrootSourceWorkspaceConfig ,
25
+ RustSourceWorkspaceConfig ,
26
26
} ;
27
27
28
28
#[ derive( Debug , Clone , PartialEq , Eq ) ]
29
29
pub struct Sysroot {
30
30
root : Option < AbsPathBuf > ,
31
- src_root : Option < AbsPathBuf > ,
32
- workspace : SysrootWorkspace ,
31
+ rust_lib_src_root : Option < AbsPathBuf > ,
32
+ workspace : RustLibSrcWorkspace ,
33
33
error : Option < String > ,
34
34
}
35
35
36
36
#[ derive( Debug , Clone , Eq , PartialEq ) ]
37
- pub enum SysrootWorkspace {
37
+ pub enum RustLibSrcWorkspace {
38
38
Workspace ( CargoWorkspace ) ,
39
39
Stitched ( Stitched ) ,
40
40
Empty ,
41
41
}
42
42
43
43
#[ derive( Debug , Clone , Eq , PartialEq ) ]
44
44
pub struct Stitched {
45
- crates : Arena < SysrootCrateData > ,
45
+ crates : Arena < RustLibSrcCrateData > ,
46
46
}
47
47
48
- impl ops:: Index < SysrootCrate > for Stitched {
49
- type Output = SysrootCrateData ;
50
- fn index ( & self , index : SysrootCrate ) -> & SysrootCrateData {
48
+ impl ops:: Index < RustLibSrcCrate > for Stitched {
49
+ type Output = RustLibSrcCrateData ;
50
+ fn index ( & self , index : RustLibSrcCrate ) -> & RustLibSrcCrateData {
51
51
& self . crates [ index]
52
52
}
53
53
}
54
54
55
55
impl Stitched {
56
- pub ( crate ) fn public_deps ( & self ) -> impl Iterator < Item = ( CrateName , SysrootCrate , bool ) > + ' _ {
56
+ pub ( crate ) fn public_deps (
57
+ & self ,
58
+ ) -> impl Iterator < Item = ( CrateName , RustLibSrcCrate , bool ) > + ' _ {
57
59
// core is added as a dependency before std in order to
58
60
// mimic rustcs dependency order
59
61
[ ( "core" , true ) , ( "alloc" , false ) , ( "std" , true ) , ( "test" , false ) ] . into_iter ( ) . filter_map (
@@ -63,32 +65,37 @@ impl Stitched {
63
65
)
64
66
}
65
67
66
- pub ( crate ) fn proc_macro ( & self ) -> Option < SysrootCrate > {
68
+ pub ( crate ) fn proc_macro ( & self ) -> Option < RustLibSrcCrate > {
67
69
self . by_name ( "proc_macro" )
68
70
}
69
71
70
- pub ( crate ) fn crates ( & self ) -> impl ExactSizeIterator < Item = SysrootCrate > + ' _ {
72
+ pub ( crate ) fn crates ( & self ) -> impl ExactSizeIterator < Item = RustLibSrcCrate > + ' _ {
71
73
self . crates . iter ( ) . map ( |( id, _data) | id)
72
74
}
73
75
74
- fn by_name ( & self , name : & str ) -> Option < SysrootCrate > {
76
+ fn by_name ( & self , name : & str ) -> Option < RustLibSrcCrate > {
75
77
let ( id, _data) = self . crates . iter ( ) . find ( |( _id, data) | data. name == name) ?;
76
78
Some ( id)
77
79
}
78
80
}
79
81
80
- pub ( crate ) type SysrootCrate = Idx < SysrootCrateData > ;
82
+ pub ( crate ) type RustLibSrcCrate = Idx < RustLibSrcCrateData > ;
81
83
82
84
#[ derive( Debug , Clone , Eq , PartialEq ) ]
83
- pub ( crate ) struct SysrootCrateData {
85
+ pub ( crate ) struct RustLibSrcCrateData {
84
86
pub ( crate ) name : String ,
85
87
pub ( crate ) root : ManifestPath ,
86
- pub ( crate ) deps : Vec < SysrootCrate > ,
88
+ pub ( crate ) deps : Vec < RustLibSrcCrate > ,
87
89
}
88
90
89
91
impl Sysroot {
90
92
pub const fn empty ( ) -> Sysroot {
91
- Sysroot { root : None , src_root : None , workspace : SysrootWorkspace :: Empty , error : None }
93
+ Sysroot {
94
+ root : None ,
95
+ rust_lib_src_root : None ,
96
+ workspace : RustLibSrcWorkspace :: Empty ,
97
+ error : None ,
98
+ }
92
99
}
93
100
94
101
/// Returns sysroot "root" directory, where `bin/`, `etc/`, `lib/`, `libexec/`
@@ -100,15 +107,15 @@ impl Sysroot {
100
107
101
108
/// Returns the sysroot "source" directory, where stdlib sources are located, like:
102
109
/// `$HOME/.rustup/toolchains/nightly-2022-07-23-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library`
103
- pub fn src_root ( & self ) -> Option < & AbsPath > {
104
- self . src_root . as_deref ( )
110
+ pub fn rust_lib_src_root ( & self ) -> Option < & AbsPath > {
111
+ self . rust_lib_src_root . as_deref ( )
105
112
}
106
113
107
- pub fn is_empty ( & self ) -> bool {
114
+ pub fn is_rust_lib_src_empty ( & self ) -> bool {
108
115
match & self . workspace {
109
- SysrootWorkspace :: Workspace ( ws) => ws. packages ( ) . next ( ) . is_none ( ) ,
110
- SysrootWorkspace :: Stitched ( stitched) => stitched. crates . is_empty ( ) ,
111
- SysrootWorkspace :: Empty => true ,
116
+ RustLibSrcWorkspace :: Workspace ( ws) => ws. packages ( ) . next ( ) . is_none ( ) ,
117
+ RustLibSrcWorkspace :: Stitched ( stitched) => stitched. crates . is_empty ( ) ,
118
+ RustLibSrcWorkspace :: Empty => true ,
112
119
}
113
120
}
114
121
@@ -118,13 +125,13 @@ impl Sysroot {
118
125
119
126
pub fn num_packages ( & self ) -> usize {
120
127
match & self . workspace {
121
- SysrootWorkspace :: Workspace ( ws) => ws. packages ( ) . count ( ) ,
122
- SysrootWorkspace :: Stitched ( c) => c. crates ( ) . count ( ) ,
123
- SysrootWorkspace :: Empty => 0 ,
128
+ RustLibSrcWorkspace :: Workspace ( ws) => ws. packages ( ) . count ( ) ,
129
+ RustLibSrcWorkspace :: Stitched ( c) => c. crates ( ) . count ( ) ,
130
+ RustLibSrcWorkspace :: Empty => 0 ,
124
131
}
125
132
}
126
133
127
- pub ( crate ) fn workspace ( & self ) -> & SysrootWorkspace {
134
+ pub ( crate ) fn workspace ( & self ) -> & RustLibSrcWorkspace {
128
135
& self . workspace
129
136
}
130
137
}
@@ -133,33 +140,33 @@ impl Sysroot {
133
140
/// Attempts to discover the toolchain's sysroot from the given `dir`.
134
141
pub fn discover ( dir : & AbsPath , extra_env : & FxHashMap < String , String > ) -> Sysroot {
135
142
let sysroot_dir = discover_sysroot_dir ( dir, extra_env) ;
136
- let sysroot_src_dir = sysroot_dir. as_ref ( ) . ok ( ) . map ( |sysroot_dir| {
137
- discover_sysroot_src_dir_or_add_component ( sysroot_dir, dir, extra_env)
143
+ let rust_lib_src_dir = sysroot_dir. as_ref ( ) . ok ( ) . map ( |sysroot_dir| {
144
+ discover_rust_lib_src_dir_or_add_component ( sysroot_dir, dir, extra_env)
138
145
} ) ;
139
- Sysroot :: assemble ( Some ( sysroot_dir) , sysroot_src_dir )
146
+ Sysroot :: assemble ( Some ( sysroot_dir) , rust_lib_src_dir )
140
147
}
141
148
142
149
pub fn discover_with_src_override (
143
150
current_dir : & AbsPath ,
144
151
extra_env : & FxHashMap < String , String > ,
145
- sysroot_src_dir : AbsPathBuf ,
152
+ rust_lib_src_dir : AbsPathBuf ,
146
153
) -> Sysroot {
147
154
let sysroot_dir = discover_sysroot_dir ( current_dir, extra_env) ;
148
- Sysroot :: assemble ( Some ( sysroot_dir) , Some ( Ok ( sysroot_src_dir ) ) )
155
+ Sysroot :: assemble ( Some ( sysroot_dir) , Some ( Ok ( rust_lib_src_dir ) ) )
149
156
}
150
157
151
- pub fn discover_sysroot_src_dir ( sysroot_dir : AbsPathBuf ) -> Sysroot {
152
- let sysroot_src_dir = discover_sysroot_src_dir ( & sysroot_dir)
158
+ pub fn discover_rust_lib_src_dir ( sysroot_dir : AbsPathBuf ) -> Sysroot {
159
+ let rust_lib_src_dir = discover_rust_lib_src_dir ( & sysroot_dir)
153
160
. ok_or_else ( || format_err ! ( "can't find standard library sources in {sysroot_dir}" ) ) ;
154
- Sysroot :: assemble ( Some ( Ok ( sysroot_dir) ) , Some ( sysroot_src_dir ) )
161
+ Sysroot :: assemble ( Some ( Ok ( sysroot_dir) ) , Some ( rust_lib_src_dir ) )
155
162
}
156
163
157
164
pub fn discover_rustc_src ( & self ) -> Option < ManifestPath > {
158
165
get_rustc_src ( self . root ( ) ?)
159
166
}
160
167
161
- pub fn new ( sysroot_dir : Option < AbsPathBuf > , sysroot_src_dir : Option < AbsPathBuf > ) -> Sysroot {
162
- Self :: assemble ( sysroot_dir. map ( Ok ) , sysroot_src_dir . map ( Ok ) )
168
+ pub fn new ( sysroot_dir : Option < AbsPathBuf > , rust_lib_src_dir : Option < AbsPathBuf > ) -> Sysroot {
169
+ Self :: assemble ( sysroot_dir. map ( Ok ) , rust_lib_src_dir . map ( Ok ) )
163
170
}
164
171
165
172
/// Returns a command to run a tool preferring the cargo proxies if the sysroot exists.
@@ -200,7 +207,7 @@ impl Sysroot {
200
207
201
208
fn assemble (
202
209
sysroot_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
203
- sysroot_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
210
+ rust_lib_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
204
211
) -> Sysroot {
205
212
let mut errors = String :: new ( ) ;
206
213
let root = match sysroot_dir {
@@ -211,8 +218,8 @@ impl Sysroot {
211
218
}
212
219
None => None ,
213
220
} ;
214
- let src_root = match sysroot_src_dir {
215
- Some ( Ok ( sysroot_src_dir ) ) => Some ( sysroot_src_dir ) ,
221
+ let rust_lib_src_root = match rust_lib_src_dir {
222
+ Some ( Ok ( rust_lib_src_dir ) ) => Some ( rust_lib_src_dir ) ,
216
223
Some ( Err ( e) ) => {
217
224
format_to ! ( errors, "{e}\n " ) ;
218
225
None
@@ -221,21 +228,22 @@ impl Sysroot {
221
228
} ;
222
229
Sysroot {
223
230
root,
224
- src_root ,
225
- workspace : SysrootWorkspace :: Empty ,
231
+ rust_lib_src_root ,
232
+ workspace : RustLibSrcWorkspace :: Empty ,
226
233
error : errors. is_empty ( ) . not ( ) . then_some ( errors) ,
227
234
}
228
235
}
229
236
230
237
pub fn load_workspace (
231
238
& self ,
232
- sysroot_source_config : & SysrootSourceWorkspaceConfig ,
233
- ) -> Option < SysrootWorkspace > {
234
- assert ! ( matches!( self . workspace, SysrootWorkspace :: Empty ) , "workspace already loaded" ) ;
235
- let Self { root : _, src_root : Some ( src_root) , workspace : _, error : _ } = self else {
239
+ sysroot_source_config : & RustSourceWorkspaceConfig ,
240
+ ) -> Option < RustLibSrcWorkspace > {
241
+ assert ! ( matches!( self . workspace, RustLibSrcWorkspace :: Empty ) , "workspace already loaded" ) ;
242
+ let Self { root : _, rust_lib_src_root : Some ( src_root) , workspace : _, error : _ } = self
243
+ else {
236
244
return None ;
237
245
} ;
238
- if let SysrootSourceWorkspaceConfig :: CargoMetadata ( cargo_config) = sysroot_source_config {
246
+ if let RustSourceWorkspaceConfig :: CargoMetadata ( cargo_config) = sysroot_source_config {
239
247
let library_manifest = ManifestPath :: try_from ( src_root. join ( "Cargo.toml" ) ) . unwrap ( ) ;
240
248
if fs:: metadata ( & library_manifest) . is_ok ( ) {
241
249
if let Some ( loaded) =
@@ -258,7 +266,7 @@ impl Sysroot {
258
266
. find ( |it| fs:: metadata ( it) . is_ok ( ) ) ;
259
267
260
268
if let Some ( root) = root {
261
- stitched. crates . alloc ( SysrootCrateData {
269
+ stitched. crates . alloc ( RustLibSrcCrateData {
262
270
name : name. into ( ) ,
263
271
root,
264
272
deps : Vec :: new ( ) ,
@@ -289,21 +297,23 @@ impl Sysroot {
289
297
}
290
298
}
291
299
}
292
- Some ( SysrootWorkspace :: Stitched ( stitched) )
300
+ Some ( RustLibSrcWorkspace :: Stitched ( stitched) )
293
301
}
294
302
295
- pub fn set_workspace ( & mut self , workspace : SysrootWorkspace ) {
303
+ pub fn set_workspace ( & mut self , workspace : RustLibSrcWorkspace ) {
296
304
self . workspace = workspace;
297
305
if self . error . is_none ( ) {
298
- if let Some ( src_root) = & self . src_root {
306
+ if let Some ( src_root) = & self . rust_lib_src_root {
299
307
let has_core = match & self . workspace {
300
- SysrootWorkspace :: Workspace ( ws) => ws. packages ( ) . any ( |p| ws[ p] . name == "core" ) ,
301
- SysrootWorkspace :: Stitched ( stitched) => stitched. by_name ( "core" ) . is_some ( ) ,
302
- SysrootWorkspace :: Empty => true ,
308
+ RustLibSrcWorkspace :: Workspace ( ws) => {
309
+ ws. packages ( ) . any ( |p| ws[ p] . name == "core" )
310
+ }
311
+ RustLibSrcWorkspace :: Stitched ( stitched) => stitched. by_name ( "core" ) . is_some ( ) ,
312
+ RustLibSrcWorkspace :: Empty => true ,
303
313
} ;
304
314
if !has_core {
305
- let var_note = if env:: var_os ( "RUST_SRC_PATH " ) . is_some ( ) {
306
- " (env var `RUST_SRC_PATH ` is set and may be incorrect, try unsetting it)"
315
+ let var_note = if env:: var_os ( "rust_lib_src_PATH " ) . is_some ( ) {
316
+ " (env var `rust_lib_src_PATH ` is set and may be incorrect, try unsetting it)"
307
317
} else {
308
318
", try running `rustup component add rust-src` to possibly fix this"
309
319
} ;
@@ -317,9 +327,9 @@ impl Sysroot {
317
327
318
328
fn load_library_via_cargo (
319
329
library_manifest : ManifestPath ,
320
- sysroot_src_dir : & AbsPathBuf ,
330
+ rust_lib_src_dir : & AbsPathBuf ,
321
331
cargo_config : & CargoMetadataConfig ,
322
- ) -> Option < SysrootWorkspace > {
332
+ ) -> Option < RustLibSrcWorkspace > {
323
333
tracing:: debug!( "Loading library metadata: {library_manifest}" ) ;
324
334
let mut cargo_config = cargo_config. clone ( ) ;
325
335
// the sysroot uses `public-dependency`, so we make cargo think it's a nightly
@@ -330,7 +340,7 @@ impl Sysroot {
330
340
331
341
let ( mut res, _) = match CargoWorkspace :: fetch_metadata (
332
342
& library_manifest,
333
- sysroot_src_dir ,
343
+ rust_lib_src_dir ,
334
344
& cargo_config,
335
345
& Sysroot :: empty ( ) ,
336
346
// Make sure we never attempt to write to the sysroot
@@ -394,7 +404,7 @@ impl Sysroot {
394
404
} ) ;
395
405
396
406
let cargo_workspace = CargoWorkspace :: new ( res, library_manifest, Default :: default ( ) ) ;
397
- Some ( SysrootWorkspace :: Workspace ( cargo_workspace) )
407
+ Some ( RustLibSrcWorkspace :: Workspace ( cargo_workspace) )
398
408
}
399
409
}
400
410
@@ -410,36 +420,38 @@ fn discover_sysroot_dir(
410
420
Ok ( AbsPathBuf :: assert ( Utf8PathBuf :: from ( stdout) ) )
411
421
}
412
422
413
- fn discover_sysroot_src_dir ( sysroot_path : & AbsPathBuf ) -> Option < AbsPathBuf > {
414
- if let Ok ( path) = env:: var ( "RUST_SRC_PATH " ) {
423
+ fn discover_rust_lib_src_dir ( sysroot_path : & AbsPathBuf ) -> Option < AbsPathBuf > {
424
+ if let Ok ( path) = env:: var ( "rust_lib_src_PATH " ) {
415
425
if let Ok ( path) = AbsPathBuf :: try_from ( path. as_str ( ) ) {
416
426
let core = path. join ( "core" ) ;
417
427
if fs:: metadata ( & core) . is_ok ( ) {
418
- tracing:: debug!( "Discovered sysroot by RUST_SRC_PATH : {path}" ) ;
428
+ tracing:: debug!( "Discovered sysroot by rust_lib_src_PATH : {path}" ) ;
419
429
return Some ( path) ;
420
430
}
421
- tracing:: debug!( "RUST_SRC_PATH is set, but is invalid (no core: {core:?}), ignoring" ) ;
431
+ tracing:: debug!(
432
+ "rust_lib_src_PATH is set, but is invalid (no core: {core:?}), ignoring"
433
+ ) ;
422
434
} else {
423
- tracing:: debug!( "RUST_SRC_PATH is set, but is invalid, ignoring" ) ;
435
+ tracing:: debug!( "rust_lib_src_PATH is set, but is invalid, ignoring" ) ;
424
436
}
425
437
}
426
438
427
- get_rust_src ( sysroot_path)
439
+ get_rust_lib_src ( sysroot_path)
428
440
}
429
441
430
- fn discover_sysroot_src_dir_or_add_component (
442
+ fn discover_rust_lib_src_dir_or_add_component (
431
443
sysroot_path : & AbsPathBuf ,
432
444
current_dir : & AbsPath ,
433
445
extra_env : & FxHashMap < String , String > ,
434
446
) -> Result < AbsPathBuf > {
435
- discover_sysroot_src_dir ( sysroot_path)
447
+ discover_rust_lib_src_dir ( sysroot_path)
436
448
. or_else ( || {
437
449
let mut rustup = toolchain:: command ( Tool :: Rustup . prefer_proxy ( ) , current_dir) ;
438
450
rustup. envs ( extra_env) ;
439
451
rustup. args ( [ "component" , "add" , "rust-src" ] ) ;
440
452
tracing:: info!( "adding rust-src component by {:?}" , rustup) ;
441
453
utf8_stdout ( & mut rustup) . ok ( ) ?;
442
- get_rust_src ( sysroot_path)
454
+ get_rust_lib_src ( sysroot_path)
443
455
} )
444
456
. ok_or_else ( || {
445
457
tracing:: error!( %sysroot_path, "can't load standard library, try installing `rust-src`" ) ;
@@ -464,11 +476,11 @@ fn get_rustc_src(sysroot_path: &AbsPath) -> Option<ManifestPath> {
464
476
}
465
477
}
466
478
467
- fn get_rust_src ( sysroot_path : & AbsPath ) -> Option < AbsPathBuf > {
468
- let rust_src = sysroot_path. join ( "lib/rustlib/src/rust/library" ) ;
469
- tracing:: debug!( "checking sysroot library: {rust_src }" ) ;
470
- if fs:: metadata ( & rust_src ) . is_ok ( ) {
471
- Some ( rust_src )
479
+ fn get_rust_lib_src ( sysroot_path : & AbsPath ) -> Option < AbsPathBuf > {
480
+ let rust_lib_src = sysroot_path. join ( "lib/rustlib/src/rust/library" ) ;
481
+ tracing:: debug!( "checking sysroot library: {rust_lib_src }" ) ;
482
+ if fs:: metadata ( & rust_lib_src ) . is_ok ( ) {
483
+ Some ( rust_lib_src )
472
484
} else {
473
485
None
474
486
}
0 commit comments