aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/packages/RuleClass.java2
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java36
3 files changed, 38 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java
index 8330dba872..8853d50267 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/EnvironmentRule.java
@@ -57,8 +57,6 @@ public final class EnvironmentRule implements RuleDefinition {
.allowedRuleClasses(EnvironmentRule.RULE_NAME)
.allowedFileTypes(FileTypeSet.NO_FILE)
.nonconfigurable("used for defining constraint models - this shouldn't be configured"))
- .removeAttribute(RuleClass.COMPATIBLE_ENVIRONMENT_ATTR)
- .removeAttribute(RuleClass.RESTRICTED_ENVIRONMENT_ATTR)
.exemptFromConstraintChecking("this rule *defines* a constraint")
.setUndocumented()
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
index d841c2c991..d2c1f569cc 100644
--- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
+++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java
@@ -756,6 +756,8 @@ public final class RuleClass {
public <TYPE> Builder exemptFromConstraintChecking(String reason) {
Preconditions.checkState(this.supportsConstraintChecking);
this.supportsConstraintChecking = false;
+ attributes.remove(RuleClass.COMPATIBLE_ENVIRONMENT_ATTR);
+ attributes.remove(RuleClass.RESTRICTED_ENVIRONMENT_ATTR);
return this;
}
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java b/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
index 909d7a6603..f87b939050 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/constraints/ConstraintsTest.java
@@ -123,6 +123,25 @@ public class ConstraintsTest extends AbstractConstraintsTest {
}
}
+ private static final class ConstraintExemptRuleClass implements RuleDefinition {
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
+ return builder
+ .setUndocumented()
+ .exemptFromConstraintChecking("for testing removal of restricted_to / compatible_with")
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("totally_free_rule")
+ .ancestors(BaseRuleClasses.RuleBase.class)
+ .factoryClass(UnknownRuleConfiguredTarget.class)
+ .build();
+ }
+ }
+
/**
* Injects the rule class default rules into the default test rule class provider.
*/
@@ -133,6 +152,7 @@ public class ConstraintsTest extends AbstractConstraintsTest {
builder.addRuleDefinition(new RuleClassDefaultRule());
builder.addRuleDefinition(new BadRuleClassDefaultRule());
builder.addRuleDefinition(new RuleClassWithImplicitAndLateBoundDefaults());
+ builder.addRuleDefinition(new ConstraintExemptRuleClass());
return builder.build();
}
@@ -723,4 +743,20 @@ public class ConstraintsTest extends AbstractConstraintsTest {
assertNotNull(getConfiguredTarget("//hello:main"));
assertNoEvents();
}
+
+ public void testConstraintExemptRulesDontHaveConstraintAttributes() throws Exception {
+ new EnvironmentGroupMaker("foo_env")
+ .setEnvironments("a", "b")
+ .setDefaults("a")
+ .make();
+ scratch.file("ihave/BUILD",
+ "totally_free_rule(",
+ " name = 'nolimits',",
+ " restricted_to = ['//foo_env:b']",
+ ")");
+
+ reporter.removeHandler(failFastHandler);
+ assertNull(getConfiguredTarget("//ihave:nolimits"));
+ assertContainsEvent("no such attribute 'restricted_to' in 'totally_free_rule'");
+ }
}