aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar mstaib <mstaib@google.com>2017-09-20 18:36:44 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-09-21 10:59:32 +0200
commitb20708f4d7a12236159096a5354034be70eeb87d (patch)
tree1e691f541ff02126c6743a335485fd77de8ed145 /src/main/java/com/google
parentd13badff830587c381e8ae8845d208753f91120d (diff)
Only load the whitelist for Android targets if they use feature flags.
Currently, every Android-related top-level target will use the feature flag whitelist, regardless of whether it has any feature flags. This change makes it so that these targets only load the whitelist if they need it. In the process, it moves the value of the whitelist from the attribute definition method to outside of it. Because it's a builder, this is only a minor change to each callsite. RELNOTES: None. PiperOrigin-RevId: 169405621
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/whitelisting/Whitelist.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidFeatureFlagSetProvider.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java29
4 files changed, 39 insertions, 11 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/whitelisting/Whitelist.java b/src/main/java/com/google/devtools/build/lib/analysis/whitelisting/Whitelist.java
index 8850f1a9ec..10e776a3be 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/whitelisting/Whitelist.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/whitelisting/Whitelist.java
@@ -44,13 +44,10 @@ public final class Whitelist {
*
* @param whitelistName The name of the whitelist. This has to comply with attribute naming
* standards and will be used as a suffix for the attribute name.
- * @param packageGroupWhitelist Label for the package group with the whitelist.
*/
- public static Attribute.Builder<Label> getAttributeFromWhitelistName(
- String whitelistName, Label packageGroupWhitelist) {
+ public static Attribute.Builder<Label> getAttributeFromWhitelistName(String whitelistName) {
String attributeName = getAttributeNameFromWhitelistName(whitelistName);
return attr(attributeName, LABEL)
- .value(packageGroupWhitelist)
.cfg(HOST)
.mandatoryNativeProviders(ImmutableList.of(PackageSpecificationProvider.class));
}
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 549bbfeda0..ecfdcb65b2 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
@@ -19,11 +19,13 @@ import com.google.common.base.Optional;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.AliasProvider;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.RuleDefinitionEnvironment;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
+import com.google.devtools.build.lib.packages.Attribute;
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;
@@ -53,6 +55,14 @@ public abstract class AndroidFeatureFlagSetProvider implements TransitiveInfoPro
}
/**
+ * Constructs a definition for the attribute used to restrict access to feature flags. The
+ * whitelist will only be reached if the feature_flags attribute is explicitly set.
+ */
+ public static Attribute.Builder<Label> getWhitelistAttribute(RuleDefinitionEnvironment env) {
+ return ConfigFeatureFlag.getWhitelistAttribute(env, FEATURE_FLAG_ATTR);
+ }
+
+ /**
* Builds a map which can be used with create, confirming that the desired flag values were
* actually received, and producing an error if they were not (because aliases were used).
*
diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
index b2f064848e..763a134cba 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidRuleClasses.java
@@ -54,7 +54,6 @@ import com.google.devtools.build.lib.packages.TriState;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidAaptVersion;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.AndroidManifestMerger;
import com.google.devtools.build.lib.rules.android.AndroidConfiguration.ConfigurationDistinguisher;
-import com.google.devtools.build.lib.rules.config.ConfigFeatureFlag;
import com.google.devtools.build.lib.rules.config.ConfigFeatureFlagProvider;
import com.google.devtools.build.lib.rules.cpp.CppOptions;
import com.google.devtools.build.lib.rules.java.JavaCompilationArgsProvider;
@@ -917,9 +916,8 @@ public final class AndroidRuleClasses {
.allowedRuleClasses("config_feature_flag")
.allowedFileTypes()
.nonconfigurable("defines an aspect of configuration")
- .mandatoryProviders(
- ImmutableList.of(ConfigFeatureFlagProvider.id())))
- .add(ConfigFeatureFlag.getWhitelistAttribute(env))
+ .mandatoryProviders(ImmutableList.of(ConfigFeatureFlagProvider.id())))
+ .add(AndroidFeatureFlagSetProvider.getWhitelistAttribute(env))
// The resource extractor is used at the binary level to extract java resources from the
// deploy jar so that they can be added to the APK.
.add(
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 70fa67d8d1..68bf177ce5 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
@@ -35,6 +35,8 @@ import com.google.devtools.build.lib.analysis.whitelisting.Whitelist;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.Attribute.ComputedDefault;
+import com.google.devtools.build.lib.packages.AttributeMap;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.syntax.Printer;
import java.util.List;
@@ -46,11 +48,32 @@ public class ConfigFeatureFlag implements RuleConfiguredTargetFactory {
/** The name of the policy that is used to restrict access to the config_feature_flag rule. */
private static final String WHITELIST_NAME = "config_feature_flag";
+ /** The label of the policy that is used to restrict access to the config_feature_flag rule. */
+ private static final String WHITELIST_LABEL =
+ "//tools/whitelists/config_feature_flag:config_feature_flag";
+
/** Constructs a definition for the attribute used to restrict access to config_feature_flag. */
public static Attribute.Builder<Label> getWhitelistAttribute(RuleDefinitionEnvironment env) {
- return Whitelist.getAttributeFromWhitelistName(
- WHITELIST_NAME,
- env.getToolsLabel("//tools/whitelists/config_feature_flag:config_feature_flag"));
+ return Whitelist.getAttributeFromWhitelistName(WHITELIST_NAME)
+ .value(env.getToolsLabel(WHITELIST_LABEL));
+ }
+
+ /**
+ * Constructs a definition for the attribute used to restrict access to config_feature_flag. The
+ * whitelist will only be reached if the given {@code attributeToInspect} has a value explicitly
+ * specified. It must be non-configurable.
+ */
+ public static Attribute.Builder<Label> getWhitelistAttribute(
+ RuleDefinitionEnvironment env, String attributeToInspect) {
+ final Label label = env.getToolsLabel(WHITELIST_LABEL);
+ return Whitelist.getAttributeFromWhitelistName(WHITELIST_NAME)
+ .value(
+ new ComputedDefault() {
+ @Override
+ public Label getDefault(AttributeMap rule) {
+ return rule.isAttributeValueExplicitlySpecified(attributeToInspect) ? label : null;
+ }
+ });
}
/**