Preserve fallback platform in exec/host transition.
Previously the exec/host transition would set the fallback target platform back to its default whereas the --target_platform_fallback flag's semantics were meant to apply everywhere the platform_mapping does not get used. This change ensures the fallback uses the value of the passed flag in all instances (unless explicitly reset by a transition).
RELNOTES: --target_platform_fallback now also applies to exec/host configurations
PiperOrigin-RevId: 277557685
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
index d6f9d66..9d1699c 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/PlatformOptions.java
@@ -225,6 +225,7 @@
host.toolchainResolutionOverrides = this.toolchainResolutionOverrides;
host.autoConfigureHostPlatform = this.autoConfigureHostPlatform;
host.useToolchainResolutionForJavaRules = this.useToolchainResolutionForJavaRules;
+ host.targetPlatformFallback = this.targetPlatformFallback;
return host;
}
diff --git a/src/test/shell/bazel/platform_mapping_test.sh b/src/test/shell/bazel/platform_mapping_test.sh
index 9be52af..8ce3822 100755
--- a/src/test/shell/bazel/platform_mapping_test.sh
+++ b/src/test/shell/bazel/platform_mapping_test.sh
@@ -191,5 +191,95 @@
expect_log "platform: //plat:platform2"
}
+function test_target_platform_fallback() {
+ cat > platform_mappings <<EOF
+flags:
+ --cpu=k8
+ //plat:platform1
+EOF
+
+ cat > package/BUILD <<EOF
+load("//report:report.bzl", "report_flags")
+report_flags(name = "report")
+EOF
+
+ bazel build --cpu=arm64 package:report \
+ --noincompatible_auto_configure_host_platform \
+ --target_platform_fallback=//plat:platform2 &> "${TEST_log}" \
+ || fail "Build failed unexpectedly"
+ expect_log "platform: //plat:platform2"
+}
+
+function test_target_platform_fallback_after_exec() {
+ echo "" > platform_mappings
+
+ cat > package/rule.bzl <<EOF
+def _my_transition_impl(settings, attrs):
+ return {
+ # Platforms *must* be wiped for transitions to correctly participate in
+ # platform mapping.
+ "//command_line_option:platforms": [],
+ }
+
+
+my_transition = transition(
+ implementation = _my_transition_impl,
+ inputs = [],
+ outputs = [
+ "//command_line_option:platforms",
+ ],
+)
+
+
+def _transitioning_rule_impl(ctx):
+ return []
+
+
+transitioning_rule = rule(
+ implementation = _transitioning_rule_impl,
+ attrs = {
+ "deps": attr.label_list(cfg = my_transition),
+ "_whitelist_function_transition": attr.label(
+ default = "@//tools/whitelists/function_transition_whitelist"),
+ }
+)
+
+
+def _other_rule_impl(ctx):
+ return []
+
+
+other_rule = rule(
+ implementation = _other_rule_impl,
+ attrs = {
+ "tools": attr.label_list(cfg = "exec"),
+ },
+)
+EOF
+
+ cat > package/BUILD <<EOF
+load("//report:report.bzl", "report_flags")
+load("//package:rule.bzl", "other_rule", "transitioning_rule")
+
+other_rule(
+ name = "custom",
+ tools = [ ":transitioning" ],
+)
+
+transitioning_rule(
+ name = "transitioning",
+ deps = [ ":report" ]
+)
+
+report_flags(name = "report")
+EOF
+
+ bazel build --host_platform=//plat:platform1 package:custom \
+ --noincompatible_auto_configure_host_platform \
+ --target_platform_fallback=//plat:platform2 &> "${TEST_log}" \
+ || fail "Build failed unexpectedly"
+ expect_log "platform: //plat:platform2"
+}
+
run_suite "platform mapping test"