Skip to content

Commit 2c2520f

Browse files
Allow specifying sysroot OR sysroot_src
1 parent 6967751 commit 2c2520f

File tree

1 file changed

+17
-7
lines changed

1 file changed

+17
-7
lines changed

crates/project-model/src/workspace.rs

+17-7
Original file line numberDiff line numberDiff line change
@@ -230,16 +230,26 @@ impl ProjectWorkspace {
230230
project_json: ProjectJson,
231231
target: Option<&str>,
232232
) -> 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+
239240
Some(Sysroot::load(sysroot, sysroot_src)?)
240241
}
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,
242251
};
252+
243253
let rustc_cfg = rustc_cfg::get(None, target);
244254
Ok(ProjectWorkspace::Json { project: project_json, sysroot, rustc_cfg })
245255
}

0 commit comments

Comments
 (0)