Targets that fail to analyze due to target compatibility checks should report the current target platform.

PiperOrigin-RevId: 403143135
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
index d2aadad..f8cde9b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD
@@ -797,6 +797,7 @@
     deps = [
         ":configured_target",
         "//src/main/java/com/google/devtools/build/lib/analysis/platform",
+        "//src/main/java/com/google/devtools/build/lib/cmdline",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/lib/packages",
         "//src/main/java/com/google/devtools/build/lib/starlarkbuildapi/platform",
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/IncompatiblePlatformProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/IncompatiblePlatformProvider.java
index ca53774..144310b 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/IncompatiblePlatformProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/IncompatiblePlatformProvider.java
@@ -18,6 +18,7 @@
 import com.google.common.base.Preconditions;
 import com.google.common.collect.ImmutableList;
 import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
+import com.google.devtools.build.lib.cmdline.Label;
 import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
 import com.google.devtools.build.lib.packages.BuiltinProvider;
 import com.google.devtools.build.lib.packages.Info;
@@ -56,17 +57,19 @@
   }
 
   public static IncompatiblePlatformProvider incompatibleDueToTargets(
+      @Nullable Label targetPlatform,
       ImmutableList<ConfiguredTarget> targetsResponsibleForIncompatibility) {
     Preconditions.checkNotNull(targetsResponsibleForIncompatibility);
     Preconditions.checkArgument(!targetsResponsibleForIncompatibility.isEmpty());
-    return new AutoValue_IncompatiblePlatformProvider(targetsResponsibleForIncompatibility, null);
+    return new AutoValue_IncompatiblePlatformProvider(
+        targetPlatform, targetsResponsibleForIncompatibility, null);
   }
 
   public static IncompatiblePlatformProvider incompatibleDueToConstraints(
-      ImmutableList<ConstraintValueInfo> constraints) {
+      @Nullable Label targetPlatform, ImmutableList<ConstraintValueInfo> constraints) {
     Preconditions.checkNotNull(constraints);
     Preconditions.checkArgument(!constraints.isEmpty());
-    return new AutoValue_IncompatiblePlatformProvider(null, constraints);
+    return new AutoValue_IncompatiblePlatformProvider(targetPlatform, null, constraints);
   }
 
   @Override
@@ -74,6 +77,10 @@
     return true; // immutable and Starlark-hashable
   }
 
+  /** Returns the target platform of the target that was incompatible. */
+  @Nullable
+  public abstract Label targetPlatform();
+
   /**
    * Returns the incompatible dependencies that caused this provider to be present.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index ea265cf..88338bd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -1206,6 +1206,18 @@
   }
 
   @Nullable
+  public Label targetPlatform() {
+    if (toolchainContexts == null) {
+      return null;
+    }
+    PlatformInfo targetPlatform = toolchainContexts.getTargetPlatform();
+    if (targetPlatform == null) {
+      return null;
+    }
+    return targetPlatform.label();
+  }
+
+  @Nullable
   public ResolvedToolchainContext getToolchainContext() {
     return toolchainContexts == null ? null : toolchainContexts.getDefaultToolchainContext();
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
index e961589..ea888e9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/RuleContextConstraintSemantics.java
@@ -1001,10 +1001,11 @@
     if (targetsResponsibleForIncompatibility != null) {
       builder.addNativeDeclaredProvider(
           IncompatiblePlatformProvider.incompatibleDueToTargets(
-              targetsResponsibleForIncompatibility));
+              ruleContext.targetPlatform(), targetsResponsibleForIncompatibility));
     } else if (violatedConstraints != null) {
       builder.addNativeDeclaredProvider(
-          IncompatiblePlatformProvider.incompatibleDueToConstraints(violatedConstraints));
+          IncompatiblePlatformProvider.incompatibleDueToConstraints(
+              ruleContext.targetPlatform(), violatedConstraints));
     } else {
       throw new IllegalArgumentException(
           "Both violatedConstraints and targetsResponsibleForIncompatibility are null");
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
index b17a40d..0211999 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/TopLevelConstraintSemantics.java
@@ -204,7 +204,9 @@
       }
     }
 
-    message += "   <-- target platform didn't satisfy constraint";
+    message +=
+        String.format(
+            "   <-- target platform (%s) didn't satisfy constraint", provider.targetPlatform());
     if (provider.constraintsResponsibleForIncompatibility().size() == 1) {
       message += " " + provider.constraintsResponsibleForIncompatibility().get(0).label();
       return message;
diff --git a/src/test/shell/integration/target_compatible_with_test.sh b/src/test/shell/integration/target_compatible_with_test.sh
index 8121e76..fd43268 100755
--- a/src/test/shell/integration/target_compatible_with_test.sh
+++ b/src/test/shell/integration/target_compatible_with_test.sh
@@ -637,7 +637,7 @@
   # Validate that we get the dependency chain printed out.
   expect_log '^Dependency chain:$'
   expect_log '^    //target_skipping:generate_with_tool$'
-  expect_log "^    //target_skipping:generator_tool   <-- target platform didn't satisfy constraint //target_skipping:foo1"
+  expect_log "^    //target_skipping:generator_tool   <-- target platform (//target_skipping:foo2_bar1_platform) didn't satisfy constraint //target_skipping:foo1"
   expect_log 'FAILED: Build did NOT complete successfully'
 
   # Validate the test.
@@ -652,7 +652,7 @@
   expect_log '^Dependency chain:$'
   expect_log '^    //target_skipping:generated_test$'
   expect_log '^    //target_skipping:generate_with_tool$'
-  expect_log "^    //target_skipping:generator_tool   <-- target platform didn't satisfy constraint //target_skipping:foo1"
+  expect_log "^    //target_skipping:generator_tool   <-- target platform (//target_skipping:foo2_bar1_platform) didn't satisfy constraint //target_skipping:foo1"
   expect_log 'FAILED: Build did NOT complete successfully'
 }
 
@@ -700,7 +700,7 @@
   expect_log '^Dependency chain:$'
   expect_log '^    //target_skipping:generated_test$'
   expect_log '^    //target_skipping:generate_with_tool$'
-  expect_log "^    //target_skipping:generator_tool   <-- target platform didn't satisfy constraints \[//target_skipping:foo1, //target_skipping:bar2\]"
+  expect_log "^    //target_skipping:generator_tool   <-- target platform (//target_skipping:foo2_bar1_platform) didn't satisfy constraints \[//target_skipping:foo1, //target_skipping:bar2\]"
   expect_log 'FAILED: Build did NOT complete successfully'
 }
 
@@ -986,7 +986,7 @@
     'deps(//target_skipping:sh_foo1)' &> "${TEST_log}" \
     && fail "Bazel cquery passed unexpectedly."
   expect_log 'Target //target_skipping:sh_foo1 is incompatible and cannot be built, but was explicitly requested'
-  expect_log "target platform didn't satisfy constraint //target_skipping:foo1"
+  expect_log "target platform (//target_skipping:foo3_platform) didn't satisfy constraint //target_skipping:foo1"
 }
 
 # Runs a cquery and makes sure that we can properly distinguish between
@@ -1063,7 +1063,7 @@
     '//target_skipping:sh_foo1' &> "${TEST_log}" \
     && fail "Bazel aquery passed unexpectedly."
   expect_log 'Target //target_skipping:sh_foo1 is incompatible and cannot be built, but was explicitly requested'
-  expect_log "target platform didn't satisfy constraint //target_skipping:foo1"
+  expect_log "target platform (//target_skipping:foo3_platform) didn't satisfy constraint //target_skipping:foo1"
 }
 
 run_suite "target_compatible_with tests"