@@ -14,7 +14,7 @@ use paths::{AbsPath, AbsPathBuf, Utf8PathBuf};
1414use rustc_hash:: FxHashMap ;
1515use toolchain:: { probe_for_binary, Tool } ;
1616
17- use crate :: { utf8_stdout, CargoConfig , CargoWorkspace , ManifestPath } ;
17+ use crate :: { utf8_stdout, CargoConfig , CargoWorkspace , ManifestPath , SysrootQueryMetadata } ;
1818
1919#[ derive( Debug , Clone , PartialEq , Eq ) ]
2020pub struct Sysroot {
@@ -123,27 +123,43 @@ impl Sysroot {
123123// FIXME: Expose a builder api as loading the sysroot got way too modular and complicated.
124124impl Sysroot {
125125 /// Attempts to discover the toolchain's sysroot from the given `dir`.
126- pub fn discover ( dir : & AbsPath , extra_env : & FxHashMap < String , String > ) -> Sysroot {
126+ pub fn discover (
127+ dir : & AbsPath ,
128+ extra_env : & FxHashMap < String , String > ,
129+ sysroot_query_metadata : SysrootQueryMetadata ,
130+ ) -> Sysroot {
127131 let sysroot_dir = discover_sysroot_dir ( dir, extra_env) ;
128132 let sysroot_src_dir = sysroot_dir. as_ref ( ) . ok ( ) . map ( |sysroot_dir| {
129133 discover_sysroot_src_dir_or_add_component ( sysroot_dir, dir, extra_env)
130134 } ) ;
131- Sysroot :: load_core_check ( Some ( sysroot_dir) , sysroot_src_dir)
135+ Sysroot :: load_core_check ( Some ( sysroot_dir) , sysroot_src_dir, sysroot_query_metadata )
132136 }
133137
134138 pub fn discover_with_src_override (
135139 current_dir : & AbsPath ,
136140 extra_env : & FxHashMap < String , String > ,
137141 sysroot_src_dir : AbsPathBuf ,
142+ sysroot_query_metadata : SysrootQueryMetadata ,
138143 ) -> Sysroot {
139144 let sysroot_dir = discover_sysroot_dir ( current_dir, extra_env) ;
140- Sysroot :: load_core_check ( Some ( sysroot_dir) , Some ( Ok ( sysroot_src_dir) ) )
145+ Sysroot :: load_core_check (
146+ Some ( sysroot_dir) ,
147+ Some ( Ok ( sysroot_src_dir) ) ,
148+ sysroot_query_metadata,
149+ )
141150 }
142151
143- pub fn discover_sysroot_src_dir ( sysroot_dir : AbsPathBuf ) -> Sysroot {
152+ pub fn discover_sysroot_src_dir (
153+ sysroot_dir : AbsPathBuf ,
154+ sysroot_query_metadata : SysrootQueryMetadata ,
155+ ) -> Sysroot {
144156 let sysroot_src_dir = discover_sysroot_src_dir ( & sysroot_dir)
145157 . ok_or_else ( || format_err ! ( "can't find standard library sources in {sysroot_dir}" ) ) ;
146- Sysroot :: load_core_check ( Some ( Ok ( sysroot_dir) ) , Some ( sysroot_src_dir) )
158+ Sysroot :: load_core_check (
159+ Some ( Ok ( sysroot_dir) ) ,
160+ Some ( sysroot_src_dir) ,
161+ sysroot_query_metadata,
162+ )
147163 }
148164
149165 pub fn discover_rustc_src ( & self ) -> Option < ManifestPath > {
@@ -186,15 +202,20 @@ impl Sysroot {
186202 } )
187203 }
188204
189- pub fn load ( sysroot_dir : Option < AbsPathBuf > , sysroot_src_dir : Option < AbsPathBuf > ) -> Sysroot {
190- Self :: load_core_check ( sysroot_dir. map ( Ok ) , sysroot_src_dir. map ( Ok ) )
205+ pub fn load (
206+ sysroot_dir : Option < AbsPathBuf > ,
207+ sysroot_src_dir : Option < AbsPathBuf > ,
208+ sysroot_query_metadata : SysrootQueryMetadata ,
209+ ) -> Sysroot {
210+ Self :: load_core_check ( sysroot_dir. map ( Ok ) , sysroot_src_dir. map ( Ok ) , sysroot_query_metadata)
191211 }
192212
193213 fn load_core_check (
194214 sysroot_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
195215 sysroot_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
216+ sysroot_query_metadata : SysrootQueryMetadata ,
196217 ) -> Sysroot {
197- let mut sysroot = Self :: load_ ( sysroot_dir, sysroot_src_dir) ;
218+ let mut sysroot = Self :: load_ ( sysroot_dir, sysroot_src_dir, sysroot_query_metadata ) ;
198219 if sysroot. error . is_none ( ) {
199220 if let Some ( src_root) = & sysroot. src_root {
200221 let has_core = match & sysroot. mode {
@@ -220,6 +241,7 @@ impl Sysroot {
220241 fn load_ (
221242 sysroot_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
222243 sysroot_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
244+ sysroot_query_metadata : SysrootQueryMetadata ,
223245 ) -> Sysroot {
224246 let sysroot_dir = match sysroot_dir {
225247 Some ( Ok ( sysroot_dir) ) => Some ( sysroot_dir) ,
@@ -252,12 +274,15 @@ impl Sysroot {
252274 }
253275 }
254276 } ;
255- let library_manifest = ManifestPath :: try_from ( sysroot_src_dir. join ( "Cargo.toml" ) ) . unwrap ( ) ;
256- if fs:: metadata ( & library_manifest) . is_ok ( ) {
257- if let Some ( sysroot) =
258- Self :: load_library_via_cargo ( library_manifest, & sysroot_dir, & sysroot_src_dir)
259- {
260- return sysroot;
277+ if sysroot_query_metadata == SysrootQueryMetadata :: CargoMetadata {
278+ let library_manifest =
279+ ManifestPath :: try_from ( sysroot_src_dir. join ( "Cargo.toml" ) ) . unwrap ( ) ;
280+ if fs:: metadata ( & library_manifest) . is_ok ( ) {
281+ if let Some ( sysroot) =
282+ Self :: load_library_via_cargo ( library_manifest, & sysroot_dir, & sysroot_src_dir)
283+ {
284+ return sysroot;
285+ }
261286 }
262287 }
263288 tracing:: debug!( "Stitching sysroot library: {sysroot_src_dir}" ) ;
0 commit comments