From 0d92be32c9e59619e7be2e0d8cceff5dfc38be5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Fri, 6 Jan 2017 21:52:57 +0200 Subject: [PATCH 1/2] Add support for building all members of the workspace with "build --all" https://github.com/rust-lang/cargo/issues/3491 --- src/bin/build.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/src/bin/build.rs b/src/bin/build.rs index 379f49ace9b..9b7ffc7c0bb 100644 --- a/src/bin/build.rs +++ b/src/bin/build.rs @@ -1,7 +1,7 @@ use std::env; use cargo::core::Workspace; -use cargo::ops::{self, CompileOptions, MessageFormat}; +use cargo::ops::{self, CompileOptions, MessageFormat, Packages}; use cargo::util::important_paths::{find_root_manifest_for_wd}; use cargo::util::{CliResult, Config}; @@ -26,6 +26,7 @@ pub struct Options { flag_bench: Vec, flag_locked: bool, flag_frozen: bool, + flag_all: bool, } pub const USAGE: &'static str = " @@ -37,6 +38,7 @@ Usage: Options: -h, --help Print this message -p SPEC, --package SPEC ... Package to build + --all Build all packages in the workspace -j N, --jobs N Number of parallel jobs, defaults to # of CPUs --lib Build only this package's library --bin NAME Build only the specified binary @@ -61,6 +63,9 @@ which indicates which package should be built. If it is not given, then the current package is built. For more information on SPEC and its format, see the `cargo help pkgid` command. +All packages in the workspace are built if the `--all` flag is supplied. The +`--all` flag may be supplied in the presence of a virtual manifest. + Compilation can be configured via the use of profiles which are configured in the manifest. The default profile for this command is `dev`, but passing the --release flag will use the `release` profile instead. @@ -77,6 +82,12 @@ pub fn execute(options: Options, config: &Config) -> CliResult> { let root = find_root_manifest_for_wd(options.flag_manifest_path, config.cwd())?; + let spec = if options.flag_all { + Packages::All + } else { + Packages::Packages(&options.flag_package) + }; + let opts = CompileOptions { config: config, jobs: options.flag_jobs, @@ -84,7 +95,7 @@ pub fn execute(options: Options, config: &Config) -> CliResult> { features: &options.flag_features, all_features: options.flag_all_features, no_default_features: options.flag_no_default_features, - spec: ops::Packages::Packages(&options.flag_package), + spec: spec, mode: ops::CompileMode::Build, release: options.flag_release, filter: ops::CompileFilter::new(options.flag_lib, From 4df1375c0e05cb901a9aea49086cad6e1c85e772 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20Dr=C3=B6ge?= Date: Sat, 7 Jan 2017 13:01:39 +0200 Subject: [PATCH 2/2] Add tests for "build --all" These are basically the same as the ones from "test --all" --- tests/build.rs | 101 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 101 insertions(+) diff --git a/tests/build.rs b/tests/build.rs index 4ab8706cebb..8959fac7e1b 100644 --- a/tests/build.rs +++ b/tests/build.rs @@ -12,6 +12,7 @@ use cargotest::{is_nightly, rustc_host, sleep_ms}; use cargotest::support::paths::{CargoPathExt,root}; use cargotest::support::{ProjectBuilder}; use cargotest::support::{project, execs, main_file, basic_bin_manifest}; +use cargotest::support::registry::Package; use hamcrest::{assert_that, existing_file, is_not}; use tempdir::TempDir; @@ -2554,3 +2555,103 @@ fn cargo_build_empty_target() { execs().with_status(101) .with_stderr_contains("[..] target was empty")); } + +#[test] +fn build_all_workspace() { + let p = project("foo") + .file("Cargo.toml", r#" + [project] + name = "foo" + version = "0.1.0" + + [dependencies] + bar = { path = "bar" } + + [workspace] + "#) + .file("src/main.rs", r#" + fn main() {} + "#) + .file("bar/Cargo.toml", r#" + [project] + name = "bar" + version = "0.1.0" + "#) + .file("bar/src/lib.rs", r#" + pub fn bar() {} + "#); + p.build(); + + assert_that(p.cargo_process("build") + .arg("--all"), + execs().with_stderr("[..] Compiling bar v0.1.0 ([..])\n\ + [..] Compiling foo v0.1.0 ([..])\n\ + [..] Finished debug [unoptimized + debuginfo] target(s) in [..]\n")); +} + +#[test] +fn build_all_virtual_manifest() { + let p = project("workspace") + .file("Cargo.toml", r#" + [workspace] + members = ["foo", "bar"] + "#) + .file("foo/Cargo.toml", r#" + [project] + name = "foo" + version = "0.1.0" + "#) + .file("foo/src/lib.rs", r#" + pub fn foo() {} + "#) + .file("bar/Cargo.toml", r#" + [project] + name = "bar" + version = "0.1.0" + "#) + .file("bar/src/lib.rs", r#" + pub fn bar() {} + "#); + p.build(); + + // The order in which foo and bar are built is not guaranteed + assert_that(p.cargo_process("build") + .arg("--all"), + execs().with_stderr_contains("[..] Compiling bar v0.1.0 ([..])") + .with_stderr_contains("[..] Compiling foo v0.1.0 ([..])") + .with_stderr("[..] Compiling [..] v0.1.0 ([..])\n\ + [..] Compiling [..] v0.1.0 ([..])\n\ + [..] Finished debug [unoptimized + debuginfo] target(s) in [..]\n")); +} + +#[test] +fn build_all_member_dependency_same_name() { + let p = project("workspace") + .file("Cargo.toml", r#" + [workspace] + members = ["a"] + "#) + .file("a/Cargo.toml", r#" + [project] + name = "a" + version = "0.1.0" + + [dependencies] + a = "0.1.0" + "#) + .file("a/src/lib.rs", r#" + pub fn a() {} + "#); + p.build(); + + Package::new("a", "0.1.0").publish(); + + assert_that(p.cargo_process("build") + .arg("--all"), + execs().with_stderr("[..] Updating registry `[..]`\n\ + [..] Downloading a v0.1.0 ([..])\n\ + [..] Compiling a v0.1.0\n\ + [..] Compiling a v0.1.0 ([..])\n\ + [..] Finished debug [unoptimized + debuginfo] target(s) in [..]\n")); +} +