aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2018-06-14 02:24:57 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-14 02:26:18 -0700
commitd79e977c87ea46855c219cb7dcbde0e3fde4bcf9 (patch)
tree7b967abf32849eeb1a774f0bbbaf467907060c0a /src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
parent3a5780d020517342137ef48ca3fbad1df69e9f33 (diff)
Allow Skylark rules to specify whether targets can add execution platform constraints.
Closes #5341. Change-Id: Ib74e59fec48102469a5039e045e3f3d0e0d86d8c PiperOrigin-RevId: 200526448
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java34
1 files changed, 33 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
index 9237cea109..b1eef7dc85 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java
@@ -318,6 +318,8 @@ public class SkylarkRuleClassFunctions implements SkylarkRuleFunctionsApi<Artifa
SkylarkList<String> toolchains,
String doc,
SkylarkList<?> providesArg,
+ Boolean executionPlatformConstraintsAllowed,
+ SkylarkList<?> execCompatibleWith,
FuncallExpression ast,
Environment funcallEnv)
throws EvalException, ConversionException {
@@ -399,6 +401,16 @@ public class SkylarkRuleClassFunctions implements SkylarkRuleFunctionsApi<Artifa
builder.advertiseSkylarkProvider(skylarkProvider);
}
+ if (!execCompatibleWith.isEmpty()) {
+ builder.addExecutionPlatformConstraints(
+ collectConstraintLabels(
+ execCompatibleWith.getContents(String.class, "exec_compatile_with"),
+ ast.getLocation()));
+ }
+ if (executionPlatformConstraintsAllowed) {
+ builder.executionPlatformConstraintsAllowed(ExecutionPlatformConstraintsAllowed.PER_TARGET);
+ }
+
return new SkylarkRuleFunction(builder, type, attributes, ast.getLocation());
}
@@ -445,6 +457,22 @@ public class SkylarkRuleClassFunctions implements SkylarkRuleFunctionsApi<Artifa
return requiredToolchains.build();
}
+ private static ImmutableList<Label> collectConstraintLabels(
+ Iterable<String> rawLabels, Location loc) throws EvalException {
+ ImmutableList.Builder<Label> constraintLabels = new ImmutableList.Builder<>();
+ for (String rawLabel : rawLabels) {
+ try {
+ Label constraintLabel = Label.parseAbsolute(rawLabel);
+ constraintLabels.add(constraintLabel);
+ } catch (LabelSyntaxException e) {
+ throw new EvalException(
+ loc, String.format("Unable to parse constraint %s: %s", rawLabel, e.getMessage()), e);
+ }
+ }
+
+ return constraintLabels.build();
+ }
+
@Override
public SkylarkAspect aspect(
BaseFunction implementation,
@@ -657,7 +685,11 @@ public class SkylarkRuleClassFunctions implements SkylarkRuleFunctionsApi<Artifa
addAttribute(definitionLocation, builder,
descriptor.build(attribute.getFirst()));
}
- this.ruleClass = builder.build(ruleClassName, skylarkLabel + "%" + ruleClassName);
+ try {
+ this.ruleClass = builder.build(ruleClassName, skylarkLabel + "%" + ruleClassName);
+ } catch (IllegalArgumentException | IllegalStateException ex) {
+ throw new EvalException(location, ex);
+ }
this.builder = null;
this.attributes = null;