aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/SkylarkAttr.java17
-rw-r--r--src/test/java/com/google/devtools/build/lib/skylark/SkylarkRuleClassFunctionsTest.java23
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");
+ }
}