diff options
author | Greg Estren <gregce@google.com> | 2016-08-05 21:07:02 +0000 |
---|---|---|
committer | Yue Gan <yueg@google.com> | 2016-08-08 08:08:13 +0000 |
commit | 66cadd3d1c6014799616ba22f9d1381a82006c48 (patch) | |
tree | b12a01b53e88aeb239ad29c1c37f990e7704a322 /src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java | |
parent | 57472638ce94796deabc3d3db4ba851a1d0d600f (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.java | 22 |
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 { |