mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 10:13:54 +00:00
Support cfg overrides in all workspace kind
This commit is contained in:
parent
ee10f9f5cd
commit
8989dcffd6
@ -75,6 +75,7 @@ fn load_rust_project(file: &str) -> (CrateGraph, ProcMacroPaths) {
|
|||||||
rustc_cfg: Vec::new(),
|
rustc_cfg: Vec::new(),
|
||||||
toolchain: None,
|
toolchain: None,
|
||||||
target_layout: Err(Arc::from("test has no data layout")),
|
target_layout: Err(Arc::from("test has no data layout")),
|
||||||
|
cfg_overrides: Default::default(),
|
||||||
};
|
};
|
||||||
to_crate_graph(project_workspace)
|
to_crate_graph(project_workspace)
|
||||||
}
|
}
|
||||||
|
@ -86,6 +86,8 @@ pub enum ProjectWorkspace {
|
|||||||
toolchain: Option<Version>,
|
toolchain: Option<Version>,
|
||||||
/// The target data layout queried for workspace.
|
/// The target data layout queried for workspace.
|
||||||
target_layout: TargetLayoutLoadResult,
|
target_layout: TargetLayoutLoadResult,
|
||||||
|
/// A set of cfg overrides for this workspace.
|
||||||
|
cfg_overrides: CfgOverrides,
|
||||||
},
|
},
|
||||||
// FIXME: The primary limitation of this approach is that the set of detached files needs to be fixed at the beginning.
|
// FIXME: The primary limitation of this approach is that the set of detached files needs to be fixed at the beginning.
|
||||||
// That's not the end user experience we should strive for.
|
// That's not the end user experience we should strive for.
|
||||||
@ -111,6 +113,8 @@ pub enum ProjectWorkspace {
|
|||||||
toolchain: Option<Version>,
|
toolchain: Option<Version>,
|
||||||
/// The target data layout queried for workspace.
|
/// The target data layout queried for workspace.
|
||||||
target_layout: TargetLayoutLoadResult,
|
target_layout: TargetLayoutLoadResult,
|
||||||
|
/// A set of cfg overrides for the files.
|
||||||
|
cfg_overrides: CfgOverrides,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -149,6 +153,7 @@ impl fmt::Debug for ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain,
|
toolchain,
|
||||||
target_layout: data_layout,
|
target_layout: data_layout,
|
||||||
|
cfg_overrides,
|
||||||
} => {
|
} => {
|
||||||
let mut debug_struct = f.debug_struct("Json");
|
let mut debug_struct = f.debug_struct("Json");
|
||||||
debug_struct.field("n_crates", &project.n_crates());
|
debug_struct.field("n_crates", &project.n_crates());
|
||||||
@ -158,7 +163,8 @@ impl fmt::Debug for ProjectWorkspace {
|
|||||||
debug_struct
|
debug_struct
|
||||||
.field("n_rustc_cfg", &rustc_cfg.len())
|
.field("n_rustc_cfg", &rustc_cfg.len())
|
||||||
.field("toolchain", &toolchain)
|
.field("toolchain", &toolchain)
|
||||||
.field("data_layout", &data_layout);
|
.field("data_layout", &data_layout)
|
||||||
|
.field("n_cfg_overrides", &cfg_overrides.len());
|
||||||
debug_struct.finish()
|
debug_struct.finish()
|
||||||
}
|
}
|
||||||
ProjectWorkspace::DetachedFiles {
|
ProjectWorkspace::DetachedFiles {
|
||||||
@ -167,6 +173,7 @@ impl fmt::Debug for ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain,
|
toolchain,
|
||||||
target_layout,
|
target_layout,
|
||||||
|
cfg_overrides,
|
||||||
} => f
|
} => f
|
||||||
.debug_struct("DetachedFiles")
|
.debug_struct("DetachedFiles")
|
||||||
.field("n_files", &files.len())
|
.field("n_files", &files.len())
|
||||||
@ -174,6 +181,7 @@ impl fmt::Debug for ProjectWorkspace {
|
|||||||
.field("n_rustc_cfg", &rustc_cfg.len())
|
.field("n_rustc_cfg", &rustc_cfg.len())
|
||||||
.field("toolchain", &toolchain)
|
.field("toolchain", &toolchain)
|
||||||
.field("data_layout", &target_layout)
|
.field("data_layout", &target_layout)
|
||||||
|
.field("n_cfg_overrides", &cfg_overrides.len())
|
||||||
.finish(),
|
.finish(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -227,6 +235,7 @@ impl ProjectWorkspace {
|
|||||||
project_json,
|
project_json,
|
||||||
config.target.as_deref(),
|
config.target.as_deref(),
|
||||||
&config.extra_env,
|
&config.extra_env,
|
||||||
|
&config.cfg_overrides,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
ProjectManifest::CargoToml(cargo_toml) => {
|
ProjectManifest::CargoToml(cargo_toml) => {
|
||||||
@ -368,6 +377,7 @@ impl ProjectWorkspace {
|
|||||||
project_json: ProjectJson,
|
project_json: ProjectJson,
|
||||||
target: Option<&str>,
|
target: Option<&str>,
|
||||||
extra_env: &FxHashMap<String, String>,
|
extra_env: &FxHashMap<String, String>,
|
||||||
|
cfg_overrides: &CfgOverrides,
|
||||||
) -> ProjectWorkspace {
|
) -> ProjectWorkspace {
|
||||||
let sysroot = match (project_json.sysroot.clone(), project_json.sysroot_src.clone()) {
|
let sysroot = match (project_json.sysroot.clone(), project_json.sysroot_src.clone()) {
|
||||||
(Some(sysroot), Some(sysroot_src)) => {
|
(Some(sysroot), Some(sysroot_src)) => {
|
||||||
@ -414,6 +424,7 @@ impl ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain,
|
toolchain,
|
||||||
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
||||||
|
cfg_overrides: cfg_overrides.clone(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -464,6 +475,7 @@ impl ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain,
|
toolchain,
|
||||||
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
||||||
|
cfg_overrides: config.cfg_overrides.clone(),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -619,6 +631,7 @@ impl ProjectWorkspace {
|
|||||||
rustc_cfg: _,
|
rustc_cfg: _,
|
||||||
toolchain: _,
|
toolchain: _,
|
||||||
target_layout: _,
|
target_layout: _,
|
||||||
|
cfg_overrides: _,
|
||||||
} => project
|
} => project
|
||||||
.crates()
|
.crates()
|
||||||
.map(|(_, krate)| PackageRoot {
|
.map(|(_, krate)| PackageRoot {
|
||||||
@ -734,6 +747,7 @@ impl ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain: _,
|
toolchain: _,
|
||||||
target_layout: _,
|
target_layout: _,
|
||||||
|
cfg_overrides,
|
||||||
} => (
|
} => (
|
||||||
project_json_to_crate_graph(
|
project_json_to_crate_graph(
|
||||||
rustc_cfg.clone(),
|
rustc_cfg.clone(),
|
||||||
@ -741,6 +755,7 @@ impl ProjectWorkspace {
|
|||||||
project,
|
project,
|
||||||
sysroot.as_ref().ok(),
|
sysroot.as_ref().ok(),
|
||||||
extra_env,
|
extra_env,
|
||||||
|
cfg_overrides,
|
||||||
),
|
),
|
||||||
sysroot,
|
sysroot,
|
||||||
),
|
),
|
||||||
@ -772,12 +787,14 @@ impl ProjectWorkspace {
|
|||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
toolchain: _,
|
toolchain: _,
|
||||||
target_layout: _,
|
target_layout: _,
|
||||||
|
cfg_overrides,
|
||||||
} => (
|
} => (
|
||||||
detached_files_to_crate_graph(
|
detached_files_to_crate_graph(
|
||||||
rustc_cfg.clone(),
|
rustc_cfg.clone(),
|
||||||
load,
|
load,
|
||||||
files,
|
files,
|
||||||
sysroot.as_ref().ok(),
|
sysroot.as_ref().ok(),
|
||||||
|
cfg_overrides,
|
||||||
),
|
),
|
||||||
sysroot,
|
sysroot,
|
||||||
),
|
),
|
||||||
@ -828,28 +845,45 @@ impl ProjectWorkspace {
|
|||||||
&& cargo_config_extra_env == o_cargo_config_extra_env
|
&& cargo_config_extra_env == o_cargo_config_extra_env
|
||||||
}
|
}
|
||||||
(
|
(
|
||||||
Self::Json { project, sysroot, rustc_cfg, toolchain, target_layout: _ },
|
Self::Json {
|
||||||
|
project,
|
||||||
|
sysroot,
|
||||||
|
rustc_cfg,
|
||||||
|
toolchain,
|
||||||
|
target_layout: _,
|
||||||
|
cfg_overrides,
|
||||||
|
},
|
||||||
Self::Json {
|
Self::Json {
|
||||||
project: o_project,
|
project: o_project,
|
||||||
sysroot: o_sysroot,
|
sysroot: o_sysroot,
|
||||||
rustc_cfg: o_rustc_cfg,
|
rustc_cfg: o_rustc_cfg,
|
||||||
toolchain: o_toolchain,
|
toolchain: o_toolchain,
|
||||||
target_layout: _,
|
target_layout: _,
|
||||||
|
cfg_overrides: o_cfg_overrides,
|
||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
project == o_project
|
project == o_project
|
||||||
&& rustc_cfg == o_rustc_cfg
|
&& rustc_cfg == o_rustc_cfg
|
||||||
&& sysroot == o_sysroot
|
&& sysroot == o_sysroot
|
||||||
&& toolchain == o_toolchain
|
&& toolchain == o_toolchain
|
||||||
|
&& cfg_overrides == o_cfg_overrides
|
||||||
}
|
}
|
||||||
(
|
(
|
||||||
Self::DetachedFiles { files, sysroot, rustc_cfg, toolchain, target_layout },
|
Self::DetachedFiles {
|
||||||
|
files,
|
||||||
|
sysroot,
|
||||||
|
rustc_cfg,
|
||||||
|
toolchain,
|
||||||
|
target_layout,
|
||||||
|
cfg_overrides,
|
||||||
|
},
|
||||||
Self::DetachedFiles {
|
Self::DetachedFiles {
|
||||||
files: o_files,
|
files: o_files,
|
||||||
sysroot: o_sysroot,
|
sysroot: o_sysroot,
|
||||||
rustc_cfg: o_rustc_cfg,
|
rustc_cfg: o_rustc_cfg,
|
||||||
toolchain: o_toolchain,
|
toolchain: o_toolchain,
|
||||||
target_layout: o_target_layout,
|
target_layout: o_target_layout,
|
||||||
|
cfg_overrides: o_cfg_overrides,
|
||||||
},
|
},
|
||||||
) => {
|
) => {
|
||||||
files == o_files
|
files == o_files
|
||||||
@ -857,6 +891,7 @@ impl ProjectWorkspace {
|
|||||||
&& rustc_cfg == o_rustc_cfg
|
&& rustc_cfg == o_rustc_cfg
|
||||||
&& toolchain == o_toolchain
|
&& toolchain == o_toolchain
|
||||||
&& target_layout == o_target_layout
|
&& target_layout == o_target_layout
|
||||||
|
&& cfg_overrides == o_cfg_overrides
|
||||||
}
|
}
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
@ -877,6 +912,7 @@ fn project_json_to_crate_graph(
|
|||||||
project: &ProjectJson,
|
project: &ProjectJson,
|
||||||
sysroot: Option<&Sysroot>,
|
sysroot: Option<&Sysroot>,
|
||||||
extra_env: &FxHashMap<String, String>,
|
extra_env: &FxHashMap<String, String>,
|
||||||
|
override_cfg: &CfgOverrides,
|
||||||
) -> (CrateGraph, ProcMacroPaths) {
|
) -> (CrateGraph, ProcMacroPaths) {
|
||||||
let mut res = (CrateGraph::default(), ProcMacroPaths::default());
|
let mut res = (CrateGraph::default(), ProcMacroPaths::default());
|
||||||
let (crate_graph, proc_macros) = &mut res;
|
let (crate_graph, proc_macros) = &mut res;
|
||||||
@ -916,19 +952,22 @@ fn project_json_to_crate_graph(
|
|||||||
None => &rustc_cfg,
|
None => &rustc_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let mut cfg_options = target_cfgs
|
||||||
|
.iter()
|
||||||
|
.chain(cfg.iter())
|
||||||
|
.chain(iter::once(&r_a_cfg_flag))
|
||||||
|
.cloned()
|
||||||
|
.collect();
|
||||||
|
override_cfg.apply(
|
||||||
|
&mut cfg_options,
|
||||||
|
display_name.as_ref().map(|it| it.canonical_name()).unwrap_or_default(),
|
||||||
|
);
|
||||||
let crate_graph_crate_id = crate_graph.add_crate_root(
|
let crate_graph_crate_id = crate_graph.add_crate_root(
|
||||||
file_id,
|
file_id,
|
||||||
*edition,
|
*edition,
|
||||||
display_name.clone(),
|
display_name.clone(),
|
||||||
version.clone(),
|
version.clone(),
|
||||||
Arc::new(
|
Arc::new(cfg_options),
|
||||||
target_cfgs
|
|
||||||
.iter()
|
|
||||||
.chain(cfg.iter())
|
|
||||||
.chain(iter::once(&r_a_cfg_flag))
|
|
||||||
.cloned()
|
|
||||||
.collect(),
|
|
||||||
),
|
|
||||||
None,
|
None,
|
||||||
env,
|
env,
|
||||||
*is_proc_macro,
|
*is_proc_macro,
|
||||||
@ -992,7 +1031,7 @@ fn cargo_to_crate_graph(
|
|||||||
None => (SysrootPublicDeps::default(), None),
|
None => (SysrootPublicDeps::default(), None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let cfg_options = create_cfg_options(rustc_cfg);
|
let cfg_options = CfgOptions::from_iter(rustc_cfg);
|
||||||
|
|
||||||
// Mapping of a package to its library target
|
// Mapping of a package to its library target
|
||||||
let mut pkg_to_lib_crate = FxHashMap::default();
|
let mut pkg_to_lib_crate = FxHashMap::default();
|
||||||
@ -1168,6 +1207,7 @@ fn detached_files_to_crate_graph(
|
|||||||
load: FileLoader<'_>,
|
load: FileLoader<'_>,
|
||||||
detached_files: &[AbsPathBuf],
|
detached_files: &[AbsPathBuf],
|
||||||
sysroot: Option<&Sysroot>,
|
sysroot: Option<&Sysroot>,
|
||||||
|
override_cfg: &CfgOverrides,
|
||||||
) -> (CrateGraph, ProcMacroPaths) {
|
) -> (CrateGraph, ProcMacroPaths) {
|
||||||
let _p = tracing::span!(tracing::Level::INFO, "detached_files_to_crate_graph").entered();
|
let _p = tracing::span!(tracing::Level::INFO, "detached_files_to_crate_graph").entered();
|
||||||
let mut crate_graph = CrateGraph::default();
|
let mut crate_graph = CrateGraph::default();
|
||||||
@ -1176,8 +1216,10 @@ fn detached_files_to_crate_graph(
|
|||||||
None => (SysrootPublicDeps::default(), None),
|
None => (SysrootPublicDeps::default(), None),
|
||||||
};
|
};
|
||||||
|
|
||||||
let mut cfg_options = create_cfg_options(rustc_cfg);
|
let mut cfg_options = CfgOptions::from_iter(rustc_cfg);
|
||||||
|
cfg_options.insert_atom("test".into());
|
||||||
cfg_options.insert_atom("rust_analyzer".into());
|
cfg_options.insert_atom("rust_analyzer".into());
|
||||||
|
override_cfg.apply(&mut cfg_options, "");
|
||||||
let cfg_options = Arc::new(cfg_options);
|
let cfg_options = Arc::new(cfg_options);
|
||||||
|
|
||||||
for detached_file in detached_files {
|
for detached_file in detached_files {
|
||||||
@ -1411,7 +1453,11 @@ fn sysroot_to_crate_graph(
|
|||||||
cargo,
|
cargo,
|
||||||
None,
|
None,
|
||||||
rustc_cfg,
|
rustc_cfg,
|
||||||
&CfgOverrides::default(),
|
&CfgOverrides {
|
||||||
|
global: CfgDiff::new(vec![CfgAtom::Flag("debug_assertions".into())], vec![])
|
||||||
|
.unwrap(),
|
||||||
|
..Default::default()
|
||||||
|
},
|
||||||
&WorkspaceBuildScripts::default(),
|
&WorkspaceBuildScripts::default(),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -1469,7 +1515,12 @@ fn sysroot_to_crate_graph(
|
|||||||
(SysrootPublicDeps { deps: pub_deps }, libproc_macro)
|
(SysrootPublicDeps { deps: pub_deps }, libproc_macro)
|
||||||
}
|
}
|
||||||
SysrootMode::Stitched(stitched) => {
|
SysrootMode::Stitched(stitched) => {
|
||||||
let cfg_options = Arc::new(create_cfg_options(rustc_cfg));
|
let cfg_options = Arc::new({
|
||||||
|
let mut cfg_options = CfgOptions::default();
|
||||||
|
cfg_options.extend(rustc_cfg);
|
||||||
|
cfg_options.insert_atom("debug_assertions".into());
|
||||||
|
cfg_options
|
||||||
|
});
|
||||||
let sysroot_crates: FxHashMap<SysrootCrate, CrateId> = stitched
|
let sysroot_crates: FxHashMap<SysrootCrate, CrateId> = stitched
|
||||||
.crates()
|
.crates()
|
||||||
.filter_map(|krate| {
|
.filter_map(|krate| {
|
||||||
@ -1542,10 +1593,3 @@ fn add_dep_inner(graph: &mut CrateGraph, from: CrateId, dep: Dependency) {
|
|||||||
tracing::error!("{}", err)
|
tracing::error!("{}", err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn create_cfg_options(rustc_cfg: Vec<CfgFlag>) -> CfgOptions {
|
|
||||||
let mut cfg_options = CfgOptions::default();
|
|
||||||
cfg_options.extend(rustc_cfg);
|
|
||||||
cfg_options.insert_atom("debug_assertions".into());
|
|
||||||
cfg_options
|
|
||||||
}
|
|
||||||
|
@ -81,6 +81,7 @@ impl Tester {
|
|||||||
rustc_cfg: vec![],
|
rustc_cfg: vec![],
|
||||||
toolchain: None,
|
toolchain: None,
|
||||||
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
target_layout: data_layout.map(Arc::from).map_err(|it| Arc::from(it.to_string())),
|
||||||
|
cfg_overrides: Default::default(),
|
||||||
};
|
};
|
||||||
let load_cargo_config = LoadCargoConfig {
|
let load_cargo_config = LoadCargoConfig {
|
||||||
load_out_dirs_from_check: false,
|
load_out_dirs_from_check: false,
|
||||||
|
@ -234,6 +234,7 @@ impl GlobalState {
|
|||||||
it.clone(),
|
it.clone(),
|
||||||
cargo_config.target.as_deref(),
|
cargo_config.target.as_deref(),
|
||||||
&cargo_config.extra_env,
|
&cargo_config.extra_env,
|
||||||
|
&cargo_config.cfg_overrides,
|
||||||
))
|
))
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
Loading…
Reference in New Issue
Block a user