diff --git a/src/cargo/core/compiler/custom_build.rs b/src/cargo/core/compiler/custom_build.rs index 1587f100eae..24c71245fdf 100644 --- a/src/cargo/core/compiler/custom_build.rs +++ b/src/cargo/core/compiler/custom_build.rs @@ -571,6 +571,27 @@ impl BuildOutput { warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key)); } } + "rustc-link-arg-tests" => { + if extra_link_arg { + linker_args.push((Some(LinkType::Test), value)); + } else { + warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key)); + } + } + "rustc-link-arg-benches" => { + if extra_link_arg { + linker_args.push((Some(LinkType::Bench), value)); + } else { + warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key)); + } + } + "rustc-link-arg-examples" => { + if extra_link_arg { + linker_args.push((Some(LinkType::Example), value)); + } else { + warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key)); + } + } "rustc-link-arg" => { if extra_link_arg { linker_args.push((None, value)); diff --git a/src/cargo/util/config/target.rs b/src/cargo/util/config/target.rs index e22cab92ee5..64cd654bd51 100644 --- a/src/cargo/util/config/target.rs +++ b/src/cargo/util/config/target.rs @@ -133,32 +133,48 @@ fn parse_links_overrides( .extend(list.iter().map(|v| PathBuf::from(&v.0))); } "rustc-link-arg-cdylib" | "rustc-cdylib-link-arg" => { - let args = value.list(key)?; - let args = args.iter().map(|v| (Some(LinkType::Cdylib), v.0.clone())); + let args = extra_link_args(Some(LinkType::Cdylib), key, value)?; output.linker_args.extend(args); } "rustc-link-arg-bins" => { if extra_link_arg { - let args = value.list(key)?; - let args = args.iter().map(|v| (Some(LinkType::Bin), v.0.clone())); + let args = extra_link_args(Some(LinkType::Bin), key, value)?; output.linker_args.extend(args); } else { - config.shell().warn(format!( - "target config `{}.{}` requires -Zextra-link-arg flag", - target_key, key - ))?; + warn_extra_link_arg(config, target_key, key)?; } } - "rustc-link-arg" => { + "rustc-link-arg-tests" => { + if extra_link_arg { + let args = extra_link_args(Some(LinkType::Test), key, value)?; + output.linker_args.extend(args); + } else { + warn_extra_link_arg(config, target_key, key)?; + } + } + "rustc-link-arg-benches" => { + if extra_link_arg { + let args = extra_link_args(Some(LinkType::Bench), key, value)?; + output.linker_args.extend(args); + } else { + warn_extra_link_arg(config, target_key, key)?; + } + } + "rustc-link-arg-examples" => { if extra_link_arg { - let args = value.list(key)?; - let args = args.iter().map(|v| (None, v.0.clone())); + let args = extra_link_args(Some(LinkType::Example), key, value)?; output.linker_args.extend(args); } else { - config.shell().warn(format!( - "target config `{}.{}` requires -Zextra-link-arg flag", - target_key, key - ))?; + warn_extra_link_arg(config, target_key, key)?; + } + } + "rustc-link-arg" => { + if extra_link_arg { + output + .linker_args + .extend(extra_link_args(None, key, value)?); + } else { + warn_extra_link_arg(config, target_key, key)?; } } "rustc-cfg" => { @@ -184,3 +200,19 @@ fn parse_links_overrides( } Ok(links_overrides) } + +fn extra_link_args<'a>( + link_type: Option, + key: &str, + value: &'a CV, +) -> CargoResult, String)> + 'a> { + let args = value.list(key)?; + Ok(args.iter().map(move |v| (link_type, v.0.clone()))) +} + +fn warn_extra_link_arg(config: &Config, target_key: &ConfigKey, key: &str) -> CargoResult<()> { + config.shell().warn(format!( + "target config `{}.{}` requires -Zextra-link-arg flag", + target_key, key + )) +} diff --git a/tests/testsuite/build_script_extra_link_arg.rs b/tests/testsuite/build_script_extra_link_arg.rs index e655414924e..538acf280d2 100644 --- a/tests/testsuite/build_script_extra_link_arg.rs +++ b/tests/testsuite/build_script_extra_link_arg.rs @@ -1,9 +1,9 @@ //! Tests for -Zextra-link-arg. -use cargo_test_support::{basic_bin_manifest, project}; +use cargo_test_support::{basic_bin_manifest, basic_lib_manifest, project}; #[cargo_test] -fn build_script_extra_link_arg_bin() { +fn build_script_extra_link_arg_bins() { let p = project() .file("Cargo.toml", &basic_bin_manifest("foo")) .file("src/main.rs", "fn main() {}") @@ -26,6 +26,81 @@ fn build_script_extra_link_arg_bin() { .run(); } +#[cargo_test] +fn build_script_extra_link_arg_tests() { + let p = project() + .file("Cargo.toml", &basic_lib_manifest("foo")) + .file("src/lib.rs", "") + .file("tests/test_foo.rs", "") + .file( + "build.rs", + r#" + fn main() { + println!("cargo:rustc-link-arg-tests=--this-is-a-bogus-flag"); + } + "#, + ) + .build(); + + p.cargo("test -Zextra-link-arg -v") + .masquerade_as_nightly_cargo() + .without_status() + .with_stderr_contains( + "[RUNNING] `rustc --crate-name test_foo [..]-C link-arg=--this-is-a-bogus-flag[..]", + ) + .run(); +} + +#[cargo_test] +fn build_script_extra_link_arg_benches() { + let p = project() + .file("Cargo.toml", &basic_lib_manifest("foo")) + .file("src/lib.rs", "") + .file("benches/bench_foo.rs", "") + .file( + "build.rs", + r#" + fn main() { + println!("cargo:rustc-link-arg-benches=--this-is-a-bogus-flag"); + } + "#, + ) + .build(); + + p.cargo("bench -Zextra-link-arg -v") + .masquerade_as_nightly_cargo() + .without_status() + .with_stderr_contains( + "[RUNNING] `rustc --crate-name bench_foo [..]-C link-arg=--this-is-a-bogus-flag[..]", + ) + .run(); +} + +#[cargo_test] +fn build_script_extra_link_arg_examples() { + let p = project() + .file("Cargo.toml", &basic_lib_manifest("foo")) + .file("src/lib.rs", "") + .file("examples/example_foo.rs", "fn main() {}") + .file( + "build.rs", + r#" + fn main() { + println!("cargo:rustc-link-arg-examples=--this-is-a-bogus-flag"); + } + "#, + ) + .build(); + + p.cargo("build -Zextra-link-arg -v --examples") + .masquerade_as_nightly_cargo() + .without_status() + .with_stderr_contains( + "[RUNNING] `rustc --crate-name example_foo [..]-C link-arg=--this-is-a-bogus-flag[..]", + ) + .run(); +} + #[cargo_test] fn build_script_extra_link_arg() { let p = project()