@@ -22,38 +22,40 @@ use toolchain::{probe_for_binary, Tool};
2222
2323use crate :: {
2424 cargo_workspace:: CargoMetadataConfig , utf8_stdout, CargoWorkspace , ManifestPath ,
25- SysrootSourceWorkspaceConfig ,
25+ RustSourceWorkspaceConfig ,
2626} ;
2727
2828#[ derive( Debug , Clone , PartialEq , Eq ) ]
2929pub struct Sysroot {
3030 root : Option < AbsPathBuf > ,
31- src_root : Option < AbsPathBuf > ,
32- workspace : SysrootWorkspace ,
31+ rust_lib_src_root : Option < AbsPathBuf > ,
32+ workspace : RustLibSrcWorkspace ,
3333 error : Option < String > ,
3434}
3535
3636#[ derive( Debug , Clone , Eq , PartialEq ) ]
37- pub ( crate ) enum SysrootWorkspace {
37+ pub enum RustLibSrcWorkspace {
3838 Workspace ( CargoWorkspace ) ,
3939 Stitched ( Stitched ) ,
4040 Empty ,
4141}
4242
4343#[ derive( Debug , Clone , Eq , PartialEq ) ]
44- pub ( crate ) struct Stitched {
45- crates : Arena < SysrootCrateData > ,
44+ pub struct Stitched {
45+ crates : Arena < RustLibSrcCrateData > ,
4646}
4747
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 {
5151 & self . crates [ index]
5252 }
5353}
5454
5555impl 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 ) > + ' _ {
5759 // core is added as a dependency before std in order to
5860 // mimic rustcs dependency order
5961 [ ( "core" , true ) , ( "alloc" , false ) , ( "std" , true ) , ( "test" , false ) ] . into_iter ( ) . filter_map (
@@ -63,32 +65,37 @@ impl Stitched {
6365 )
6466 }
6567
66- pub ( crate ) fn proc_macro ( & self ) -> Option < SysrootCrate > {
68+ pub ( crate ) fn proc_macro ( & self ) -> Option < RustLibSrcCrate > {
6769 self . by_name ( "proc_macro" )
6870 }
6971
70- pub ( crate ) fn crates ( & self ) -> impl ExactSizeIterator < Item = SysrootCrate > + ' _ {
72+ pub ( crate ) fn crates ( & self ) -> impl ExactSizeIterator < Item = RustLibSrcCrate > + ' _ {
7173 self . crates . iter ( ) . map ( |( id, _data) | id)
7274 }
7375
74- fn by_name ( & self , name : & str ) -> Option < SysrootCrate > {
76+ fn by_name ( & self , name : & str ) -> Option < RustLibSrcCrate > {
7577 let ( id, _data) = self . crates . iter ( ) . find ( |( _id, data) | data. name == name) ?;
7678 Some ( id)
7779 }
7880}
7981
80- pub ( crate ) type SysrootCrate = Idx < SysrootCrateData > ;
82+ pub ( crate ) type RustLibSrcCrate = Idx < RustLibSrcCrateData > ;
8183
8284#[ derive( Debug , Clone , Eq , PartialEq ) ]
83- pub ( crate ) struct SysrootCrateData {
85+ pub ( crate ) struct RustLibSrcCrateData {
8486 pub ( crate ) name : String ,
8587 pub ( crate ) root : ManifestPath ,
86- pub ( crate ) deps : Vec < SysrootCrate > ,
88+ pub ( crate ) deps : Vec < RustLibSrcCrate > ,
8789}
8890
8991impl Sysroot {
9092 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+ }
9299 }
93100
94101 /// Returns sysroot "root" directory, where `bin/`, `etc/`, `lib/`, `libexec/`
@@ -100,15 +107,15 @@ impl Sysroot {
100107
101108 /// Returns the sysroot "source" directory, where stdlib sources are located, like:
102109 /// `$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 ( )
105112 }
106113
107- pub fn is_empty ( & self ) -> bool {
114+ pub fn is_rust_lib_src_empty ( & self ) -> bool {
108115 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 ,
112119 }
113120 }
114121
@@ -118,13 +125,13 @@ impl Sysroot {
118125
119126 pub fn num_packages ( & self ) -> usize {
120127 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 ,
124131 }
125132 }
126133
127- pub ( crate ) fn workspace ( & self ) -> & SysrootWorkspace {
134+ pub ( crate ) fn workspace ( & self ) -> & RustLibSrcWorkspace {
128135 & self . workspace
129136 }
130137}
@@ -133,33 +140,33 @@ impl Sysroot {
133140 /// Attempts to discover the toolchain's sysroot from the given `dir`.
134141 pub fn discover ( dir : & AbsPath , extra_env : & FxHashMap < String , String > ) -> Sysroot {
135142 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)
138145 } ) ;
139- Sysroot :: assemble ( Some ( sysroot_dir) , sysroot_src_dir )
146+ Sysroot :: assemble ( Some ( sysroot_dir) , rust_lib_src_dir )
140147 }
141148
142149 pub fn discover_with_src_override (
143150 current_dir : & AbsPath ,
144151 extra_env : & FxHashMap < String , String > ,
145- sysroot_src_dir : AbsPathBuf ,
152+ rust_lib_src_dir : AbsPathBuf ,
146153 ) -> Sysroot {
147154 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 ) ) )
149156 }
150157
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)
153160 . 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 ) )
155162 }
156163
157164 pub fn discover_rustc_src ( & self ) -> Option < ManifestPath > {
158165 get_rustc_src ( self . root ( ) ?)
159166 }
160167
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 ) )
163170 }
164171
165172 /// Returns a command to run a tool preferring the cargo proxies if the sysroot exists.
@@ -200,7 +207,7 @@ impl Sysroot {
200207
201208 fn assemble (
202209 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 > > ,
204211 ) -> Sysroot {
205212 let mut errors = String :: new ( ) ;
206213 let root = match sysroot_dir {
@@ -211,8 +218,8 @@ impl Sysroot {
211218 }
212219 None => None ,
213220 } ;
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 ) ,
216223 Some ( Err ( e) ) => {
217224 format_to ! ( errors, "{e}\n " ) ;
218225 None
@@ -221,24 +228,28 @@ impl Sysroot {
221228 } ;
222229 Sysroot {
223230 root,
224- src_root ,
225- workspace : SysrootWorkspace :: Empty ,
231+ rust_lib_src_root ,
232+ workspace : RustLibSrcWorkspace :: Empty ,
226233 error : errors. is_empty ( ) . not ( ) . then_some ( errors) ,
227234 }
228235 }
229236
230- pub fn load_workspace ( & mut self , sysroot_source_config : & SysrootSourceWorkspaceConfig ) {
231- assert ! ( matches!( self . workspace, SysrootWorkspace :: Empty ) , "workspace already loaded" ) ;
232- let Self { root : _, src_root : Some ( src_root) , workspace, error : _ } = self else { return } ;
233- if let SysrootSourceWorkspaceConfig :: CargoMetadata ( cargo_config) = sysroot_source_config {
237+ pub fn load_workspace (
238+ & self ,
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 {
244+ return None ;
245+ } ;
246+ if let RustSourceWorkspaceConfig :: CargoMetadata ( cargo_config) = sysroot_source_config {
234247 let library_manifest = ManifestPath :: try_from ( src_root. join ( "Cargo.toml" ) ) . unwrap ( ) ;
235248 if fs:: metadata ( & library_manifest) . is_ok ( ) {
236249 if let Some ( loaded) =
237250 Self :: load_library_via_cargo ( library_manifest, src_root, cargo_config)
238251 {
239- * workspace = loaded;
240- self . load_core_check ( ) ;
241- return ;
252+ return Some ( loaded) ;
242253 }
243254 }
244255 }
@@ -255,7 +266,7 @@ impl Sysroot {
255266 . find ( |it| fs:: metadata ( it) . is_ok ( ) ) ;
256267
257268 if let Some ( root) = root {
258- stitched. crates . alloc ( SysrootCrateData {
269+ stitched. crates . alloc ( RustLibSrcCrateData {
259270 name : name. into ( ) ,
260271 root,
261272 deps : Vec :: new ( ) ,
@@ -286,21 +297,23 @@ impl Sysroot {
286297 }
287298 }
288299 }
289- * workspace = SysrootWorkspace :: Stitched ( stitched) ;
290- self . load_core_check ( ) ;
300+ Some ( RustLibSrcWorkspace :: Stitched ( stitched) )
291301 }
292302
293- fn load_core_check ( & mut self ) {
303+ pub fn set_workspace ( & mut self , workspace : RustLibSrcWorkspace ) {
304+ self . workspace = workspace;
294305 if self . error . is_none ( ) {
295- if let Some ( src_root) = & self . src_root {
306+ if let Some ( src_root) = & self . rust_lib_src_root {
296307 let has_core = match & self . workspace {
297- SysrootWorkspace :: Workspace ( ws) => ws. packages ( ) . any ( |p| ws[ p] . name == "core" ) ,
298- SysrootWorkspace :: Stitched ( stitched) => stitched. by_name ( "core" ) . is_some ( ) ,
299- 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 ,
300313 } ;
301314 if !has_core {
302- let var_note = if env:: var_os ( "RUST_SRC_PATH " ) . is_some ( ) {
303- " (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)"
304317 } else {
305318 ", try running `rustup component add rust-src` to possibly fix this"
306319 } ;
@@ -314,9 +327,9 @@ impl Sysroot {
314327
315328 fn load_library_via_cargo (
316329 library_manifest : ManifestPath ,
317- sysroot_src_dir : & AbsPathBuf ,
330+ rust_lib_src_dir : & AbsPathBuf ,
318331 cargo_config : & CargoMetadataConfig ,
319- ) -> Option < SysrootWorkspace > {
332+ ) -> Option < RustLibSrcWorkspace > {
320333 tracing:: debug!( "Loading library metadata: {library_manifest}" ) ;
321334 let mut cargo_config = cargo_config. clone ( ) ;
322335 // the sysroot uses `public-dependency`, so we make cargo think it's a nightly
@@ -327,7 +340,7 @@ impl Sysroot {
327340
328341 let ( mut res, _) = match CargoWorkspace :: fetch_metadata (
329342 & library_manifest,
330- sysroot_src_dir ,
343+ rust_lib_src_dir ,
331344 & cargo_config,
332345 & Sysroot :: empty ( ) ,
333346 // Make sure we never attempt to write to the sysroot
@@ -391,7 +404,7 @@ impl Sysroot {
391404 } ) ;
392405
393406 let cargo_workspace = CargoWorkspace :: new ( res, library_manifest, Default :: default ( ) ) ;
394- Some ( SysrootWorkspace :: Workspace ( cargo_workspace) )
407+ Some ( RustLibSrcWorkspace :: Workspace ( cargo_workspace) )
395408 }
396409}
397410
@@ -407,36 +420,38 @@ fn discover_sysroot_dir(
407420 Ok ( AbsPathBuf :: assert ( Utf8PathBuf :: from ( stdout) ) )
408421}
409422
410- fn discover_sysroot_src_dir ( sysroot_path : & AbsPathBuf ) -> Option < AbsPathBuf > {
411- 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 " ) {
412425 if let Ok ( path) = AbsPathBuf :: try_from ( path. as_str ( ) ) {
413426 let core = path. join ( "core" ) ;
414427 if fs:: metadata ( & core) . is_ok ( ) {
415- tracing:: debug!( "Discovered sysroot by RUST_SRC_PATH : {path}" ) ;
428+ tracing:: debug!( "Discovered sysroot by rust_lib_src_PATH : {path}" ) ;
416429 return Some ( path) ;
417430 }
418- 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+ ) ;
419434 } else {
420- tracing:: debug!( "RUST_SRC_PATH is set, but is invalid, ignoring" ) ;
435+ tracing:: debug!( "rust_lib_src_PATH is set, but is invalid, ignoring" ) ;
421436 }
422437 }
423438
424- get_rust_src ( sysroot_path)
439+ get_rust_lib_src ( sysroot_path)
425440}
426441
427- fn discover_sysroot_src_dir_or_add_component (
442+ fn discover_rust_lib_src_dir_or_add_component (
428443 sysroot_path : & AbsPathBuf ,
429444 current_dir : & AbsPath ,
430445 extra_env : & FxHashMap < String , String > ,
431446) -> Result < AbsPathBuf > {
432- discover_sysroot_src_dir ( sysroot_path)
447+ discover_rust_lib_src_dir ( sysroot_path)
433448 . or_else ( || {
434449 let mut rustup = toolchain:: command ( Tool :: Rustup . prefer_proxy ( ) , current_dir) ;
435450 rustup. envs ( extra_env) ;
436451 rustup. args ( [ "component" , "add" , "rust-src" ] ) ;
437452 tracing:: info!( "adding rust-src component by {:?}" , rustup) ;
438453 utf8_stdout ( & mut rustup) . ok ( ) ?;
439- get_rust_src ( sysroot_path)
454+ get_rust_lib_src ( sysroot_path)
440455 } )
441456 . ok_or_else ( || {
442457 tracing:: error!( %sysroot_path, "can't load standard library, try installing `rust-src`" ) ;
@@ -461,11 +476,11 @@ fn get_rustc_src(sysroot_path: &AbsPath) -> Option<ManifestPath> {
461476 }
462477}
463478
464- fn get_rust_src ( sysroot_path : & AbsPath ) -> Option < AbsPathBuf > {
465- let rust_src = sysroot_path. join ( "lib/rustlib/src/rust/library" ) ;
466- tracing:: debug!( "checking sysroot library: {rust_src }" ) ;
467- if fs:: metadata ( & rust_src ) . is_ok ( ) {
468- 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 )
469484 } else {
470485 None
471486 }
0 commit comments