diff options
7 files changed, 51 insertions, 63 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 798fe05bcf..15fbf12653 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -1082,6 +1082,7 @@ java_library( ":vfs", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib/actions", + "//src/main/java/com/google/devtools/build/lib/analysis/featurecontrol", "//src/main/java/com/google/devtools/build/lib/rules/config", "//src/main/java/com/google/devtools/build/lib/rules/cpp", "//src/main/java/com/google/devtools/common/options", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyConfiguration.java index 66e91ca127..96d3431836 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyConfiguration.java @@ -17,9 +17,11 @@ package com.google.devtools.build.lib.analysis.featurecontrol; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.ImmutableSetMultimap; +import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.PackageSpecification; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.util.Preconditions; /** @@ -113,6 +115,39 @@ public final class FeaturePolicyConfiguration extends BuildConfiguration.Fragmen } /** + * Checks whether the rule in the given RuleContext has access to a given feature and reports an + * error if not. + * + * @param ruleContext The context in which this check is being executed. + * @param policyName The name of the policy. + * @param feature The name of the feature being used, to be printed in the error if the policy + * forbids access to this rule. + * @param additionalErrorMessage Additional text for the error message. + */ + public static void checkAvailable( + RuleContext ruleContext, String policyName, String feature, String additionalErrorMessage) + throws RuleErrorException { + FeaturePolicyConfiguration policy = ruleContext.getFragment(FeaturePolicyConfiguration.class); + Label label = ruleContext.getLabel(); + if (!policy.isFeatureEnabledForRule(policyName, label)) { + String message = "%s is not available in package '%s' according to policy '%s'.%s"; + ruleContext.ruleError( + String.format( + message, + feature, + label.getPackageIdentifier(), + policy.getPolicyForFeature(policyName), + additionalErrorMessage == null ? "" : " " + additionalErrorMessage + ".")); + throw new RuleErrorException(); + } + } + + public static void checkAvailable(RuleContext ruleContext, String policyName, String feature) + throws RuleErrorException { + checkAvailable(ruleContext, policyName, feature, null); + } + + /** * Returns a String suitable for presenting to the user which represents the policy used for the * given feature. */ diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java index 429ef08eab..540244e67f 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java @@ -97,8 +97,8 @@ import com.google.devtools.build.lib.rules.apple.XcodeVersionRule; import com.google.devtools.build.lib.rules.apple.cpp.AppleCcToolchainRule; import com.google.devtools.build.lib.rules.apple.swift.SwiftCommandLineOptions; import com.google.devtools.build.lib.rules.apple.swift.SwiftConfiguration; +import com.google.devtools.build.lib.rules.config.ConfigFeatureFlag; import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagConfiguration; -import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagFeatureVisibility; import com.google.devtools.build.lib.rules.config.ConfigRuleClasses; import com.google.devtools.build.lib.rules.config.ConfigSkylarkCommon; import com.google.devtools.build.lib.rules.cpp.CcIncLibraryRule; @@ -227,9 +227,8 @@ public class BazelRuleClassProvider { } }; - public static final ImmutableSet<String> FEATURE_POLICY_FEATURES = ImmutableSet.<String>of( - ConfigFeatureFlagFeatureVisibility.POLICY_NAME - ); + public static final ImmutableSet<String> FEATURE_POLICY_FEATURES = + ImmutableSet.of(ConfigFeatureFlag.POLICY_NAME); public static final RuleSet CORE_RULES = new RuleSet() { diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java index fe92de0d46..b7068675ad 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java @@ -20,13 +20,14 @@ import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.TransitiveInfoProvider; +import com.google.devtools.build.lib.analysis.featurecontrol.FeaturePolicyConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.AliasProvider; -import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagFeatureVisibility; +import com.google.devtools.build.lib.rules.config.ConfigFeatureFlag; import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagProvider; import java.util.Map; @@ -67,8 +68,8 @@ public abstract class AndroidFeatureFlagSetProvider implements TransitiveInfoPro return ImmutableMap.of(); } - ConfigFeatureFlagFeatureVisibility.checkAvailable( - ruleContext, "the " + FEATURE_FLAG_ATTR + " attribute"); + FeaturePolicyConfiguration.checkAvailable( + ruleContext, ConfigFeatureFlag.POLICY_NAME, "the " + FEATURE_FLAG_ATTR + " attribute"); Iterable<? extends TransitiveInfoCollection> actualTargets = ruleContext.getPrerequisites(FEATURE_FLAG_ATTR, Mode.TARGET); diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java index 87ce548a4a..43928c1f50 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java +++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java @@ -29,6 +29,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; +import com.google.devtools.build.lib.analysis.featurecontrol.FeaturePolicyConfiguration; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory; @@ -39,12 +40,14 @@ import java.util.List; * The implementation of the config_feature_flag rule for defining custom flags for Android rules. */ public class ConfigFeatureFlag implements RuleConfiguredTargetFactory { + /** The name of the policy that is used to restrict access to the config_feature_flag rule. */ + public static final String POLICY_NAME = "config_feature_flag"; @Override public ConfiguredTarget create(RuleContext ruleContext) throws InterruptedException, RuleErrorException { - ConfigFeatureFlagFeatureVisibility.checkAvailable( - ruleContext, "the " + ruleContext.getRuleClassNameForLogging() + " rule"); + FeaturePolicyConfiguration.checkAvailable( + ruleContext, POLICY_NAME, "the " + ruleContext.getRuleClassNameForLogging() + " rule"); List<String> specifiedValues = ruleContext.attributes().get("allowed_values", STRING_LIST); ImmutableSet<String> values = ImmutableSet.copyOf(specifiedValues); diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagFeatureVisibility.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagFeatureVisibility.java deleted file mode 100644 index b0909b4fef..0000000000 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagFeatureVisibility.java +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright 2017 The Bazel Authors. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License - -package com.google.devtools.build.lib.rules.config; - -import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.analysis.featurecontrol.FeaturePolicyConfiguration; -import com.google.devtools.build.lib.cmdline.Label; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; - -/** - * A validator utility class which confirms that config_feature_flag-related features can be used by - * the current rule. - */ -public class ConfigFeatureFlagFeatureVisibility { - - /** The name of the policy that is used to restrict access to the config_feature_flag rule. */ - public static final String POLICY_NAME = "config_feature_flag"; - - private ConfigFeatureFlagFeatureVisibility() {} - - /** - * Checks whether the rule in the given RuleContext has access to config_feature_flag and related - * features, and reports an error if not. - * - * @param ruleContext The context in which this check is being executed. - * @param feature The name of the config_feature_flag-related feature being used, to be printed in - * the error if the policy forbids access to this rule. - */ - public static void checkAvailable(RuleContext ruleContext, String feature) - throws RuleErrorException { - FeaturePolicyConfiguration policy = ruleContext.getFragment(FeaturePolicyConfiguration.class); - Label label = ruleContext.getLabel(); - if (!policy.isFeatureEnabledForRule(POLICY_NAME, label)) { - ruleContext.ruleError( - String.format( - "%s is not available in package '%s' according to policy '%s'", - feature, label.getPackageIdentifier(), policy.getPolicyForFeature(POLICY_NAME))); - throw new RuleErrorException(); - } - } -} diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java index 48977eb458..8215f4ad78 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java +++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java @@ -32,6 +32,7 @@ import com.google.devtools.build.lib.analysis.TransitiveInfoCollection; import com.google.devtools.build.lib.analysis.config.BuildConfigurationOptionDetails; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; import com.google.devtools.build.lib.analysis.config.TransitiveOptionDetails; +import com.google.devtools.build.lib.analysis.featurecontrol.FeaturePolicyConfiguration; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; @@ -70,8 +71,9 @@ public class ConfigSetting implements RuleConfiguredTargetFactory { ConfigRuleClasses.ConfigSettingRule.FLAG_SETTINGS_ATTRIBUTE, BuildType.LABEL_KEYED_STRING_DICT); if (!flagSettings.isEmpty()) { - ConfigFeatureFlagFeatureVisibility.checkAvailable( + FeaturePolicyConfiguration.checkAvailable( ruleContext, + ConfigFeatureFlag.POLICY_NAME, "the " + ConfigRuleClasses.ConfigSettingRule.FLAG_SETTINGS_ATTRIBUTE + " attribute"); } |