diff options
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"); + } } |