diff options
Diffstat (limited to 'src')
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'"); + } } |