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"); + } }