diff --git a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java index 111711b0e55128..e88183bdc42cc5 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java @@ -72,6 +72,30 @@ */ public abstract class DependencyResolver { + /** + * Returns whether or not to use the new toolchain transition. Checks the global incompatible + * change flag and the rule's toolchain transition readiness attribute. + */ + // TODO(#10523): Remove this when the migration period for toolchain transitions has ended. + public static boolean shouldUseToolchainTransition( + @Nullable BuildConfiguration configuration, Target target) { + // Check whether the global incompatible change flag is set. + if (configuration != null) { + PlatformOptions platformOptions = configuration.getOptions().get(PlatformOptions.class); + if (platformOptions != null && platformOptions.overrideToolchainTransition) { + return true; + } + } + + // Check the rule definition to see if it is ready. + if (target instanceof Rule && ((Rule) target).getRuleClassObject().useToolchainTransition()) { + return true; + } + + // Default to false. + return false; + } + /** * What we know about a dependency edge after factoring in the properties of the configured target * that the edge originates from, but not the properties of target it points to. @@ -148,6 +172,7 @@ public final OrderedSetMultimap dependentNodeMap( @Nullable Aspect aspect, ImmutableMap configConditions, @Nullable ToolchainCollection toolchainContexts, + boolean useToolchainTransition, @Nullable TransitionFactory trimmingTransitionFactory) throws EvalException, InterruptedException, InconsistentAspectOrderException { NestedSetBuilder rootCauses = NestedSetBuilder.stableOrder(); @@ -155,9 +180,10 @@ public final OrderedSetMultimap dependentNodeMap( dependentNodeMap( node, hostConfig, - aspect != null ? ImmutableList.of(aspect) : ImmutableList.of(), + aspect != null ? ImmutableList.of(aspect) : ImmutableList.of(), configConditions, toolchainContexts, + useToolchainTransition, rootCauses, trimmingTransitionFactory); if (!rootCauses.isEmpty()) { @@ -203,6 +229,7 @@ public final OrderedSetMultimap dependentNodeMap( Iterable aspects, ImmutableMap configConditions, @Nullable ToolchainCollection toolchainContexts, + boolean useToolchainTransition, NestedSetBuilder rootCauses, @Nullable TransitionFactory trimmingTransitionFactory) throws EvalException, InterruptedException, InconsistentAspectOrderException { @@ -239,9 +266,6 @@ public final OrderedSetMultimap dependentNodeMap( return OrderedSetMultimap.create(); } - // TODO(#10523): Remove this when the migration period for toolchain transitions has ended. - boolean useToolchainTransition = - shouldUseToolchainTransition(node.getConfiguration(), fromRule); OrderedSetMultimap partiallyResolvedDeps = partiallyResolveDependencies( outgoingLabels, @@ -258,29 +282,6 @@ public final OrderedSetMultimap dependentNodeMap( return outgoingEdges; } - /** - * Returns whether or not to use the new toolchain transition. Checks the global incompatible - * change flag and the rule's toolchain transition readiness attribute. - */ - private static boolean shouldUseToolchainTransition( - @Nullable BuildConfiguration configuration, @Nullable Rule fromRule) { - // Check whether the global incompatible change flag is set. - if (configuration != null) { - PlatformOptions platformOptions = configuration.getOptions().get(PlatformOptions.class); - if (platformOptions != null && platformOptions.overrideToolchainTransition) { - return true; - } - } - - // Check the rule definition to see if it is ready. - if (fromRule != null && fromRule.getRuleClassObject().useToolchainTransition()) { - return true; - } - - // Default to false. - return false; - } - /** * Factor in the properties of the current rule into the dependency edge calculation. * diff --git a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java index fa20d77f8e6b82..ed0d557fb079fc 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/cquery/TransitionsOutputFormatterCallback.java @@ -132,6 +132,7 @@ public void processOutput(Iterable partialResult) throws Inter /*aspect=*/ null, configConditions, toolchainContexts, + DependencyResolver.shouldUseToolchainTransition(config, target), trimmingTransitionFactory); } catch (EvalException | InconsistentAspectOrderException e) { throw new InterruptedException(e.getMessage()); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index 627d206d84b0ba..200b70310c63f4 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -424,6 +424,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) : ToolchainCollection.builder() .addDefaultContext(unloadedToolchainContext) .build(), + /* useToolchainTransition= */ false, ruleClassProvider, view.getHostConfiguration(originalTargetAndAspectConfiguration.getConfiguration()), transitivePackagesForPackageRootResolution, 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 515faf778cc108..1cac710d1ac097 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 @@ -35,6 +35,7 @@ import com.google.devtools.build.lib.analysis.Dependency; import com.google.devtools.build.lib.analysis.DependencyKey; import com.google.devtools.build.lib.analysis.DependencyKind; +import com.google.devtools.build.lib.analysis.DependencyResolver; import com.google.devtools.build.lib.analysis.DuplicateException; import com.google.devtools.build.lib.analysis.EmptyConfiguredTarget; import com.google.devtools.build.lib.analysis.InconsistentAspectOrderException; @@ -314,6 +315,7 @@ public SkyValue compute(SkyKey key, Environment env) throws ConfiguredTargetFunc unloadedToolchainContexts == null ? null : unloadedToolchainContexts.asToolchainContexts(), + DependencyResolver.shouldUseToolchainTransition(configuration, ctgValue.getTarget()), ruleClassProvider, view.getHostConfiguration(configuration), transitivePackagesForPackageRootResolution, @@ -615,6 +617,7 @@ static OrderedSetMultimap computeDepend Iterable aspects, ImmutableMap configConditions, @Nullable ToolchainCollection toolchainContexts, + boolean useToolchainTransition, RuleClassProvider ruleClassProvider, BuildConfiguration hostConfiguration, @Nullable NestedSetBuilder transitivePackagesForPackageRootResolution, @@ -634,6 +637,7 @@ static OrderedSetMultimap computeDepend aspects, configConditions, toolchainContexts, + useToolchainTransition, transitiveRootCauses, ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory()); } catch (EvalException e) { diff --git a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java index abf3ee677f6fca..cb7b0b1e963177 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/DependencyResolverTest.java @@ -95,6 +95,7 @@ private OrderedSetMultimap dependentNodeMap( aspect != null ? Aspect.forNative(aspect) : null, ImmutableMap.of(), /*toolchainContext=*/ null, + /*useToolchainTransition=*/ false, /*trimmingTransitionFactory=*/ null); return prerequisiteMap; diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java index 950249fd1ea64e..bce82371ac3f4b 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/util/BuildViewForTesting.java @@ -325,15 +325,16 @@ protected Map getTargets( } DependencyResolver dependencyResolver = new SilentDependencyResolver(); - TargetAndConfiguration ctgNode = - new TargetAndConfiguration( - target, skyframeExecutor.getConfiguration(eventHandler, ct.getConfigurationKey())); + BuildConfiguration configuration = + skyframeExecutor.getConfiguration(eventHandler, ct.getConfigurationKey()); + TargetAndConfiguration ctgNode = new TargetAndConfiguration(target, configuration); return dependencyResolver.dependentNodeMap( ctgNode, configurations.getHostConfiguration(), /*aspect=*/ null, getConfigurableAttributeKeysForTesting(eventHandler, ctgNode), toolchainContexts, + DependencyResolver.shouldUseToolchainTransition(configuration, target), ruleClassProvider.getTrimmingTransitionFactory()); } diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java index 2821a20544c1ba..93ec6eac44a231 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java @@ -142,6 +142,7 @@ public SkyValue compute(SkyKey skyKey, Environment env) ImmutableList.of(), ImmutableMap.of(), /*toolchainContext=*/ null, + /* useToolchainTransition= */ false, stateProvider.lateBoundRuleClassProvider(), stateProvider.lateBoundHostConfig(), NestedSetBuilder.stableOrder(),