mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-28 11:20:36 +00:00
206 lines
5.5 KiB
Rust
206 lines
5.5 KiB
Rust
//! Tests for workspace feature unification.
|
|
|
|
use crate::prelude::*;
|
|
use cargo_test_support::{basic_manifest, cargo_process, project, str};
|
|
|
|
#[cargo_test]
|
|
fn workspace_feature_unification() {
|
|
let p = project()
|
|
.file(
|
|
".cargo/config.toml",
|
|
r#"
|
|
[resolver]
|
|
feature-unification = "workspace"
|
|
"#,
|
|
)
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[workspace]
|
|
resolver = "2"
|
|
members = ["common", "a", "b"]
|
|
"#,
|
|
)
|
|
.file(
|
|
"common/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "common"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[features]
|
|
a = []
|
|
b = []
|
|
"#,
|
|
)
|
|
.file(
|
|
"common/src/lib.rs",
|
|
r#"
|
|
#[cfg(not(all(feature = "a", feature = "b")))]
|
|
compile_error!("features were not unified");
|
|
"#,
|
|
)
|
|
.file(
|
|
"a/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "a"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
common = { path = "../common", features = ["a"] }
|
|
"#,
|
|
)
|
|
.file("a/src/lib.rs", "")
|
|
.file(
|
|
"b/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "b"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
common = { path = "../common", features = ["b"] }
|
|
"#,
|
|
)
|
|
.file("b/src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("check -p common")
|
|
.arg("-Zfeature-unification")
|
|
.masquerade_as_nightly_cargo(&["feature-unification"])
|
|
.with_stderr_data(str![[r#"
|
|
[CHECKING] common v0.1.0 ([ROOT]/foo/common)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
p.cargo("check -p a")
|
|
.arg("-Zfeature-unification")
|
|
.masquerade_as_nightly_cargo(&["feature-unification"])
|
|
.with_stderr_data(str![[r#"
|
|
[CHECKING] a v0.1.0 ([ROOT]/foo/a)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
p.cargo("check -p b")
|
|
.arg("-Zfeature-unification")
|
|
.masquerade_as_nightly_cargo(&["feature-unification"])
|
|
.with_stderr_data(str![[r#"
|
|
[CHECKING] b v0.1.0 ([ROOT]/foo/b)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
p.cargo("check")
|
|
.arg("-Zfeature-unification")
|
|
.masquerade_as_nightly_cargo(&["feature-unification"])
|
|
.with_stderr_data(str![[r#"
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn cargo_install_ignores_config() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "a"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
common = { path = "common", features = ["a"] }
|
|
|
|
[workspace]
|
|
members = ["common", "b"]
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file(
|
|
"common/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "common"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[features]
|
|
a = []
|
|
b = []
|
|
"#,
|
|
)
|
|
.file(
|
|
"common/src/lib.rs",
|
|
r#"
|
|
#[cfg(all(feature = "a", feature = "b"))]
|
|
compile_error!("features should not be unified");
|
|
"#,
|
|
)
|
|
.file(
|
|
"b/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "b"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
|
|
[dependencies]
|
|
common = { path = "../common", features = ["b"] }
|
|
"#,
|
|
)
|
|
.file("b/src/lib.rs", "")
|
|
.build();
|
|
|
|
cargo_process("install --path")
|
|
.arg(p.root())
|
|
.arg("-Zfeature-unification")
|
|
.masquerade_as_nightly_cargo(&["feature-unification"])
|
|
.env("CARGO_RESOLVER_FEATURE_UNIFICATION", "workspace")
|
|
.with_stderr_data(str![[r#"
|
|
[INSTALLING] a v0.1.0 ([ROOT]/foo)
|
|
[COMPILING] common v0.1.0 ([ROOT]/foo/common)
|
|
[COMPILING] a v0.1.0 ([ROOT]/foo)
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
[INSTALLING] [ROOT]/home/.cargo/bin/a[EXE]
|
|
[INSTALLED] package `a v0.1.0 ([ROOT]/foo)` (executable `a[EXE]`)
|
|
[WARNING] be sure to add `[ROOT]/home/.cargo/bin` to your PATH to be able to run the installed binaries
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn unstable_config_on_stable() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[workspace]
|
|
resolver = "2"
|
|
members = ["bar"]
|
|
"#,
|
|
)
|
|
.file("bar/Cargo.toml", &basic_manifest("bar", "0.1.0"))
|
|
.file("bar/src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("check")
|
|
.env("CARGO_RESOLVER_FEATURE_UNIFICATION", "workspace")
|
|
.with_stderr_data(str![[r#"
|
|
[WARNING] ignoring `resolver.feature-unification` without `-Zfeature-unification`
|
|
[CHECKING] bar v0.1.0 ([ROOT]/foo/bar)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|