Resolve toolchains and thread through to RuleContext
PiperOrigin-RevId: 305744813
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
index b5f4b68..de6c5de 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java
@@ -180,7 +180,7 @@
ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
- @Nullable ResolvedToolchainContext toolchainContext)
+ @Nullable ToolchainCollection<ResolvedToolchainContext> toolchainContexts)
throws InterruptedException, ActionConflictException {
if (target instanceof Rule) {
try {
@@ -193,7 +193,7 @@
configuredTargetKey,
prerequisiteMap,
configConditions,
- toolchainContext);
+ toolchainContexts);
} finally {
CurrentRuleTracker.endConfiguredTarget();
}
@@ -407,7 +407,7 @@
ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
- @Nullable ResolvedToolchainContext toolchainContext)
+ @Nullable ToolchainCollection<ResolvedToolchainContext> toolchainContexts)
throws InterruptedException, ActionConflictException {
ConfigurationFragmentPolicy configurationFragmentPolicy =
rule.getRuleClassObject().getConfigurationFragmentPolicy();
@@ -426,7 +426,7 @@
.setPrerequisites(transformPrerequisiteMap(prerequisiteMap, rule))
.setConfigConditions(configConditions)
.setUniversalFragments(ruleClassProvider.getUniversalFragments())
- .setToolchainContext(toolchainContext)
+ .setToolchainContexts(toolchainContexts)
.setConstraintSemantics(ruleClassProvider.getConstraintSemantics())
.setRequiredConfigFragments(
getRequiredConfigFragments(
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 34fa85b..6fe5f87 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
@@ -199,7 +199,7 @@
private final ConfigurationFragmentPolicy configurationFragmentPolicy;
private final ImmutableList<Class<? extends BuildConfiguration.Fragment>> universalFragments;
private final RuleErrorConsumer reporter;
- @Nullable private final ResolvedToolchainContext toolchainContext;
+ @Nullable private final ToolchainCollection<ResolvedToolchainContext> toolchainContexts;
private final ConstraintSemantics constraintSemantics;
private final ImmutableSet<String> requiredConfigFragments;
@@ -219,7 +219,7 @@
String ruleClassNameForLogging,
ActionLookupValue.ActionLookupKey actionLookupKey,
ImmutableMap<String, Attribute> aspectAttributes,
- @Nullable ResolvedToolchainContext toolchainContext,
+ @Nullable ToolchainCollection<ResolvedToolchainContext> toolchainContexts,
ConstraintSemantics constraintSemantics,
ImmutableSet<String> requiredConfigFragments) {
super(
@@ -251,7 +251,7 @@
this.hostConfiguration = builder.hostConfiguration;
this.actionOwnerSymbolGenerator = new SymbolGenerator<>(actionLookupKey);
reporter = builder.reporter;
- this.toolchainContext = toolchainContext;
+ this.toolchainContexts = toolchainContexts;
this.constraintSemantics = constraintSemantics;
this.requiredConfigFragments = requiredConfigFragments;
}
@@ -1224,16 +1224,28 @@
return configurationMakeVariableContext;
}
+ // TODO(b/151742236): provide access to other non-default toolchain contexts.
@Nullable
public ResolvedToolchainContext getToolchainContext() {
- return toolchainContext;
+ return toolchainContexts == null ? null : toolchainContexts.getDefaultToolchainContext();
+ }
+
+ @Nullable
+ public ToolchainCollection<ResolvedToolchainContext> getToolchainContextsForTesting() {
+ return toolchainContexts;
}
public boolean targetPlatformHasConstraint(ConstraintValueInfo constraintValue) {
- if (toolchainContext == null || toolchainContext.targetPlatform() == null) {
+ if (toolchainContexts == null
+ || toolchainContexts.getDefaultToolchainContext().targetPlatform() == null) {
return false;
}
- return toolchainContext.targetPlatform().constraints().hasConstraintValue(constraintValue);
+ // All toolchain contexts should have the same target platform so we access via the default.
+ return toolchainContexts
+ .getDefaultToolchainContext()
+ .targetPlatform()
+ .constraints()
+ .hasConstraintValue(constraintValue);
}
public ConstraintSemantics getConstraintSemantics() {
@@ -1615,7 +1627,7 @@
private NestedSet<PackageGroupContents> visibility;
private ImmutableMap<String, Attribute> aspectAttributes;
private ImmutableList<Aspect> aspects;
- private ResolvedToolchainContext toolchainContext;
+ private ToolchainCollection<ResolvedToolchainContext> toolchainContexts;
private ConstraintSemantics constraintSemantics;
private ImmutableSet<String> requiredConfigFragments = ImmutableSet.of();
@@ -1668,7 +1680,7 @@
getRuleClassNameForLogging(),
actionOwnerSymbol,
aspectAttributes != null ? aspectAttributes : ImmutableMap.<String, Attribute>of(),
- toolchainContext,
+ toolchainContexts,
constraintSemantics,
requiredConfigFragments);
}
@@ -1728,7 +1740,24 @@
/** Sets the {@link ResolvedToolchainContext} used to access toolchains used by this rule. */
public Builder setToolchainContext(ResolvedToolchainContext toolchainContext) {
- this.toolchainContext = toolchainContext;
+ Preconditions.checkState(
+ this.toolchainContexts == null,
+ "toolchainContexts has already been set for this Builder");
+ this.toolchainContexts =
+ new ToolchainCollection.Builder<ResolvedToolchainContext>()
+ .addDefaultContext(toolchainContext)
+ .build();
+ return this;
+ }
+
+ /** Sets the collection of {@link ResolvedToolchainContext}s available to this rule. */
+ @VisibleForTesting
+ public Builder setToolchainContexts(
+ ToolchainCollection<ResolvedToolchainContext> toolchainContexts) {
+ Preconditions.checkState(
+ this.toolchainContexts == null,
+ "toolchainContexts has already been set for this Builder");
+ this.toolchainContexts = toolchainContexts;
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
index 1f62133..17985a9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainCollection.java
@@ -13,11 +13,11 @@
// limitations under the License.
package com.google.devtools.build.lib.analysis;
+import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.cmdline.Label;
-import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
@@ -30,7 +30,7 @@
* after toolchain resolution.
*/
public class ToolchainCollection<T extends ToolchainContext> {
- private static final String DEFAULT_EXEC_GROUP_NAME = "default_exec_group";
+ @VisibleForTesting public static final String DEFAULT_EXEC_GROUP_NAME = "default_exec_group";
/** A map of execution group names to toolchain contexts. */
private final ImmutableMap<String, T> toolchainContexts;
@@ -82,7 +82,7 @@
return new ToolchainCollection<>(ImmutableMap.copyOf(toolchainContexts));
}
- public Collection<T> getContexts() {
- return toolchainContexts.values();
+ public ImmutableMap<String, T> getContextMap() {
+ return toolchainContexts;
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index 72a1821..6d9b644 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -321,16 +321,22 @@
Preconditions.checkNotNull(depValueMap);
// Load the requested toolchains into the ToolchainContext, now that we have dependencies.
- // TODO(b/151742236); load non-default {@link ExecGroup} toolchains.
- ResolvedToolchainContext toolchainContext = null;
+ ToolchainCollection<ResolvedToolchainContext> toolchainContexts = null;
if (unloadedToolchainContexts != null) {
String targetDescription = target.toString();
- toolchainContext =
- ResolvedToolchainContext.load(
- target.getPackage().getRepositoryMapping(),
- unloadedToolchainContexts.getDefaultToolchainContext(),
- targetDescription,
- depValueMap.get(DependencyResolver.TOOLCHAIN_DEPENDENCY));
+ ToolchainCollection.Builder<ResolvedToolchainContext> contextsBuilder =
+ new ToolchainCollection.Builder<>();
+ for (Map.Entry<String, UnloadedToolchainContext> unloadedContext :
+ unloadedToolchainContexts.getContextMap().entrySet()) {
+ contextsBuilder.addContext(
+ unloadedContext.getKey(),
+ ResolvedToolchainContext.load(
+ target.getPackage().getRepositoryMapping(),
+ unloadedContext.getValue(),
+ targetDescription,
+ depValueMap.get(DependencyResolver.TOOLCHAIN_DEPENDENCY)));
+ }
+ toolchainContexts = contextsBuilder.build();
}
ConfiguredTargetValue ans =
@@ -342,7 +348,7 @@
configuredTargetKey,
depValueMap,
configConditions,
- toolchainContext,
+ toolchainContexts,
transitivePackagesForPackageRootResolution);
if (configuredTargetProgress != null) {
configuredTargetProgress.doneConfigureTarget();
@@ -916,7 +922,7 @@
ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> depValueMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
- @Nullable ResolvedToolchainContext toolchainContext,
+ @Nullable ToolchainCollection<ResolvedToolchainContext> toolchainContexts,
@Nullable NestedSetBuilder<Package> transitivePackagesForPackageRootResolution)
throws ConfiguredTargetFunctionException, InterruptedException {
StoredEventHandler events = new StoredEventHandler();
@@ -942,7 +948,7 @@
configuredTargetKey,
depValueMap,
configConditions,
- toolchainContext);
+ toolchainContexts);
} catch (MissingDepException e) {
Preconditions.checkState(env.valuesMissing(), e.getMessage());
return null;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 6ac47a74..52be517 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -44,6 +44,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTargetFactory;
import com.google.devtools.build.lib.analysis.DependencyResolver.DependencyKind;
import com.google.devtools.build.lib.analysis.ResolvedToolchainContext;
+import com.google.devtools.build.lib.analysis.ToolchainCollection;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
import com.google.devtools.build.lib.analysis.ViewCreationFailedException;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -869,7 +870,7 @@
ConfiguredTargetKey configuredTargetKey,
OrderedSetMultimap<DependencyKind, ConfiguredTargetAndData> prerequisiteMap,
ImmutableMap<Label, ConfigMatchingProvider> configConditions,
- @Nullable ResolvedToolchainContext toolchainContext)
+ @Nullable ToolchainCollection<ResolvedToolchainContext> toolchainContexts)
throws InterruptedException, ActionConflictException {
Preconditions.checkState(
enableAnalysis, "Already in execution phase %s %s", target, configuration);
@@ -885,7 +886,7 @@
configuredTargetKey,
prerequisiteMap,
configConditions,
- toolchainContext);
+ toolchainContexts);
}
/**