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"