Skip to content

Commit 7cbc858

Browse files
committed
Add some tests
1 parent 55f0163 commit 7cbc858

File tree

2 files changed

+124
-0
lines changed

2 files changed

+124
-0
lines changed

tests/testsuite/build_script.rs

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,43 @@ fn custom_build_env_var_rustc_linker() {
453453
p.cargo("build --target").arg(&target).run();
454454
}
455455

456+
// Only run this test on linux, since it's difficult to construct
457+
// a case suitable for all platforms.
458+
// See:https://github.com/rust-lang/cargo/pull/12535#discussion_r1306618264
459+
#[cargo_test]
460+
#[cfg(target_os = "linux")]
461+
fn custom_build_env_var_rustc_linker_with_target_cfg() {
462+
if cross_compile::disabled() {
463+
return;
464+
}
465+
466+
let target = cross_compile::alternate();
467+
let p = project()
468+
.file(
469+
".cargo/config",
470+
r#"
471+
[target.'cfg(target_pointer_width = "32")']
472+
linker = "/path/to/linker"
473+
"#,
474+
)
475+
.file(
476+
"build.rs",
477+
r#"
478+
use std::env;
479+
480+
fn main() {
481+
assert!(env::var("RUSTC_LINKER").unwrap().ends_with("/path/to/linker"));
482+
}
483+
"#,
484+
)
485+
.file("src/lib.rs", "")
486+
.build();
487+
488+
// no crate type set => linker never called => build succeeds if and
489+
// only if build.rs succeeds, despite linker binary not existing.
490+
p.cargo("build --target").arg(&target).run();
491+
}
492+
456493
#[cargo_test]
457494
fn custom_build_env_var_rustc_linker_bad_host_target() {
458495
let target = rustc_host();

tests/testsuite/tool_paths.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,93 @@ fn pathless_tools() {
3232
.run();
3333
}
3434

35+
// can set a custom linker via `target.'cfg(..)'.linker`
36+
#[cargo_test]
37+
fn custom_linker_cfg() {
38+
let foo = project()
39+
.file("Cargo.toml", &basic_lib_manifest("foo"))
40+
.file("src/lib.rs", "")
41+
.file(
42+
".cargo/config",
43+
r#"
44+
[target.'cfg(not(target_os = "none"))']
45+
linker = "nonexistent-linker"
46+
"#,
47+
)
48+
.build();
49+
50+
foo.cargo("build --verbose")
51+
.with_stderr(
52+
"\
53+
[COMPILING] foo v0.5.0 ([CWD])
54+
[RUNNING] `rustc [..] -C linker=nonexistent-linker [..]`
55+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
56+
",
57+
)
58+
.run();
59+
}
60+
61+
// custom linker set via `target.$triple.linker` have precede over `target.'cfg(..)'.linker`
62+
#[cargo_test]
63+
fn custom_linker_cfg_precedence() {
64+
let target = rustc_host();
65+
66+
let foo = project()
67+
.file("Cargo.toml", &basic_lib_manifest("foo"))
68+
.file("src/lib.rs", "")
69+
.file(
70+
".cargo/config",
71+
&format!(
72+
r#"
73+
[target.'cfg(not(target_os = "none"))']
74+
linker = "ignored-linker"
75+
[target.{}]
76+
linker = "nonexistent-linker"
77+
"#,
78+
target
79+
),
80+
)
81+
.build();
82+
83+
foo.cargo("build --verbose")
84+
.with_stderr(
85+
"\
86+
[COMPILING] foo v0.5.0 ([CWD])
87+
[RUNNING] `rustc [..] -C linker=nonexistent-linker [..]`
88+
[FINISHED] dev [unoptimized + debuginfo] target(s) in [..]
89+
",
90+
)
91+
.run();
92+
}
93+
94+
#[cargo_test]
95+
fn custom_linker_cfg_collision() {
96+
let foo = project()
97+
.file("Cargo.toml", &basic_lib_manifest("foo"))
98+
.file("src/lib.rs", "")
99+
.file(
100+
".cargo/config",
101+
r#"
102+
[target.'cfg(not(target_arch = "avr"))']
103+
linker = "nonexistent-linker1"
104+
[target.'cfg(not(target_os = "none"))']
105+
linker = "nonexistent-linker2"
106+
"#,
107+
)
108+
.build();
109+
110+
foo.cargo("build --verbose")
111+
.with_status(101)
112+
.with_stderr(&format!(
113+
"\
114+
[ERROR] several matching instances of `target.'cfg(..)'.linker` in configurations
115+
first match `cfg(not(target_arch = \"avr\"))` located in [..]/foo/.cargo/config
116+
second match `cfg(not(target_os = \"none\"))` located in [..]/foo/.cargo/config
117+
",
118+
))
119+
.run();
120+
}
121+
35122
#[cargo_test]
36123
fn absolute_tools() {
37124
let target = rustc_host();

0 commit comments

Comments
 (0)