diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
11 files changed, 174 insertions, 39 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java index 4b61384684..84ee3a54f4 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java @@ -214,7 +214,8 @@ public final class AnalysisUtils { targetAndConfig.getConfiguration(), Dependency.withTransitionAndAspects( targetAndConfig.getLabel(), - TransitionResolver.evaluateTopLevelTransition(targetAndConfig), + TransitionResolver.evaluateTopLevelTransition( + targetAndConfig, ruleClassProvider.getTrimmingTransitionFactory()), // TODO(bazel-team): support top-level aspects AspectCollection.EMPTY)); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index 6d6d8a011b..984c55fbcd 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -1098,7 +1098,8 @@ public class BuildView { toolchainContext == null ? ImmutableSet.of() : toolchainContext.getResolvedToolchainLabels(), - skyframeExecutor.getDefaultBuildOptions()); + skyframeExecutor.getDefaultBuildOptions(), + ruleClassProvider.getTrimmingTransitionFactory()); } /** 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 cad348ba0b..6f3c3d812c 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 @@ -18,6 +18,7 @@ import static com.google.common.base.Preconditions.checkNotNull; import static com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType.ABSTRACT; import static com.google.devtools.build.lib.packages.RuleClass.Builder.RuleClassType.TEST; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.cache.CacheBuilder; import com.google.common.cache.CacheLoader; @@ -52,6 +53,7 @@ import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; import com.google.devtools.build.lib.packages.RuleClassProvider; import com.google.devtools.build.lib.packages.RuleErrorConsumer; +import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy; import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData; @@ -73,6 +75,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.TreeSet; +import javax.annotation.Nullable; /** * Knows about every rule Blaze supports and the associated configuration options. @@ -231,6 +234,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { private PatchTransition lipoDataTransition; private List<Class<? extends BuildConfiguration.Fragment>> universalFragments = new ArrayList<>(); + @Nullable private RuleTransitionFactory trimmingTransitionFactory; private PrerequisiteValidator prerequisiteValidator; private ImmutableMap.Builder<String, Object> skylarkAccessibleTopLevels = ImmutableMap.builder(); @@ -395,6 +399,32 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { return this; } + /** + * Sets the transition factory that produces a trimming transition to be run over all targets + * after other transitions. + * + * <p>This is a temporary measure for supporting manual trimming of feature flags, and support + * for this transition factory will likely be removed at some point in the future (whenever + * automatic trimming is sufficiently workable). + */ + public Builder setTrimmingTransitionFactory(RuleTransitionFactory factory) { + Preconditions.checkState( + trimmingTransitionFactory == null, "Trimming transition factory already set"); + trimmingTransitionFactory = Preconditions.checkNotNull(factory); + return this; + } + + /** + * Overrides the transition factory run over all targets. + * + * @see #setTrimmingTransitionFactory(RuleTransitionFactory) + */ + @VisibleForTesting(/* for testing trimming transition factories without relying on prod use */) + public Builder overrideTrimmingTransitionFactoryForTesting(RuleTransitionFactory factory) { + trimmingTransitionFactory = null; + return this.setTrimmingTransitionFactory(factory); + } + @Override public PatchTransition getLipoDataTransition() { Preconditions.checkState(lipoDataTransition != null); @@ -476,6 +506,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableList.copyOf(configurationFragmentFactories), lipoDataTransition, ImmutableList.copyOf(universalFragments), + trimmingTransitionFactory, prerequisiteValidator, skylarkAccessibleTopLevels.build(), skylarkModules.build(), @@ -575,6 +606,9 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { private final PatchTransition lipoDataTransition; + /** The transition factory used to produce the transition that will trim targets. */ + @Nullable private final RuleTransitionFactory trimmingTransitionFactory; + /** * Configuration fragments that should be available to all rules even when they don't * explicitly require it. @@ -609,6 +643,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { ImmutableList<ConfigurationFragmentFactory> configurationFragments, PatchTransition lipoDataTransition, ImmutableList<Class<? extends BuildConfiguration.Fragment>> universalFragments, + @Nullable RuleTransitionFactory trimmingTransitionFactory, PrerequisiteValidator prerequisiteValidator, ImmutableMap<String, Object> skylarkAccessibleJavaClasses, ImmutableList<Class<?>> skylarkModules, @@ -628,6 +663,7 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { this.configurationFragmentFactories = configurationFragments; this.lipoDataTransition = lipoDataTransition; this.universalFragments = universalFragments; + this.trimmingTransitionFactory = trimmingTransitionFactory; this.prerequisiteValidator = prerequisiteValidator; this.globals = createGlobals(skylarkAccessibleJavaClasses, skylarkModules); this.reservedActionMnemonics = reservedActionMnemonics; @@ -697,6 +733,18 @@ public class ConfiguredRuleClassProvider implements RuleClassProvider { } /** + * Returns the transition factory used to produce the transition to trim targets. + * + * <p>This is a temporary measure for supporting manual trimming of feature flags, and support + * for this transition factory will likely be removed at some point in the future (whenever + * automatic trimming is sufficiently workable + */ + @Nullable + public RuleTransitionFactory getTrimmingTransitionFactory() { + return trimmingTransitionFactory; + } + + /** * Returns the set of configuration options that are supported in this module. */ public ImmutableList<Class<? extends FragmentOptions>> getConfigurationOptions() { 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 a0136f888d..6f1a90fd6d 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 @@ -48,6 +48,7 @@ import com.google.devtools.build.lib.packages.OutputFile; import com.google.devtools.build.lib.packages.PackageGroup; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClass; +import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; @@ -93,6 +94,8 @@ public abstract class DependencyResolver { * @param toolchainLabels required toolchain labels * @param defaultBuildOptions default build options provided to the server to use for creating * diffs during SkyKey construction + * @param trimmingTransitionFactory the transition factory used to trim rules (note: this is a + * temporary feature; see the corresponding methods in ConfiguredRuleClassProvider) * @return a mapping of each attribute in this rule or aspects to its dependent nodes */ public final OrderedSetMultimap<Attribute, Dependency> dependentNodeMap( @@ -101,7 +104,8 @@ public abstract class DependencyResolver { @Nullable Aspect aspect, ImmutableMap<Label, ConfigMatchingProvider> configConditions, ImmutableSet<Label> toolchainLabels, - BuildOptions defaultBuildOptions) + BuildOptions defaultBuildOptions, + @Nullable RuleTransitionFactory trimmingTransitionFactory) throws EvalException, InvalidConfigurationException, InterruptedException, InconsistentAspectOrderException { NestedSetBuilder<Label> rootCauses = NestedSetBuilder.<Label>stableOrder(); @@ -113,7 +117,8 @@ public abstract class DependencyResolver { configConditions, toolchainLabels, rootCauses, - defaultBuildOptions); + defaultBuildOptions, + trimmingTransitionFactory); if (!rootCauses.isEmpty()) { throw new IllegalStateException(rootCauses.build().iterator().next().toString()); } @@ -146,10 +151,12 @@ public abstract class DependencyResolver { * @param aspects the aspects applied to this target (if any) * @param configConditions resolver for config_setting labels * @param toolchainLabels required toolchain labels - * @param rootCauses collector for dep labels that can't be (loading phase) loaded @return a - * mapping of each attribute in this rule or aspects to its dependent nodes + * @param trimmingTransitionFactory the transition factory used to trim rules (note: this is a + * temporary feature; see the corresponding methods in ConfiguredRuleClassProvider) + * @param rootCauses collector for dep labels that can't be (loading phase) loaded * @param defaultBuildOptions default build options provided by the server to use for creating * diffs during SkyKey construction + * @return a mapping of each attribute in this rule or aspects to its dependent nodes */ public final OrderedSetMultimap<Attribute, Dependency> dependentNodeMap( TargetAndConfiguration node, @@ -158,7 +165,8 @@ public abstract class DependencyResolver { ImmutableMap<Label, ConfigMatchingProvider> configConditions, ImmutableSet<Label> toolchainLabels, NestedSetBuilder<Label> rootCauses, - BuildOptions defaultBuildOptions) + BuildOptions defaultBuildOptions, + @Nullable RuleTransitionFactory trimmingTransitionFactory) throws EvalException, InvalidConfigurationException, InterruptedException, InconsistentAspectOrderException { Target target = node.getTarget(); @@ -182,7 +190,8 @@ public abstract class DependencyResolver { toolchainLabels, rootCauses, outgoingEdges, - defaultBuildOptions); + defaultBuildOptions, + trimmingTransitionFactory); } else if (target instanceof PackageGroup) { visitPackageGroup(node, (PackageGroup) target, rootCauses, outgoingEdges.get(null)); } else { @@ -200,7 +209,8 @@ public abstract class DependencyResolver { ImmutableSet<Label> toolchainLabels, NestedSetBuilder<Label> rootCauses, OrderedSetMultimap<Attribute, Dependency> outgoingEdges, - BuildOptions defaultBuildOptions) + BuildOptions defaultBuildOptions, + @Nullable RuleTransitionFactory trimmingTransitionFactory) throws EvalException, InvalidConfigurationException, InconsistentAspectOrderException, InterruptedException { Preconditions.checkArgument(node.getTarget() instanceof Rule); @@ -210,7 +220,14 @@ public abstract class DependencyResolver { ConfiguredAttributeMapper attributeMap = ConfiguredAttributeMapper.of(rule, configConditions); attributeMap.validateAttributes(); RuleResolver depResolver = - new RuleResolver(rule, ruleConfig, aspects, attributeMap, rootCauses, outgoingEdges); + new RuleResolver( + rule, + ruleConfig, + aspects, + attributeMap, + rootCauses, + outgoingEdges, + trimmingTransitionFactory); visitTargetVisibility(node, rootCauses, outgoingEdges.get(null)); resolveEarlyBoundAttributes(depResolver); @@ -548,14 +565,21 @@ public abstract class DependencyResolver { public final Collection<Dependency> resolveRuleLabels( TargetAndConfiguration node, OrderedSetMultimap<Attribute, Label> depLabels, - NestedSetBuilder<Label> rootCauses) + NestedSetBuilder<Label> rootCauses, + @Nullable RuleTransitionFactory trimmingTransitionFactory) throws InterruptedException, InconsistentAspectOrderException { Preconditions.checkArgument(node.getTarget() instanceof Rule); Rule rule = (Rule) node.getTarget(); OrderedSetMultimap<Attribute, Dependency> outgoingEdges = OrderedSetMultimap.create(); - RuleResolver depResolver = new RuleResolver( - rule, node.getConfiguration(), ImmutableList.<Aspect>of(), - /*attributeMap=*/null, rootCauses, outgoingEdges); + RuleResolver depResolver = + new RuleResolver( + rule, + node.getConfiguration(), + ImmutableList.<Aspect>of(), + /*attributeMap=*/ null, + rootCauses, + outgoingEdges, + trimmingTransitionFactory); Map<Attribute, Collection<Label>> m = depLabels.asMap(); for (Map.Entry<Attribute, Collection<Label>> entry : depLabels.asMap().entrySet()) { for (Label depLabel : entry.getValue()) { @@ -680,6 +704,7 @@ public abstract class DependencyResolver { private final ConfiguredAttributeMapper attributeMap; private final NestedSetBuilder<Label> rootCauses; private final OrderedSetMultimap<Attribute, Dependency> outgoingEdges; + @Nullable private final RuleTransitionFactory trimmingTransitionFactory; private final List<AttributeAndOwner> attributes; /** @@ -692,15 +717,21 @@ public abstract class DependencyResolver { * @param rootCauses output collector for dep labels that can't be (loading phase) loaded * @param outgoingEdges output collector for the resolved dependencies */ - RuleResolver(Rule rule, BuildConfiguration ruleConfig, Iterable<Aspect> aspects, - ConfiguredAttributeMapper attributeMap, NestedSetBuilder<Label> rootCauses, - OrderedSetMultimap<Attribute, Dependency> outgoingEdges) { + RuleResolver( + Rule rule, + BuildConfiguration ruleConfig, + Iterable<Aspect> aspects, + ConfiguredAttributeMapper attributeMap, + NestedSetBuilder<Label> rootCauses, + OrderedSetMultimap<Attribute, Dependency> outgoingEdges, + @Nullable RuleTransitionFactory trimmingTransitionFactory) { this.rule = rule; this.ruleConfig = ruleConfig; this.aspects = aspects; this.attributeMap = attributeMap; this.rootCauses = rootCauses; this.outgoingEdges = outgoingEdges; + this.trimmingTransitionFactory = trimmingTransitionFactory; this.attributes = getAttributes( @@ -737,8 +768,14 @@ public abstract class DependencyResolver { if (toTarget == null) { return; // Skip this round: we still need to Skyframe-evaluate the dep's target. } - ConfigurationTransition transition = TransitionResolver.evaluateTransition( - ruleConfig, rule, attributeAndOwner.attribute, toTarget, attributeMap); + ConfigurationTransition transition = + TransitionResolver.evaluateTransition( + ruleConfig, + rule, + attributeAndOwner.attribute, + toTarget, + attributeMap, + trimmingTransitionFactory); outgoingEdges.put( attributeAndOwner.attribute, transition == NullTransition.INSTANCE diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java index 0c1073173a..049fc64d65 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java @@ -30,6 +30,7 @@ import com.google.devtools.build.lib.packages.PackageGroup; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.packages.Target; +import javax.annotation.Nullable; /** * Tool for evaluating which {@link ConfigurationTransition}(s) should be applied to given targets. @@ -51,6 +52,9 @@ public final class TransitionResolver { * @param fromRule the parent rule * @param attribute the attribute creating the dependency (e.g. "srcs") * @param toTarget the child target (which may or may not be a rule) + * @param attributeMap the attributes of the rule + * @param trimmingTransitionFactory the transition factory used to trim rules (note: this is a + * temporary feature; see the corresponding methods in ConfiguredRuleClassProvider) * * @return the child's configuration, expressed as a diff from the parent's configuration. This * is either a {@link PatchTransition} or {@link SplitTransition}. @@ -60,7 +64,8 @@ public final class TransitionResolver { final Rule fromRule, final Attribute attribute, final Target toTarget, - ConfiguredAttributeMapper attributeMap) { + ConfiguredAttributeMapper attributeMap, + @Nullable RuleTransitionFactory trimmingTransitionFactory) { // I. Input files and package groups have no configurations. We don't want to duplicate them. if (usesNullConfiguration(toTarget)) { @@ -106,9 +111,13 @@ public final class TransitionResolver { attribute.getConfigurationTransition()); } - // IV. Applies any rule transitions associated with the dep target, composes their transitions - // with a passed-in existing transition, and returns the composed result. - return applyRuleTransition(currentTransition, toTarget); + // IV. Applies any rule transitions associated with the dep target and composes their + // transitions with a passed-in existing transition. + currentTransition = applyRuleTransition(currentTransition, toTarget); + + // V. Applies a transition to trim the result and returns it. (note: this is a temporary + // feature; see the corresponding methods in ConfiguredRuleClassProvider) + return applyTransitionFromFactory(currentTransition, toTarget, trimmingTransitionFactory); } /** @@ -116,7 +125,8 @@ public final class TransitionResolver { * enables support for rule-triggered top-level configuration hooks. */ public static ConfigurationTransition evaluateTopLevelTransition( - TargetAndConfiguration targetAndConfig) { + TargetAndConfiguration targetAndConfig, + @Nullable RuleTransitionFactory trimmingTransitionFactory) { Target target = targetAndConfig.getTarget(); BuildConfiguration fromConfig = targetAndConfig.getConfiguration(); @@ -130,7 +140,10 @@ public final class TransitionResolver { if (target.getAssociatedRule() == null) { return topLevelTransition; } - return applyRuleTransition(topLevelTransition, target); + ConfigurationTransition ruleTransition = applyRuleTransition(topLevelTransition, target); + ConfigurationTransition trimmingTransition = + applyTransitionFromFactory(ruleTransition, target, trimmingTransitionFactory); + return trimmingTransition; } /** @@ -185,19 +198,31 @@ public final class TransitionResolver { /** * @param currentTransition a pre-existing transition to be composed with - * @param toTarget rule to examine for transitions + * @param toTarget target whose associated rule's incoming transition should be applied */ private static ConfigurationTransition applyRuleTransition( ConfigurationTransition currentTransition, Target toTarget) { - if (isFinal(currentTransition)) { - return currentTransition; - } Rule associatedRule = toTarget.getAssociatedRule(); RuleTransitionFactory transitionFactory = associatedRule.getRuleClassObject().getTransitionFactory(); + return applyTransitionFromFactory(currentTransition, toTarget, transitionFactory); + } + + /** + * @param currentTransition a pre-existing transition to be composed with + * @param toTarget target whose associated rule's incoming transition should be applied + * @param transitionFactory a rule transition factory to apply, or null to do nothing + */ + private static ConfigurationTransition applyTransitionFromFactory( + ConfigurationTransition currentTransition, + Target toTarget, + @Nullable RuleTransitionFactory transitionFactory) { + if (isFinal(currentTransition)) { + return currentTransition; + } if (transitionFactory != null) { PatchTransition ruleClassTransition = - (PatchTransition) transitionFactory.buildTransitionFor(associatedRule); + (PatchTransition) transitionFactory.buildTransitionFor(toTarget.getAssociatedRule()); if (ruleClassTransition != null) { if (currentTransition == NoTransition.INSTANCE) { return ruleClassTransition; diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java index 6883e7982e..46ed57cd4f 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java @@ -134,6 +134,7 @@ public class CqueryBuildTool extends BuildTool { env.getReporter(), env.getSkyframeExecutor(), hostConfiguration, + runtime.getRuleClassProvider().getTrimmingTransitionFactory(), cqueryOptions.aspectDeps.createResolver(env.getPackageManager(), env.getReporter())); CqueryThreadsafeCallback callback = CqueryThreadsafeCallback.getCallback(cqueryOptions.outputFormat, callbacks); diff --git a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java index 5f096b5063..b1251c6169 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java @@ -35,6 +35,7 @@ import com.google.devtools.build.lib.events.Reporter; import com.google.devtools.build.lib.packages.DependencyFilter; import com.google.devtools.build.lib.packages.NoSuchTargetException; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.pkgcache.FilteringPolicies; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; @@ -187,6 +188,7 @@ public class ConfiguredTargetQueryEnvironment Reporter reporter, SkyframeExecutor skyframeExecutor, BuildConfiguration hostConfiguration, + @Nullable RuleTransitionFactory trimmingTransitionFactory, AspectResolver resolver) { OutputStream out = reporter.getOutErr().getOutputStream(); return new ImmutableList.Builder<CqueryThreadsafeCallback>() @@ -195,7 +197,13 @@ public class ConfiguredTargetQueryEnvironment reporter, options, out, skyframeExecutor, accessor)) .add( new TransitionsOutputFormatterCallback( - reporter, options, out, skyframeExecutor, accessor, hostConfiguration)) + reporter, + options, + out, + skyframeExecutor, + accessor, + hostConfiguration, + trimmingTransitionFactory)) .add( new ProtoOutputFormatterCallback( reporter, options, out, skyframeExecutor, accessor, resolver)) diff --git a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java index 92922d5d0a..dd7922a722 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java @@ -61,6 +61,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import javax.annotation.Nullable; /** * Output formatter that prints {@link ConfigurationTransition} information for rule configured @@ -71,6 +72,7 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback protected final BuildConfiguration hostConfiguration; private final HashMap<Label, Target> partialResultMap; + @Nullable private final RuleTransitionFactory trimmingTransitionFactory; @Override public String getName() { @@ -87,9 +89,11 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback OutputStream out, SkyframeExecutor skyframeExecutor, TargetAccessor<ConfiguredTarget> accessor, - BuildConfiguration hostConfiguration) { + BuildConfiguration hostConfiguration, + @Nullable RuleTransitionFactory trimmingTransitionFactory) { super(reporter, options, out, skyframeExecutor, accessor); this.hostConfiguration = hostConfiguration; + this.trimmingTransitionFactory = trimmingTransitionFactory; this.partialResultMap = Maps.newHashMap(); } @@ -139,7 +143,8 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback ImmutableSet.copyOf( ConfiguredAttributeMapper.of(target.getAssociatedRule(), configConditions) .get(PlatformSemantics.TOOLCHAINS_ATTR, BuildType.LABEL_LIST)), - fromOptions); + fromOptions, + trimmingTransitionFactory); } catch (EvalException | InvalidConfigurationException | 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 6e8e6033ff..29ffee6abf 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 @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.AspectResolver; import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAspectOrderException; import com.google.devtools.build.lib.analysis.TargetAndConfiguration; @@ -393,7 +394,8 @@ public final class AspectFunction implements SkyFunction { resolver, originalTargetAndAspectConfiguration, transitivePackagesForPackageRootResolution, - transitiveRootCauses); + transitiveRootCauses, + ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory()); if (configConditions == null) { // Those targets haven't yet been resolved. return null; 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 17ffe47c77..f22cf53280 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 @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictEx import com.google.devtools.build.lib.analysis.AspectResolver; import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment; import com.google.devtools.build.lib.analysis.ConfiguredAspect; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.ConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.Dependency; @@ -55,6 +56,7 @@ import com.google.devtools.build.lib.packages.Package; import com.google.devtools.build.lib.packages.RawAttributeMapper; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.RuleClassProvider; +import com.google.devtools.build.lib.packages.RuleTransitionFactory; import com.google.devtools.build.lib.packages.Target; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.skyframe.AspectFunction.AspectCreationException; @@ -239,7 +241,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { resolver, ctgValue, transitivePackagesForPackageRootResolution, - transitiveLoadingRootCauses); + transitiveLoadingRootCauses, + ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory()); if (env.valuesMissing()) { return null; } @@ -429,7 +432,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { ? ImmutableSet.of() : toolchainContext.getResolvedToolchainLabels(), transitiveLoadingRootCauses, - defaultBuildOptions); + defaultBuildOptions, + ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory()); } catch (EvalException e) { // EvalException can only be thrown by computed Skylark attributes in the current rule. env.getListener().handle(Event.error(e.getLocation(), e.getMessage())); @@ -506,7 +510,8 @@ public final class ConfiguredTargetFunction implements SkyFunction { SkyframeDependencyResolver resolver, TargetAndConfiguration ctgValue, @Nullable NestedSetBuilder<Package> transitivePackagesForPackageRootResolution, - NestedSetBuilder<Label> transitiveLoadingRootCauses) + NestedSetBuilder<Label> transitiveLoadingRootCauses, + @Nullable RuleTransitionFactory trimmingTransitionFactory) throws DependencyEvaluationException, InterruptedException { if (!(target instanceof Rule)) { return NO_CONFIG_CONDITIONS; @@ -533,7 +538,7 @@ public final class ConfiguredTargetFunction implements SkyFunction { Collection<Dependency> configValueNames; try { configValueNames = resolver.resolveRuleLabels( - ctgValue, configLabelMap, transitiveLoadingRootCauses); + ctgValue, configLabelMap, transitiveLoadingRootCauses, trimmingTransitionFactory); } catch (InconsistentAspectOrderException e) { throw new DependencyEvaluationException(e); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java index 6464b45a76..e56942b2fd 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.Dependency; import com.google.devtools.build.lib.analysis.DependencyResolver.InconsistentAspectOrderException; @@ -125,7 +126,8 @@ public class PostConfiguredTargetFunction implements SkyFunction { /*aspect=*/ null, configConditions, /*toolchainLabels*/ ImmutableSet.of(), - defaultBuildOptions); + defaultBuildOptions, + ((ConfiguredRuleClassProvider) ruleClassProvider).getTrimmingTransitionFactory()); if (configuredTargetAndData.getConfiguration() != null) { deps = ConfigurationResolver.resolveConfigurations( |