aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/featurecontrol/FeaturePolicyConfiguration.java35
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/rules/BazelRuleClassProvider.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlagFeatureVisibility.java53
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java4
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");
}