aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Carmi Grushko <carmi@google.com>2015-11-11 16:11:11 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2015-11-12 09:00:07 +0000
commit3c0af3d90df4e8c3dc1ae8ac2189adb4a019a129 (patch)
tree4b6eb75767703d00e79ee3abea890875e26fb6f8 /src/main/java/com
parent90670386407b5e1e1964f7c7b30ad4d2c25ab471 (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.java120
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetBuilder.java94
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));
}