Extend the repository_rule function by a parameter configure

Setting this parameter to True (the default value is False) indicates
to bazel that the repository serves a configure-like purpose, e.g.,
inspecting the host environment searching for compilers or standard
libraries.

Change-Id: I57c97f2ae81b176bb40a06d60d65929585665a68
PiperOrigin-RevId: 257588478
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
index c924714..38f2a9c 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryFunction.java
@@ -245,6 +245,16 @@
   }
 
   @Override
+  protected boolean isConfigure(Rule rule) {
+    return (Boolean) rule.getAttributeContainer().getAttr("$configure");
+  }
+
+  public static boolean isConfigurelikeRule(Rule rule) {
+    return rule.getRuleClassObject().isSkylark()
+        && ((Boolean) rule.getAttributeContainer().getAttr("$configure"));
+  }
+
+  @Override
   public Class<? extends RuleDefinition> getRuleDefinition() {
     return null; // unused so safe to return null
   }
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
index f5b9823..2396ce4 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/repository/skylark/SkylarkRepositoryModule.java
@@ -63,6 +63,7 @@
       Object attrs,
       Boolean local,
       SkylarkList<String> environ,
+      Boolean configure,
       String doc,
       FuncallExpression ast,
       com.google.devtools.build.lib.syntax.Environment funcallEnv)
@@ -72,6 +73,7 @@
     RuleClass.Builder builder = new RuleClass.Builder("", RuleClassType.WORKSPACE, true);
 
     builder.addOrOverrideAttribute(attr("$local", BOOLEAN).defaultValue(local).build());
+    builder.addOrOverrideAttribute(attr("$configure", BOOLEAN).defaultValue(configure).build());
     builder.addOrOverrideAttribute(
         attr("$environ", STRING_LIST).defaultValue(environ).build());
     BaseRuleClasses.nameAttribute(builder);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
index 2bab9f5..ad79058 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryFunction.java
@@ -372,6 +372,11 @@
    */
   protected abstract boolean isLocal(Rule rule);
 
+  /** Wheather the rule declares it inspects the local environment for configure purpose. */
+  protected boolean isConfigure(Rule rule) {
+    return false;
+  }
+
   /**
    * Returns a block of data that must be equal for two Rules for them to be considered the same.
    *
diff --git a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
index 2e138c8..bdf7dd7 100644
--- a/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
+++ b/src/main/java/com/google/devtools/build/lib/skylarkbuildapi/repository/RepositoryModuleApi.java
@@ -42,9 +42,9 @@
             type = BaseFunction.class,
             named = true,
             doc =
-                "the function implementing this rule, has to have exactly one parameter: "
-                    + "<code><a href=\"repository_ctx.html\">repository_ctx</a></code>. The function "
-                    + "is called during loading phase for each instance of the rule."),
+                "the function implementing this rule, has to have exactly one parameter: <code><a"
+                    + " href=\"repository_ctx.html\">repository_ctx</a></code>. The function is"
+                    + " called during loading phase for each instance of the rule."),
         @Param(
             name = "attrs",
             type = SkylarkDict.class,
@@ -80,6 +80,13 @@
             named = true,
             positional = false),
         @Param(
+            name = "configure",
+            type = Boolean.class,
+            defaultValue = "False",
+            doc = "Indicate that the repository inspects the system for configuration purpose",
+            named = true,
+            positional = false),
+        @Param(
             name = "doc",
             type = String.class,
             defaultValue = "''",
@@ -96,6 +103,7 @@
       Object attrs,
       Boolean local,
       SkylarkList<String> environ,
+      Boolean configure,
       String doc,
       FuncallExpression ast,
       Environment env)
diff --git a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
index 0a1ce19..7c1ab1c 100644
--- a/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
+++ b/src/main/java/com/google/devtools/build/skydoc/fakebuildapi/repository/FakeRepositoryModule.java
@@ -52,6 +52,7 @@
       Object attrs,
       Boolean local,
       SkylarkList<String> environ,
+      Boolean configure,
       String doc,
       FuncallExpression ast,
       Environment env)