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); } /**