Add tests and warnings for -Zextra-link-arg.

This commit is contained in:
Markus Reiter 2020-07-02 11:45:41 +02:00
parent 13b262491d
commit d3454cb14b
4 changed files with 108 additions and 15 deletions

View file

@ -289,6 +289,8 @@ fn build_work(cx: &mut Context<'_, '_>, unit: &Unit) -> CargoResult<Job> {
paths::create_dir_all(&script_dir)?;
paths::create_dir_all(&script_out_dir)?;
let extra_link_arg = cx.bcx.config.cli_unstable().extra_link_arg;
// Prepare the unit of "dirty work" which will actually run the custom build
// command.
//
@ -392,8 +394,13 @@ fn build_work(cx: &mut Context<'_, '_>, unit: &Unit) -> CargoResult<Job> {
paths::set_file_time_no_err(output_file, timestamp);
paths::write(&err_file, &output.stderr)?;
paths::write(&root_output_file, util::path2bytes(&script_out_dir)?)?;
let parsed_output =
BuildOutput::parse(&output.stdout, &pkg_name, &script_out_dir, &script_out_dir)?;
let parsed_output = BuildOutput::parse(
&output.stdout,
&pkg_name,
&script_out_dir,
&script_out_dir,
extra_link_arg,
)?;
if json_messages {
emit_build_output(state, &parsed_output, script_out_dir.as_path(), id);
@ -417,6 +424,7 @@ fn build_work(cx: &mut Context<'_, '_>, unit: &Unit) -> CargoResult<Job> {
&pkg_name,
&prev_script_out_dir,
&script_out_dir,
extra_link_arg,
)?,
};
@ -466,6 +474,7 @@ impl BuildOutput {
pkg_name: &str,
script_out_dir_when_generated: &Path,
script_out_dir: &Path,
extra_link_arg: bool,
) -> CargoResult<BuildOutput> {
let contents = paths::read_bytes(path)?;
BuildOutput::parse(
@ -473,6 +482,7 @@ impl BuildOutput {
pkg_name,
script_out_dir_when_generated,
script_out_dir,
extra_link_arg,
)
}
@ -483,6 +493,7 @@ impl BuildOutput {
pkg_name: &str,
script_out_dir_when_generated: &Path,
script_out_dir: &Path,
extra_link_arg: bool,
) -> CargoResult<BuildOutput> {
let mut library_paths = Vec::new();
let mut library_links = Vec::new();
@ -536,8 +547,20 @@ impl BuildOutput {
"rustc-link-lib" => library_links.push(value.to_string()),
"rustc-link-search" => library_paths.push(PathBuf::from(value)),
"rustc-cdylib-link-arg" => linker_args.push((Some(LinkType::Cdylib), value)),
"rustc-bin-link-arg" => linker_args.push((Some(LinkType::Bin), value)),
"rustc-link-arg" => linker_args.push((None, value)),
"rustc-bin-link-arg" => {
if extra_link_arg {
linker_args.push((Some(LinkType::Bin), value));
} else {
warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key));
}
}
"rustc-link-arg" => {
if extra_link_arg {
linker_args.push((None, value));
} else {
warnings.push(format!("cargo:{} requires -Zextra-link-arg flag", key));
}
}
"rustc-cfg" => cfgs.push(value.to_string()),
"rustc-env" => env.push(BuildOutput::parse_rustc_env(&value, &whence)?),
"warning" => warnings.push(value.to_string()),
@ -786,12 +809,15 @@ fn prev_build_output(cx: &mut Context<'_, '_>, unit: &Unit) -> (Option<BuildOutp
.and_then(|bytes| util::bytes2path(&bytes))
.unwrap_or_else(|_| script_out_dir.clone());
let extra_link_arg = cx.bcx.config.cli_unstable().extra_link_arg;
(
BuildOutput::parse_file(
&output_file,
&unit.pkg.to_string(),
&prev_script_out_dir,
&script_out_dir,
extra_link_arg,
)
.ok(),
prev_script_out_dir,

View file

@ -215,7 +215,6 @@ fn rustc(cx: &mut Context<'_, '_>, unit: &Unit, exec: &Arc<dyn Executor>) -> Car
// don't pass the `-l` flags.
let pass_l_flag = unit.target.is_lib() || !unit.pkg.targets().iter().any(|t| t.is_lib());
let link_type = (&unit.target).into();
let extra_link_arg = cx.bcx.config.cli_unstable().extra_link_arg;
let dep_info_name = match cx.files().metadata(unit) {
Some(metadata) => format!("{}-{}.d", unit.target.crate_name(), metadata),
@ -264,7 +263,6 @@ fn rustc(cx: &mut Context<'_, '_>, unit: &Unit, exec: &Arc<dyn Executor>) -> Car
&build_scripts,
pass_l_flag,
link_type,
extra_link_arg,
current_id,
)?;
add_plugin_deps(&mut rustc, &script_outputs, &build_scripts, &root_output)?;
@ -347,7 +345,6 @@ fn rustc(cx: &mut Context<'_, '_>, unit: &Unit, exec: &Arc<dyn Executor>) -> Car
build_scripts: &BuildScripts,
pass_l_flag: bool,
link_type: Option<LinkType>,
extra_link_arg: bool,
current_id: PackageId,
) -> CargoResult<()> {
for key in build_scripts.to_link.iter() {
@ -370,14 +367,11 @@ fn rustc(cx: &mut Context<'_, '_>, unit: &Unit, exec: &Arc<dyn Executor>) -> Car
}
}
if link_type.is_some() {
output
.linker_args
.iter()
.filter(|x| x.0.is_none() || x.0 == link_type)
.filter(|x| x.0 == Some(LinkType::Cdylib) || extra_link_arg)
.for_each(|x| {
rustc.arg("-C").arg(format!("link-arg={}", x.1));
});
for (lt, arg) in &output.linker_args {
if lt.is_none() || *lt == link_type {
rustc.arg("-C").arg(format!("link-arg={}", arg));
}
}
}
}
}

View file

@ -0,0 +1,72 @@
//! Tests for -Zextra-link-arg.
use cargo_test_support::{basic_bin_manifest, project};
#[cargo_test]
fn build_script_extra_bin_link_args() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/main.rs", "fn main() {}")
.file(
"build.rs",
r#"
fn main() {
println!("cargo:rustc-bin-link-arg=--this-is-a-bogus-flag");
}
"#,
)
.build();
p.cargo("build -Zextra-link-arg -v")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr_contains(
"[RUNNING] `rustc --crate-name foo [..]-C link-arg=--this-is-a-bogus-flag[..]",
)
.run();
}
#[cargo_test]
fn build_script_extra_link_args() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/main.rs", "fn main() {}")
.file(
"build.rs",
r#"
fn main() {
println!("cargo:rustc-link-arg=--this-is-a-bogus-flag");
}
"#,
)
.build();
p.cargo("build -Zextra-link-arg -v")
.masquerade_as_nightly_cargo()
.with_status(101)
.with_stderr_contains(
"[RUNNING] `rustc --crate-name foo [..]-C link-arg=--this-is-a-bogus-flag[..]",
)
.run();
}
#[cargo_test]
fn build_script_extra_link_args_warn_on_stable() {
let p = project()
.file("Cargo.toml", &basic_bin_manifest("foo"))
.file("src/main.rs", "fn main() {}")
.file(
"build.rs",
r#"
fn main() {
println!("cargo:rustc-link-arg=--this-is-a-bogus-flag");
}
"#,
)
.build();
p.cargo("build -vv")
.with_status(0)
.with_stderr_contains("warning: cargo:rustc-link-arg requires -Zextra-link-arg flag")
.run();
}

View file

@ -20,6 +20,7 @@ mod build;
mod build_plan;
mod build_script;
mod build_script_env;
mod build_script_extra_link_arg;
mod cache_messages;
mod cargo_alias_config;
mod cargo_command;