Adds the target_platform_has_constraint method to allow rules to check the target platform.

Fixes #10368.

RELNOTES: Adds ctx.target_platform_has_constraint to allow rules to check the target platform's constraints.
PiperOrigin-RevId: 286001442
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 a2b2ca0..02ba0cf 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
@@ -57,6 +57,7 @@
 import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
 import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
 import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
+import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
 import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
 import com.google.devtools.build.lib.analysis.stringtemplate.TemplateContext;
 import com.google.devtools.build.lib.cmdline.Label;
@@ -1225,6 +1226,13 @@
     return toolchainContext;
   }
 
+  public boolean targetPlatformHasConstraint(ConstraintValueInfo constraintValue) {
+    if (toolchainContext == null || toolchainContext.targetPlatform() == null) {
+      return false;
+    }
+    return toolchainContext.targetPlatform().constraints().hasConstraintValue(constraintValue);
+  }
+
   public ConstraintSemantics getConstraintSemantics() {
     return constraintSemantics;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
index 1caa9a1..15e1dfd 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleContext.java
@@ -693,6 +693,11 @@
   }
 
   @Override
+  public boolean targetPlatformHasConstraint(ConstraintValueInfo constraintValue) {
+    return ruleContext.targetPlatformHasConstraint(constraintValue);
+  }
+
+  @Override
   public String toString() {
     return ruleLabelCanonicalName;
   }
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
index 4fa981a..8a134cc 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/SkylarkRuleContextApi.java
@@ -318,6 +318,19 @@
   ToolchainContextApi toolchains() throws EvalException;
 
   @SkylarkCallable(
+      name = "target_platform_has_constraint",
+      doc = "Returns true if the given constraint value is part of the current target platform.",
+      parameters = {
+        @Param(
+            name = "constraintValue",
+            positional = true,
+            named = false,
+            type = ConstraintValueInfoApi.class,
+            doc = "The constraint value to check the target platform against.")
+      })
+  boolean targetPlatformHasConstraint(ConstraintValueT constraintValue);
+
+  @SkylarkCallable(
       name = "tokenize",
       doc = "Splits a shell command into a list of tokens.",
       // TODO(cparsons): Look into flipping this to true.