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
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
index 616c60c..62d42c9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java
@@ -24,6 +24,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigurationFragmentFactory;
import com.google.devtools.build.lib.analysis.config.DefaultsPackage;
@@ -97,6 +98,7 @@
private final Digraph<Class<? extends RuleDefinition>> dependencyGraph =
new Digraph<>();
private ConfigurationCollectionFactory configurationCollectionFactory;
+ private Class<? extends BuildConfiguration.Fragment> universalFragment;
private PrerequisiteValidator prerequisiteValidator;
private ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses = ImmutableMap.of();
@@ -163,6 +165,12 @@
return this;
}
+ public Builder setUniversalConfigurationFragment(
+ Class<? extends BuildConfiguration.Fragment> fragment) {
+ this.universalFragment = fragment;
+ return this;
+ }
+
public Builder setSkylarkAccessibleJavaClasses(ImmutableMap<String, SkylarkType> objects) {
this.skylarkAccessibleJavaClasses = objects;
return this;
@@ -238,6 +246,7 @@
ImmutableList.copyOf(configurationOptions),
ImmutableList.copyOf(configurationFragments),
configurationCollectionFactory,
+ universalFragment,
prerequisiteValidator,
skylarkAccessibleJavaClasses);
}
@@ -310,6 +319,12 @@
*/
private final ConfigurationCollectionFactory configurationCollectionFactory;
+ /**
+ * A configuration fragment that should be available to all rules even when they don't
+ * explicitly require it.
+ */
+ private final Class<? extends BuildConfiguration.Fragment> universalFragment;
+
private final ImmutableList<BuildInfoFactory> buildInfoFactories;
private final PrerequisiteValidator prerequisiteValidator;
@@ -327,6 +342,7 @@
ImmutableList<Class<? extends FragmentOptions>> configurationOptions,
ImmutableList<ConfigurationFragmentFactory> configurationFragments,
ConfigurationCollectionFactory configurationCollectionFactory,
+ Class<? extends BuildConfiguration.Fragment> universalFragment,
PrerequisiteValidator prerequisiteValidator,
ImmutableMap<String, SkylarkType> skylarkAccessibleJavaClasses) {
this.preludeLabel = preludeLabel;
@@ -339,6 +355,7 @@
this.configurationOptions = configurationOptions;
this.configurationFragments = configurationFragments;
this.configurationCollectionFactory = configurationCollectionFactory;
+ this.universalFragment = universalFragment;
this.prerequisiteValidator = prerequisiteValidator;
this.globals = createGlobals(skylarkAccessibleJavaClasses);
}
@@ -403,6 +420,14 @@
}
/**
+ * Returns the configuration fragment that should be available to all rules even when they
+ * don't explicitly require it.
+ */
+ public Class<? extends BuildConfiguration.Fragment> getUniversalFragment() {
+ return universalFragment;
+ }
+
+ /**
* Returns the defaults package for the default settings.
*/
public String getDefaultsPackageContent() {