From da0ec9a39b135fb30af3ceee9fe46088f932eeec Mon Sep 17 00:00:00 2001 From: Yehuda Katz Date: Wed, 7 May 2014 15:48:43 -0700 Subject: [PATCH] Clean up cargo-compile --- .gitignore | 2 +- src/bin/cargo-compile.rs | 4 ++-- src/cargo/core/dependency.rs | 22 +++++++++++++++------ src/cargo/core/manifest.rs | 16 ++++++++++++++- src/cargo/core/mod.rs | 2 +- src/cargo/core/namever.rs | 10 +++++++++- src/cargo/core/package.rs | 12 ++++++++++++ src/cargo/core/summary.rs | 15 ++++++++++++++ src/cargo/ops/cargo_compile.rs | 36 ++++++++++++++++------------------ src/cargo/ops/cargo_rustc.rs | 3 ++- 10 files changed, 90 insertions(+), 32 deletions(-) diff --git a/.gitignore b/.gitignore index d913617bc..cd8e4b1f6 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,2 @@ target - +.cargo diff --git a/src/bin/cargo-compile.rs b/src/bin/cargo-compile.rs index 0c2a5d613..07d4ccc19 100644 --- a/src/bin/cargo-compile.rs +++ b/src/bin/cargo-compile.rs @@ -23,8 +23,8 @@ fn flags>() -> CLIResult } fn execute() -> CLIResult<()> { - compile(try!(flags::()).manifest_path.as_slice()).to_result(|_| - CLIError::new("Compilation failed", None, 1)) + compile(try!(flags::()).manifest_path.as_slice()).to_result(|err| + CLIError::new(format!("Compilation failed: {}", err), None, 1)) } fn main() { diff --git a/src/cargo/core/dependency.rs b/src/cargo/core/dependency.rs index 0536acdd6..3e4b7c75c 100644 --- a/src/cargo/core/dependency.rs +++ b/src/cargo/core/dependency.rs @@ -1,24 +1,24 @@ -use core; +use core::NameVer; #[deriving(Eq,Clone,Show,Encodable,Decodable)] pub struct Dependency { - name: core::NameVer + name: NameVer } impl Dependency { pub fn new(name: &str) -> Dependency { - Dependency { name: core::NameVer::new(name.to_owned(), "1.0.0") } + Dependency { name: NameVer::new(name.to_owned(), "1.0.0") } } - pub fn with_namever(name: &core::NameVer) -> Dependency { + pub fn with_namever(name: &NameVer) -> Dependency { Dependency { name: name.clone() } } pub fn with_name_and_version(name: &str, version: &str) -> Dependency { - Dependency { name: core::NameVer::new(name, version) } + Dependency { name: NameVer::new(name, version) } } - pub fn get_namever<'a>(&'a self) -> &'a core::NameVer { + pub fn get_namever<'a>(&'a self) -> &'a NameVer { &self.name } @@ -26,3 +26,13 @@ impl Dependency { self.name.get_name() } } + +pub trait DependencyNameVers { + fn namevers(&self) -> Vec; +} + +impl DependencyNameVers for Vec { + fn namevers(&self) -> Vec { + self.iter().map(|dep| dep.get_namever().clone()).collect() + } +} diff --git a/src/cargo/core/manifest.rs b/src/cargo/core/manifest.rs index 6070d24d8..9b86b1700 100644 --- a/src/cargo/core/manifest.rs +++ b/src/cargo/core/manifest.rs @@ -1,4 +1,6 @@ use collections::HashMap; +use std::fmt; +use std::fmt::{Show,Formatter}; use core::{ Dependency, NameVer, @@ -16,7 +18,13 @@ pub struct Manifest { target_dir: Path, } -#[deriving(Clone,Eq)] +impl Show for Manifest { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f.buf, "Manifest({}, authors={}, targets={}, target_dir={})", self.summary, self.authors, self.targets, self.target_dir.display()) + } +} + +#[deriving(Show,Clone,Eq)] pub enum TargetKind { LibTarget, BinTarget @@ -29,6 +37,12 @@ pub struct Target { path: Path } +impl Show for Target { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f.buf, "{}(name={}, path={})", self.kind, self.name, self.path.display()) + } +} + impl Manifest { pub fn new(summary: &Summary, targets: &[Target], target_dir: &Path) -> Manifest { Manifest { diff --git a/src/cargo/core/mod.rs b/src/cargo/core/mod.rs index 88a403c65..571790486 100644 --- a/src/cargo/core/mod.rs +++ b/src/cargo/core/mod.rs @@ -34,5 +34,5 @@ pub mod package; pub mod dependency; pub mod manifest; pub mod resolver; -mod summary; +pub mod summary; mod registry; diff --git a/src/cargo/core/namever.rs b/src/cargo/core/namever.rs index 48998627f..7f1b13f69 100644 --- a/src/cargo/core/namever.rs +++ b/src/cargo/core/namever.rs @@ -1,4 +1,6 @@ use semver; +use std::fmt; +use std::fmt::{Show,Formatter}; use serialize::{ Encodable, Encoder, @@ -6,7 +8,7 @@ use serialize::{ Decoder }; -#[deriving(Clone,Eq,Show,Ord)] +#[deriving(Clone,Eq,Ord)] pub struct NameVer { name: ~str, version: semver::Version @@ -26,6 +28,12 @@ impl NameVer { } } +impl Show for NameVer { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f.buf, "{} v{}", self.name, self.version) + } +} + impl> Decodable for NameVer { fn decode(d: &mut D) -> Result { let vector: Vec<~str> = try!(Decodable::decode(d)); diff --git a/src/cargo/core/package.rs b/src/cargo/core/package.rs index 700a36635..efd732ae6 100644 --- a/src/cargo/core/package.rs +++ b/src/cargo/core/package.rs @@ -1,4 +1,6 @@ use std::slice; +use std::fmt; +use std::fmt::{Show,Formatter}; use std::path::Path; use core::{ Dependency, @@ -25,6 +27,10 @@ impl Package { } } + pub fn to_dependency(&self) -> Dependency { + Dependency::with_namever(self.manifest.get_summary().get_name_ver()) + } + pub fn get_manifest<'a>(&'a self) -> &'a Manifest { &self.manifest } @@ -58,6 +64,12 @@ impl Package { } } +impl Show for Package { + fn fmt(&self, f: &mut Formatter) -> fmt::Result { + write!(f.buf, "{}", self.get_summary().get_name_ver()) + } +} + pub struct PackageSet { packages: ~[Package] } diff --git a/src/cargo/core/summary.rs b/src/cargo/core/summary.rs index efd35e738..7f584f45a 100644 --- a/src/cargo/core/summary.rs +++ b/src/cargo/core/summary.rs @@ -29,3 +29,18 @@ impl Summary { self.dependencies.as_slice() } } + +pub trait SummaryVec { + fn names(&self) -> Vec<~str>; + fn deps(&self) -> Vec; +} + +impl SummaryVec for Vec { + fn names(&self) -> Vec<~str> { + self.iter().map(|summary| summary.name_ver.get_name().to_owned()).collect() + } + + fn deps(&self) -> Vec { + self.iter().map(|summary| Dependency::with_namever(summary.get_name_ver())).collect() + } +} diff --git a/src/cargo/ops/cargo_compile.rs b/src/cargo/ops/cargo_compile.rs index f6196e297..a003e3075 100644 --- a/src/cargo/ops/cargo_compile.rs +++ b/src/cargo/ops/cargo_compile.rs @@ -14,18 +14,20 @@ * b. Compile each dependency in order, passing in the -L's pointing at each previously compiled dependency */ -use std::vec::Vec; use std::os; use util::config; use util::config::{all_configs,ConfigValue}; -use core::{PackageSet,Source,Dependency,NameVer}; +use core::{PackageSet,Source}; use core::resolver::resolve; use sources::path::PathSource; use ops::cargo_rustc; +use ops::cargo_read_manifest::read_manifest; use core::errors::{CargoError,CLIError,CLIResult,ToResult}; +use core::summary::SummaryVec; pub fn compile(manifest_path: &str) -> CLIResult<()> { - // TODO: Fix + let root_dep = try!(read_manifest(manifest_path)).to_dependency(); + let configs = try!(all_configs(os::getcwd()).to_result(|err: CargoError| CLIError::new("Could not load configurations", Some(err.to_str()), 1))); @@ -37,25 +39,21 @@ pub fn compile(manifest_path: &str) -> CLIResult<()> { }; let source = PathSource::new(paths); - let summaries = try!(source.list().to_result(|err| CLIError::new(format!("Unable to list packages from {}", source), Some(err.to_str()), 1))); - let names: Vec = summaries.iter().map(|s| s.get_name_ver().clone()).collect(); + let summaries = try!(source.list().to_result(|err| + CLIError::new(format!("Unable to list packages from {}", source), Some(err.to_str()), 1))); - // This does not need to happen - // try!(source.download(names.as_slice()).to_result(|err| CLIError::new(format!("Unable to download packages from {}", source), Some(err.to_str()), 1))); - - let deps: Vec = summaries.iter().map(|summary| { - Dependency::with_namever(summary.get_name_ver()) - }).collect(); - - let packages = try!(source.get(names.as_slice()).to_result(|err| - CLIError::new(format!("Unable to get packages from {} for {}", source, names), Some(err.to_str()), 1))); - - let registry = PackageSet::new(packages.as_slice()); - - let resolved = try!(resolve(deps.as_slice(), ®istry).to_result(|err: CargoError| + let resolved = try!(resolve([root_dep], &summaries).to_result(|err: CargoError| CLIError::new("Unable to resolve dependencies", Some(err.to_str()), 1))); - try!(cargo_rustc::compile(®istry)); + try!(source.download(resolved.as_slice()).to_result(|err| + CLIError::new(format!("Unable to download packages from {}", source), Some(err.to_str()), 1))); + + let packages = try!(source.get(resolved.as_slice()).to_result(|err| + CLIError::new(format!("Unable to get packages from {} for {}", source, summaries.names()), Some(err.to_str()), 1))); + + let package_set = PackageSet::new(packages.as_slice()); + + try!(cargo_rustc::compile(&package_set)); Ok(()) } diff --git a/src/cargo/ops/cargo_rustc.rs b/src/cargo/ops/cargo_rustc.rs index 0d2af16ef..7f3490836 100644 --- a/src/cargo/ops/cargo_rustc.rs +++ b/src/cargo/ops/cargo_rustc.rs @@ -14,6 +14,7 @@ pub fn compile(pkgs: &core::PackageSet) -> CLIResult<()> { }; for pkg in sorted.iter() { + println!("Compiling {}", pkg); try!(compile_pkg(pkg, pkgs)); } @@ -52,7 +53,7 @@ fn rustc(root: &Path, target: &core::Target, dest: &Path, deps: &[core::Package] .args(args.as_slice()) .exec() .to_result(|err| - CLIError::new(format!("Couldn't execute rustc {}", args.connect(" ")), Some(err.to_str()), 1))); + CLIError::new(format!("Couldn't execute `rustc {}` in `{}`", args.connect(" "), root.display()), Some(err.to_str()), 1))); Ok(()) }