mirror of
https://github.com/rust-lang/cargo.git
synced 2025-09-25 11:14:46 +00:00
959 lines
25 KiB
Rust
959 lines
25 KiB
Rust
//! Tests for profiles.
|
|
|
|
use std::env;
|
|
|
|
use crate::prelude::*;
|
|
use cargo_test_support::registry::Package;
|
|
use cargo_test_support::{project, rustc_host, str};
|
|
|
|
#[cargo_test]
|
|
fn profile_overrides() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
|
|
name = "test"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
debug = false
|
|
rpath = true
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
p.cargo("build -v").with_stderr_data(str![[r#"
|
|
[COMPILING] test v0.0.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name test --edition=2015 src/lib.rs [..]--crate-type lib --emit=[..]link[..] -C opt-level=1[..] -C debug-assertions=on[..] -C metadata=[..] -C rpath --out-dir [ROOT]/foo/target/debug/deps [..] -L dependency=[ROOT]/foo/target/debug/deps`
|
|
[FINISHED] `dev` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]]).run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn opt_level_override_0() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
|
|
name = "test"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.dev]
|
|
opt-level = 0
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
p.cargo("build -v").with_stderr_data(str![[r#"
|
|
[COMPILING] test v0.0.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name test --edition=2015 src/lib.rs [..]--crate-type lib --emit=[..]link[..]-C debuginfo=2 [..] -C metadata=[..] --out-dir [ROOT]/foo/target/debug/deps -L dependency=[ROOT]/foo/target/debug/deps`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]]).run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn debug_override_1() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "test"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.dev]
|
|
debug = 1
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
p.cargo("build -v").with_stderr_data(str![[r#"
|
|
[COMPILING] test v0.0.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name test --edition=2015 src/lib.rs [..]--crate-type lib --emit=[..]link[..]-C debuginfo=1 [..]-C metadata=[..] --out-dir [ROOT]/foo/target/debug/deps -L dependency=[ROOT]/foo/target/debug/deps`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]]).run();
|
|
}
|
|
|
|
fn check_opt_level_override(profile_level: &str, rustc_level: &str) {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
&format!(
|
|
r#"
|
|
[package]
|
|
|
|
name = "test"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.dev]
|
|
opt-level = {level}
|
|
"#,
|
|
level = profile_level
|
|
),
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
p.cargo("build -v")
|
|
.with_stderr_data(&format!(
|
|
"\
|
|
[COMPILING] test v0.0.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name test --edition=2015 src/lib.rs [..]--crate-type lib \
|
|
--emit=[..]link \
|
|
-C opt-level={level}[..]\
|
|
-C debuginfo=2 [..]\
|
|
-C debug-assertions=on[..] \
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[ROOT]/foo/target/debug/deps`
|
|
[FINISHED] `dev` profile [..]+ debuginfo] target(s) in [ELAPSED]s
|
|
",
|
|
level = rustc_level
|
|
))
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn opt_level_overrides() {
|
|
for &(profile_level, rustc_level) in &[
|
|
("1", "1"),
|
|
("2", "2"),
|
|
("3", "3"),
|
|
("\"s\"", "s"),
|
|
("\"z\"", "z"),
|
|
] {
|
|
check_opt_level_override(profile_level, rustc_level)
|
|
}
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn top_level_overrides_deps() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
|
|
name = "test"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.release]
|
|
opt-level = 1
|
|
debug = true
|
|
|
|
[dependencies.foo]
|
|
path = "foo"
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.file(
|
|
"foo/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
|
|
name = "foo"
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.release]
|
|
opt-level = 0
|
|
debug = false
|
|
|
|
[lib]
|
|
name = "foo"
|
|
crate-type = ["dylib", "rlib"]
|
|
"#,
|
|
)
|
|
.file("foo/src/lib.rs", "")
|
|
.build();
|
|
p.cargo("build -v --release")
|
|
.with_stderr_data(&format!(
|
|
"\
|
|
[LOCKING] 1 package to latest compatible version
|
|
[COMPILING] foo v0.0.0 ([ROOT]/foo/foo)
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 foo/src/lib.rs [..]\
|
|
--crate-type dylib --crate-type rlib \
|
|
--emit=[..]link \
|
|
-C prefer-dynamic \
|
|
-C opt-level=1[..]\
|
|
-C debuginfo=2 [..]\
|
|
-C metadata=[..] \
|
|
--out-dir [ROOT]/foo/target/release/deps \
|
|
-L dependency=[ROOT]/foo/target/release/deps`
|
|
[COMPILING] test v0.0.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name test --edition=2015 src/lib.rs [..]--crate-type lib \
|
|
--emit=[..]link \
|
|
-C opt-level=1[..]\
|
|
-C debuginfo=2 [..]\
|
|
-C metadata=[..] \
|
|
--out-dir [..] \
|
|
-L dependency=[ROOT]/foo/target/release/deps \
|
|
--extern foo=[ROOT]/foo/target/release/deps/\
|
|
{prefix}foo[..]{suffix} \
|
|
--extern foo=[ROOT]/foo/target/release/deps/libfoo.rlib`
|
|
[FINISHED] `release` profile [optimized + debuginfo] target(s) in [ELAPSED]s
|
|
",
|
|
prefix = env::consts::DLL_PREFIX,
|
|
suffix = env::consts::DLL_SUFFIX
|
|
))
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_in_non_root_manifest_triggers_a_warning() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[workspace]
|
|
members = ["bar"]
|
|
|
|
[profile.dev]
|
|
debug = false
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file(
|
|
"bar/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "bar"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
authors = []
|
|
workspace = ".."
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
"#,
|
|
)
|
|
.file("bar/src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.cwd("bar")
|
|
.with_stderr_data(str![[r#"
|
|
[WARNING] profiles for the non root package will be ignored, specify profiles at the workspace root:
|
|
package: [ROOT]/foo/bar/Cargo.toml
|
|
workspace: [ROOT]/foo/Cargo.toml
|
|
[COMPILING] bar v0.1.0 ([ROOT]/foo/bar)
|
|
[RUNNING] `rustc [..]`
|
|
[FINISHED] `dev` profile [unoptimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_in_virtual_manifest_works() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[workspace]
|
|
members = ["bar"]
|
|
|
|
[profile.dev]
|
|
opt-level = 1
|
|
debug = false
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file(
|
|
"bar/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "bar"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
authors = []
|
|
workspace = ".."
|
|
"#,
|
|
)
|
|
.file("bar/src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.cwd("bar")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] bar v0.1.0 ([ROOT]/foo/bar)
|
|
[RUNNING] `rustc [..]`
|
|
[FINISHED] `dev` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_lto_string_bool_dev() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[profile.dev]
|
|
lto = "true"
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("build")
|
|
.with_status(101)
|
|
.with_stderr_data(str![[r#"
|
|
[ERROR] failed to parse manifest at `[ROOT]/foo/Cargo.toml`
|
|
|
|
Caused by:
|
|
`lto` setting of string `"true"` for `dev` profile is not a valid setting, must be a boolean (`true`/`false`) or a string (`"thin"`/`"fat"`/`"off"`) or omitted.
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_panic_test_bench() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[profile.test]
|
|
panic = "abort"
|
|
|
|
[profile.bench]
|
|
panic = "abort"
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("build")
|
|
.with_stderr_data(str![[r#"
|
|
[WARNING] `panic` setting is ignored for `bench` profile
|
|
[WARNING] `panic` setting is ignored for `test` profile
|
|
[COMPILING] foo v0.0.1 ([ROOT]/foo)
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_doc_deprecated() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[profile.doc]
|
|
opt-level = 0
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("build")
|
|
.with_stderr_data(str![[r#"
|
|
[WARNING] profile `doc` is deprecated and has no effect
|
|
...
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn panic_unwind_does_not_build_twice() {
|
|
// Check for a bug where `lib` was built twice, once with panic set and
|
|
// once without. Since "unwind" is the default, they are the same and
|
|
// should only be built once.
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.dev]
|
|
panic = "unwind"
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file("tests/t1.rs", "")
|
|
.build();
|
|
|
|
p.cargo("test -v --tests --no-run")
|
|
.with_stderr_data(
|
|
str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 src/lib.rs [..]--crate-type lib [..]`
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 src/lib.rs [..] --test [..]`
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 src/main.rs [..]--crate-type bin [..]`
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 src/main.rs [..] --test [..]`
|
|
[RUNNING] `rustc --crate-name t1 --edition=2015 tests/t1.rs [..]`
|
|
[FINISHED] `test` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
[EXECUTABLE] `[ROOT]/foo/target/debug/deps/foo-[HASH][EXE]`
|
|
[EXECUTABLE] `[ROOT]/foo/target/debug/deps/foo-[HASH][EXE]`
|
|
[EXECUTABLE] `[ROOT]/foo/target/debug/deps/t1-[HASH][EXE]`
|
|
|
|
"#]]
|
|
.unordered(),
|
|
)
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn debug_0_report() {
|
|
// The finished line handles 0 correctly.
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.dev]
|
|
debug = 0
|
|
"#,
|
|
)
|
|
.file("src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo --edition=2015 src/lib.rs [..]`
|
|
[FINISHED] `dev` profile [unoptimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.with_stderr_does_not_contain("-C debuginfo")
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn thin_lto_works() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "top"
|
|
version = "0.5.0"
|
|
edition = "2015"
|
|
authors = []
|
|
|
|
[profile.release]
|
|
lto = 'thin'
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] top v0.5.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C lto=thin [..]`
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_works() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.release]
|
|
strip = 'symbols'
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C strip=symbols [..]`
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_passes_unknown_option_to_rustc() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.release]
|
|
strip = 'unknown'
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_status(101)
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C strip=unknown [..]`
|
|
[ERROR] incorrect value `unknown` for [..] `strip` [..] was expected
|
|
...
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_accepts_true_to_strip_symbols() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.release]
|
|
strip = true
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C strip=symbols [..]`
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_accepts_false_to_disable_strip() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.release]
|
|
strip = false
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_does_not_contain("[RUNNING] `rustc [..] -C strip[..]`")
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_debuginfo_in_release() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C strip=debuginfo[..]`
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
p.cargo("build --release -v --target")
|
|
.arg(rustc_host())
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc [..] -C strip=debuginfo[..]`
|
|
[FINISHED] `release` profile [optimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn strip_debuginfo_without_debug() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[profile.dev]
|
|
debug = 0
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.1.0 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo [..] -C strip=debuginfo[..]`
|
|
[FINISHED] `dev` profile [unoptimized] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn do_not_strip_debuginfo_with_requested_debug() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
|
|
[dependencies]
|
|
bar = { path = "bar" }
|
|
|
|
[profile.release.package.bar]
|
|
debug = 1
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.file(
|
|
"bar/Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "bar"
|
|
version = "0.1.0"
|
|
edition = "2015"
|
|
"#,
|
|
)
|
|
.file("bar/src/lib.rs", "")
|
|
.build();
|
|
|
|
p.cargo("build --release -v")
|
|
.with_stderr_does_not_contain("[RUNNING] `rustc [..] -C strip=debuginfo[..]`")
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn rustflags_works() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["profile-rustflags"]
|
|
|
|
[profile.dev]
|
|
rustflags = ["-C", "link-dead-code=yes"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.masquerade_as_nightly_cargo(&["profile-rustflags"])
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.0.1 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo [..] -C link-dead-code=yes [..]`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn rustflags_works_with_env() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
cargo-features = ["profile-rustflags"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.env("CARGO_PROFILE_DEV_RUSTFLAGS", "-C link-dead-code=yes")
|
|
.masquerade_as_nightly_cargo(&["profile-rustflags"])
|
|
.with_stderr_data(str![[r#"
|
|
[COMPILING] foo v0.0.1 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo [..] -C link-dead-code=yes [..]`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn rustflags_requires_cargo_feature() {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[profile.dev]
|
|
rustflags = ["-C", "link-dead-code=yes"]
|
|
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
.masquerade_as_nightly_cargo(&["profile-rustflags"])
|
|
.with_status(101)
|
|
.with_stderr_data(str![[r#"
|
|
[ERROR] failed to parse manifest at `[ROOT]/foo/Cargo.toml`
|
|
|
|
Caused by:
|
|
feature `profile-rustflags` is required
|
|
|
|
The package requires the Cargo feature called `profile-rustflags`, but that feature is not stabilized in this version of Cargo (1.[..]).
|
|
Consider adding `cargo-features = ["profile-rustflags"]` to the top of Cargo.toml (above the [package] table) to tell Cargo you are opting in to use this unstable feature.
|
|
See https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#profile-rustflags-option for more information about the status of this feature.
|
|
|
|
"#]])
|
|
.run();
|
|
|
|
Package::new("bar", "1.0.0").publish();
|
|
p.change_file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[dependencies]
|
|
bar = "1.0"
|
|
|
|
[profile.dev.package.bar]
|
|
rustflags = ["-C", "link-dead-code=yes"]
|
|
"#,
|
|
);
|
|
p.cargo("check")
|
|
.masquerade_as_nightly_cargo(&["profile-rustflags"])
|
|
.with_status(101)
|
|
.with_stderr_data(str![[r#"
|
|
[ERROR] failed to parse manifest at `[ROOT]/foo/Cargo.toml`
|
|
|
|
Caused by:
|
|
feature `profile-rustflags` is required
|
|
|
|
The package requires the Cargo feature called `profile-rustflags`, but that feature is not stabilized in this version of Cargo (1.[..]).
|
|
Consider adding `cargo-features = ["profile-rustflags"]` to the top of Cargo.toml (above the [package] table) to tell Cargo you are opting in to use this unstable feature.
|
|
See https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#profile-rustflags-option for more information about the status of this feature.
|
|
|
|
"#]])
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn debug_options_valid() {
|
|
let build = |option| {
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
&format!(
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
authors = []
|
|
version = "0.0.0"
|
|
edition = "2015"
|
|
|
|
[profile.dev]
|
|
debug = "{option}"
|
|
"#
|
|
),
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
|
|
p.cargo("build -v")
|
|
};
|
|
|
|
for (option, cli) in [
|
|
("line-directives-only", "line-directives-only"),
|
|
("line-tables-only", "line-tables-only"),
|
|
("limited", "1"),
|
|
("full", "2"),
|
|
] {
|
|
build(option)
|
|
.with_stderr_data(&format!(
|
|
"\
|
|
...
|
|
[RUNNING] `rustc [..]-C debuginfo={cli} [..]`
|
|
...
|
|
"
|
|
))
|
|
.run();
|
|
}
|
|
build("none")
|
|
.with_stderr_does_not_contain("[..]-C debuginfo[..]")
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test]
|
|
fn profile_hint_mostly_unused_warn_without_gate() {
|
|
Package::new("bar", "1.0.0").publish();
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[dependencies]
|
|
bar = "1.0"
|
|
|
|
[profile.dev.package.bar]
|
|
hint-mostly-unused = true
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
p.cargo("check -v")
|
|
.with_stderr_data(str![[r#"
|
|
[UPDATING] `dummy-registry` index
|
|
[LOCKING] 1 package to latest compatible version
|
|
[DOWNLOADING] crates ...
|
|
[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`)
|
|
[WARNING] bar@1.0.0: ignoring 'hint-mostly-unused' profile option, pass `-Zprofile-hint-mostly-unused` to enable it
|
|
[CHECKING] bar v1.0.0
|
|
[RUNNING] `rustc --crate-name bar [..]`
|
|
[CHECKING] foo v0.0.1 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo [..]`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.with_stderr_does_not_contain("-Zhint-mostly-unused")
|
|
.run();
|
|
}
|
|
|
|
#[cargo_test(nightly, reason = "-Zhint-mostly-unused is unstable")]
|
|
fn profile_hint_mostly_unused_nightly() {
|
|
Package::new("bar", "1.0.0").publish();
|
|
let p = project()
|
|
.file(
|
|
"Cargo.toml",
|
|
r#"
|
|
[package]
|
|
name = "foo"
|
|
version = "0.0.1"
|
|
edition = "2015"
|
|
|
|
[dependencies]
|
|
bar = "1.0"
|
|
|
|
[profile.dev.package.bar]
|
|
hint-mostly-unused = true
|
|
"#,
|
|
)
|
|
.file("src/main.rs", "fn main() {}")
|
|
.build();
|
|
p.cargo("check -Zprofile-hint-mostly-unused -v")
|
|
.masquerade_as_nightly_cargo(&["profile-hint-mostly-unused"])
|
|
.with_stderr_data(str![[r#"
|
|
[UPDATING] `dummy-registry` index
|
|
[LOCKING] 1 package to latest compatible version
|
|
[DOWNLOADING] crates ...
|
|
[DOWNLOADED] bar v1.0.0 (registry `dummy-registry`)
|
|
[CHECKING] bar v1.0.0
|
|
[RUNNING] `rustc --crate-name bar [..] -Zhint-mostly-unused [..]`
|
|
[CHECKING] foo v0.0.1 ([ROOT]/foo)
|
|
[RUNNING] `rustc --crate-name foo [..]`
|
|
[FINISHED] `dev` profile [unoptimized + debuginfo] target(s) in [ELAPSED]s
|
|
|
|
"#]])
|
|
.with_stderr_does_not_contain(
|
|
"[RUNNING] `rustc --crate-name foo [..] -Zhint-mostly-unused [..]",
|
|
)
|
|
.run();
|
|
}
|