use clap::{self, SubCommand};
use cargo::CargoResult;
use cargo::core::Workspace;
-use cargo::core::compiler::MessageFormat;
+use cargo::core::compiler::{BuildConfig, MessageFormat};
use cargo::ops::{CompileFilter, CompileOptions, NewOptions, Packages, VersionControl};
use cargo::util::paths;
use cargo::util::important_paths::find_root_manifest_for_wd;
}
};
+ let mut build_config = BuildConfig::new(config, self.jobs()?, &self.target(), mode)?;
+ build_config.message_format = message_format;
+ build_config.release = self._is_present("release");
+
let opts = CompileOptions {
config,
- jobs: self.jobs()?,
- target: self.target(),
+ build_config,
features: self._values_of("features"),
all_features: self._is_present("all-features"),
no_default_features: self._is_present("no-default-features"),
spec,
- mode,
- release: self._is_present("release"),
filter: CompileFilter::new(
self._is_present("lib"),
self._values_of("bin"),
self._is_present("benches"),
self._is_present("all-targets"),
),
- message_format,
target_rustdoc_args: None,
target_rustc_args: None,
export_dir: None,
pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult {
let ws = args.workspace(config)?;
let mut compile_opts = args.compile_options(config, CompileMode::Bench)?;
- compile_opts.release = true;
+ compile_opts.build_config.release = true;
let ops = TestOptions {
no_run: args.is_present("no-run"),
pub fn exec(config: &mut Config, args: &ArgMatches) -> CliResult {
let mut compile_opts = args.compile_options(config, CompileMode::Build)?;
- compile_opts.release = !args.is_present("debug");
+ compile_opts.build_config.release = !args.is_present("debug");
let krates = args.values_of("crate")
.unwrap_or_default()
let mut compile_opts = args.compile_options(config, CompileMode::Test)?;
let doc = args.is_present("doc");
if doc {
- compile_opts.mode = CompileMode::Doctest;
+ compile_opts.build_config.mode = CompileMode::Doctest;
compile_opts.filter = ops::CompileFilter::new(
true,
Vec::new(),
use util::{CargoResult, CargoResultExt, Config};
/// Configuration information for a rustc build.
+#[derive(Debug)]
pub struct BuildConfig {
/// The target arch triple, defaults to host arch
pub requested_target: Option<String>,
use std::sync::Arc;
use core::compiler::{BuildConfig, BuildContext, Compilation, Context, DefaultExecutor, Executor};
-use core::compiler::{CompileMode, Kind, MessageFormat, Unit};
+use core::compiler::{CompileMode, Kind, Unit};
use core::profiles::{ProfileFor, Profiles};
use core::resolver::{Method, Resolve};
use core::{Package, Source, Target};
#[derive(Debug)]
pub struct CompileOptions<'a> {
pub config: &'a Config,
- /// Number of concurrent jobs to use.
- pub jobs: Option<u32>,
- /// The target platform to compile for (example: `i686-unknown-linux-gnu`).
- pub target: Option<String>,
+ /// Configuration information for a rustc build
+ pub build_config: BuildConfig,
/// Extra features to build for the root package
pub features: Vec<String>,
/// Flag whether all available features should be built for the root package
/// Filter to apply to the root package to select which targets will be
/// built.
pub filter: CompileFilter,
- /// Whether this is a release build or not
- pub release: bool,
- /// Mode for this compile.
- pub mode: CompileMode,
- /// `--error_format` flag for the compiler.
- pub message_format: MessageFormat,
/// Extra arguments to be passed to rustdoc (for main crate and dependencies)
pub target_rustdoc_args: Option<Vec<String>>,
/// The specified target will be compiled with all the available arguments,
}
impl<'a> CompileOptions<'a> {
- pub fn default(config: &'a Config, mode: CompileMode) -> CompileOptions<'a> {
- CompileOptions {
+ pub fn default(config: &'a Config, mode: CompileMode) -> CargoResult<CompileOptions<'a>> {
+ Ok(CompileOptions {
config,
- jobs: None,
- target: None,
+ build_config: BuildConfig::new(config, None, &None, mode)?,
features: Vec::new(),
all_features: false,
no_default_features: false,
spec: ops::Packages::Packages(Vec::new()),
- mode,
- release: false,
filter: CompileFilter::Default {
required_features_filterable: false,
},
- message_format: MessageFormat::Human,
target_rustdoc_args: None,
target_rustc_args: None,
export_dir: None,
- }
+ })
}
}
) -> CargoResult<Compilation<'a>> {
let CompileOptions {
config,
- jobs,
- ref target,
+ ref build_config,
ref spec,
ref features,
all_features,
no_default_features,
- release,
- mode,
- message_format,
ref filter,
ref target_rustdoc_args,
ref target_rustc_args,
ref export_dir,
} = *options;
- let mut build_config = BuildConfig::new(config, jobs, &target, mode)?;
- build_config.release = release;
- build_config.message_format = message_format;
let default_arch_kind = if build_config.requested_target.is_some() {
Kind::Target
} else {
let specs = spec.into_package_id_specs(ws)?;
let features = Method::split_features(features);
let method = Method::Required {
- dev_deps: ws.require_optional_deps() || filter.need_dev_deps(mode),
+ dev_deps: ws.require_optional_deps() || filter.need_dev_deps(build_config.mode),
features: &features,
all_features,
uses_default_features: !no_default_features,
filter,
default_arch_kind,
&resolve_with_overrides,
- &build_config,
+ build_config,
)?;
if let Some(args) = extra_args {
// nothing we can do about it and otherwise if it's getting overwritten
// then that's also ok!
let mut target_dir = ws.target_dir();
- if let Some(ref triple) = options.compile_opts.target {
+ if let Some(ref triple) = options.compile_opts.build_config.requested_target {
target_dir.push(Path::new(triple).file_stem().unwrap());
}
let path = target_dir.join("doc").join(&name).join("index.html");
use tar::{Archive, Builder, EntryType, Header};
use core::{Package, Source, SourceId, Workspace};
-use core::compiler::{CompileMode, DefaultExecutor, MessageFormat};
+use core::compiler::{BuildConfig, CompileMode, DefaultExecutor};
use sources::PathSource;
use util::{self, internal, Config, FileLock};
use util::paths;
None,
&ops::CompileOptions {
config,
- jobs: opts.jobs,
- target: opts.target.clone(),
+ build_config: BuildConfig::new(config, opts.jobs, &opts.target, CompileMode::Build)?,
features: Vec::new(),
no_default_features: false,
all_features: false,
filter: ops::CompileFilter::Default {
required_features_filterable: true,
},
- release: false,
- message_format: MessageFormat::Human,
- mode: CompileMode::Build,
target_rustdoc_args: None,
target_rustc_args: None,
export_dir: None,