diff options
author | 2017-06-02 16:04:07 -0400 | |
---|---|---|
committer | 2017-06-05 10:18:57 -0400 | |
commit | f19fcfebb81759a5ab4fe6bede35195287f89872 (patch) | |
tree | 26a0a1ee0edc18705178a6003cb63c63852139cd /src/main/java/com/google/devtools/build/lib/analysis/config | |
parent | 4169ae7eeea951b9df9b4a77e78411180935a3c6 (diff) |
Automated g4 rollforward of commit b71e99b1f3746103e5d6802eebc24096b3494959.
(Automated g4 rollback of commit de92f9d8ea093416fae999073bbfcf3cf501ab55).
*** Reason for rollback ***
The problems that forced commit de92f9d8ea093416fae999073bbfcf3cf501ab55 were fixed in commit e6392cd380fce14d719890c78d5eb2657e8a6cfc .
*** Original change description being rolled forward ***
Implement dynamically configured LIPO builds.
Quick overview:
- provide a dynamic interface for getting the artifact owner
configuration
- provide a (dynamic) RuleTransitionFactory LIPO_ON_DEMAND to replace
the (static) RuleClass.Configurator LIPO_ON_DEMAND. Eventually
we'll remove the rule class configurator interface entirely....
***
ROLLBACK_OF=156180015
PiperOrigin-RevId: 157865224
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config')
-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 62307e489c..4e37488ad6 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 @@ -207,6 +207,18 @@ public final class BuildConfiguration implements BuildEvent { } /** + * 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; + } + + /** * Returns an extra transition that should apply to top-level targets in this * configuration. Returns null if no transition is needed. * @@ -1997,16 +2009,21 @@ public final class BuildConfiguration implements BuildEvent { 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 = @@ -2646,15 +2663,38 @@ public final class BuildConfiguration implements BuildEvent { } /** + * 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(); } /** |