Skylark: All executable rules now have an attribute 'args'. -- MOS_MIGRATED_REVID=101932897
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 da14fc6..1ca229c 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
@@ -21,6 +21,7 @@ import static com.google.devtools.build.lib.packages.Type.INTEGER; import static com.google.devtools.build.lib.packages.Type.LABEL; import static com.google.devtools.build.lib.packages.Type.LABEL_LIST; +import static com.google.devtools.build.lib.packages.Type.LICENSE; import static com.google.devtools.build.lib.packages.Type.STRING; import static com.google.devtools.build.lib.packages.Type.STRING_LIST; import static com.google.devtools.build.lib.syntax.SkylarkType.castList; @@ -119,13 +120,22 @@ }); // TODO(bazel-team): Remove the code duplication (BaseRuleClasses and this class). - /** Parent rule class for non-test Skylark rules. */ + /** Parent rule class for non-executable non-test Skylark rules. */ public static final RuleClass baseRule = BaseRuleClasses.commonCoreAndSkylarkAttributes( new RuleClass.Builder("$base_rule", RuleClassType.ABSTRACT, true)) .add(attr("expect_failure", STRING)) .build(); + /** Parent rule class for executable non-test Skylark rules. */ + public static final RuleClass binaryBaseRule = + new RuleClass.Builder("$binary_base_rule", RuleClassType.ABSTRACT, true, baseRule) + .add( + attr("args", STRING_LIST) + .nonconfigurable("policy decision: should be consistent across configurations")) + .add(attr("output_licenses", LICENSE)) + .build(); + /** Parent rule class for test Skylark rules. */ public static final RuleClass testBaseRule = new RuleClass.Builder("$test_base_rule", RuleClassType.ABSTRACT, true, baseRule) @@ -235,11 +245,10 @@ funcallEnv.checkLoadingPhase("rule", ast.getLocation()); RuleClassType type = test ? RuleClassType.TEST : RuleClassType.NORMAL; + RuleClass parent = test ? testBaseRule : (executable ? binaryBaseRule : baseRule); // We'll set the name later, pass the empty string for now. - RuleClass.Builder builder = test - ? new RuleClass.Builder("", type, true, testBaseRule) - : new RuleClass.Builder("", type, true, baseRule); + RuleClass.Builder builder = new RuleClass.Builder("", type, true, parent); if (attrs != Environment.NONE) { for (Map.Entry<String, Attribute.Builder> attr : castMap(