use serde::ser;
+ use crate::core::compiler::{CompileKind, CompileTarget};
use crate::util::ProcessBuilder;
- use crate::util::{CargoResult, CargoResultExt, Config, RustfixDiagnosticServer};
+ use crate::util::{CargoResult, Config, RustfixDiagnosticServer};
+#[derive(Debug, Clone)]
+pub enum ProfileKind {
+ Dev,
+ Release,
+ Custom(String),
+}
+
+impl ProfileKind {
+ pub fn name(&self) -> &str {
+ match self {
+ ProfileKind::Dev => "dev",
+ ProfileKind::Release => "release",
+ ProfileKind::Custom(name) => &name,
+ }
+ }
+}
+
/// Configuration information for a rustc build.
#[derive(Debug)]
pub struct BuildConfig {
- /// The target arch triple.
- /// Default: host arch.
- pub requested_target: Option<String>,
+ /// The requested kind of compilation for this session
+ pub requested_kind: CompileKind,
/// Number of rustc jobs to run in parallel.
pub jobs: u32,
- /// `true` if we are building for release.
- pub release: bool,
+ /// Build profile
+ pub profile_kind: ProfileKind,
/// The mode we are compiling in.
pub mode: CompileMode,
/// `true` to print stdout in JSON format (for machine reading).
let jobs = jobs.or(cfg_jobs).unwrap_or(::num_cpus::get() as u32);
Ok(BuildConfig {
- requested_target: target,
+ requested_kind,
jobs,
- release: false,
+ profile_kind: ProfileKind::Dev,
mode,
message_format: MessageFormat::Human,
force_rebuild: false,
export_dir: Option<PathBuf>,
units: &[Unit<'a>],
) -> CargoResult<()> {
- let dest = if self.bcx.build_config.release {
- "release"
- } else {
- "debug"
- };
- let host_layout = Layout::new(self.bcx.ws, None, dest)?;
+ let profile_kind = &self.bcx.build_config.profile_kind;
+ let dest = self.bcx.profiles.get_dir_name(profile_kind);
+ let host_layout = Layout::new(self.bcx.ws, None, &dest)?;
- let target_layout = match self.bcx.build_config.requested_target.as_ref() {
- Some(target) => {
- let layout = Layout::new(self.bcx.ws, Some(target), &dest)?;
- standard_lib::prepare_sysroot(&layout)?;
- Some(layout)
- }
- None => None,
- };
+ let mut targets = HashMap::new();
+ if let CompileKind::Target(target) = self.bcx.build_config.requested_kind {
- let layout = Layout::new(self.bcx.ws, Some(target), dest)?;
++ let layout = Layout::new(self.bcx.ws, Some(target), &dest)?;
+ standard_lib::prepare_sysroot(&layout)?;
+ targets.insert(target, layout);
+ }
self.primary_packages
.extend(units.iter().map(|u| u.pkg.package_id()));
use failure::Error;
use lazycell::LazyCell;
use log::debug;
- use serde::Serialize;
-pub use self::build_config::{BuildConfig, CompileMode, MessageFormat};
+pub use self::build_config::{BuildConfig, CompileMode, MessageFormat, ProfileKind};
pub use self::build_context::{BuildContext, FileFlavor, TargetConfig, TargetInfo};
use self::build_plan::BuildPlan;
pub use self::compilation::{Compilation, Doctest};
use crate::core::compiler::unit_dependencies;
use crate::core::compiler::UnitInterner;
- use crate::core::compiler::{BuildConfig, BuildContext, CompileMode, Context, Kind, ProfileKind};
-use crate::core::compiler::{BuildConfig, BuildContext, CompileKind, CompileMode, Context};
++use crate::core::compiler::{
++ BuildConfig, BuildContext, CompileKind, CompileMode, Context, ProfileKind,
++};
use crate::core::profiles::UnitFor;
use crate::core::Workspace;
use crate::ops;
}
}
- let default_arch_kind = if build_config.requested_target.is_some() {
- Kind::Target
- } else {
- Kind::Host
- };
-
let profiles = ws.profiles();
+ // Early check for whether the profile is defined.
+ let _ = profiles.base_profile(&build_config.profile_kind)?;
+
let specs = spec.to_package_id_specs(ws)?;
let dev_deps = ws.require_optional_deps() || filter.need_dev_deps(build_config.mode);
let opts = ResolveOpts::new(dev_deps, features, all_features, !no_default_features);
info.features = feature_set(&opts.features);
info.all_features = opts.all_features;
info.no_default_features = opts.no_default_features;
- info.profile = profile_name(opts.build_config.release).to_string();
+ info.profile = opts.build_config.profile_name().to_string();
- info.target = Some(target);
- info.rustc = Some(rustc);
+ info.target = Some(target.to_string());
+ info.rustc = Some(rustc.to_string());
} else {
self.installs.insert(
pkg.package_id(),
features: feature_set(&opts.features),
all_features: opts.all_features,
no_default_features: opts.no_default_features,
- profile: profile_name(opts.build_config.release).to_string(),
+ profile: opts.build_config.profile_name().to_string(),
- target: Some(target),
- rustc: Some(rustc),
+ target: Some(target.to_string()),
+ rustc: Some(rustc.to_string()),
other: BTreeMap::new(),
},
);