Make Skylark "license"-type attributes non-configurable.

Bazel has custom loading-phase logic checking "licenses" attributes.
Without this change, that logic fails with a "licenses is potentially
configurable" error.

--
MOS_MIGRATED_REVID=113890489
diff --git a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
index aa2fef9..01d4bc3 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java
@@ -201,6 +201,17 @@
     }
   }
 
+  private static Descriptor createNonconfigurableAttrDescriptor(
+      Map<String, Object> kwargs, Type<?> type, String whyNotConfigurable, FuncallExpression ast,
+      Environment env) throws EvalException {
+    try {
+      return new Descriptor(
+          createAttribute(type, kwargs, ast, env).nonconfigurable(whyNotConfigurable));
+    } catch (ConversionException e) {
+      throw new EvalException(ast.getLocation(), e.getMessage());
+    }
+  }
+
   @SkylarkSignature(
     name = "int",
     doc = "Creates an attribute of type int.",
@@ -652,9 +663,10 @@
             Object defaultO, Boolean mandatory, FuncallExpression ast, Environment env)
             throws EvalException {
           env.checkLoadingPhase("attr.output", ast.getLocation());
-          return createAttrDescriptor(
+          return createNonconfigurableAttrDescriptor(
               EvalUtils.optionMap(DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
               BuildType.OUTPUT,
+              "output paths are part of the static graph structure",
               ast,
               env);
         }
@@ -795,9 +807,10 @@
             Object defaultO, Boolean mandatory, FuncallExpression ast, Environment env)
             throws EvalException {
           env.checkLoadingPhase("attr.license", ast.getLocation());
-          return createAttrDescriptor(
+          return createNonconfigurableAttrDescriptor(
               EvalUtils.optionMap(DEFAULT_ARG, defaultO, MANDATORY_ARG, mandatory),
               BuildType.LICENSE,
+              "loading phase license checking logic assumes non-configurable values",
               ast,
               env);
         }
diff --git a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
index 717a132..76bbbd4 100644
--- a/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java
@@ -570,4 +570,27 @@
         "invalid target name 'bad syntax': target names may not contain ' '",
         "Label('//foo:bar').relative('bad syntax')");
   }
+
+  @Test
+  public void testLicenseAttributesNonconfigurable() throws Exception {
+    scratch.file("test/BUILD");
+    scratch.file("test/rule.bzl",
+        "def _impl(ctx):",
+        "  return",
+        "some_rule = rule(",
+        "  implementation = _impl,",
+        "  attrs = {",
+        "    'licenses': attr.license()",
+        "  }",
+        ")");
+    scratch.file("third_party/foo/BUILD",
+        "load('/test/rule', 'some_rule')",
+        "some_rule(",
+        "    name='r',",
+        "    licenses = ['unencumbered']",
+        ")");
+    invalidatePackages();
+    // Should succeed without a "licenses attribute is potentially configurable" loading error:
+    createRuleContext("//third_party/foo:r");
+  }
 }