diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java | 64 |
1 files changed, 52 insertions, 12 deletions
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 af68c8b9fa..e942556160 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 @@ -200,6 +200,18 @@ public final class BuildConfiguration { public boolean compatibleWithStrategy(String strategyName) { return true; } + + /** + * Returns the transition that produces the "artifact owner" for this configuration, or null + * if this configuration is its own owner. + * + * <p>If multiple fragments return the same transition, that transition is only applied + * once. Multiple fragments may not return different non-null transitions. + */ + @Nullable + public PatchTransition getArtifactOwnerTransition() { + return null; + } } private static final Label convertLabel(String input) throws OptionsParsingException { @@ -1968,16 +1980,21 @@ public final class BuildConfiguration { if (currentTransition == ConfigurationTransition.NONE) { currentTransition = ruleClassTransition; } else { - currentTransition = new ComposingSplitTransition(ruleClassTransition, - currentTransition); + currentTransition = new ComposingSplitTransition(currentTransition, + ruleClassTransition); } } } - // We don't support rule class configurators (which may need intermediate configurations to - // apply). The only current use of that is LIPO, which can't currently be invoked with dynamic - // configurations (e.g. this code can never get called for LIPO builds). So check that - // if there is a configurator, it's for LIPO, in which case we can ignore it. + /** + * Dynamic configurations don't support rule class configurators (which may need intermediate + * configurations to apply). The only current use of that is LIPO, which dynamic + * configurations have a different code path for: + * {@link com.google.devtools.build.lib.rules.cpp.CppRuleClasses.LIPO_ON_DEMAND}. + * + * So just check that if there is a configurator, it's for LIPO, in which case we can ignore + * it. + */ if (associatedRule != null) { @SuppressWarnings("unchecked") RuleClass.Configurator<?, ?> func = @@ -2606,15 +2623,38 @@ public final class BuildConfiguration { } /** + * Returns the transition that produces the "artifact owner" for this configuration, or null + * if this configuration is its own owner. + * + * <p>This is the dynamic configuration version of {@link #getArtifactOwnerConfiguration}. + */ + @Nullable + public PatchTransition getArtifactOwnerTransition() { + Preconditions.checkState(useDynamicConfigurations()); + PatchTransition ownerTransition = null; + for (Fragment fragment : fragments.values()) { + PatchTransition fragmentTransition = fragment.getArtifactOwnerTransition(); + if (fragmentTransition != null) { + if (ownerTransition != null) { + Verify.verify(ownerTransition == fragmentTransition, + String.format( + "cannot determine owner transition: fragments returning both %s and %s", + ownerTransition.toString(), fragmentTransition.toString())); + } + ownerTransition = fragmentTransition; + } + } + return ownerTransition; + } + + /** * See {@code BuildConfigurationCollection.Transitions.getArtifactOwnerConfiguration()}. + * + * <p>This is the static configuration version of {@link #getArtifactOwnerTransition}. */ public BuildConfiguration getArtifactOwnerConfiguration() { - // Dynamic configurations inherit transitions objects from other configurations exclusively - // for use of Transitions.getDynamicTransition. No other calls to transitions should be - // made for dynamic configurations. - // TODO(bazel-team): enforce the above automatically (without having to explicitly check - // for dynamic configuration mode). - return useDynamicConfigurations() ? this : transitions.getArtifactOwnerConfiguration(); + Preconditions.checkState(!useDynamicConfigurations()); + return transitions.getArtifactOwnerConfiguration(); } /** |