diff options
author | 2015-11-17 01:54:45 +0000 | |
---|---|---|
committer | 2015-11-17 10:53:19 +0000 | |
commit | eaaa9d0d76a880fc1df1ce818c92b526b2b282c2 (patch) | |
tree | 0b5baa17a4a47f0f3f0fc7b56ebb73a423dd95df /src/main/java/com | |
parent | 6b283e212281ac194011c1245dbe0c559b32779a (diff) |
Emit extra-actions for actions registered by Aspects.
A prerequisite is to pass RuleContext to ConfiguredAspect, so we can read from it the registered actions when we build() the aspect.
--
MOS_MIGRATED_REVID=107997593
Diffstat (limited to 'src/main/java/com')
9 files changed, 50 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java index 6a1fa38b43..fa134f23fb 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BaseRuleClasses.java @@ -27,6 +27,7 @@ import static com.google.devtools.build.lib.syntax.Type.INTEGER; import static com.google.devtools.build.lib.syntax.Type.STRING; import static com.google.devtools.build.lib.syntax.Type.STRING_LIST; +import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.Constants; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -77,7 +78,8 @@ public class BaseRuleClasses { /** * Implementation for the :action_listener attribute. */ - private static final LateBoundLabelList<BuildConfiguration> ACTION_LISTENER = + @VisibleForTesting + static final LateBoundLabelList<BuildConfiguration> ACTION_LISTENER = new LateBoundLabelList<BuildConfiguration>() { @Override public List<Label> getDefault(Rule rule, BuildConfiguration configuration) { diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java index d5ef9e846b..8ffb94df89 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredAspect.java @@ -14,10 +14,14 @@ package com.google.devtools.build.lib.analysis; +import static com.google.devtools.build.lib.analysis.ExtraActionUtils.createExtraActionProvider; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.UnmodifiableIterator; +import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -93,9 +97,11 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider> private final ImmutableMap.Builder<String, Object> skylarkProviderBuilder = ImmutableMap.builder(); private final String name; + private final RuleContext ruleContext; - public Builder(String name) { + public Builder(String name, RuleContext ruleContext) { this.name = name; + this.ruleContext = ruleContext; } /** @@ -159,6 +165,10 @@ public final class ConfiguredAspect implements Iterable<TransitiveInfoProvider> providers.put(SkylarkProviders.class, new SkylarkProviders(skylarkProvidersMap)); } + addProvider(createExtraActionProvider( + ImmutableSet.<Action>of() /* actionsWithoutExtraAction */, + ruleContext)); + return new ConfiguredAspect(name, ImmutableMap.copyOf(providers)); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionArtifactsProvider.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionArtifactsProvider.java index 8f2e1caad9..01b23d988f 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionArtifactsProvider.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionArtifactsProvider.java @@ -78,6 +78,20 @@ public final class ExtraActionArtifactsProvider implements TransitiveInfoProvide return new ExtraActionArtifactsProvider(extraActionArtifacts, transitiveExtraActionArtifacts); } + public static ExtraActionArtifactsProvider merge( + Iterable<ExtraActionArtifactsProvider> providers) { + NestedSetBuilder<Artifact> artifacts = NestedSetBuilder.stableOrder(); + NestedSetBuilder<ExtraArtifactSet> transitiveExtraActionArtifacts = + NestedSetBuilder.stableOrder(); + + for (ExtraActionArtifactsProvider provider : providers) { + artifacts.addTransitive(provider.getExtraActionArtifacts()); + transitiveExtraActionArtifacts.addTransitive(provider.getTransitiveExtraActionArtifacts()); + } + return ExtraActionArtifactsProvider.create( + artifacts.build(), transitiveExtraActionArtifacts.build()); + } + /** The outputs of the extra actions associated with this target. */ private final NestedSet<Artifact> extraActionArtifacts; private final NestedSet<ExtraArtifactSet> transitiveExtraActionArtifacts; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java index 3ef5414323..b05609dd71 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTarget.java @@ -137,6 +137,10 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { SkylarkProviders mergedSkylarkProviders = SkylarkProviders.merge(getAllProviders(base, aspects, SkylarkProviders.class)); + // Merge extra-actions provider. + ExtraActionArtifactsProvider mergedExtraActionProviders = ExtraActionArtifactsProvider.merge( + getAllProviders(base, aspects, ExtraActionArtifactsProvider.class)); + // Validate that all other providers are only provided once. for (ConfiguredAspect configuredAspect : aspects) { for (TransitiveInfoProvider aspectProvider : configuredAspect) { @@ -147,6 +151,9 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { if (SkylarkProviders.class.equals(aClass)) { continue; } + if (ExtraActionArtifactsProvider.class.equals(aClass)) { + continue; + } if (!providers.add(aClass)) { throw new IllegalStateException("Provider " + aClass + " provided twice"); } @@ -154,7 +161,8 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { } if (base.getProvider(OutputGroupProvider.class) == mergedOutputGroupProvider - && base.getProvider(SkylarkProviders.class) == mergedSkylarkProviders) { + && base.getProvider(SkylarkProviders.class) == mergedSkylarkProviders + && base.getProvider(ExtraActionArtifactsProvider.class) == mergedExtraActionProviders) { this.providers = base.providers; } else { ImmutableMap.Builder<Class<? extends TransitiveInfoProvider>, Object> builder = @@ -166,6 +174,9 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { if (SkylarkProviders.class.equals(aClass)) { continue; } + if (ExtraActionArtifactsProvider.class.equals(aClass)) { + continue; + } builder.put(aClass, base.providers.get(aClass)); } if (mergedOutputGroupProvider != null) { @@ -174,6 +185,9 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { if (mergedSkylarkProviders != null) { builder.put(SkylarkProviders.class, mergedSkylarkProviders); } + if (mergedExtraActionProviders != null) { + builder.put(ExtraActionArtifactsProvider.class, mergedExtraActionProviders); + } this.providers = builder.build(); } this.mandatoryStampFiles = base.mandatoryStampFiles; diff --git a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java index 5512a1993b..dc3d6f0f3b 100644 --- a/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/ideinfo/AndroidStudioInfoAspect.java @@ -121,7 +121,7 @@ public class AndroidStudioInfoAspect implements ConfiguredNativeAspectFactory { @Override public ConfiguredAspect create( ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) { - ConfiguredAspect.Builder builder = new Builder(NAME); + ConfiguredAspect.Builder builder = new Builder(NAME, ruleContext); AndroidStudioInfoFilesProvider.Builder providerBuilder = new AndroidStudioInfoFilesProvider.Builder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java index eb856708d9..b0a3e0d914 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidNeverlinkAspect.java @@ -49,7 +49,7 @@ public class AndroidNeverlinkAspect implements ConfiguredNativeAspectFactory { ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) { if (!JavaCommon.getConstraints(ruleContext).contains("android") && !ruleContext.getRule().getRuleClass().startsWith("android_")) { - return new ConfiguredAspect.Builder(NAME).build(); + return new ConfiguredAspect.Builder(NAME, ruleContext).build(); } List<TransitiveInfoCollection> deps = new ArrayList<>(); @@ -65,7 +65,7 @@ public class AndroidNeverlinkAspect implements ConfiguredNativeAspectFactory { deps.addAll(ruleContext.getPrerequisites(attribute, Mode.TARGET)); } - return new ConfiguredAspect.Builder(NAME) + return new ConfiguredAspect.Builder(NAME, ruleContext) .addProvider( AndroidNeverLinkLibrariesProvider.class, new AndroidNeverLinkLibrariesProvider( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java index 529bc4a29e..743c5442a4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AbstractJ2ObjcProtoAspect.java @@ -78,7 +78,7 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec public ConfiguredAspect create( ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) { if (!checkShouldCreateAspect(ruleContext)) { - return new ConfiguredAspect.Builder(NAME).build(); + return new ConfiguredAspect.Builder(NAME, ruleContext).build(); } ProtoSourcesProvider protoSourcesProvider = base.getProvider(ProtoSourcesProvider.class); @@ -110,7 +110,7 @@ public abstract class AbstractJ2ObjcProtoAspect implements ConfiguredNativeAspec NestedSet<Artifact> j2ObjcTransitiveClassMappingFiles = j2ObjcTransitiveClassMappingFiles( ruleContext, classMappingFiles); - return new ConfiguredAspect.Builder(NAME) + return new ConfiguredAspect.Builder(NAME, ruleContext) .addProvider(J2ObjcSrcsProvider.class, j2objcSrcsProvider) .addProvider( J2ObjcMappingFileProvider.class, diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java index 5d28156446..ab1aa8a1db 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcAspect.java @@ -92,7 +92,7 @@ public class J2ObjcAspect implements ConfiguredNativeAspectFactory { @Override public ConfiguredAspect create( ConfiguredTarget base, RuleContext ruleContext, AspectParameters parameters) { - ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(NAME); + ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(NAME, ruleContext); JavaCompilationArgsProvider compilationArgsProvider = base.getProvider(JavaCompilationArgsProvider.class); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java index 707a8963f8..794d746f1e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkylarkAspectFactory.java @@ -80,7 +80,7 @@ public class SkylarkAspectFactory implements ConfiguredAspectFactory { return null; } - ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(name); + ConfiguredAspect.Builder builder = new ConfiguredAspect.Builder(name, ruleContext); SkylarkClassObject struct = (SkylarkClassObject) aspectSkylarkObject; Location loc = struct.getCreationLoc(); |