aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_project_model/src/lib.rs
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2020-05-08 11:11:19 +0100
committerGitHub <[email protected]>2020-05-08 11:11:19 +0100
commit8295a9340c1fbda805497035054ead0b10c0d88e (patch)
treeccab3f149b9633ae95570d78fa5d6b8d3b3392e6 /crates/ra_project_model/src/lib.rs
parent363c1f2f493d206f2cc10c348a02f3efadd8c77a (diff)
parent3077eae2a61f97c28c0d4e3456f6ab873126e5b8 (diff)
Merge #4329
4329: Look for `cargo`, `rustc`, and `rustup` in standard installation path r=matklad a=cdisselkoen Discussed in #3118. This is approximately a 90% fix for the issue described there. This PR creates a new crate `ra_env` with a function `get_path_for_executable()`; see docs there. `get_path_for_executable()` improves and generalizes the function `cargo_binary()` which was previously duplicated in the `ra_project_model` and `ra_flycheck` crates. (Both of those crates now depend on the new `ra_env` crate.) The new function checks (e.g.) `$CARGO` and `$PATH`, but also falls back on `~/.cargo/bin` manually before erroring out. This should allow most users to not have to worry about setting the `$CARGO` or `$PATH` variables for VSCode, which can be difficult e.g. on macOS as discussed in #3118. I've attempted to replace all calls to `cargo`, `rustc`, and `rustup` in rust-analyzer with appropriate invocations of `get_path_for_executable()`; I don't think I've missed any in Rust code, but there is at least one invocation in TypeScript code which I haven't fixed. (I'm not sure whether it's affected by the same problem or not.) https://github.com/rust-analyzer/rust-analyzer/blob/a4778ddb7a00f552a8e653bbf56ae9fd69cfe1d3/editors/code/src/cargo.ts#L79 I'm sure this PR could be improved a bunch, so I'm happy to take feedback/suggestions on how to solve this problem better, or just bikeshedding variable/function/crate names etc. cc @Veetaha Fixes #3118. Co-authored-by: Craig Disselkoen <[email protected]> Co-authored-by: veetaha <[email protected]>
Diffstat (limited to 'crates/ra_project_model/src/lib.rs')
-rw-r--r--crates/ra_project_model/src/lib.rs3
1 files changed, 2 insertions, 1 deletions
diff --git a/crates/ra_project_model/src/lib.rs b/crates/ra_project_model/src/lib.rs
index c226ffa57..88a6ffb2a 100644
--- a/crates/ra_project_model/src/lib.rs
+++ b/crates/ra_project_model/src/lib.rs
@@ -14,6 +14,7 @@ use std::{
14use anyhow::{bail, Context, Result}; 14use anyhow::{bail, Context, Result};
15use ra_cfg::CfgOptions; 15use ra_cfg::CfgOptions;
16use ra_db::{CrateGraph, CrateName, Edition, Env, ExternSource, ExternSourceId, FileId}; 16use ra_db::{CrateGraph, CrateName, Edition, Env, ExternSource, ExternSourceId, FileId};
17use ra_env::get_path_for_executable;
17use rustc_hash::FxHashMap; 18use rustc_hash::FxHashMap;
18use serde_json::from_reader; 19use serde_json::from_reader;
19 20
@@ -569,7 +570,7 @@ pub fn get_rustc_cfg_options(target: Option<&String>) -> CfgOptions {
569 570
570 match (|| -> Result<String> { 571 match (|| -> Result<String> {
571 // `cfg(test)` and `cfg(debug_assertion)` are handled outside, so we suppress them here. 572 // `cfg(test)` and `cfg(debug_assertion)` are handled outside, so we suppress them here.
572 let mut cmd = Command::new("rustc"); 573 let mut cmd = Command::new(get_path_for_executable("rustc")?);
573 cmd.args(&["--print", "cfg", "-O"]); 574 cmd.args(&["--print", "cfg", "-O"]);
574 if let Some(target) = target { 575 if let Some(target) = target {
575 cmd.args(&["--target", target.as_str()]); 576 cmd.args(&["--target", target.as_str()]);