use std::{
+ env,
path::{Path, PathBuf},
process::Command,
};
}
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,
))?;
}
}
}
+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
(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