]> git.lizzy.rs Git - rust.git/commitdiff
Make sysroot use `RUST_SRC_PATH` if set
authorBastian Köcher <git@kchr.de>
Thu, 22 Aug 2019 19:08:34 +0000 (21:08 +0200)
committerBastian Köcher <git@kchr.de>
Thu, 22 Aug 2019 19:59:23 +0000 (21:59 +0200)
crates/ra_project_model/src/sysroot.rs
docs/user/README.md

index 2a7927f7efa6176c96b7eb421dabe08e0db0a98c..0c27d4f4b312ae9e5bfdcd75ad812e16e025a4d8 100644 (file)
@@ -1,4 +1,5 @@
 use std::{
+    env,
     path::{Path, PathBuf},
     process::Command,
 };
@@ -33,21 +34,13 @@ pub fn crates<'a>(&'a self) -> impl Iterator<Item = SysrootCrate> + ExactSizeIte
     }
 
     pub fn discover(cargo_toml: &Path) -> Result<Sysroot> {
-        let rustc_output = Command::new("rustc")
-            .current_dir(cargo_toml.parent().unwrap())
-            .args(&["--print", "sysroot"])
-            .output()?;
-        if !rustc_output.status.success() {
-            Err("failed to locate sysroot")?
-        }
-        let stdout = String::from_utf8(rustc_output.stdout)?;
-        let sysroot_path = Path::new(stdout.trim());
-        let src = sysroot_path.join("lib/rustlib/src/rust/src");
+        let src = try_find_src_path(cargo_toml)?;
+
         if !src.exists() {
             Err(format!(
                 "can't load standard library from sysroot\n\
                  {:?}\n\
-                 try running `rustup component add rust-src`",
+                 try running `rustup component add rust-src` or set `RUST_SRC_PATH`",
                 src,
             ))?;
         }
@@ -83,6 +76,23 @@ fn by_name(&self, name: &str) -> Option<SysrootCrate> {
     }
 }
 
+fn try_find_src_path(cargo_toml: &Path) -> Result<PathBuf> {
+    if let Ok(path) = env::var("RUST_SRC_PATH") {
+        return Ok(path.into());
+    }
+
+    let rustc_output = Command::new("rustc")
+        .current_dir(cargo_toml.parent().unwrap())
+        .args(&["--print", "sysroot"])
+        .output()?;
+    if !rustc_output.status.success() {
+        Err("failed to locate sysroot")?;
+    }
+    let stdout = String::from_utf8(rustc_output.stdout)?;
+    let sysroot_path = Path::new(stdout.trim());
+    Ok(sysroot_path.join("lib/rustlib/src/rust/src"))
+}
+
 impl SysrootCrate {
     pub fn name(self, sysroot: &Sysroot) -> &str {
         &sysroot.crates[self].name
index 7990d1d31b12f4b642a6bcb2e331b4150b1ed6bd..453e8e273f82eb4c982374fbdf0be2acc3b4d10a 100644 (file)
@@ -78,6 +78,7 @@ See https://github.com/microsoft/vscode/issues/72308[microsoft/vscode#72308] for
   (e.g: `--features="shumway,pdf"` will run as `cargo watch -x "check --features="shumway,pdf""` )
 * `rust-analyzer.trace.server`: enables internal logging
 * `rust-analyzer.trace.cargo-watch`: enables cargo-watch logging
+* `RUST_SRC_PATH`: environment variable that overwrites the sysroot
 
 
 ## Emacs