Skip to content

Commit

Permalink
Update Attribute to use a single TransitionFactory for patch and split
Browse files Browse the repository at this point in the history
transitions.

Part of work on #7814.

Closes #7859.

PiperOrigin-RevId: 240797521
  • Loading branch information
katre authored and copybara-github committed Mar 28, 2019
1 parent 7faa0ef commit 5adcd3e
Show file tree
Hide file tree
Showing 6 changed files with 105 additions and 130 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
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.RuleTransitionData;
import com.google.devtools.build.lib.packages.RuleTransitionFactory;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.syntax.EvalException;
Expand Down Expand Up @@ -342,12 +343,8 @@ public final OrderedSetMultimap<DependencyKind, Dependency> dependentNodeMap(
collectPropagatingAspects(
aspects, attribute.getName(), entry.getKey().getOwningAspect(), propagatingAspects);

// TODO(https://github.com/bazelbuild/bazel/issues/7814): Unify this and get rid of the
// check for splits, to directly use TransitionFactory.
ConfigurationTransition attributeTransition =
attribute.hasSplitConfigurationTransition()
? attribute.getSplitTransition(attributeMap)
: attribute.getConfigurationTransition(attributeMap);
attribute.getTransitionFactory().create(RuleTransitionData.create(attributeMap));
partiallyResolvedDeps.put(
entry.getKey(),
PartiallyResolvedDependency.of(toLabel, attributeTransition, propagatingAspects.build()));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,8 +52,8 @@
import com.google.devtools.build.lib.analysis.config.FragmentCollection;
import com.google.devtools.build.lib.analysis.config.transitions.ConfigurationTransition;
import com.google.devtools.build.lib.analysis.config.transitions.NoTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
Expand Down Expand Up @@ -88,6 +88,7 @@
import com.google.devtools.build.lib.packages.Rule;
import com.google.devtools.build.lib.packages.RuleClass;
import com.google.devtools.build.lib.packages.RuleErrorConsumer;
import com.google.devtools.build.lib.packages.RuleTransitionData;
import com.google.devtools.build.lib.packages.Target;
import com.google.devtools.build.lib.packages.TargetUtils;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
Expand Down Expand Up @@ -823,9 +824,14 @@ public List<ConfiguredTargetAndData> getPrerequisiteConfiguredTargetAndTargets(
getSplitPrerequisiteConfiguredTargetAndTargets(String attributeName) {
checkAttribute(attributeName, Mode.SPLIT);
Attribute attributeDefinition = attributes().getAttributeDefinition(attributeName);
Preconditions.checkState(attributeDefinition.hasSplitConfigurationTransition());
SplitTransition transition =
attributeDefinition.getSplitTransition(
ConfiguredAttributeMapper.of(rule, configConditions));
(SplitTransition)
attributeDefinition
.getTransitionFactory()
.create(
RuleTransitionData.create(
ConfiguredAttributeMapper.of(rule, configConditions)));
BuildOptions fromOptions = getConfiguration().getOptions();
List<BuildOptions> splitOptions = transition.split(fromOptions);
List<ConfiguredTargetAndData> deps = getConfiguredTargetAndTargetDeps(attributeName);
Expand Down Expand Up @@ -1154,17 +1160,16 @@ private void checkAttribute(String attributeName, Mode mode) {
throw new IllegalStateException(getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not a label type attribute");
}
// TODO(https://github.com/bazelbuild/bazel/issues/7814): Refactor this to be more clear and
// not require a specific ConfigurationTransition.
ConfigurationTransition transition = attributeDefinition.getConfigurationTransition(null);
TransitionFactory<RuleTransitionData> transitionFactory =
attributeDefinition.getTransitionFactory();
if (mode == Mode.HOST) {
if (!(transition instanceof PatchTransition)) {
if (transitionFactory.isSplit()) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the host configuration");
}
} else if (mode == Mode.TARGET) {
if (!(transition instanceof PatchTransition) && transition != NoTransition.INSTANCE) {
if (transitionFactory.isSplit() && !NoTransition.isInstance(transitionFactory)) {
throw new IllegalStateException(getRule().getLocation() + ": "
+ getRuleClassNameForLogging() + " attribute " + attributeName
+ " is not configured for the target configuration");
Expand Down
Loading

0 comments on commit 5adcd3e

Please sign in to comment.