aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
diff options
context:
space:
mode:
authorGravatar Greg Estren <gregce@google.com>2016-08-05 21:07:02 +0000
committerGravatar Yue Gan <yueg@google.com>2016-08-08 08:08:13 +0000
commit66cadd3d1c6014799616ba22f9d1381a82006c48 (patch)
treeb12a01b53e88aeb239ad29c1c37f990e7704a322 /src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
parent57472638ce94796deabc3d3db4ba851a1d0d600f (diff)
Implements dynamic split transitions (minus latebound attribute splits).
With the prereq work behind this, this is surprisingly straightforward. The main change is to eliminate BuildConfiguration.SplittableTransitionApplier, make both DynamicTransitionApplier and StaticTransitionApplier split-aware, and add awareness of this to ConfiguredTargetFunction.trimConfigurations. Latebound splits will follow next. -- MOS_MIGRATED_REVID=129480309
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index b429606b48..1bd77b5719 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -19,6 +19,7 @@ import com.google.common.base.Joiner;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
+import com.google.common.base.Verify;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableList;
@@ -43,6 +44,7 @@ import com.google.devtools.build.lib.analysis.actions.ActionConstructionContext;
import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.config.FragmentCollection;
import com.google.devtools.build.lib.cmdline.Label;
@@ -704,26 +706,28 @@ public final class RuleContext extends TargetContext
checkAttribute(attributeName, Mode.SPLIT);
Attribute attributeDefinition = getAttribute(attributeName);
- SplitTransition<?> transition = attributeDefinition.getSplitTransition(rule);
- List<BuildConfiguration> configurations =
- getConfiguration().getTransitions().getSplitConfigurationsNoSelf(transition);
- if (configurations.isEmpty()) {
+ @SuppressWarnings("unchecked") // Attribute.java doesn't have the BuildOptions symbol.
+ SplitTransition<BuildOptions> transition =
+ (SplitTransition<BuildOptions>) attributeDefinition.getSplitTransition(rule);
+ List<ConfiguredTarget> deps = targetMap.get(attributeName);
+
+ List<BuildOptions> splitOptions = transition.split(getConfiguration().getOptions());
+ if (splitOptions.isEmpty()) {
// The split transition is not active. Defer the decision on which CPU to use.
- return ImmutableMap.of(Optional.<String>absent(), targetMap.get(attributeName));
+ return ImmutableMap.of(Optional.<String>absent(), deps);
}
Set<String> cpus = new HashSet<>();
- for (BuildConfiguration config : configurations) {
+ for (BuildOptions options : splitOptions) {
// This method should only be called when the split config is enabled on the command line, in
// which case this cpu can't be null.
- Preconditions.checkNotNull(config.getCpu());
- cpus.add(config.getCpu());
+ cpus.add(Verify.verifyNotNull(options.get(BuildConfiguration.Options.class).getCpu()));
}
// Use an ImmutableListMultimap.Builder here to preserve ordering.
ImmutableListMultimap.Builder<Optional<String>, TransitiveInfoCollection> result =
ImmutableListMultimap.builder();
- for (TransitiveInfoCollection t : targetMap.get(attributeName)) {
+ for (TransitiveInfoCollection t : deps) {
if (t.getConfiguration() != null) {
result.put(Optional.of(t.getConfiguration().getCpu()), t);
} else {