diff options
author | 2015-11-11 16:11:11 +0000 | |
---|---|---|
committer | 2015-11-12 09:00:07 +0000 | |
commit | 3c0af3d90df4e8c3dc1ae8ac2189adb4a019a129 (patch) | |
tree | 4b6eb75767703d00e79ee3abea890875e26fb6f8 /src/main/java/com | |
parent | 90670386407b5e1e1964f7c7b30ad4d2c25ab471 (diff) |
Move initializeExtraActions() unchcnaged (apart from its name) to a separate class, in preparation for calling it from Aspects.
--
MOS_MIGRATED_REVID=107587682
Diffstat (limited to 'src/main/java/com')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java | 120 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java | 94 |
2 files changed, 123 insertions, 91 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java new file mode 100644 index 0000000000..f59281042c --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/analysis/ExtraActionUtils.java @@ -0,0 +1,120 @@ +// Copyright 2015 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.analysis; + +import com.google.common.collect.HashMultimap; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Multimap; +import com.google.devtools.build.lib.actions.Action; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.ExtraActionArtifactsProvider.ExtraArtifactSet; +import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; +import com.google.devtools.build.lib.analysis.config.BuildConfiguration; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; +import com.google.devtools.build.lib.rules.extra.ExtraActionMapProvider; +import com.google.devtools.build.lib.rules.extra.ExtraActionSpec; + +import java.util.List; +import java.util.Set; + +/** + * A collection of static methods related to ExtraActions. + */ +class ExtraActionUtils { + /** + * Scans {@code action_listeners} associated with this build to see if any + * {@code extra_actions} should be added to this configured target. If any + * action_listeners are present, a partial visit of the artifact/action graph + * is performed (for as long as actions found are owned by this {@link + * ConfiguredTarget}). Any actions that match the {@code action_listener} + * get an {@code extra_action} associated. The output artifacts of the + * extra_action are reported to the {@link AnalysisEnvironment} for + * bookkeeping. + */ + static ExtraActionArtifactsProvider createExtraActionProvider( + Set<Action> actionsWithoutExtraAction, List<Artifact> mandatoryStampFiles, + RuleContext ruleContext) { + BuildConfiguration configuration = ruleContext.getConfiguration(); + if (configuration.isHostConfiguration()) { + return ExtraActionArtifactsProvider.EMPTY; + } + + ImmutableList<Artifact> extraActionArtifacts = ImmutableList.of(); + NestedSetBuilder<ExtraArtifactSet> builder = NestedSetBuilder.stableOrder(); + + List<Label> actionListenerLabels = configuration.getActionListeners(); + if (!actionListenerLabels.isEmpty() + && ruleContext.attributes().getAttributeDefinition(":action_listener") != null) { + ExtraActionsVisitor visitor = + new ExtraActionsVisitor(ruleContext, computeMnemonicsToExtraActionMap(ruleContext)); + + // The action list is modified within the body of the loop by the addExtraAction() call, + // thus the copy + for (Action action : ImmutableList.copyOf( + ruleContext.getAnalysisEnvironment().getRegisteredActions())) { + if (!actionsWithoutExtraAction.contains(action)) { + visitor.addExtraAction(action); + } + } + + extraActionArtifacts = visitor.getAndResetExtraArtifacts(); + if (!extraActionArtifacts.isEmpty()) { + builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), extraActionArtifacts)); + } + } + + // Add extra action artifacts from dependencies + for (TransitiveInfoCollection dep : ruleContext.getConfiguredTargetMap().values()) { + ExtraActionArtifactsProvider provider = + dep.getProvider(ExtraActionArtifactsProvider.class); + if (provider != null) { + builder.addTransitive(provider.getTransitiveExtraActionArtifacts()); + } + } + + if (mandatoryStampFiles != null && !mandatoryStampFiles.isEmpty()) { + builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), mandatoryStampFiles)); + } + + if (extraActionArtifacts.isEmpty() && builder.isEmpty()) { + return ExtraActionArtifactsProvider.EMPTY; + } + return new ExtraActionArtifactsProvider(extraActionArtifacts, builder.build()); + } + + /** + * Populates the configuration specific mnemonicToExtraActionMap + * based on all action_listers selected by the user (via the blaze option + * {@code --experimental_action_listener=<target>}). + */ + private static Multimap<String, ExtraActionSpec> computeMnemonicsToExtraActionMap( + RuleContext ruleContext) { + // We copy the multimap here every time. This could be expensive. + Multimap<String, ExtraActionSpec> mnemonicToExtraActionMap = HashMultimap.create(); + for (TransitiveInfoCollection actionListener : + ruleContext.getPrerequisites(":action_listener", Mode.HOST)) { + ExtraActionMapProvider provider = actionListener.getProvider(ExtraActionMapProvider.class); + if (provider == null) { + ruleContext.ruleError(String.format( + "Unable to match experimental_action_listeners to this rule. " + + "Specified target %s is not an action_listener rule", + actionListener.getLabel().toString())); + } else { + mnemonicToExtraActionMap.putAll(provider.getExtraActionMap()); + } + } + return mnemonicToExtraActionMap; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java index e89e91ccd3..a5ed4b46a3 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java @@ -14,22 +14,17 @@ package com.google.devtools.build.lib.analysis; import com.google.common.base.Preconditions; -import com.google.common.collect.HashMultimap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Multimap; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; -import com.google.devtools.build.lib.analysis.ExtraActionArtifactsProvider.ExtraArtifactSet; import com.google.devtools.build.lib.analysis.LicensesProvider.TargetLicense; -import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics; import com.google.devtools.build.lib.analysis.constraints.EnvironmentCollection; import com.google.devtools.build.lib.analysis.constraints.SupportedEnvironments; import com.google.devtools.build.lib.analysis.constraints.SupportedEnvironmentsProvider; -import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.collect.nestedset.Order; @@ -37,8 +32,6 @@ import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.License; import com.google.devtools.build.lib.packages.Rule; import com.google.devtools.build.lib.packages.TargetUtils; -import com.google.devtools.build.lib.rules.extra.ExtraActionMapProvider; -import com.google.devtools.build.lib.rules.extra.ExtraActionSpec; import com.google.devtools.build.lib.rules.test.ExecutionInfoProvider; import com.google.devtools.build.lib.rules.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.rules.test.TestActionBuilder; @@ -49,7 +42,6 @@ import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; import java.util.LinkedHashMap; -import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; @@ -117,7 +109,9 @@ public final class RuleConfiguredTargetBuilder { Preconditions.checkState(runfilesSupport != null); add(TestProvider.class, initializeTestProvider(filesToRunProvider)); } - add(ExtraActionArtifactsProvider.class, initializeExtraActions()); + add(ExtraActionArtifactsProvider.class, ExtraActionUtils.createExtraActionProvider( + actionsWithoutExtraAction, + mandatoryStampFiles, ruleContext)); if (!outputGroupBuilders.isEmpty()) { ImmutableMap.Builder<String, NestedSet<Artifact>> outputGroups = ImmutableMap.builder(); for (Map.Entry<String, NestedSetBuilder<Artifact>> entry : outputGroupBuilders.entrySet()) { @@ -209,88 +203,6 @@ public final class RuleConfiguredTargetBuilder { return new LicensesProviderImpl(builder.build()); } - /** - * Scans {@code action_listeners} associated with this build to see if any - * {@code extra_actions} should be added to this configured target. If any - * action_listeners are present, a partial visit of the artifact/action graph - * is performed (for as long as actions found are owned by this {@link - * ConfiguredTarget}). Any actions that match the {@code action_listener} - * get an {@code extra_action} associated. The output artifacts of the - * extra_action are reported to the {@link AnalysisEnvironment} for - * bookkeeping. - */ - private ExtraActionArtifactsProvider initializeExtraActions() { - BuildConfiguration configuration = ruleContext.getConfiguration(); - if (configuration.isHostConfiguration()) { - return ExtraActionArtifactsProvider.EMPTY; - } - - ImmutableList<Artifact> extraActionArtifacts = ImmutableList.of(); - NestedSetBuilder<ExtraArtifactSet> builder = NestedSetBuilder.stableOrder(); - - List<Label> actionListenerLabels = configuration.getActionListeners(); - if (!actionListenerLabels.isEmpty() - && ruleContext.attributes().getAttributeDefinition(":action_listener") != null) { - ExtraActionsVisitor visitor = - new ExtraActionsVisitor(ruleContext, computeMnemonicsToExtraActionMap()); - - // The action list is modified within the body of the loop by the addExtraAction() call, - // thus the copy - for (Action action : ImmutableList.copyOf( - ruleContext.getAnalysisEnvironment().getRegisteredActions())) { - if (!actionsWithoutExtraAction.contains(action)) { - visitor.addExtraAction(action); - } - } - - extraActionArtifacts = visitor.getAndResetExtraArtifacts(); - if (!extraActionArtifacts.isEmpty()) { - builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), extraActionArtifacts)); - } - } - - // Add extra action artifacts from dependencies - for (TransitiveInfoCollection dep : ruleContext.getConfiguredTargetMap().values()) { - ExtraActionArtifactsProvider provider = - dep.getProvider(ExtraActionArtifactsProvider.class); - if (provider != null) { - builder.addTransitive(provider.getTransitiveExtraActionArtifacts()); - } - } - - if (mandatoryStampFiles != null && !mandatoryStampFiles.isEmpty()) { - builder.add(ExtraArtifactSet.of(ruleContext.getLabel(), mandatoryStampFiles)); - } - - if (extraActionArtifacts.isEmpty() && builder.isEmpty()) { - return ExtraActionArtifactsProvider.EMPTY; - } - return new ExtraActionArtifactsProvider(extraActionArtifacts, builder.build()); - } - - /** - * Populates the configuration specific mnemonicToExtraActionMap - * based on all action_listers selected by the user (via the blaze option - * {@code --experimental_action_listener=<target>}). - */ - private Multimap<String, ExtraActionSpec> computeMnemonicsToExtraActionMap() { - // We copy the multimap here every time. This could be expensive. - Multimap<String, ExtraActionSpec> mnemonicToExtraActionMap = HashMultimap.create(); - for (TransitiveInfoCollection actionListener : - ruleContext.getPrerequisites(":action_listener", Mode.HOST)) { - ExtraActionMapProvider provider = actionListener.getProvider(ExtraActionMapProvider.class); - if (provider == null) { - ruleContext.ruleError(String.format( - "Unable to match experimental_action_listeners to this rule. " - + "Specified target %s is not an action_listener rule", - actionListener.getLabel().toString())); - } else { - mnemonicToExtraActionMap.putAll(provider.getExtraActionMap()); - } - } - return mnemonicToExtraActionMap; - } - private <T extends TransitiveInfoProvider> T findProvider(Class<T> clazz) { return clazz.cast(providers.get(clazz)); } |