From 5c241e102756e340991365d7b376997a9ae95f62 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 23:16:17 +0200 Subject: [PATCH 01/11] Correct formatting with cargo fmt --- src/cargo/core/resolver/context.rs | 8 +++++--- src/cargo/ops/resolve.rs | 15 ++++++++++----- tests/testsuite/install.rs | 7 +++++-- tests/testsuite/required_features.rs | 5 ++++- 4 files changed, 24 insertions(+), 11 deletions(-) diff --git a/src/cargo/core/resolver/context.rs b/src/cargo/core/resolver/context.rs index 2c2281d6107..c423cf3e815 100644 --- a/src/cargo/core/resolver/context.rs +++ b/src/cargo/core/resolver/context.rs @@ -244,9 +244,11 @@ impl Context { if !reqs.used.is_empty() { let pkgid = s.package_id(); - let set = Rc::make_mut(self.resolve_features - .entry(pkgid.clone()) - .or_insert_with(|| Rc::new(HashSet::new()))); + let set = Rc::make_mut( + self.resolve_features + .entry(pkgid.clone()) + .or_insert_with(|| Rc::new(HashSet::new())), + ); for feature in reqs.used { set.insert(InternedString::new(feature)); diff --git a/src/cargo/ops/resolve.rs b/src/cargo/ops/resolve.rs index 68965388112..6d4e6d2dbf5 100644 --- a/src/cargo/ops/resolve.rs +++ b/src/cargo/ops/resolve.rs @@ -479,11 +479,16 @@ fn register_previous_locks<'a>( // Ok if nothing matches, then we poison the source of this // dependencies and the previous lock file. - debug!("poisoning {} because {} looks like it changed {}", - dep.source_id(), - member.package_id(), - dep.name()); - for id in resolve.iter().filter(|id| id.source_id() == dep.source_id()) { + debug!( + "poisoning {} because {} looks like it changed {}", + dep.source_id(), + member.package_id(), + dep.name() + ); + for id in resolve + .iter() + .filter(|id| id.source_id() == dep.source_id()) + { add_deps(resolve, id, &mut avoid_locking); } } diff --git a/tests/testsuite/install.rs b/tests/testsuite/install.rs index f6d9bf10303..738b16f6a4b 100644 --- a/tests/testsuite/install.rs +++ b/tests/testsuite/install.rs @@ -1042,13 +1042,16 @@ fn installs_from_cwd_with_2018_warnings() { .build(); assert_that( - cargo_process("install").cwd(p.root()).masquerade_as_nightly_cargo(), + cargo_process("install") + .cwd(p.root()) + .masquerade_as_nightly_cargo(), execs().with_status(101).with_stderr_contains( "error: To build the current package use `cargo build`, \ to install the current package run `cargo install --path .`, \ otherwise specify a crate to install from crates.io, \ or use --path or --git to specify alternate source\ - "), + ", + ), ); assert_that(cargo_home(), is_not(has_installed_exe("foo"))); } diff --git a/tests/testsuite/required_features.rs b/tests/testsuite/required_features.rs index 4e59c796bb6..6dba1ad70ca 100644 --- a/tests/testsuite/required_features.rs +++ b/tests/testsuite/required_features.rs @@ -758,7 +758,10 @@ fn install_default_features() { ); assert_that(cargo_home(), is_not(has_installed_exe("foo"))); - assert_that(p.cargo("install --path .").arg("--bin=foo"), execs().with_status(0)); + assert_that( + p.cargo("install --path .").arg("--bin=foo"), + execs().with_status(0), + ); assert_that(cargo_home(), has_installed_exe("foo")); assert_that(p.cargo("uninstall").arg("foo"), execs().with_status(0)); From 1986c5db15019a994528698651d176521f59fee4 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 16:05:28 +0200 Subject: [PATCH 02/11] Process build configuration before resolving dependencies --- src/cargo/ops/cargo_compile.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 27ba181aef1..63372b27928 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -259,6 +259,14 @@ pub fn compile_ws<'a>( bail!("jobs must be at least 1") } + let mut build_config = scrape_build_config(config, jobs, target)?; + build_config.release = release; + build_config.test = mode == CompileMode::Test || mode == CompileMode::Bench; + build_config.json_messages = message_format == MessageFormat::Json; + if let CompileMode::Doc { deps } = mode { + build_config.doc_all = deps; + } + let profiles = ws.profiles(); let specs = spec.into_package_id_specs(ws)?; @@ -340,14 +348,6 @@ pub fn compile_ws<'a>( } let mut ret = { let _p = profile::start("compiling"); - let mut build_config = scrape_build_config(config, jobs, target)?; - build_config.release = release; - build_config.test = mode == CompileMode::Test || mode == CompileMode::Bench; - build_config.json_messages = message_format == MessageFormat::Json; - if let CompileMode::Doc { deps } = mode { - build_config.doc_all = deps; - } - ops::compile_targets( ws, &package_targets, From 6099439a5e1ec2144d50ec935a9497701bd574ea Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 23:44:58 +0200 Subject: [PATCH 03/11] Inline single use variable binding --- src/cargo/ops/cargo_clean.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 2319470b22c..48b61dd0904 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -36,7 +36,6 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { let (packages, resolve) = ops::resolve_ws(ws)?; let profiles = ws.profiles(); - let host_triple = opts.config.rustc()?.host.clone(); let mut units = Vec::new(); for spec in opts.spec.iter() { @@ -91,7 +90,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { &packages, opts.config, BuildConfig { - host_triple, + host_triple: opts.config.rustc()?.host.clone(), requested_target: opts.target.clone(), release: opts.release, jobs: 1, From 9e5deb8ce32bf8c2bbeeb7b74d603e3bb9e450da Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 23:55:01 +0200 Subject: [PATCH 04/11] Initialize BuildConfig in a single place --- src/cargo/ops/cargo_clean.rs | 11 +++-------- src/cargo/ops/cargo_compile.rs | 9 ++------- src/cargo/ops/cargo_rustc/mod.rs | 11 +++++++++++ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 48b61dd0904..035999de2f1 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -1,4 +1,3 @@ -use std::default::Default; use std::fs; use std::path::Path; @@ -84,18 +83,14 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { } } + let mut build_config = BuildConfig::new(&opts.config.rustc()?.host, &opts.target); + build_config.release = opts.release; let mut cx = Context::new( ws, &resolve, &packages, opts.config, - BuildConfig { - host_triple: opts.config.rustc()?.host.clone(), - requested_target: opts.target.clone(), - release: opts.release, - jobs: 1, - ..BuildConfig::default() - }, + build_config, profiles, None, &units, diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 63372b27928..83a303b065a 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -23,7 +23,6 @@ //! use std::collections::{HashMap, HashSet}; -use std::default::Default; use std::path::{Path, PathBuf}; use std::sync::Arc; @@ -858,12 +857,8 @@ fn scrape_build_config( let jobs = jobs.or(cfg_jobs).unwrap_or(::num_cpus::get() as u32); let cfg_target = config.get_string("build.target")?.map(|s| s.val); let target = target.or(cfg_target); - let mut base = ops::BuildConfig { - host_triple: config.rustc()?.host.clone(), - requested_target: target.clone(), - jobs, - ..Default::default() - }; + let mut base = ops::BuildConfig::new(&config.rustc()?.host, &target); + base.jobs = jobs; base.host = scrape_target_config(config, &base.host_triple)?; base.target = match target.as_ref() { Some(triple) => scrape_target_config(config, triple)?, diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index c742f04f98d..6e47859821d 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -76,6 +76,17 @@ pub struct BuildConfig { pub json_messages: bool, } +impl BuildConfig { + pub fn new(host_triple: &str, requested_target: &Option) -> BuildConfig { + BuildConfig { + host_triple: host_triple.to_string(), + requested_target: (*requested_target).clone(), + jobs: 1, + ..Default::default() + } + } +} + /// Information required to build for a target #[derive(Clone, Default)] pub struct TargetConfig { From 6999db6f89c78e89083c41c252bf0476b644a6f9 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 00:04:58 +0200 Subject: [PATCH 05/11] Error out early on empty targets --- src/cargo/ops/cargo_clean.rs | 2 +- src/cargo/ops/cargo_compile.rs | 2 +- src/cargo/ops/cargo_rustc/layout.rs | 2 +- src/cargo/ops/cargo_rustc/mod.rs | 11 ++++++++--- 4 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 035999de2f1..cf1923ae7ed 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -83,7 +83,7 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { } } - let mut build_config = BuildConfig::new(&opts.config.rustc()?.host, &opts.target); + let mut build_config = BuildConfig::new(&opts.config.rustc()?.host, &opts.target)?; build_config.release = opts.release; let mut cx = Context::new( ws, diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 83a303b065a..e5b0f8132b5 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -857,7 +857,7 @@ fn scrape_build_config( let jobs = jobs.or(cfg_jobs).unwrap_or(::num_cpus::get() as u32); let cfg_target = config.get_string("build.target")?.map(|s| s.val); let target = target.or(cfg_target); - let mut base = ops::BuildConfig::new(&config.rustc()?.host, &target); + let mut base = ops::BuildConfig::new(&config.rustc()?.host, &target)?; base.jobs = jobs; base.host = scrape_target_config(config, &base.host_triple)?; base.target = match target.as_ref() { diff --git a/src/cargo/ops/cargo_rustc/layout.rs b/src/cargo/ops/cargo_rustc/layout.rs index 52af1defad9..c29b55768d6 100644 --- a/src/cargo/ops/cargo_rustc/layout.rs +++ b/src/cargo/ops/cargo_rustc/layout.rs @@ -92,7 +92,7 @@ impl Layout { if let Some(triple) = triple { path.push(Path::new(triple) .file_stem() - .ok_or_else(|| format_err!("target was empty"))?); + .ok_or_else(|| format_err!("invalid target"))?); } path.push(dest); Layout::at(ws.config(), path) diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 6e47859821d..02efdde7023 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -77,13 +77,18 @@ pub struct BuildConfig { } impl BuildConfig { - pub fn new(host_triple: &str, requested_target: &Option) -> BuildConfig { - BuildConfig { + pub fn new(host_triple: &str, requested_target: &Option) -> CargoResult { + if let Some(ref s) = *requested_target { + if s.trim().is_empty() { + bail!("target was empty") + } + } + Ok(BuildConfig { host_triple: host_triple.to_string(), requested_target: (*requested_target).clone(), jobs: 1, ..Default::default() - } + }) } } From 4d7d063600fc6069d7dc06b3f2bcb9640923c476 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 22:25:05 +0200 Subject: [PATCH 06/11] Deliver units to compilation Context after initialization --- src/cargo/ops/cargo_clean.rs | 12 +----- src/cargo/ops/cargo_rustc/context/mod.rs | 47 +++++++++++++++--------- src/cargo/ops/cargo_rustc/mod.rs | 14 +------ 3 files changed, 34 insertions(+), 39 deletions(-) diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index cf1923ae7ed..74e317c3d49 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -85,16 +85,8 @@ pub fn clean(ws: &Workspace, opts: &CleanOptions) -> CargoResult<()> { let mut build_config = BuildConfig::new(&opts.config.rustc()?.host, &opts.target)?; build_config.release = opts.release; - let mut cx = Context::new( - ws, - &resolve, - &packages, - opts.config, - build_config, - profiles, - None, - &units, - )?; + let mut cx = Context::new(ws, &resolve, &packages, opts.config, build_config, profiles)?; + cx.prepare_units(None, &units)?; for unit in units.iter() { rm_rf(&cx.files().fingerprint_dir(unit), config)?; diff --git a/src/cargo/ops/cargo_rustc/context/mod.rs b/src/cargo/ops/cargo_rustc/context/mod.rs index 389a0afd547..17238595f8e 100644 --- a/src/cargo/ops/cargo_rustc/context/mod.rs +++ b/src/cargo/ops/cargo_rustc/context/mod.rs @@ -105,20 +105,7 @@ impl<'a, 'cfg> Context<'a, 'cfg> { config: &'cfg Config, build_config: BuildConfig, profiles: &'a Profiles, - export_dir: Option, - units: &[Unit<'a>], ) -> CargoResult> { - let dest = if build_config.release { - "release" - } else { - "debug" - }; - let host_layout = Layout::new(ws, None, dest)?; - let target_layout = match build_config.requested_target.as_ref() { - Some(target) => Some(Layout::new(ws, Some(target), dest)?), - None => None, - }; - let incremental_env = match env::var("CARGO_INCREMENTAL") { Ok(v) => Some(v == "1"), Err(_) => None, @@ -163,13 +150,39 @@ impl<'a, 'cfg> Context<'a, 'cfg> { }; cx.probe_target_info()?; - let deps = build_unit_dependencies(units, &cx)?; - cx.unit_dependencies = deps; - let files = CompilationFiles::new(units, host_layout, target_layout, export_dir, ws, &cx); - cx.files = Some(files); Ok(cx) } + pub fn prepare_units( + &mut self, + export_dir: Option, + units: &[Unit<'a>], + ) -> CargoResult<()> { + let dest = if self.build_config.release { + "release" + } else { + "debug" + }; + let host_layout = Layout::new(self.ws, None, dest)?; + let target_layout = match self.build_config.requested_target.as_ref() { + Some(target) => Some(Layout::new(self.ws, Some(target), dest)?), + None => None, + }; + + let deps = build_unit_dependencies(units, &self)?; + self.unit_dependencies = deps; + let files = CompilationFiles::new( + units, + host_layout, + target_layout, + export_dir, + self.ws, + &self, + ); + self.files = Some(files); + Ok(()) + } + /// Prepare this context, ensuring that all filesystem directories are in /// place. pub fn prepare(&mut self) -> CargoResult<()> { diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 02efdde7023..fb865f565e4 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -181,19 +181,9 @@ pub fn compile_targets<'a, 'cfg: 'a>( }) .collect::>(); - let mut cx = Context::new( - ws, - resolve, - packages, - config, - build_config, - profiles, - export_dir, - &units, - )?; - + let mut cx = Context::new(ws, resolve, packages, config, build_config, profiles)?; let mut queue = JobQueue::new(&cx); - + cx.prepare_units(export_dir, &units)?; cx.prepare()?; cx.build_used_in_plugin_map(&units)?; custom_build::build_map(&mut cx, &units)?; From 3f3f27bee65917f8904f94d783221904d2d9c62f Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Wed, 11 Apr 2018 22:50:07 +0200 Subject: [PATCH 07/11] Hoist Context creation out of compile_targets() --- src/cargo/ops/cargo_compile.rs | 12 +++++------- src/cargo/ops/cargo_rustc/mod.rs | 15 ++++----------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index e5b0f8132b5..59a9e027532 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -29,7 +29,7 @@ use std::sync::Arc; use core::{Package, Source, Target}; use core::{PackageId, PackageIdSpec, Profile, Profiles, TargetKind, Workspace}; use core::resolver::{Method, Resolve}; -use ops::{self, BuildOutput, DefaultExecutor, Executor}; +use ops::{self, BuildOutput, Context, DefaultExecutor, Executor}; use util::config::Config; use util::{profile, CargoResult, CargoResultExt}; @@ -347,17 +347,15 @@ pub fn compile_ws<'a>( } let mut ret = { let _p = profile::start("compiling"); - ops::compile_targets( + let mut cx = Context::new( ws, - &package_targets, - &packages, &resolve_with_overrides, + &packages, config, build_config, profiles, - export_dir.clone(), - &exec, - )? + )?; + ops::compile_targets(cx, &package_targets, export_dir.clone(), &exec)? }; ret.to_doc_test = to_builds.into_iter().cloned().collect(); diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index fb865f565e4..4da9dbe61d8 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -9,12 +9,11 @@ use std::sync::Arc; use same_file::is_same_file; use serde_json; -use core::{Feature, Package, PackageId, PackageSet, Resolve, Target}; -use core::{Profile, Profiles, Workspace}; +use core::{Feature, Package, PackageId, Profile, Target}; use core::manifest::Lto; use core::shell::ColorChoice; use util::{self, machine_message, ProcessBuilder}; -use util::{internal, join_paths, profile, Config}; +use util::{internal, join_paths, profile}; use util::paths; use util::errors::{CargoResult, CargoResultExt, Internal}; use util::Freshness; @@ -150,20 +149,15 @@ impl Executor for DefaultExecutor {} // Returns a mapping of the root package plus its immediate dependencies to // where the compiled libraries are all located. pub fn compile_targets<'a, 'cfg: 'a>( - ws: &Workspace<'cfg>, + mut cx: Context<'a, 'cfg>, pkg_targets: &'a PackagesToBuild<'a>, - packages: &'a PackageSet<'cfg>, - resolve: &'a Resolve, - config: &'cfg Config, - build_config: BuildConfig, - profiles: &'a Profiles, export_dir: Option, exec: &Arc, ) -> CargoResult> { let units = pkg_targets .iter() .flat_map(|&(pkg, ref targets)| { - let default_kind = if build_config.requested_target.is_some() { + let default_kind = if cx.build_config.requested_target.is_some() { Kind::Target } else { Kind::Host @@ -181,7 +175,6 @@ pub fn compile_targets<'a, 'cfg: 'a>( }) .collect::>(); - let mut cx = Context::new(ws, resolve, packages, config, build_config, profiles)?; let mut queue = JobQueue::new(&cx); cx.prepare_units(export_dir, &units)?; cx.prepare()?; From 4e2e0191c851bbd98053f851568c495f4382ca1c Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 00:29:24 +0200 Subject: [PATCH 08/11] Move cargo_rustc::compile_targets() to Context::compile() --- src/cargo/ops/cargo_compile.rs | 2 +- src/cargo/ops/cargo_rustc/context/mod.rs | 159 ++++++++++++++++++++++- src/cargo/ops/cargo_rustc/mod.rs | 156 +--------------------- src/cargo/ops/mod.rs | 2 +- 4 files changed, 160 insertions(+), 159 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 59a9e027532..fc2c1c3d797 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -355,7 +355,7 @@ pub fn compile_ws<'a>( build_config, profiles, )?; - ops::compile_targets(cx, &package_targets, export_dir.clone(), &exec)? + cx.compile(&package_targets, export_dir.clone(), &exec)? }; ret.to_doc_test = to_builds.into_iter().cloned().collect(); diff --git a/src/cargo/ops/cargo_rustc/context/mod.rs b/src/cargo/ops/cargo_rustc/context/mod.rs index 17238595f8e..757c25587c7 100644 --- a/src/cargo/ops/cargo_rustc/context/mod.rs +++ b/src/cargo/ops/cargo_rustc/context/mod.rs @@ -14,11 +14,12 @@ use util::{internal, profile, Cfg, CfgExpr, Config}; use util::errors::{CargoResult, CargoResultExt}; use super::TargetConfig; -use super::custom_build::{BuildDeps, BuildScripts, BuildState}; +use super::custom_build::{self, BuildDeps, BuildScripts, BuildState}; use super::fingerprint::Fingerprint; +use super::job_queue::JobQueue; use super::layout::Layout; use super::links::Links; -use super::{BuildConfig, Compilation, Kind}; +use super::{BuildConfig, Compilation, Executor, Kind, PackagesToBuild}; mod unit_dependencies; use self::unit_dependencies::build_unit_dependencies; @@ -153,6 +154,160 @@ impl<'a, 'cfg> Context<'a, 'cfg> { Ok(cx) } + // Returns a mapping of the root package plus its immediate dependencies to + // where the compiled libraries are all located. + pub fn compile( + mut self, + pkg_targets: &'a PackagesToBuild<'a>, + export_dir: Option, + exec: &Arc, + ) -> CargoResult> { + let units = pkg_targets + .iter() + .flat_map(|&(pkg, ref targets)| { + let default_kind = if self.build_config.requested_target.is_some() { + Kind::Target + } else { + Kind::Host + }; + targets.iter().map(move |&(target, profile)| Unit { + pkg, + target, + profile, + kind: if target.for_host() { + Kind::Host + } else { + default_kind + }, + }) + }) + .collect::>(); + + let mut queue = JobQueue::new(&self); + self.prepare_units(export_dir, &units)?; + self.prepare()?; + self.build_used_in_plugin_map(&units)?; + custom_build::build_map(&mut self, &units)?; + + for unit in units.iter() { + // Build up a list of pending jobs, each of which represent + // compiling a particular package. No actual work is executed as + // part of this, that's all done next as part of the `execute` + // function which will run everything in order with proper + // parallelism. + super::compile(&mut self, &mut queue, unit, exec)?; + } + + // Now that we've figured out everything that we're going to do, do it! + queue.execute(&mut self)?; + + for unit in units.iter() { + for output in self.outputs(unit)?.iter() { + if output.flavor == FileFlavor::DebugInfo { + continue; + } + + let bindst = match output.hardlink { + Some(ref link_dst) => link_dst, + None => &output.path, + }; + + if unit.profile.test { + self.compilation.tests.push(( + unit.pkg.clone(), + unit.target.kind().clone(), + unit.target.name().to_string(), + output.path.clone(), + )); + } else if unit.target.is_bin() || unit.target.is_example() { + self.compilation.binaries.push(bindst.clone()); + } else if unit.target.is_lib() { + let pkgid = unit.pkg.package_id().clone(); + self.compilation + .libraries + .entry(pkgid) + .or_insert_with(HashSet::new) + .insert((unit.target.clone(), output.path.clone())); + } + } + + for dep in self.dep_targets(unit).iter() { + if !unit.target.is_lib() { + continue; + } + + if dep.profile.run_custom_build { + let out_dir = self.files().build_script_out_dir(dep).display().to_string(); + self.compilation + .extra_env + .entry(dep.pkg.package_id().clone()) + .or_insert_with(Vec::new) + .push(("OUT_DIR".to_string(), out_dir)); + } + + if !dep.target.is_lib() { + continue; + } + if dep.profile.doc { + continue; + } + + let outputs = self.outputs(dep)?; + self.compilation + .libraries + .entry(unit.pkg.package_id().clone()) + .or_insert_with(HashSet::new) + .extend( + outputs + .iter() + .map(|output| (dep.target.clone(), output.path.clone())), + ); + } + + let feats = self.resolve.features(unit.pkg.package_id()); + if !feats.is_empty() { + self.compilation + .cfgs + .entry(unit.pkg.package_id().clone()) + .or_insert_with(|| { + feats + .iter() + .map(|feat| format!("feature=\"{}\"", feat)) + .collect() + }); + } + let rustdocflags = self.rustdocflags_args(unit)?; + if !rustdocflags.is_empty() { + self.compilation + .rustdocflags + .entry(unit.pkg.package_id().clone()) + .or_insert(rustdocflags); + } + + super::output_depinfo(&mut self, unit)?; + } + + for (&(ref pkg, _), output) in self.build_state.outputs.lock().unwrap().iter() { + self.compilation + .cfgs + .entry(pkg.clone()) + .or_insert_with(HashSet::new) + .extend(output.cfgs.iter().cloned()); + + self.compilation + .extra_env + .entry(pkg.clone()) + .or_insert_with(Vec::new) + .extend(output.env.iter().cloned()); + + for dir in output.library_paths.iter() { + self.compilation.native_dirs.insert(dir.clone()); + } + } + self.compilation.target = self.target_triple().to_string(); + Ok(self.compilation) + } + pub fn prepare_units( &mut self, export_dir: Option, diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 4da9dbe61d8..5380f70bda8 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -1,4 +1,4 @@ -use std::collections::{HashMap, HashSet}; +use std::collections::HashMap; use std::env; use std::ffi::{OsStr, OsString}; use std::fs; @@ -146,160 +146,6 @@ pub struct DefaultExecutor; impl Executor for DefaultExecutor {} -// Returns a mapping of the root package plus its immediate dependencies to -// where the compiled libraries are all located. -pub fn compile_targets<'a, 'cfg: 'a>( - mut cx: Context<'a, 'cfg>, - pkg_targets: &'a PackagesToBuild<'a>, - export_dir: Option, - exec: &Arc, -) -> CargoResult> { - let units = pkg_targets - .iter() - .flat_map(|&(pkg, ref targets)| { - let default_kind = if cx.build_config.requested_target.is_some() { - Kind::Target - } else { - Kind::Host - }; - targets.iter().map(move |&(target, profile)| Unit { - pkg, - target, - profile, - kind: if target.for_host() { - Kind::Host - } else { - default_kind - }, - }) - }) - .collect::>(); - - let mut queue = JobQueue::new(&cx); - cx.prepare_units(export_dir, &units)?; - cx.prepare()?; - cx.build_used_in_plugin_map(&units)?; - custom_build::build_map(&mut cx, &units)?; - - for unit in units.iter() { - // Build up a list of pending jobs, each of which represent - // compiling a particular package. No actual work is executed as - // part of this, that's all done next as part of the `execute` - // function which will run everything in order with proper - // parallelism. - compile(&mut cx, &mut queue, unit, exec)?; - } - - // Now that we've figured out everything that we're going to do, do it! - queue.execute(&mut cx)?; - - for unit in units.iter() { - for output in cx.outputs(unit)?.iter() { - if output.flavor == FileFlavor::DebugInfo { - continue; - } - - let bindst = match output.hardlink { - Some(ref link_dst) => link_dst, - None => &output.path, - }; - - if unit.profile.test { - cx.compilation.tests.push(( - unit.pkg.clone(), - unit.target.kind().clone(), - unit.target.name().to_string(), - output.path.clone(), - )); - } else if unit.target.is_bin() || unit.target.is_example() { - cx.compilation.binaries.push(bindst.clone()); - } else if unit.target.is_lib() { - let pkgid = unit.pkg.package_id().clone(); - cx.compilation - .libraries - .entry(pkgid) - .or_insert_with(HashSet::new) - .insert((unit.target.clone(), output.path.clone())); - } - } - - for dep in cx.dep_targets(unit).iter() { - if !unit.target.is_lib() { - continue; - } - - if dep.profile.run_custom_build { - let out_dir = cx.files().build_script_out_dir(dep).display().to_string(); - cx.compilation - .extra_env - .entry(dep.pkg.package_id().clone()) - .or_insert_with(Vec::new) - .push(("OUT_DIR".to_string(), out_dir)); - } - - if !dep.target.is_lib() { - continue; - } - if dep.profile.doc { - continue; - } - - let outputs = cx.outputs(dep)?; - cx.compilation - .libraries - .entry(unit.pkg.package_id().clone()) - .or_insert_with(HashSet::new) - .extend( - outputs - .iter() - .map(|output| (dep.target.clone(), output.path.clone())), - ); - } - - let feats = cx.resolve.features(unit.pkg.package_id()); - if !feats.is_empty() { - cx.compilation - .cfgs - .entry(unit.pkg.package_id().clone()) - .or_insert_with(|| { - feats - .iter() - .map(|feat| format!("feature=\"{}\"", feat)) - .collect() - }); - } - let rustdocflags = cx.rustdocflags_args(unit)?; - if !rustdocflags.is_empty() { - cx.compilation - .rustdocflags - .entry(unit.pkg.package_id().clone()) - .or_insert(rustdocflags); - } - - output_depinfo(&mut cx, unit)?; - } - - for (&(ref pkg, _), output) in cx.build_state.outputs.lock().unwrap().iter() { - cx.compilation - .cfgs - .entry(pkg.clone()) - .or_insert_with(HashSet::new) - .extend(output.cfgs.iter().cloned()); - - cx.compilation - .extra_env - .entry(pkg.clone()) - .or_insert_with(Vec::new) - .extend(output.env.iter().cloned()); - - for dir in output.library_paths.iter() { - cx.compilation.native_dirs.insert(dir.clone()); - } - } - cx.compilation.target = cx.target_triple().to_string(); - Ok(cx.compilation) -} - fn compile<'a, 'cfg: 'a>( cx: &mut Context<'a, 'cfg>, jobs: &mut JobQueue<'a>, diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 86822b3d1d3..01aec30112b 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -2,7 +2,7 @@ pub use self::cargo_clean::{clean, CleanOptions}; pub use self::cargo_compile::{compile, compile_with_exec, compile_ws, CompileOptions}; pub use self::cargo_compile::{CompileFilter, CompileMode, FilterRule, MessageFormat, Packages}; pub use self::cargo_read_manifest::{read_package, read_packages}; -pub use self::cargo_rustc::{compile_targets, Compilation, Kind, Unit}; +pub use self::cargo_rustc::{Compilation, Kind, Unit}; pub use self::cargo_rustc::{is_bad_artifact_name, Context}; pub use self::cargo_rustc::{BuildConfig, BuildOutput, TargetConfig}; pub use self::cargo_rustc::{DefaultExecutor, Executor}; From 19b854d86713adc36e9cbb35d321c2cbf8197788 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 00:37:30 +0200 Subject: [PATCH 09/11] Use Unit type as interface to compilation --- src/cargo/ops/cargo_compile.rs | 24 +++++++++++++++++++-- src/cargo/ops/cargo_rustc/context/mod.rs | 27 +++--------------------- src/cargo/ops/cargo_rustc/mod.rs | 4 +--- 3 files changed, 26 insertions(+), 29 deletions(-) diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index fc2c1c3d797..17d370eda3c 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -29,7 +29,7 @@ use std::sync::Arc; use core::{Package, Source, Target}; use core::{PackageId, PackageIdSpec, Profile, Profiles, TargetKind, Workspace}; use core::resolver::{Method, Resolve}; -use ops::{self, BuildOutput, Context, DefaultExecutor, Executor}; +use ops::{self, BuildOutput, Context, DefaultExecutor, Executor, Kind, Unit}; use util::config::Config; use util::{profile, CargoResult, CargoResultExt}; @@ -355,7 +355,27 @@ pub fn compile_ws<'a>( build_config, profiles, )?; - cx.compile(&package_targets, export_dir.clone(), &exec)? + let units = package_targets + .iter() + .flat_map(|&(pkg, ref targets)| { + let default_kind = if cx.build_config.requested_target.is_some() { + Kind::Target + } else { + Kind::Host + }; + targets.iter().map(move |&(target, profile)| Unit { + pkg, + target, + profile, + kind: if target.for_host() { + Kind::Host + } else { + default_kind + }, + }) + }) + .collect::>(); + cx.compile(&units, export_dir.clone(), &exec)? }; ret.to_doc_test = to_builds.into_iter().cloned().collect(); diff --git a/src/cargo/ops/cargo_rustc/context/mod.rs b/src/cargo/ops/cargo_rustc/context/mod.rs index 757c25587c7..2d317f8c15a 100644 --- a/src/cargo/ops/cargo_rustc/context/mod.rs +++ b/src/cargo/ops/cargo_rustc/context/mod.rs @@ -19,7 +19,7 @@ use super::fingerprint::Fingerprint; use super::job_queue::JobQueue; use super::layout::Layout; use super::links::Links; -use super::{BuildConfig, Compilation, Executor, Kind, PackagesToBuild}; +use super::{BuildConfig, Compilation, Executor, Kind}; mod unit_dependencies; use self::unit_dependencies::build_unit_dependencies; @@ -158,33 +158,12 @@ impl<'a, 'cfg> Context<'a, 'cfg> { // where the compiled libraries are all located. pub fn compile( mut self, - pkg_targets: &'a PackagesToBuild<'a>, + units: &[Unit<'a>], export_dir: Option, exec: &Arc, ) -> CargoResult> { - let units = pkg_targets - .iter() - .flat_map(|&(pkg, ref targets)| { - let default_kind = if self.build_config.requested_target.is_some() { - Kind::Target - } else { - Kind::Host - }; - targets.iter().map(move |&(target, profile)| Unit { - pkg, - target, - profile, - kind: if target.for_host() { - Kind::Host - } else { - default_kind - }, - }) - }) - .collect::>(); - let mut queue = JobQueue::new(&self); - self.prepare_units(export_dir, &units)?; + self.prepare_units(export_dir, units)?; self.prepare()?; self.build_used_in_plugin_map(&units)?; custom_build::build_map(&mut self, &units)?; diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/ops/cargo_rustc/mod.rs index 5380f70bda8..47c1237a145 100644 --- a/src/cargo/ops/cargo_rustc/mod.rs +++ b/src/cargo/ops/cargo_rustc/mod.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use same_file::is_same_file; use serde_json; -use core::{Feature, Package, PackageId, Profile, Target}; +use core::{Feature, PackageId, Profile, Target}; use core::manifest::Lto; use core::shell::ColorChoice; use util::{self, machine_message, ProcessBuilder}; @@ -102,8 +102,6 @@ pub struct TargetConfig { pub overrides: HashMap, } -pub type PackagesToBuild<'a> = [(&'a Package, Vec<(&'a Target, &'a Profile)>)]; - /// A glorified callback for executing calls to rustc. Rather than calling rustc /// directly, we'll use an Executor, giving clients an opportunity to intercept /// the build calls. From 49a762f314bd2a039322d419e817edc4d9ab51b3 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 00:49:56 +0200 Subject: [PATCH 10/11] Use relative dependencies inside cargo_rustc module --- src/cargo/ops/cargo_rustc/context/compilation_files.rs | 4 +--- src/cargo/ops/cargo_rustc/context/target_info.rs | 2 +- src/cargo/ops/cargo_rustc/context/unit_dependencies.rs | 3 +-- src/cargo/ops/cargo_rustc/output_depinfo.rs | 3 +-- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/cargo/ops/cargo_rustc/context/compilation_files.rs b/src/cargo/ops/cargo_rustc/context/compilation_files.rs index db844bccebb..95b5f638671 100644 --- a/src/cargo/ops/cargo_rustc/context/compilation_files.rs +++ b/src/cargo/ops/cargo_rustc/context/compilation_files.rs @@ -8,9 +8,7 @@ use std::sync::Arc; use lazycell::LazyCell; use core::{TargetKind, Workspace}; -use ops::cargo_rustc::layout::Layout; -use ops::cargo_rustc::FileFlavor; -use ops::{Context, Kind, Unit}; +use super::{Context, FileFlavor, Kind, Layout, Unit}; use util::{self, CargoResult}; #[derive(Clone, Hash, Eq, PartialEq, Ord, PartialOrd)] diff --git a/src/cargo/ops/cargo_rustc/context/target_info.rs b/src/cargo/ops/cargo_rustc/context/target_info.rs index 30978395324..82d759692fa 100644 --- a/src/cargo/ops/cargo_rustc/context/target_info.rs +++ b/src/cargo/ops/cargo_rustc/context/target_info.rs @@ -6,7 +6,7 @@ use std::str::{self, FromStr}; use super::{env_args, Context}; use util::{CargoResult, CargoResultExt, Cfg, ProcessBuilder}; use core::TargetKind; -use ops::Kind; +use super::Kind; #[derive(Clone, Default)] pub struct TargetInfo { diff --git a/src/cargo/ops/cargo_rustc/context/unit_dependencies.rs b/src/cargo/ops/cargo_rustc/context/unit_dependencies.rs index 2fe20cde0d0..d68037b5512 100644 --- a/src/cargo/ops/cargo_rustc/context/unit_dependencies.rs +++ b/src/cargo/ops/cargo_rustc/context/unit_dependencies.rs @@ -15,11 +15,10 @@ //! (for example, with and without tests), so we actually build a dependency //! graph of `Unit`s, which capture these properties. -use ops::Unit; +use super::{Context, Kind, Unit}; use std::collections::HashMap; use CargoResult; use core::dependency::Kind as DepKind; -use ops::{Context, Kind}; use core::Target; use core::Profile; diff --git a/src/cargo/ops/cargo_rustc/output_depinfo.rs b/src/cargo/ops/cargo_rustc/output_depinfo.rs index 8edcd185f17..dcdbb95f8b7 100644 --- a/src/cargo/ops/cargo_rustc/output_depinfo.rs +++ b/src/cargo/ops/cargo_rustc/output_depinfo.rs @@ -3,10 +3,9 @@ use std::io::{BufWriter, Write}; use std::fs::File; use std::path::{Path, PathBuf}; -use ops::{Context, Unit}; +use super::{fingerprint, Context, Unit}; use util::{internal, CargoResult}; use util::paths; -use ops::cargo_rustc::fingerprint; fn render_filename>(path: P, basedir: Option<&str>) -> CargoResult { let path = path.as_ref(); From a340ba0b3362a3229d03bc5863b0930ef90b4fb9 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Thu, 12 Apr 2018 01:08:01 +0200 Subject: [PATCH 11/11] Move compiler driver code from ops into core --- .../compiler}/compilation.rs | 0 .../compiler}/context/compilation_files.rs | 0 .../compiler}/context/mod.rs | 0 .../compiler}/context/target_info.rs | 0 .../compiler}/context/unit_dependencies.rs | 0 .../compiler}/custom_build.rs | 0 .../compiler}/fingerprint.rs | 0 .../{ops/cargo_rustc => core/compiler}/job.rs | 0 .../cargo_rustc => core/compiler}/job_queue.rs | 0 .../cargo_rustc => core/compiler}/layout.rs | 0 .../cargo_rustc => core/compiler}/links.rs | 0 .../{ops/cargo_rustc => core/compiler}/mod.rs | 0 .../compiler}/output_depinfo.rs | 0 src/cargo/core/mod.rs | 1 + src/cargo/ops/cargo_clean.rs | 3 ++- src/cargo/ops/cargo_compile.rs | 18 ++++++++++-------- src/cargo/ops/cargo_install.rs | 3 ++- src/cargo/ops/cargo_new.rs | 5 ++--- src/cargo/ops/cargo_package.rs | 3 ++- src/cargo/ops/cargo_test.rs | 3 ++- src/cargo/ops/mod.rs | 5 ----- src/cargo/util/toml/targets.rs | 5 ++--- 22 files changed, 23 insertions(+), 23 deletions(-) rename src/cargo/{ops/cargo_rustc => core/compiler}/compilation.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/context/compilation_files.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/context/mod.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/context/target_info.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/context/unit_dependencies.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/custom_build.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/fingerprint.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/job.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/job_queue.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/layout.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/links.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/mod.rs (100%) rename src/cargo/{ops/cargo_rustc => core/compiler}/output_depinfo.rs (100%) diff --git a/src/cargo/ops/cargo_rustc/compilation.rs b/src/cargo/core/compiler/compilation.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/compilation.rs rename to src/cargo/core/compiler/compilation.rs diff --git a/src/cargo/ops/cargo_rustc/context/compilation_files.rs b/src/cargo/core/compiler/context/compilation_files.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/context/compilation_files.rs rename to src/cargo/core/compiler/context/compilation_files.rs diff --git a/src/cargo/ops/cargo_rustc/context/mod.rs b/src/cargo/core/compiler/context/mod.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/context/mod.rs rename to src/cargo/core/compiler/context/mod.rs diff --git a/src/cargo/ops/cargo_rustc/context/target_info.rs b/src/cargo/core/compiler/context/target_info.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/context/target_info.rs rename to src/cargo/core/compiler/context/target_info.rs diff --git a/src/cargo/ops/cargo_rustc/context/unit_dependencies.rs b/src/cargo/core/compiler/context/unit_dependencies.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/context/unit_dependencies.rs rename to src/cargo/core/compiler/context/unit_dependencies.rs diff --git a/src/cargo/ops/cargo_rustc/custom_build.rs b/src/cargo/core/compiler/custom_build.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/custom_build.rs rename to src/cargo/core/compiler/custom_build.rs diff --git a/src/cargo/ops/cargo_rustc/fingerprint.rs b/src/cargo/core/compiler/fingerprint.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/fingerprint.rs rename to src/cargo/core/compiler/fingerprint.rs diff --git a/src/cargo/ops/cargo_rustc/job.rs b/src/cargo/core/compiler/job.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/job.rs rename to src/cargo/core/compiler/job.rs diff --git a/src/cargo/ops/cargo_rustc/job_queue.rs b/src/cargo/core/compiler/job_queue.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/job_queue.rs rename to src/cargo/core/compiler/job_queue.rs diff --git a/src/cargo/ops/cargo_rustc/layout.rs b/src/cargo/core/compiler/layout.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/layout.rs rename to src/cargo/core/compiler/layout.rs diff --git a/src/cargo/ops/cargo_rustc/links.rs b/src/cargo/core/compiler/links.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/links.rs rename to src/cargo/core/compiler/links.rs diff --git a/src/cargo/ops/cargo_rustc/mod.rs b/src/cargo/core/compiler/mod.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/mod.rs rename to src/cargo/core/compiler/mod.rs diff --git a/src/cargo/ops/cargo_rustc/output_depinfo.rs b/src/cargo/core/compiler/output_depinfo.rs similarity index 100% rename from src/cargo/ops/cargo_rustc/output_depinfo.rs rename to src/cargo/core/compiler/output_depinfo.rs diff --git a/src/cargo/core/mod.rs b/src/cargo/core/mod.rs index 2f7db061a21..d112050d08b 100644 --- a/src/cargo/core/mod.rs +++ b/src/cargo/core/mod.rs @@ -21,6 +21,7 @@ pub mod resolver; pub mod summary; pub mod shell; pub mod registry; +pub mod compiler; mod interning; mod package_id_spec; mod workspace; diff --git a/src/cargo/ops/cargo_clean.rs b/src/cargo/ops/cargo_clean.rs index 74e317c3d49..0cab1d9728c 100644 --- a/src/cargo/ops/cargo_clean.rs +++ b/src/cargo/ops/cargo_clean.rs @@ -2,10 +2,11 @@ use std::fs; use std::path::Path; use core::{Profiles, Workspace}; +use core::compiler::{BuildConfig, Context, Kind, Unit}; use util::Config; use util::errors::{CargoResult, CargoResultExt}; use util::paths; -use ops::{self, BuildConfig, Context, Kind, Unit}; +use ops; pub struct CleanOptions<'a> { pub config: &'a Config, diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index 17d370eda3c..8a2d75980c3 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -28,8 +28,10 @@ use std::sync::Arc; use core::{Package, Source, Target}; use core::{PackageId, PackageIdSpec, Profile, Profiles, TargetKind, Workspace}; +use core::compiler::{BuildConfig, BuildOutput, Compilation, Context, DefaultExecutor, Executor}; +use core::compiler::{Kind, TargetConfig, Unit}; use core::resolver::{Method, Resolve}; -use ops::{self, BuildOutput, Context, DefaultExecutor, Executor, Kind, Unit}; +use ops; use util::config::Config; use util::{profile, CargoResult, CargoResultExt}; @@ -193,7 +195,7 @@ pub enum CompileFilter { pub fn compile<'a>( ws: &Workspace<'a>, options: &CompileOptions<'a>, -) -> CargoResult> { +) -> CargoResult> { compile_with_exec(ws, options, Arc::new(DefaultExecutor)) } @@ -201,7 +203,7 @@ pub fn compile_with_exec<'a>( ws: &Workspace<'a>, options: &CompileOptions<'a>, exec: Arc, -) -> CargoResult> { +) -> CargoResult> { for member in ws.members() { for warning in member.manifest().warnings().iter() { if warning.is_critical { @@ -224,7 +226,7 @@ pub fn compile_ws<'a>( source: Option>, options: &CompileOptions<'a>, exec: Arc, -) -> CargoResult> { +) -> CargoResult> { let CompileOptions { config, jobs, @@ -844,7 +846,7 @@ fn scrape_build_config( config: &Config, jobs: Option, target: Option, -) -> CargoResult { +) -> CargoResult { if jobs.is_some() && config.jobserver_from_env().is_some() { config.shell().warn( "a `-j` argument was passed to Cargo but Cargo is \ @@ -875,7 +877,7 @@ fn scrape_build_config( let jobs = jobs.or(cfg_jobs).unwrap_or(::num_cpus::get() as u32); let cfg_target = config.get_string("build.target")?.map(|s| s.val); let target = target.or(cfg_target); - let mut base = ops::BuildConfig::new(&config.rustc()?.host, &target)?; + let mut base = BuildConfig::new(&config.rustc()?.host, &target)?; base.jobs = jobs; base.host = scrape_target_config(config, &base.host_triple)?; base.target = match target.as_ref() { @@ -885,9 +887,9 @@ fn scrape_build_config( Ok(base) } -fn scrape_target_config(config: &Config, triple: &str) -> CargoResult { +fn scrape_target_config(config: &Config, triple: &str) -> CargoResult { let key = format!("target.{}", triple); - let mut ret = ops::TargetConfig { + let mut ret = TargetConfig { ar: config.get_path(&format!("{}.ar", key))?.map(|v| v.val), linker: config.get_path(&format!("{}.linker", key))?.map(|v| v.val), overrides: HashMap::new(), diff --git a/src/cargo/ops/cargo_install.rs b/src/cargo/ops/cargo_install.rs index 7987eb1e70d..0a784780de3 100644 --- a/src/cargo/ops/cargo_install.rs +++ b/src/cargo/ops/cargo_install.rs @@ -12,7 +12,8 @@ use toml; use core::{Dependency, Edition, Package, PackageIdSpec, Source, SourceId}; use core::{PackageId, Workspace}; -use ops::{self, CompileFilter, DefaultExecutor}; +use core::compiler::DefaultExecutor; +use ops::{self, CompileFilter}; use sources::{GitSource, PathSource, SourceConfigMap}; use util::{internal, Config}; use util::{FileLock, Filesystem}; diff --git a/src/cargo/ops/cargo_new.rs b/src/cargo/ops/cargo_new.rs index cc2fd73be35..8bd99ca344b 100644 --- a/src/cargo/ops/cargo_new.rs +++ b/src/cargo/ops/cargo_new.rs @@ -7,8 +7,7 @@ use std::path::{Path, PathBuf}; use git2::Config as GitConfig; use git2::Repository as GitRepository; -use core::Workspace; -use ops::is_bad_artifact_name; +use core::{compiler, Workspace}; use util::{internal, FossilRepo, GitRepo, HgRepo, PijulRepo}; use util::{paths, Config}; use util::errors::{CargoResult, CargoResultExt}; @@ -136,7 +135,7 @@ fn check_name(name: &str, opts: &NewOptions) -> CargoResult<()> { "pure", "ref", "return", "self", "sizeof", "static", "struct", "super", "test", "trait", "true", "type", "typeof", "unsafe", "unsized", "use", "virtual", "where", "while", "yield", ]; - if blacklist.contains(&name) || (opts.kind.is_bin() && is_bad_artifact_name(name)) { + if blacklist.contains(&name) || (opts.kind.is_bin() && compiler::is_bad_artifact_name(name)) { bail!( "The name `{}` cannot be used as a crate name{}", name, diff --git a/src/cargo/ops/cargo_package.rs b/src/cargo/ops/cargo_package.rs index 0e29b30b8d8..19774f5e356 100644 --- a/src/cargo/ops/cargo_package.rs +++ b/src/cargo/ops/cargo_package.rs @@ -10,11 +10,12 @@ use git2; use tar::{Archive, Builder, EntryType, Header}; use core::{Package, Source, SourceId, Workspace}; +use core::compiler::DefaultExecutor; use sources::PathSource; use util::{self, internal, Config, FileLock}; use util::paths; use util::errors::{CargoResult, CargoResultExt}; -use ops::{self, DefaultExecutor}; +use ops; pub struct PackageOpts<'cfg> { pub config: &'cfg Config, diff --git a/src/cargo/ops/cargo_test.rs b/src/cargo/ops/cargo_test.rs index 8920840c949..de0bb07b626 100644 --- a/src/cargo/ops/cargo_test.rs +++ b/src/cargo/ops/cargo_test.rs @@ -1,6 +1,7 @@ use std::ffi::{OsStr, OsString}; -use ops::{self, Compilation}; +use ops; +use core::compiler::Compilation; use util::{self, CargoTestError, ProcessError, Test}; use util::errors::CargoResult; use core::Workspace; diff --git a/src/cargo/ops/mod.rs b/src/cargo/ops/mod.rs index 01aec30112b..1e805f69acd 100644 --- a/src/cargo/ops/mod.rs +++ b/src/cargo/ops/mod.rs @@ -2,10 +2,6 @@ pub use self::cargo_clean::{clean, CleanOptions}; pub use self::cargo_compile::{compile, compile_with_exec, compile_ws, CompileOptions}; pub use self::cargo_compile::{CompileFilter, CompileMode, FilterRule, MessageFormat, Packages}; pub use self::cargo_read_manifest::{read_package, read_packages}; -pub use self::cargo_rustc::{Compilation, Kind, Unit}; -pub use self::cargo_rustc::{is_bad_artifact_name, Context}; -pub use self::cargo_rustc::{BuildConfig, BuildOutput, TargetConfig}; -pub use self::cargo_rustc::{DefaultExecutor, Executor}; pub use self::cargo_run::run; pub use self::cargo_install::{install, install_list, uninstall}; pub use self::cargo_new::{init, new, NewOptions, VersionControl}; @@ -38,7 +34,6 @@ mod cargo_package; mod cargo_pkgid; mod cargo_read_manifest; mod cargo_run; -mod cargo_rustc; mod cargo_test; mod lockfile; mod registry; diff --git a/src/cargo/util/toml/targets.rs b/src/cargo/util/toml/targets.rs index fbba46453d1..896278c49c2 100644 --- a/src/cargo/util/toml/targets.rs +++ b/src/cargo/util/toml/targets.rs @@ -14,8 +14,7 @@ use std::path::{Path, PathBuf}; use std::fs::{self, DirEntry}; use std::collections::HashSet; -use core::Target; -use ops::is_bad_artifact_name; +use core::{compiler, Target}; use util::errors::CargoResult; use super::{LibKind, PathValue, StringOrBool, TomlBenchTarget, TomlBinTarget, TomlExampleTarget, TomlLibTarget, TomlManifest, TomlTarget, TomlTestTarget}; @@ -205,7 +204,7 @@ fn clean_bins( )); } - if is_bad_artifact_name(&name) { + if compiler::is_bad_artifact_name(&name) { bail!("the binary target name `{}` is forbidden", name) } }