Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/project-model/src/workspace.rs')
-rw-r--r--crates/project-model/src/workspace.rs93
1 files changed, 47 insertions, 46 deletions
diff --git a/crates/project-model/src/workspace.rs b/crates/project-model/src/workspace.rs
index 5b36e10fd6..b88db41957 100644
--- a/crates/project-model/src/workspace.rs
+++ b/crates/project-model/src/workspace.rs
@@ -8,7 +8,7 @@ use anyhow::Context;
use base_db::{
CrateBuilderId, CrateDisplayName, CrateGraphBuilder, CrateName, CrateOrigin,
CrateWorkspaceData, DependencyBuilder, Env, LangCrateOrigin, ProcMacroLoadingError,
- ProcMacroPaths, TargetLayoutLoadResult,
+ ProcMacroPaths, target::TargetLoadResult,
};
use cfg::{CfgAtom, CfgDiff, CfgOptions};
use intern::{Symbol, sym};
@@ -16,8 +16,9 @@ use paths::{AbsPath, AbsPathBuf, Utf8PathBuf};
use rustc_hash::{FxHashMap, FxHashSet};
use semver::Version;
use span::{Edition, FileId};
-use toolchain::Tool;
+use toolchain::{NO_RUSTUP_AUTO_INSTALL_ENV, Tool};
use tracing::instrument;
+use tracing::{debug, error, info};
use triomphe::Arc;
use crate::{
@@ -30,10 +31,9 @@ use crate::{
env::{cargo_config_env, inject_cargo_env, inject_cargo_package_env, inject_rustc_tool_env},
project_json::{Crate, CrateArrayIdx},
sysroot::RustLibSrcWorkspace,
- toolchain_info::{QueryConfig, rustc_cfg, target_data_layout, target_tuple, version},
+ toolchain_info::{QueryConfig, rustc_cfg, target_data, target_tuple, version},
utf8_stdout,
};
-use tracing::{debug, error, info};
pub type FileLoader<'a> = &'a mut dyn for<'b> FnMut(&'b AbsPath) -> Option<FileId>;
@@ -63,7 +63,7 @@ pub struct ProjectWorkspace {
/// The toolchain version used by this workspace.
pub toolchain: Option<Version>,
/// The target data layout queried for workspace.
- pub target_layout: TargetLayoutLoadResult,
+ pub target: TargetLoadResult,
/// A set of cfg overrides for this workspace.
pub cfg_overrides: CfgOverrides,
/// Additional includes to add for the VFS.
@@ -115,7 +115,7 @@ impl fmt::Debug for ProjectWorkspace {
sysroot,
rustc_cfg,
toolchain,
- target_layout,
+ target: target_layout,
cfg_overrides,
extra_includes,
set_test,
@@ -157,7 +157,6 @@ impl fmt::Debug for ProjectWorkspace {
.field("file", &file)
.field("cargo_script", &cargo_script.is_some())
.field("n_sysroot_crates", &sysroot.num_packages())
- .field("cargo_script", &cargo_script.is_some())
.field("n_rustc_cfg", &rustc_cfg.len())
.field("toolchain", &toolchain)
.field("data_layout", &target_layout)
@@ -310,8 +309,8 @@ impl ProjectWorkspace {
let rustc_cfg = s.spawn(|| {
rustc_cfg::get(toolchain_config, targets.first().map(Deref::deref), extra_env)
});
- let data_layout = s.spawn(|| {
- target_data_layout::get(
+ let target_data = s.spawn(|| {
+ target_data::get(
toolchain_config,
targets.first().map(Deref::deref),
extra_env,
@@ -384,41 +383,40 @@ impl ProjectWorkspace {
toolchain.clone(),
)),
config.no_deps,
- workspace_dir,
&target_dir,
progress,
)
});
- let cargo_config_extra_env =
- s.spawn(move || cargo_config_env(cargo_toml, &config_file));
+ let cargo_env =
+ s.spawn(move || cargo_config_env(cargo_toml, &config_file, &config.extra_env));
thread::Result::Ok((
rustc_cfg.join()?,
- data_layout.join()?,
+ target_data.join()?,
rustc_dir.join()?,
loaded_sysroot.join()?,
cargo_metadata.join()?,
- cargo_config_extra_env.join()?,
+ cargo_env.join()?,
))
});
- let (
- rustc_cfg,
- data_layout,
- mut rustc,
- loaded_sysroot,
- cargo_metadata,
- cargo_config_extra_env,
- ) = match join {
- Ok(it) => it,
- Err(e) => std::panic::resume_unwind(e),
- };
+ let (rustc_cfg, data_layout, mut rustc, loaded_sysroot, cargo_metadata, mut cargo_env) =
+ match join {
+ Ok(it) => it,
+ Err(e) => std::panic::resume_unwind(e),
+ };
+
+ for (key, value) in config.extra_env.iter() {
+ if let Some(value) = value {
+ cargo_env.insert(key.clone(), value.clone());
+ }
+ }
let (meta, error) = cargo_metadata.with_context(|| {
format!(
"Failed to read Cargo metadata from Cargo.toml file {cargo_toml}, {toolchain:?}",
)
})?;
- let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_config_extra_env, false);
+ let cargo = CargoWorkspace::new(meta, cargo_toml.clone(), cargo_env, false);
if let Some(loaded_sysroot) = loaded_sysroot {
tracing::info!(src_root = ?sysroot.rust_lib_src_root(), root = %loaded_sysroot, "Loaded sysroot");
sysroot.set_workspace(loaded_sysroot);
@@ -443,7 +441,7 @@ impl ProjectWorkspace {
rustc_cfg,
cfg_overrides: cfg_overrides.clone(),
toolchain,
- target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
+ target: data_layout.map_err(|it| it.to_string().into()),
extra_includes: extra_includes.clone(),
set_test: *set_test,
})
@@ -481,18 +479,13 @@ impl ProjectWorkspace {
rustc_cfg::get(query_config, targets.first().map(Deref::deref), &config.extra_env)
});
let data_layout = s.spawn(|| {
- target_data_layout::get(
- query_config,
- targets.first().map(Deref::deref),
- &config.extra_env,
- )
+ target_data::get(query_config, targets.first().map(Deref::deref), &config.extra_env)
});
let loaded_sysroot = s.spawn(|| {
if let Some(sysroot_project) = sysroot_project {
sysroot.load_workspace(
&RustSourceWorkspaceConfig::Json(*sysroot_project),
config.no_deps,
- project_root,
&target_dir,
progress,
)
@@ -504,7 +497,6 @@ impl ProjectWorkspace {
toolchain.clone(),
)),
config.no_deps,
- project_root,
&target_dir,
progress,
)
@@ -514,7 +506,7 @@ impl ProjectWorkspace {
thread::Result::Ok((rustc_cfg.join()?, data_layout.join()?, loaded_sysroot.join()?))
});
- let (rustc_cfg, target_layout, loaded_sysroot) = match join {
+ let (rustc_cfg, target_data, loaded_sysroot) = match join {
Ok(it) => it,
Err(e) => std::panic::resume_unwind(e),
};
@@ -528,7 +520,7 @@ impl ProjectWorkspace {
sysroot,
rustc_cfg,
toolchain,
- target_layout: target_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
+ target: target_data.map_err(|it| it.to_string().into()),
cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(),
set_test: config.set_test,
@@ -552,7 +544,7 @@ impl ProjectWorkspace {
let targets = target_tuple::get(query_config, config.target.as_deref(), &config.extra_env)
.unwrap_or_default();
let rustc_cfg = rustc_cfg::get(query_config, None, &config.extra_env);
- let data_layout = target_data_layout::get(query_config, None, &config.extra_env);
+ let target_data = target_data::get(query_config, None, &config.extra_env);
let target_dir = config
.target_dir
.clone()
@@ -566,7 +558,6 @@ impl ProjectWorkspace {
toolchain.clone(),
)),
config.no_deps,
- dir,
&target_dir,
&|_| (),
);
@@ -595,7 +586,8 @@ impl ProjectWorkspace {
.unwrap_or_else(|| dir.join("target").into());
let cargo_script =
fetch_metadata.exec(&target_dir, false, &|_| ()).ok().map(|(ws, error)| {
- let cargo_config_extra_env = cargo_config_env(detached_file, &config_file);
+ let cargo_config_extra_env =
+ cargo_config_env(detached_file, &config_file, &config.extra_env);
(
CargoWorkspace::new(ws, detached_file.clone(), cargo_config_extra_env, false),
WorkspaceBuildScripts::default(),
@@ -611,7 +603,7 @@ impl ProjectWorkspace {
sysroot,
rustc_cfg,
toolchain,
- target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
+ target: target_data.map_err(|it| it.to_string().into()),
cfg_overrides: config.cfg_overrides.clone(),
extra_includes: config.extra_includes.clone(),
set_test: config.set_test,
@@ -752,7 +744,7 @@ impl ProjectWorkspace {
pub fn to_roots(&self) -> Vec<PackageRoot> {
let mk_sysroot = || {
let mut r = match self.sysroot.workspace() {
- RustLibSrcWorkspace::Workspace(ws) => ws
+ RustLibSrcWorkspace::Workspace { ws, .. } => ws
.packages()
.filter_map(|pkg| {
if ws[pkg].is_local {
@@ -943,7 +935,7 @@ impl ProjectWorkspace {
let Self { kind, sysroot, cfg_overrides, rustc_cfg, .. } = self;
let crate_ws_data = Arc::new(CrateWorkspaceData {
toolchain: self.toolchain.clone(),
- data_layout: self.target_layout.clone(),
+ target: self.target.clone(),
});
let (crate_graph, proc_macros) = match kind {
ProjectWorkspaceKind::Json(project) => project_json_to_crate_graph(
@@ -1001,13 +993,15 @@ impl ProjectWorkspace {
}
pub fn eq_ignore_build_data(&self, other: &Self) -> bool {
- let Self { kind, sysroot, rustc_cfg, toolchain, target_layout, cfg_overrides, .. } = self;
+ let Self {
+ kind, sysroot, rustc_cfg, toolchain, target: target_layout, cfg_overrides, ..
+ } = self;
let Self {
kind: o_kind,
sysroot: o_sysroot,
rustc_cfg: o_rustc_cfg,
toolchain: o_toolchain,
- target_layout: o_target_layout,
+ target: o_target_layout,
cfg_overrides: o_cfg_overrides,
..
} = other;
@@ -1096,7 +1090,13 @@ fn project_json_to_crate_graph(
},
file_id,
)| {
- let env = env.clone().into_iter().collect();
+ let mut env = env.clone().into_iter().collect::<Env>();
+ // Override existing env vars with those from `extra_env`
+ env.extend(
+ extra_env
+ .iter()
+ .filter_map(|(k, v)| v.as_ref().map(|v| (k.clone(), v.clone()))),
+ );
let target_cfgs = match target.as_deref() {
Some(target) => cfg_cache.entry(target).or_insert_with(|| {
@@ -1738,7 +1738,7 @@ fn sysroot_to_crate_graph(
) -> (SysrootPublicDeps, Option<CrateBuilderId>) {
let _p = tracing::info_span!("sysroot_to_crate_graph").entered();
match sysroot.workspace() {
- RustLibSrcWorkspace::Workspace(cargo) => {
+ RustLibSrcWorkspace::Workspace { ws: cargo, .. } => {
let (sysroot_cg, sysroot_pm) = cargo_to_crate_graph(
load,
None,
@@ -1910,6 +1910,7 @@ fn cargo_target_dir(
) -> Option<Utf8PathBuf> {
let cargo = sysroot.tool(Tool::Cargo, manifest.parent(), extra_env);
let mut meta = cargo_metadata::MetadataCommand::new();
+ meta.env(NO_RUSTUP_AUTO_INSTALL_ENV.0, NO_RUSTUP_AUTO_INSTALL_ENV.1);
meta.cargo_path(cargo.get_program());
meta.manifest_path(manifest);
// `--no-deps` doesn't (over)write lockfiles as it doesn't do any package resolve.