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(