Skylark rules can now declare their required configuration fragments
--
MOS_MIGRATED_REVID=100163482
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
index a224805..e128d7e 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkRuleClassFunctions.java
@@ -33,6 +33,7 @@
import com.google.common.cache.LoadingCache;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.RunUnder;
@@ -70,6 +71,7 @@
import com.google.devtools.build.lib.syntax.SkylarkCallbackFunction;
import com.google.devtools.build.lib.syntax.SkylarkEnvironment;
import com.google.devtools.build.lib.syntax.SkylarkList;
+import com.google.devtools.build.lib.syntax.SkylarkModuleNameResolver;
import com.google.devtools.build.lib.syntax.SkylarkSignature;
import com.google.devtools.build.lib.syntax.SkylarkSignature.Param;
import com.google.devtools.build.lib.syntax.SkylarkSignatureProcessor;
@@ -220,15 +222,18 @@
+ "there must be an action that generates <code>ctx.outputs.executable</code>."),
@Param(name = "output_to_genfiles", type = Boolean.class, defaultValue = "False",
doc = "If true, the files will be generated in the genfiles directory instead of the "
- + "bin directory. This is used for compatibility with existing rules.")},
+ + "bin directory. This is used for compatibility with existing rules."),
+ @Param(name = "fragments", type = SkylarkList.class, generic1 = String.class,
+ defaultValue = "[]",
+ doc = "List of names of configuration fragments that the rule requires.")},
useAst = true, useEnvironment = true)
private static final BuiltinFunction rule = new BuiltinFunction("rule") {
@SuppressWarnings({"rawtypes", "unchecked"}) // castMap produces
// an Attribute.Builder instead of a Attribute.Builder<?> but it's OK.
- public BaseFunction invoke(BaseFunction implementation, Boolean test,
- Object attrs, Object implicitOutputs, Boolean executable, Boolean outputToGenfiles,
- FuncallExpression ast, Environment funcallEnv)
- throws EvalException, ConversionException {
+ public BaseFunction invoke(BaseFunction implementation, Boolean test, Object attrs,
+ Object implicitOutputs, Boolean executable, Boolean outputToGenfiles,
+ SkylarkList fragments, FuncallExpression ast, Environment funcallEnv)
+ throws EvalException, ConversionException {
Preconditions.checkState(funcallEnv instanceof SkylarkEnvironment);
RuleClassType type = test ? RuleClassType.TEST : RuleClassType.NORMAL;
@@ -273,6 +278,12 @@
builder.setOutputToGenfiles();
}
+ if (!fragments.isEmpty()) {
+ builder.requiresConfigurationFragments(
+ new SkylarkModuleNameResolver(),
+ Iterables.toArray(castList(fragments, String.class), String.class));
+ }
+
builder.setConfiguredTargetFunction(implementation);
builder.setRuleDefinitionEnvironment(
((SkylarkEnvironment) funcallEnv).getGlobalEnvironment());