fix: distinguish implicit host builds from explicit targets

This commit is contained in:
2026-08-03 21:26:34 +08:00
parent d2df85a064
commit 794d571d58

View File

@@ -159,6 +159,7 @@ fn build_all(
&member.path, &member.path,
profile, profile,
target, target,
target.is_some_and(|t| !t.trim().is_empty()),
&[], &[],
force, force,
verbose, verbose,
@@ -186,26 +187,26 @@ fn build_all(
let project_name = get_config_str(&config, "package.name"); let project_name = get_config_str(&config, "package.name");
let project_version = get_config_str(&config, "package.version"); let project_version = get_config_str(&config, "package.version");
let targets_to_build: Vec<Option<String>> = if let Some(t) = target { let targets_to_build: Vec<(Option<String>, bool)> = if let Some(t) = target {
let normalized = normalize_target_os(t); let normalized = normalize_target_os(t);
if normalized.is_empty() { if normalized.is_empty() {
vec![Some(default_target_triple())] vec![(Some(default_target_triple()), true)]
} else { } else {
vec![Some(normalized.to_string())] vec![(Some(normalized.to_string()), true)]
} }
} else { } else {
let config_targets = get_targets(&config, profile)?; let config_targets = get_targets(&config, profile)?;
if config_targets.is_empty() { if config_targets.is_empty() {
vec![Some(default_target_triple())] vec![(Some(default_target_triple()), false)]
} else { } else {
config_targets config_targets
.into_iter() .into_iter()
.map(|t| { .map(|t| {
let normalized = normalize_target_os(&t); let normalized = normalize_target_os(&t);
if normalized.is_empty() { if normalized.is_empty() {
Some(default_target_triple()) (Some(default_target_triple()), true)
} else { } else {
Some(normalized.to_string()) (Some(normalized.to_string()), true)
} }
}) })
.collect() .collect()
@@ -213,7 +214,7 @@ fn build_all(
}; };
let start_time = Instant::now(); let start_time = Instant::now();
for (i, build_target) in targets_to_build.iter().enumerate() { for (i, (build_target, explicit_target)) in targets_to_build.iter().enumerate() {
if cancel.load(Ordering::SeqCst) { if cancel.load(Ordering::SeqCst) {
return Err("Build interrupted".to_string()); return Err("Build interrupted".to_string());
} }
@@ -238,6 +239,7 @@ fn build_all(
&member.path, &member.path,
profile, profile,
build_target.as_deref(), build_target.as_deref(),
*explicit_target,
&[], &[],
force, force,
verbose, verbose,
@@ -251,6 +253,7 @@ fn build_all(
&ws, &ws,
profile, profile,
build_target.as_deref(), build_target.as_deref(),
*explicit_target,
force, force,
verbose, verbose,
Some(root), Some(root),
@@ -263,6 +266,7 @@ fn build_all(
root, root,
profile, profile,
build_target.as_deref(), build_target.as_deref(),
*explicit_target,
&excludes, &excludes,
force, force,
verbose, verbose,
@@ -276,6 +280,7 @@ fn build_all(
root, root,
profile, profile,
build_target.as_deref(), build_target.as_deref(),
*explicit_target,
&[], &[],
force, force,
verbose, verbose,
@@ -295,6 +300,7 @@ fn build_workspace(
workspace: &crate::core::workspace::Workspace, workspace: &crate::core::workspace::Workspace,
profile: &str, profile: &str,
target: Option<&str>, target: Option<&str>,
explicit_target: bool,
force: bool, force: bool,
verbose: bool, verbose: bool,
workspace_root: Option<&Path>, workspace_root: Option<&Path>,
@@ -306,6 +312,7 @@ fn build_workspace(
&member.path, &member.path,
profile, profile,
target, target,
explicit_target,
&[], &[],
force, force,
verbose, verbose,
@@ -322,6 +329,7 @@ fn build_project_at(
project_root: &Path, project_root: &Path,
profile: &str, profile: &str,
target: Option<&str>, target: Option<&str>,
explicit_target: bool,
exclude_dirs: &[std::path::PathBuf], exclude_dirs: &[std::path::PathBuf],
force: bool, force: bool,
verbose: bool, verbose: bool,
@@ -358,9 +366,10 @@ fn build_project_at(
let project_version = get_config_str(&config, "package.version"); let project_version = get_config_str(&config, "package.version");
let host_target = default_target_triple(); let host_target = default_target_triple();
let build_target_config = get_build_string_with_profile(&config, "target", profile); let build_target_config = get_build_string_with_profile(&config, "target", profile);
let has_explicit_target = let has_explicit_target = explicit_target || !build_target_config.is_empty();
target.is_some_and(|t| !t.trim().is_empty()) || !build_target_config.is_empty(); let explicit_build_target = explicit_target
let build_target_owned = target .then_some(target)
.flatten()
.filter(|t| !t.trim().is_empty()) .filter(|t| !t.trim().is_empty())
.map(|t| { .map(|t| {
let normalized = normalize_target_os(t); let normalized = normalize_target_os(t);
@@ -369,8 +378,8 @@ fn build_project_at(
} else { } else {
normalized.to_string() normalized.to_string()
} }
}) });
.or_else(|| { let configured_build_target = || {
if build_target_config.is_empty() { if build_target_config.is_empty() {
None None
} else { } else {
@@ -381,7 +390,15 @@ fn build_project_at(
Some(normalized.to_string()) Some(normalized.to_string())
} }
} }
}) };
let implicit_build_target = || {
target
.filter(|t| !t.trim().is_empty())
.map(|t| normalize_target_os(t).to_string())
};
let build_target_owned = explicit_build_target
.or_else(configured_build_target)
.or_else(implicit_build_target)
.unwrap_or(host_target); .unwrap_or(host_target);
let build_target = Some(build_target_owned.as_str()); let build_target = Some(build_target_owned.as_str());
let build_language = get_language_with_profile(&config, profile)?; let build_language = get_language_with_profile(&config, profile)?;
@@ -730,6 +747,7 @@ fn build_project_at(
&dep_root, &dep_root,
profile, profile,
build_target, build_target,
has_explicit_target,
&[], &[],
force, force,
verbose, verbose,