@@ -14,7 +14,7 @@ use paths::{AbsPath, AbsPathBuf, Utf8PathBuf};
14
14
use rustc_hash:: FxHashMap ;
15
15
use toolchain:: { probe_for_binary, Tool } ;
16
16
17
- use crate :: { utf8_stdout, CargoConfig , CargoWorkspace , ManifestPath } ;
17
+ use crate :: { utf8_stdout, CargoConfig , CargoWorkspace , ManifestPath , SysrootQueryMetadata } ;
18
18
19
19
#[ derive( Debug , Clone , PartialEq , Eq ) ]
20
20
pub struct Sysroot {
@@ -123,27 +123,43 @@ impl Sysroot {
123
123
// FIXME: Expose a builder api as loading the sysroot got way too modular and complicated.
124
124
impl Sysroot {
125
125
/// 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 {
127
131
let sysroot_dir = discover_sysroot_dir ( dir, extra_env) ;
128
132
let sysroot_src_dir = sysroot_dir. as_ref ( ) . ok ( ) . map ( |sysroot_dir| {
129
133
discover_sysroot_src_dir_or_add_component ( sysroot_dir, dir, extra_env)
130
134
} ) ;
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 )
132
136
}
133
137
134
138
pub fn discover_with_src_override (
135
139
current_dir : & AbsPath ,
136
140
extra_env : & FxHashMap < String , String > ,
137
141
sysroot_src_dir : AbsPathBuf ,
142
+ sysroot_query_metadata : SysrootQueryMetadata ,
138
143
) -> Sysroot {
139
144
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
+ )
141
150
}
142
151
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 {
144
156
let sysroot_src_dir = discover_sysroot_src_dir ( & sysroot_dir)
145
157
. 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
+ )
147
163
}
148
164
149
165
pub fn discover_rustc_src ( & self ) -> Option < ManifestPath > {
@@ -186,15 +202,20 @@ impl Sysroot {
186
202
} )
187
203
}
188
204
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)
191
211
}
192
212
193
213
fn load_core_check (
194
214
sysroot_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
195
215
sysroot_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
216
+ sysroot_query_metadata : SysrootQueryMetadata ,
196
217
) -> 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 ) ;
198
219
if sysroot. error . is_none ( ) {
199
220
if let Some ( src_root) = & sysroot. src_root {
200
221
let has_core = match & sysroot. mode {
@@ -220,6 +241,7 @@ impl Sysroot {
220
241
fn load_ (
221
242
sysroot_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
222
243
sysroot_src_dir : Option < Result < AbsPathBuf , anyhow:: Error > > ,
244
+ sysroot_query_metadata : SysrootQueryMetadata ,
223
245
) -> Sysroot {
224
246
let sysroot_dir = match sysroot_dir {
225
247
Some ( Ok ( sysroot_dir) ) => Some ( sysroot_dir) ,
@@ -252,12 +274,15 @@ impl Sysroot {
252
274
}
253
275
}
254
276
} ;
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
+ }
261
286
}
262
287
}
263
288
tracing:: debug!( "Stitching sysroot library: {sysroot_src_dir}" ) ;
0 commit comments