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_dir)?;
paths::create_dir_all(&script_out_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 // Prepare the unit of "dirty work" which will actually run the custom build
// command. // 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::set_file_time_no_err(output_file, timestamp);
paths::write(&err_file, &output.stderr)?; paths::write(&err_file, &output.stderr)?;
paths::write(&root_output_file, util::path2bytes(&script_out_dir)?)?; paths::write(&root_output_file, util::path2bytes(&script_out_dir)?)?;
let parsed_output = let parsed_output = BuildOutput::parse(
BuildOutput::parse(&output.stdout, &pkg_name, &script_out_dir, &script_out_dir)?; &output.stdout,
&pkg_name,
&script_out_dir,
&script_out_dir,
extra_link_arg,
)?;
if json_messages { if json_messages {
emit_build_output(state, &parsed_output, script_out_dir.as_path(), id); 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, &pkg_name,
&prev_script_out_dir, &prev_script_out_dir,
&script_out_dir, &script_out_dir,
extra_link_arg,
)?, )?,
}; };
@ -466,6 +474,7 @@ impl BuildOutput {
pkg_name: &str, pkg_name: &str,
script_out_dir_when_generated: &Path, script_out_dir_when_generated: &Path,
script_out_dir: &Path, script_out_dir: &Path,
extra_link_arg: bool,
) -> CargoResult<BuildOutput> { ) -> CargoResult<BuildOutput> {
let contents = paths::read_bytes(path)?; let contents = paths::read_bytes(path)?;
BuildOutput::parse( BuildOutput::parse(
@ -473,6 +482,7 @@ impl BuildOutput {
pkg_name, pkg_name,
script_out_dir_when_generated, script_out_dir_when_generated,
script_out_dir, script_out_dir,
extra_link_arg,
) )
} }
@ -483,6 +493,7 @@ impl BuildOutput {
pkg_name: &str, pkg_name: &str,
script_out_dir_when_generated: &Path, script_out_dir_when_generated: &Path,
script_out_dir: &Path, script_out_dir: &Path,
extra_link_arg: bool,
) -> CargoResult<BuildOutput> { ) -> CargoResult<BuildOutput> {
let mut library_paths = Vec::new(); let mut library_paths = Vec::new();
let mut library_links = 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-lib" => library_links.push(value.to_string()),
"rustc-link-search" => library_paths.push(PathBuf::from(value)), "rustc-link-search" => library_paths.push(PathBuf::from(value)),
"rustc-cdylib-link-arg" => linker_args.push((Some(LinkType::Cdylib), value)), "rustc-cdylib-link-arg" => linker_args.push((Some(LinkType::Cdylib), value)),
"rustc-bin-link-arg" => linker_args.push((Some(LinkType::Bin), value)), "rustc-bin-link-arg" => {
"rustc-link-arg" => linker_args.push((None, value)), 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-cfg" => cfgs.push(value.to_string()),
"rustc-env" => env.push(BuildOutput::parse_rustc_env(&value, &whence)?), "rustc-env" => env.push(BuildOutput::parse_rustc_env(&value, &whence)?),
"warning" => warnings.push(value.to_string()), "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)) .and_then(|bytes| util::bytes2path(&bytes))
.unwrap_or_else(|_| script_out_dir.clone()); .unwrap_or_else(|_| script_out_dir.clone());
let extra_link_arg = cx.bcx.config.cli_unstable().extra_link_arg;
( (
BuildOutput::parse_file( BuildOutput::parse_file(
&output_file, &output_file,
&unit.pkg.to_string(), &unit.pkg.to_string(),
&prev_script_out_dir, &prev_script_out_dir,
&script_out_dir, &script_out_dir,
extra_link_arg,
) )
.ok(), .ok(),
prev_script_out_dir, 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. // don't pass the `-l` flags.
let pass_l_flag = unit.target.is_lib() || !unit.pkg.targets().iter().any(|t| t.is_lib()); let pass_l_flag = unit.target.is_lib() || !unit.pkg.targets().iter().any(|t| t.is_lib());
let link_type = (&unit.target).into(); 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) { let dep_info_name = match cx.files().metadata(unit) {
Some(metadata) => format!("{}-{}.d", unit.target.crate_name(), metadata), 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, &build_scripts,
pass_l_flag, pass_l_flag,
link_type, link_type,
extra_link_arg,
current_id, current_id,
)?; )?;
add_plugin_deps(&mut rustc, &script_outputs, &build_scripts, &root_output)?; 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, build_scripts: &BuildScripts,
pass_l_flag: bool, pass_l_flag: bool,
link_type: Option<LinkType>, link_type: Option<LinkType>,
extra_link_arg: bool,
current_id: PackageId, current_id: PackageId,
) -> CargoResult<()> { ) -> CargoResult<()> {
for key in build_scripts.to_link.iter() { 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() { if link_type.is_some() {
output for (lt, arg) in &output.linker_args {
.linker_args if lt.is_none() || *lt == link_type {
.iter() rustc.arg("-C").arg(format!("link-arg={}", arg));
.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));
});
} }
} }
} }

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_plan;
mod build_script; mod build_script;
mod build_script_env; mod build_script_env;
mod build_script_extra_link_arg;
mod cache_messages; mod cache_messages;
mod cargo_alias_config; mod cargo_alias_config;
mod cargo_command; mod cargo_command;