aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2015-11-13 17:25:36 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-11-16 09:00:29 +0000
commitc5a352ffba8a195817c541c8450fb3958accf1df (patch)
tree9717d7388b0d3aa5637b3ae49648b3f90771cb47 /src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
parentf97a44798510160dcba7dbf600e2199ac1a4b145 (diff)
Add the concept of a "universal" configuration fragment, which all
configurations contain regardless of whether their rules explicitly require it. This is used to ensure all rules have BazelConfiguration. That fragment supplies the path to the shell, which powers BuildConfiguration.getShExecutable(), which powers any rule that generates a SpawnAction. Since SpawnActions are such a ubiquitous pattern we only want to accelerate going forward, there's no point not to make this automatically available to every rule. -- MOS_MIGRATED_REVID=107786879
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java28
1 files changed, 21 insertions, 7 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index f94d22fcb6..d95e95cb2e 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -139,6 +139,7 @@ public final class RuleContext extends TargetContext
private final Map<String, Attribute> aspectAttributes;
private final BuildConfiguration hostConfiguration;
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
+ private final Class<? extends BuildConfiguration.Fragment> universalFragment;
private final ErrorReporter reporter;
private ActionOwner actionOwner;
@@ -148,11 +149,14 @@ public final class RuleContext extends TargetContext
private RuleContext(Builder builder, ListMultimap<String, ConfiguredTarget> targetMap,
ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap,
- Set<ConfigMatchingProvider> configConditions, Map<String, Attribute> aspectAttributes) {
+ Set<ConfigMatchingProvider> configConditions,
+ Class<? extends BuildConfiguration.Fragment> universalFragment,
+ Map<String, Attribute> aspectAttributes) {
super(builder.env, builder.rule, builder.configuration, builder.prerequisiteMap.get(null),
builder.visibility);
this.rule = builder.rule;
this.configurationFragmentPolicy = builder.configurationFragmentPolicy;
+ this.universalFragment = universalFragment;
this.targetMap = targetMap;
this.filesetEntryMap = filesetEntryMap;
this.configConditions = configConditions;
@@ -312,13 +316,10 @@ public final class RuleContext extends TargetContext
return getConfiguration(config).getSkylarkFragmentNames();
}
- public ConfigurationFragmentPolicy getConfigurationFragment() {
- return configurationFragmentPolicy;
- }
-
public <T extends Fragment> boolean isLegalFragment(
Class<T> fragment, ConfigurationTransition config) {
- return configurationFragmentPolicy.isLegalConfigurationFragment(fragment, config);
+ return fragment == universalFragment
+ || configurationFragmentPolicy.isLegalConfigurationFragment(fragment, config);
}
public <T extends Fragment> boolean isLegalFragment(Class<T> fragment) {
@@ -1227,6 +1228,7 @@ public final class RuleContext extends TargetContext
private final AnalysisEnvironment env;
private final Rule rule;
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
+ private Class<? extends BuildConfiguration.Fragment> universalFragment;
private final BuildConfiguration configuration;
private final BuildConfiguration hostConfiguration;
private final PrerequisiteValidator prerequisiteValidator;
@@ -1255,7 +1257,7 @@ public final class RuleContext extends TargetContext
ListMultimap<String, ConfiguredTarget> targetMap = createTargetMap();
ListMultimap<String, ConfiguredFilesetEntry> filesetEntryMap =
createFilesetEntryMap(rule, configConditions);
- return new RuleContext(this, targetMap, filesetEntryMap, configConditions,
+ return new RuleContext(this, targetMap, filesetEntryMap, configConditions, universalFragment,
aspectAttributes != null ? aspectAttributes : ImmutableMap.<String, Attribute>of());
}
@@ -1290,6 +1292,18 @@ public final class RuleContext extends TargetContext
return this;
}
+ /**
+ * Sets the fragment that can be legally accessed even when not explicitly declared.
+ */
+ Builder setUniversalFragment(Class<? extends BuildConfiguration.Fragment> fragment) {
+ // TODO(bazel-team): Add this directly to ConfigurationFragmentPolicy, so we
+ // don't need separate logic specifically for checking this fragment. The challenge is
+ // that we need RuleClassProvider to figure out what this fragment is, and not every
+ // call state that creates ConfigurationFragmentPolicy has access to that.
+ this.universalFragment = fragment;
+ return this;
+ }
+
private boolean validateFilesetEntry(FilesetEntry filesetEntry, ConfiguredTarget src) {
if (src.getProvider(FilesetProvider.class) != null) {
return true;