mirror of
https://github.com/rust-lang/cargo
synced 2024-10-13 19:22:33 +00:00
Add tests and warnings for -Zextra-link-arg
.
This commit is contained in:
parent
13b262491d
commit
d3454cb14b
|
@ -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,
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
72
tests/testsuite/build_script_extra_link_arg.rs
Normal file
72
tests/testsuite/build_script_extra_link_arg.rs
Normal 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();
|
||||
}
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue