aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google
diff options
context:
space:
mode:
authorGravatar gregce <gregce@google.com>2017-07-06 22:51:30 -0400
committerGravatar John Cater <jcater@google.com>2017-07-07 07:08:43 -0400
commit692f763fe7bfb36610a711a4ca05194db721a34b (patch)
treea0b5c9339913a649b1c07a03ac3de6af5eb9d65e /src/main/java/com/google
parent6cfffdf37e11018c7e6e2cabc90440d6d29c819b (diff)
Replace Transitions.configurationHook with equivalent rule class transitions.
This removes the last dynamic dependency on the static configuration transition table. PiperOrigin-RevId: 161162272
Diffstat (limited to 'src/main/java/com/google')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java23
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java45
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java2
4 files changed, 70 insertions, 14 deletions
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 a2c9ec75a7..80876cf69d 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
@@ -42,7 +42,9 @@ import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollectio
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ComposingSplitTransition;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
+import com.google.devtools.build.lib.analysis.config.DynamicTransitionMapper;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
+import com.google.devtools.build.lib.analysis.config.PatchTransition;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -893,7 +895,9 @@ public class BuildView {
if (targetAndConfig.getConfiguration() != null) {
asDeps.put(targetAndConfig.getConfiguration(),
Dependency.withTransitionAndAspects(
- targetAndConfig.getLabel(), getTopLevelTransition(targetAndConfig),
+ targetAndConfig.getLabel(),
+ getTopLevelTransition(targetAndConfig,
+ ruleClassProvider.getDynamicTransitionMapper()),
// TODO(bazel-team): support top-level aspects
AspectCollection.EMPTY));
}
@@ -934,8 +938,8 @@ public class BuildView {
* Returns the transition to apply to the top-level configuration before applying it to this
* target. This enables support for rule-triggered top-level configuration hooks.
*/
- private static Attribute.Transition getTopLevelTransition(
- TargetAndConfiguration targetAndConfig) {
+ private static Attribute.Transition getTopLevelTransition(TargetAndConfiguration targetAndConfig,
+ DynamicTransitionMapper dynamicTransitionMapper) {
Target target = targetAndConfig.getTarget();
BuildConfiguration fromConfig = targetAndConfig.getConfiguration();
Preconditions.checkArgument(fromConfig.useDynamicConfigurations());
@@ -956,7 +960,11 @@ public class BuildView {
if (transitionFactory == null) {
return topLevelTransition;
}
- Attribute.Transition ruleClassTransition = transitionFactory.buildTransitionFor(associatedRule);
+ // dynamicTransitionMapper is only needed because of Attribute.ConfigurationTransition.DATA:
+ // this is C++-specific but non-C++ rules declare it. So they can't directly provide the
+ // C++-specific patch transition that implements it.
+ PatchTransition ruleClassTransition = (PatchTransition)
+ dynamicTransitionMapper.map(transitionFactory.buildTransitionFor(associatedRule));
if (ruleClassTransition == null) {
return topLevelTransition;
} else if (topLevelTransition == ConfigurationTransition.NONE) {
@@ -1160,7 +1168,12 @@ public class BuildView {
if (factory == null) {
return ConfigurationTransition.NONE;
}
- Transition transition = factory.buildTransitionFor(rule);
+
+ // dynamicTransitionMapper is only needed because of Attribute.ConfigurationTransition.DATA:
+ // this is C++-specific but non-C++ rules declare it. So they can't directly provide the
+ // C++-specific patch transition that implements it.
+ PatchTransition transition = (PatchTransition)
+ ruleClassProvider.getDynamicTransitionMapper().map(factory.buildTransitionFor(rule));
return (transition == null) ? ConfigurationTransition.NONE : transition;
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index 4d718b49fb..4cb3064a01 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -1912,7 +1912,6 @@ public final class BuildConfiguration implements BuildEvent {
* transitions that the caller subsequently creates configurations from.
*/
private static class DynamicTransitionApplier implements TransitionApplier {
- private final Transitions transitionsManager;
private final DynamicTransitionMapper dynamicTransitionMapper;
private boolean splitApplied = false;
@@ -1921,9 +1920,7 @@ public final class BuildConfiguration implements BuildEvent {
// so calling code doesn't need special logic to support combinations.
private Transition currentTransition = Attribute.ConfigurationTransition.NONE;
- private DynamicTransitionApplier(Transitions transitionsManager,
- DynamicTransitionMapper dynamicTransitionMapper) {
- this.transitionsManager = transitionsManager;
+ private DynamicTransitionApplier(DynamicTransitionMapper dynamicTransitionMapper) {
this.dynamicTransitionMapper = dynamicTransitionMapper;
}
@@ -2032,14 +2029,15 @@ public final class BuildConfiguration implements BuildEvent {
if (isFinal(currentTransition)) {
return;
}
- transitionsManager.configurationHook(fromRule, attribute, toTarget, this);
-
Rule associatedRule = toTarget.getAssociatedRule();
RuleTransitionFactory transitionFactory =
associatedRule.getRuleClassObject().getTransitionFactory();
if (transitionFactory != null) {
+ // dynamicTransitionMapper is only needed because of Attribute.ConfigurationTransition.DATA:
+ // this is C++-specific but non-C++ rules declare it. So they can't directly provide the
+ // C++-specific patch transition that implements it.
PatchTransition ruleClassTransition = (PatchTransition)
- transitionFactory.buildTransitionFor(associatedRule);
+ dynamicTransitionMapper.map(transitionFactory.buildTransitionFor(associatedRule));
if (ruleClassTransition != null) {
if (currentTransition == ConfigurationTransition.NONE) {
currentTransition = ruleClassTransition;
@@ -2086,7 +2084,7 @@ public final class BuildConfiguration implements BuildEvent {
*/
public TransitionApplier getTransitionApplier() {
return useDynamicConfigurations()
- ? new DynamicTransitionApplier(this.getTransitions(), dynamicTransitionMapper)
+ ? new DynamicTransitionApplier(dynamicTransitionMapper)
: new StaticTransitionApplier(this);
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java
new file mode 100644
index 0000000000..3cc2ff71f4
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingRuleTransitionFactory.java
@@ -0,0 +1,45 @@
+// Copyright 2017 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+package com.google.devtools.build.lib.analysis.config;
+
+import com.google.devtools.build.lib.packages.Attribute;
+import com.google.devtools.build.lib.packages.Rule;
+import com.google.devtools.build.lib.packages.RuleTransitionFactory;
+
+/**
+ * A {@link RuleTransitionFactory} that composes other {@link RuleTransitionFactory}s.
+ */
+public class ComposingRuleTransitionFactory implements RuleTransitionFactory {
+
+ private final RuleTransitionFactory rtf1;
+ private final RuleTransitionFactory rtf2;
+
+ /**
+ * Creates a factory that applies the given factories in-order ({@code rtf1} first,
+ * {@code rtf2} second).
+ */
+ public ComposingRuleTransitionFactory(RuleTransitionFactory rtf1, RuleTransitionFactory rtf2) {
+ this.rtf1 = rtf1;
+ this.rtf2 = rtf2;
+ }
+
+ @Override
+ public Attribute.Transition buildTransitionFor(Rule rule) {
+ return new ComposingPatchTransition(
+ (PatchTransition) rtf1.buildTransitionFor(rule),
+ (PatchTransition) rtf2.buildTransitionFor(rule));
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
index 1f3a78b46b..9cd4077100 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/DynamicTransitionMapper.java
@@ -74,7 +74,7 @@ public final class DynamicTransitionMapper {
* {@link IllegalArgumentException}.
*/
public Transition map(Transition fromTransition) {
- if (fromTransition instanceof PatchTransition) {
+ if (fromTransition instanceof PatchTransition || fromTransition == null) {
return fromTransition;
}
Transition toTransition = map.get(fromTransition);