aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AnalysisUtils.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/ConfiguredRuleClassProvider.java48
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/DependencyResolver.java71
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/TransitionResolver.java47
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java9
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PostConfiguredTargetFunction.java4
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(