@@ -230,16 +230,26 @@ impl ProjectWorkspace {
230
230
project_json : ProjectJson ,
231
231
target : Option < & str > ,
232
232
) -> Result < ProjectWorkspace > {
233
- let sysroot = match project_json. sysroot_src . clone ( ) {
234
- Some ( sysroot_src) => {
235
- // if `sysroot` isn't specified (only `sysroot_src`), we won't have
236
- // a real sysroot path, that's fine. it's just used to discover
237
- // the standalone `proc-macro-srv` binary.
238
- let sysroot = project_json. sysroot . clone ( ) . unwrap_or_else ( || sysroot_src. clone ( ) ) ;
233
+ let sysroot = match ( project_json. sysroot . clone ( ) , project_json. sysroot_src . clone ( ) ) {
234
+ ( Some ( sysroot) , Some ( sysroot_src) ) => Some ( Sysroot :: load ( sysroot, sysroot_src) ?) ,
235
+ ( Some ( sysroot) , None ) => {
236
+ // assume sysroot is structured like rustup's and guess `sysroot_src`
237
+ let sysroot_src =
238
+ sysroot. join ( "lib" ) . join ( "rustlib" ) . join ( "src" ) . join ( "rust" ) . join ( "library" ) ;
239
+
239
240
Some ( Sysroot :: load ( sysroot, sysroot_src) ?)
240
241
}
241
- None => None ,
242
+ ( None , Some ( sysroot_src) ) => {
243
+ // assume sysroot is structured like rustup's and guess `sysroot`
244
+ let mut sysroot = sysroot_src. clone ( ) ;
245
+ for _ in 0 ..5 {
246
+ sysroot. pop ( ) ;
247
+ }
248
+ Some ( Sysroot :: load ( sysroot, sysroot_src) ?)
249
+ }
250
+ ( None , None ) => None ,
242
251
} ;
252
+
243
253
let rustc_cfg = rustc_cfg:: get ( None , target) ;
244
254
Ok ( ProjectWorkspace :: Json { project : project_json, sysroot, rustc_cfg } )
245
255
}
0 commit comments