use crate::core::compiler::unit::UnitInterner;
use crate::core::compiler::{BuildConfig, BuildOutput, CompileKind, Unit};
use crate::core::profiles::Profiles;
use crate::core::{InternedString, Workspace};
use crate::core::{PackageId, PackageSet};
use crate::util::config::Config;
use crate::util::errors::CargoResult;
use crate::util::Rustc;
use std::cell::RefCell;
use std::collections::{HashMap, HashSet};
use std::path::PathBuf;
use std::str;
mod target_info;
pub use self::target_info::{FileFlavor, RustcTargetData, TargetInfo};
pub struct BuildContext<'a, 'cfg> {
pub ws: &'a Workspace<'cfg>,
pub config: &'cfg Config,
pub profiles: Profiles,
pub build_config: &'a BuildConfig,
pub extra_compiler_args: HashMap<Unit<'a>, Vec<String>>,
pub packages: &'a PackageSet<'cfg>,
pub units: &'a UnitInterner<'a>,
pub target_data: RustcTargetData,
pub skip_units: RefCell<HashSet<Unit<'a>>>,
}
impl<'a, 'cfg> BuildContext<'a, 'cfg> {
pub fn new(
ws: &'a Workspace<'cfg>,
packages: &'a PackageSet<'cfg>,
config: &'cfg Config,
build_config: &'a BuildConfig,
profiles: Profiles,
units: &'a UnitInterner<'a>,
extra_compiler_args: HashMap<Unit<'a>, Vec<String>>,
target_data: RustcTargetData,
) -> CargoResult<BuildContext<'a, 'cfg>> {
Ok(BuildContext {
ws,
packages,
config,
build_config,
profiles,
extra_compiler_args,
units,
target_data,
skip_units: RefCell::new(HashSet::new()),
})
}
pub fn rustc(&self) -> &Rustc {
&self.target_data.rustc
}
pub fn linker(&self, kind: CompileKind) -> Option<PathBuf> {
self.target_data
.target_config(kind)
.linker
.as_ref()
.map(|l| l.val.clone().resolve_program(self.config))
}
pub fn host_triple(&self) -> InternedString {
self.target_data.rustc.host
}
pub fn jobs(&self) -> u32 {
self.build_config.jobs
}
pub fn rustflags_args(&self, unit: &Unit<'_>) -> &[String] {
&self.target_data.info(unit.kind).rustflags
}
pub fn rustdocflags_args(&self, unit: &Unit<'_>) -> &[String] {
&self.target_data.info(unit.kind).rustdocflags
}
pub fn show_warnings(&self, pkg: PackageId) -> bool {
pkg.source_id().is_path() || self.config.extra_verbose()
}
pub fn extra_args_for(&self, unit: &Unit<'a>) -> Option<&Vec<String>> {
self.extra_compiler_args.get(unit)
}
pub fn script_override(&self, lib_name: &str, kind: CompileKind) -> Option<&BuildOutput> {
self.target_data
.target_config(kind)
.links_overrides
.get(lib_name)
}
}