diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java | 17 | ||||
-rw-r--r-- | src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java | 23 |
2 files changed, 38 insertions, 2 deletions
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 aa2fef91d5..01d4bc3ce5 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 @@ public final class SkylarkAttr { } } + 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 @@ public final class SkylarkAttr { 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 @@ public final class SkylarkAttr { 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 717a132003..76bbbd47f8 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 @@ public class SkylarkRuleClassFunctionsTest extends SkylarkTestCase { "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"); + } } |