Refactor HOST configuration transitions to be dynamic-configuration friendly.
Dynamic configuration transitions require access to Skyframe (since they instantiate BuildConfigurations as Skyframe nodes). There are various places in Bazel where static transitions are done with no convenient Skyframe access. This cl shuffles host transitions, in particular, to places that are more amenable.
This change also assumes one host configuration per invocation. While this isn't strictly true (each target configuration can have its own host, and multiple target configurations are possible per build), we don't leverage that functionality in any meaningful way today. So until we have a proper interface for multiple host configurations, let's not block dynamic config progress on it.
--
MOS_MIGRATED_REVID=97008479
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 932bc2b..b81ea28 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
@@ -133,6 +133,7 @@
private final AttributeMap attributes;
private final ImmutableSet<String> features;
private final Map<String, Attribute> attributeMap;
+ private final BuildConfiguration hostConfiguration;
private ActionOwner actionOwner;
@@ -152,6 +153,7 @@
ConfiguredAttributeMapper.of(builder.rule, configConditions);
this.features = getEnabledFeatures();
this.attributeMap = attributeMap;
+ this.hostConfiguration = builder.hostConfiguration;
}
private ImmutableSet<String> getEnabledFeatures() {
@@ -211,9 +213,7 @@
* host configurations, even during a single build.
*/
public BuildConfiguration getHostConfiguration() {
- BuildConfiguration configuration = getConfiguration();
- // Note: the Builder checks that the configuration is non-null.
- return configuration.getConfiguration(ConfigurationTransition.HOST);
+ return hostConfiguration;
}
/**
@@ -1131,16 +1131,19 @@
private final AnalysisEnvironment env;
private final Rule rule;
private final BuildConfiguration configuration;
+ private final BuildConfiguration hostConfiguration;
private final PrerequisiteValidator prerequisiteValidator;
private ListMultimap<Attribute, ConfiguredTarget> prerequisiteMap;
private Set<ConfigMatchingProvider> configConditions;
private NestedSet<PackageSpecification> visibility;
Builder(AnalysisEnvironment env, Rule rule, BuildConfiguration configuration,
+ BuildConfiguration hostConfiguration,
PrerequisiteValidator prerequisiteValidator) {
this.env = Preconditions.checkNotNull(env);
this.rule = Preconditions.checkNotNull(rule);
this.configuration = Preconditions.checkNotNull(configuration);
+ this.hostConfiguration = Preconditions.checkNotNull(hostConfiguration);
this.prerequisiteValidator = prerequisiteValidator;
}