use crate::compiler::BuildConfig;
use crate::compiler::CompileKind;
use crate::compiler::Unit;
use crate::compiler::UnitIndex;
use crate::compiler::unit_graph::UnitGraph;
use crate::context::GlobalContext;
use crate::util::Rustc;
use crate::util::data_structures::{HashMap, HashSet};
use crate::util::errors::CargoResult;
use crate::util::interning::InternedString;
use crate::util::logger::BuildLogger;
use crate::workspace::PackageSet;
use crate::workspace::Workspace;
use crate::workspace::dependency::DepKind;
use crate::workspace::profiles::Profiles;
mod target_info;
pub use self::target_info::FileFlavor;
pub use self::target_info::FileType;
pub use self::target_info::RustcTargetData;
pub use self::target_info::TargetInfo;
pub struct BuildContext<'a, 'gctx> {
pub ws: &'a Workspace<'gctx>,
pub gctx: &'gctx GlobalContext,
pub logger: Option<&'a BuildLogger>,
pub profiles: Profiles,
pub build_config: &'a BuildConfig,
pub selected_dep_kinds: DepKindSet,
pub extra_compiler_args: HashMap<Unit, Vec<String>>,
pub packages: PackageSet<'gctx>,
pub target_data: RustcTargetData<'gctx>,
pub roots: Vec<Unit>,
pub unit_graph: UnitGraph,
pub unit_to_index: HashMap<Unit, UnitIndex>,
pub scrape_units: Vec<Unit>,
pub all_kinds: HashSet<CompileKind>,
}
impl<'a, 'gctx> BuildContext<'a, 'gctx> {
pub fn new(
ws: &'a Workspace<'gctx>,
logger: Option<&'a BuildLogger>,
packages: PackageSet<'gctx>,
build_config: &'a BuildConfig,
selected_dep_kinds: DepKindSet,
profiles: Profiles,
extra_compiler_args: HashMap<Unit, Vec<String>>,
target_data: RustcTargetData<'gctx>,
roots: Vec<Unit>,
unit_graph: UnitGraph,
unit_to_index: HashMap<Unit, UnitIndex>,
scrape_units: Vec<Unit>,
) -> CargoResult<BuildContext<'a, 'gctx>> {
let all_kinds = unit_graph
.keys()
.map(|u| u.kind)
.chain(build_config.requested_kinds.iter().copied())
.chain(std::iter::once(CompileKind::Host))
.collect();
Ok(BuildContext {
ws,
gctx: ws.gctx(),
logger,
packages,
build_config,
selected_dep_kinds,
profiles,
extra_compiler_args,
target_data,
roots,
unit_graph,
unit_to_index,
scrape_units,
all_kinds,
})
}
pub fn rustc(&self) -> &Rustc {
&self.target_data.rustc
}
pub fn host_triple(&self) -> InternedString {
self.target_data.rustc.host
}
pub fn jobs(&self) -> u32 {
self.build_config.jobs
}
pub fn extra_args_for(&self, unit: &Unit) -> Option<&Vec<String>> {
self.extra_compiler_args.get(unit)
}
}
#[derive(Copy, Clone, Default, Debug)]
pub struct DepKindSet {
pub build: bool,
pub normal: bool,
pub dev: bool,
}
impl DepKindSet {
pub fn contains(&self, kind: DepKind) -> bool {
match kind {
DepKind::Build => self.build,
DepKind::Normal => self.normal,
DepKind::Development => self.dev,
}
}
}