diff options
author | John Cater <jcater@google.com> | 2018-06-14 02:24:57 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-14 02:26:18 -0700 |
commit | d79e977c87ea46855c219cb7dcbde0e3fde4bcf9 (patch) | |
tree | 7b967abf32849eeb1a774f0bbbaf467907060c0a /src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleClassFunctions.java | |
parent | 3a5780d020517342137ef48ca3fbad1df69e9f33 (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.java | 34 |
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; |