Skip to content

Commit

Permalink
Auto merge of #14432 - weihanglo:target-applies-to-host, r=epage
Browse files Browse the repository at this point in the history
fix: -Cmetadata includes whether extra rustflags is same as host

### What does this PR try to resolve?

Fixes #14253

The root cause is described in <#14253 (comment)>:

> `-Ztarget-applies-to-host --config target-applies-to-host=false` make it possible to build two units for the same output directory with different rustflags (one with artifact/target rustflags, one with none/host rust flags). Those flags aren't included in the `-Cmetadata` hash which is used to disambiguate different versions of crates, resulting in a conflict. The actual error being produced appears to be the result of two invocations of `rustc` racing and clobbering each other…

While we don't hash RUSTFLAGS because it may contain absolute paths that
hurts reproducibility, we track whether a unit's RUSTFLAGS is from host
config, so that we can generate a different metadata hash for runtime
and compile-time units.

### How should we test and review this PR?

This hack is only enabled when `target-applies-to-host=false` and when compile kind is the host platform, so the shouldn't affect any stable behavior.
  • Loading branch information
bors committed Aug 21, 2024
2 parents 9e152bb + d12c716 commit 7d7b932
Show file tree
Hide file tree
Showing 2 changed files with 83 additions and 0 deletions.
20 changes: 20 additions & 0 deletions src/cargo/core/compiler/build_runner/compilation_files.rs
Original file line number Diff line number Diff line change
Expand Up @@ -649,6 +649,26 @@ fn compute_metadata(
// with user dependencies.
unit.is_std.hash(&mut hasher);

// While we don't hash RUSTFLAGS because it may contain absolute paths that
// hurts reproducibility, we track whether a unit's RUSTFLAGS is from host
// config, so that we can generate a different metadata hash for runtime
// and compile-time units.
//
// HACK: This is a temporary hack for fixing rust-lang/cargo#14253
// Need to find a long-term solution to replace this fragile workaround.
// See https://github.com/rust-lang/cargo/pull/14432#discussion_r1725065350
if unit.kind.is_host() && !bcx.gctx.target_applies_to_host().unwrap_or_default() {
let host_info = bcx.target_data.info(CompileKind::Host);
let target_configs_are_different = unit.rustflags != host_info.rustflags
|| unit.rustdocflags != host_info.rustdocflags
|| bcx
.target_data
.target_config(CompileKind::Host)
.links_overrides
!= unit.links_overrides;
target_configs_are_different.hash(&mut hasher);
}

MetaInfo {
meta_hash: Metadata(hasher.finish()),
use_extra_filename: should_use_metadata(bcx, unit),
Expand Down
63 changes: 63 additions & 0 deletions tests/testsuite/rustflags.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1642,3 +1642,66 @@ fn target_applies_to_host_rustdocflags_works() {
)
.run();
}

#[cargo_test]
fn host_config_shared_build_dep() {
// rust-lang/cargo#14253
Package::new("cc", "1.0.0").publish();
let p = project()
.file(
"Cargo.toml",
r#"
[package]
name = "bootstrap"
edition = "2021"
[dependencies]
cc = "1.0.0"
[build-dependencies]
cc = "1.0.0"
[profile.dev]
debug = 0
"#,
)
.file("src/lib.rs", "")
.file("build.rs", "fn main() {}")
.file(
".cargo/config.toml",
"
target-applies-to-host=false
[host]
rustflags = ['--cfg', 'from_host']
[build]
rustflags = ['--cfg', 'from_target']
",
)
.build();

p.cargo("build -v")
.masquerade_as_nightly_cargo(&["target-applies-to-host"])
.arg("-Ztarget-applies-to-host")
.arg("-Zhost-config")
.with_stderr_data(
str![[r#"
[UPDATING] `dummy-registry` index
[LOCKING] 2 packages to latest compatible versions
[DOWNLOADING] crates ...
[DOWNLOADED] cc v1.0.0 (registry `dummy-registry`)
[COMPILING] cc v1.0.0
[RUNNING] `rustc --crate-name cc [..]--cfg from_host[..]`
[RUNNING] `rustc --crate-name cc [..]--cfg from_target[..]`
[COMPILING] bootstrap v0.0.0 ([ROOT]/foo)
[RUNNING] `rustc --crate-name build_script_build [..]--cfg from_host[..]`
[RUNNING] `[ROOT]/foo/target/debug/build/bootstrap-[HASH]/build-script-build`
[RUNNING] `rustc --crate-name bootstrap[..]--cfg from_target[..]`
[FINISHED] `dev` profile [unoptimized] target(s) in [ELAPSED]s
"#]]
.unordered(),
)
.run();
}

0 comments on commit 7d7b932

Please sign in to comment.