aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java10
-rw-r--r--src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java35
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java18
3 files changed, 62 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
index c4287d8ea9..8a33e233d4 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ComposingSplitTransition.java
@@ -14,6 +14,7 @@
package com.google.devtools.build.lib.analysis.config;
+import com.google.common.base.Verify;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.packages.Attribute.ConfigurationTransition;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
@@ -50,7 +51,14 @@ public class ComposingSplitTransition implements SplitTransition<BuildOptions> {
} else if (transition instanceof PatchTransition) {
return ImmutableList.<BuildOptions>of(((PatchTransition) transition).apply(patchedOptions));
} else if (transition instanceof SplitTransition) {
- return ((SplitTransition<BuildOptions>) transition).split(patchedOptions);
+ SplitTransition split = (SplitTransition<BuildOptions>) transition;
+ List<BuildOptions> splitOptions = split.split(patchedOptions);
+ if (splitOptions.isEmpty()) {
+ Verify.verify(split.defaultsToSelf());
+ return ImmutableList.of(patchedOptions);
+ } else {
+ return splitOptions;
+ }
} else {
throw new IllegalStateException(
String.format("Unsupported composite transition type: %s",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
index 29265648a0..3a74a5926b 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/util/TestAspects.java
@@ -925,6 +925,19 @@ public class TestAspects {
}
}
+ private static class EmptySplitTransition implements SplitTransition<BuildOptions> {
+
+ @Override
+ public List<BuildOptions> split(BuildOptions buildOptions) {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return true;
+ }
+ }
+
/**
* Rule with a split transition on an attribute.
*/
@@ -973,4 +986,26 @@ public class TestAspects {
.build();
}
}
+
+ /** A rule with an empty split transition on an attribute. */
+ public static class EmptySplitRule implements RuleDefinition {
+ @Override
+ public RuleClass build(Builder builder, RuleDefinitionEnvironment environment) {
+ return builder
+ .add(
+ attr("with_empty_transition", LABEL)
+ .allowedFileTypes(FileTypeSet.ANY_FILE)
+ .cfg(new EmptySplitTransition()))
+ .build();
+ }
+
+ @Override
+ public Metadata getMetadata() {
+ return RuleDefinition.Metadata.builder()
+ .name("empty_split")
+ .factoryClass(DummyRuleFactory.class)
+ .ancestors(BaseRule.class)
+ .build();
+ }
+ }
}
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
index fb7a3b76a0..fd0502ce4a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsWithDynamicConfigurationsTest.java
@@ -85,4 +85,22 @@ public class ConfigurationsForTargetsWithDynamicConfigurationsTest
BuildConfiguration ruleclass = Iterables.getOnlyElement(deps).getConfiguration();
assertThat(ruleclass.getCpu()).isEqualTo("SET BY SPLIT");
}
+
+ @Test
+ public void testEmptySplitDoesNotSuppressRuleClassTransition() throws Exception {
+ setRulesAvailableInTests(
+ new TestAspects.BaseRule(),
+ new TestAspects.EmptySplitRule(),
+ new TestAspects.RuleClassTransitionRule());
+ scratch.file(
+ "a/BUILD",
+ "empty_split(",
+ " name = 'empty',",
+ " with_empty_transition = ':rule_class',",
+ ")",
+ "rule_class_transition(name='rule_class')");
+ List<ConfiguredTarget> deps = getConfiguredDeps("//a:empty", "with_empty_transition");
+ BuildConfiguration ruleclass = Iterables.getOnlyElement(deps).getConfiguration();
+ assertThat(ruleclass.getCpu()).isEqualTo("SET BY PATCH");
+ }
}