Problem
I just tried to use the new per-package-target feature implemented in #9030 (tracking issue) together with -Zbuild-std, but it results in an error: -Zbuild-std requires --target.
Steps
- Add a
default-target or forced-target key in Cargo.toml.
- Try to compile by running
cargo build -Zbuild-std=core.
Possible Solution(s)
I think the issue is that the target check already happens here:
|
if build_config.requested_kinds[0].is_host() { |
|
// TODO: This should eventually be fixed. Unfortunately it is not |
|
// easy to get the host triple in BuildConfig. Consider changing |
|
// requested_target to an enum, or some other approach. |
|
anyhow::bail!("-Zbuild-std requires --target"); |
|
} |
But the default-target/forced-target fields are only considered later in generate_targets:
|
// If `--target` has not been specified, then the unit |
|
// graph is built almost like if `--target $HOST` was |
|
// specified. See `rebuild_unit_graph_shared` for more on |
|
// why this is done. However, if the package has its own |
|
// `package.target` key, then this gets used instead of |
|
// `$HOST` |
|
let explicit_kinds = if let Some(k) = pkg.manifest().forced_kind() { |
|
vec![k] |
|
} else { |
|
requested_kinds |
|
.iter() |
|
.map(|kind| match kind { |
|
CompileKind::Host => { |
|
pkg.manifest().default_kind().unwrap_or(explicit_host_kind) |
|
} |
|
CompileKind::Target(t) => CompileKind::Target(*t), |
|
}) |
|
.collect() |
|
}; |
The generate_targets function is invoked here:
|
// Passing `build_config.requested_kinds` instead of |
|
// `explicit_host_kinds` here so that `generate_targets` can do |
|
// its own special handling of `CompileKind::Host`. It will |
|
// internally replace the host kind by the `explicit_host_kind` |
|
// before setting as a unit. |
|
let mut units = generate_targets( |
|
ws, |
|
&to_builds, |
|
filter, |
|
&build_config.requested_kinds, |
|
explicit_host_kind, |
|
build_config.mode, |
|
&resolve, |
|
&workspace_resolve, |
|
&resolved_features, |
|
&pkg_set, |
|
&profiles, |
|
interner, |
|
)?; |
Notes
Output of cargo version:
cargo 1.53.0-nightly (4369396ce 2021-04-27)
release: 1.53.0
commit-hash: 4369396ce7d270972955d876eaa4954bea56bcd9
commit-date: 2021-04-27
cc @Ekleog
Problem
I just tried to use the new
per-package-targetfeature implemented in #9030 (tracking issue) together with-Zbuild-std, but it results in anerror: -Zbuild-std requires --target.Steps
default-targetorforced-targetkey inCargo.toml.cargo build -Zbuild-std=core.Possible Solution(s)
I think the issue is that the target check already happens here:
cargo/src/cargo/ops/cargo_compile.rs
Lines 394 to 399 in db741ac
But the
default-target/forced-targetfields are only considered later ingenerate_targets:cargo/src/cargo/ops/cargo_compile.rs
Lines 925 to 943 in db741ac
The
generate_targetsfunction is invoked here:cargo/src/cargo/ops/cargo_compile.rs
Lines 470 to 488 in db741ac
Notes
Output of
cargo version:cc @Ekleog