diff options
Diffstat (limited to 'src/main/java/com/google')
91 files changed, 789 insertions, 430 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java index bbc34931b9..f02185ba2b 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionLookupValue.java @@ -13,16 +13,11 @@ // limitations under the License. package com.google.devtools.build.lib.actions; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.MoreObjects; -import com.google.common.base.MoreObjects.ToStringHelper; import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Maps; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.skyframe.SkyKey; import com.google.devtools.build.skyframe.SkyValue; import java.util.ArrayList; @@ -31,34 +26,37 @@ import java.util.Map; import javax.annotation.Nullable; /** - * Base class for all values which can provide the generating action of an artifact. The primary - * instance of such lookup values is {@code ConfiguredTargetValue}. Values that hold the generating - * actions of target completion values and build info artifacts also fall into this category. + * Base class for all values which can provide the generating action of an artifact. */ -public class ActionLookupValue implements SkyValue { - protected final List<ActionAnalysisMetadata> actions; - @VisibleForSerialization protected final ImmutableMap<Artifact, Integer> generatingActionIndex; - - protected ActionLookupValue( - ActionAnalysisMetadata action, - boolean removeActionAfterEvaluation) { - this(Actions.GeneratingActions.fromSingleAction(action), removeActionAfterEvaluation); - } +public abstract class ActionLookupValue implements SkyValue { + + private final boolean removeActionsAfterEvaluation; - @VisibleForTesting - public ActionLookupValue( - Actions.GeneratingActions generatingActions, boolean removeActionsAfterEvaluation) { - this( - removeActionsAfterEvaluation - ? new ArrayList<>(generatingActions.getActions()) - : ImmutableList.copyOf(generatingActions.getActions()), - generatingActions.getGeneratingActionIndex()); + public ActionLookupValue(boolean removeActionsAfterEvaluation) { + this.removeActionsAfterEvaluation = removeActionsAfterEvaluation; } - protected ActionLookupValue( - List<ActionAnalysisMetadata> actions, ImmutableMap<Artifact, Integer> generatingActionIndex) { - this.actions = actions; - this.generatingActionIndex = generatingActionIndex; + /** + * Returns a list of actions registered by this {@link SkyValue}. + */ + protected abstract ArrayList<ActionAnalysisMetadata> getActions(); + + /** + * Returns a map where keys are artifacts generated by this {@link SkyValue}, and values are + * the index of the action which generates this artifact. + */ + protected abstract ImmutableMap<Artifact, Integer> getGeneratingActionIndex(); + + /** + * Returns the index of the action that generates {@code artifact} in this value, or null if this + * value does not have a generating action for this artifact. The index together with the key for + * this {@link ActionLookupValue} uniquely identifies the action. + * + * <p>Unlike {@link #getAction}, this may be called after action execution. + */ + @Nullable + public Integer getGeneratingActionIndex(Artifact artifact) { + return getGeneratingActionIndex().get(artifact); } /** @@ -73,19 +71,7 @@ public class ActionLookupValue implements SkyValue { if (actionIndex == null) { return null; } - return getActionAnalysisMetadata(actionIndex); - } - - /** - * Returns the index of the action that generates {@code artifact} in this value, or null if this - * value does not have a generating action for this artifact. The index together with the key for - * this {@link ActionLookupValue} uniquely identifies the action. - * - * <p>Unlike {@link #getAction}, this may be called after action execution. - */ - @Nullable - public Integer getGeneratingActionIndex(Artifact artifact) { - return generatingActionIndex.get(artifact); + return getActions().get(actionIndex); } /** @@ -95,17 +81,13 @@ public class ActionLookupValue implements SkyValue { */ @SuppressWarnings("unchecked") // We test to make sure it's an Action. public Action getAction(int index) { - ActionAnalysisMetadata result = getActionAnalysisMetadata(index); + ActionAnalysisMetadata result = getActions().get(index); Preconditions.checkState(result instanceof Action, "Not action: %s %s %s", result, index, this); return (Action) result; } - private ActionAnalysisMetadata getActionAnalysisMetadata(int index) { - return Preconditions.checkNotNull(actions.get(index), "null action: %s %s", index, this); - } - public ActionTemplate<?> getActionTemplate(int index) { - ActionAnalysisMetadata result = getActionAnalysisMetadata(index); + ActionAnalysisMetadata result = getActions().get(index); Preconditions.checkState( result instanceof ActionTemplate, "Not action template: %s %s %s", result, index, this); return (ActionTemplate<?>) result; @@ -116,27 +98,12 @@ public class ActionLookupValue implements SkyValue { * take the proper action. */ public boolean isActionTemplate(int index) { - return actions.get(index) instanceof ActionTemplate; + return getActions().get(index) instanceof ActionTemplate; } /** To be used only when checking consistency of the action graph -- not by other values. */ public Map<Artifact, ActionAnalysisMetadata> getMapForConsistencyCheck() { - return getMapForConsistencyCheck(generatingActionIndex, actions); - } - - protected ToStringHelper getStringHelper() { - return MoreObjects.toStringHelper(this) - .add("actions", actions) - .add("generatingActionIndex", generatingActionIndex); - } - - @Override - public String toString() { - return getStringHelper().toString(); - } - - public int getNumActions() { - return actions.size(); + return getMapForConsistencyCheck(getGeneratingActionIndex(), getActions()); } public static Map<Artifact, ActionAnalysisMetadata> getMapForConsistencyCheck( @@ -146,6 +113,13 @@ public class ActionLookupValue implements SkyValue { } /** + * Returns the number of {@link Action} objects present in this value. + */ + public int getNumActions() { + return getActions().size(); + } + + /** * If this object was initialized with {@code removeActionsAfterEvaluation} and {@link * Action#canRemoveAfterExecution()} is true for {@code action}, then remove this action from this * object's index as a memory-saving measure. The {@code artifact -> index} mapping remains @@ -153,21 +127,18 @@ public class ActionLookupValue implements SkyValue { */ @ThreadSafe public void actionEvaluated(int actionIndex, Action action) { - if (!action.canRemoveAfterExecution()) { - return; - } - if (actions instanceof ArrayList) { + if (removeActionsAfterEvaluation && action.canRemoveAfterExecution()) { // This method may concurrently mutate an ArrayList, which is unsafe on its face. However, // ArrayList mutation on different indices that does not affect the size of the ArrayList is // safe, and that is what does this code does. - ArrayList<ActionAnalysisMetadata> actionArrayList = - (ArrayList<ActionAnalysisMetadata>) actions; + ArrayList<ActionAnalysisMetadata> actionArrayList = getActions(); ActionAnalysisMetadata oldAction = actionArrayList.set(actionIndex, null); Preconditions.checkState( action.equals(oldAction), "Not same: %s %s %s %s", action, oldAction, this, actionIndex); } } + /** * All subclasses of ActionLookupValue "own" artifacts with {@link ArtifactOwner}s that are * subclasses of ActionLookupKey. This allows callers to easily find the value key, while diff --git a/src/main/java/com/google/devtools/build/lib/actions/BasicActionLookupValue.java b/src/main/java/com/google/devtools/build/lib/actions/BasicActionLookupValue.java new file mode 100644 index 0000000000..7ac35c75b3 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/actions/BasicActionLookupValue.java @@ -0,0 +1,69 @@ +// Copyright 2014 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.actions; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.MoreObjects; +import com.google.common.base.MoreObjects.ToStringHelper; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; +import java.util.ArrayList; + +/** + * Basic implementation of {@link ActionLookupValue} where the value itself owns and maintains + * the list of generating actions. + */ +public class BasicActionLookupValue extends ActionLookupValue { + protected final ArrayList<ActionAnalysisMetadata> actions; + @VisibleForSerialization protected final ImmutableMap<Artifact, Integer> generatingActionIndex; + + protected BasicActionLookupValue( + ActionAnalysisMetadata action, + boolean removeActionAfterEvaluation) { + this(Actions.GeneratingActions.fromSingleAction(action), removeActionAfterEvaluation); + } + + protected BasicActionLookupValue( + ArrayList<ActionAnalysisMetadata> actions, + ImmutableMap<Artifact, Integer> generatingActionIndex, + boolean removeActionsAfterEvaluation) { + super(removeActionsAfterEvaluation); + this.actions = actions; + this.generatingActionIndex = generatingActionIndex; + } + + @VisibleForTesting + public BasicActionLookupValue( + Actions.GeneratingActions generatingActions, boolean removeActionsAfterEvaluation) { + this(new ArrayList<>(generatingActions.getActions()), + generatingActions.getGeneratingActionIndex(), + removeActionsAfterEvaluation); + } + + @Override + protected ArrayList<ActionAnalysisMetadata> getActions() { + return actions; + } + + @Override + protected ImmutableMap<Artifact, Integer> getGeneratingActionIndex() { + return generatingActionIndex; + } + + protected ToStringHelper getStringHelper() { + return MoreObjects.toStringHelper(this) + .add("actions", actions) + .add("generatingActionIndex", generatingActionIndex); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java index fa68906b87..f963a22716 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/ConfiguredTargetFactory.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactRoot; import com.google.devtools.build.lib.actions.FailAction; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.analysis.config.BuildConfiguration.Fragment; import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; @@ -233,7 +234,7 @@ public final class ConfiguredTargetFactory { OrderedSetMultimap<Attribute, ConfiguredTargetAndTarget> prerequisiteMap, ImmutableMap<Label, ConfigMatchingProvider> configConditions, @Nullable ToolchainContext toolchainContext) - throws InterruptedException { + throws InterruptedException, ActionConflictException { if (target instanceof Rule) { try { CurrentRuleTracker.beginConfiguredTarget(((Rule) target).getRuleClassObject()); @@ -307,7 +308,7 @@ public final class ConfiguredTargetFactory { OrderedSetMultimap<Attribute, ConfiguredTargetAndTarget> prerequisiteMap, ImmutableMap<Label, ConfigMatchingProvider> configConditions, @Nullable ToolchainContext toolchainContext) - throws InterruptedException { + throws InterruptedException, ActionConflictException { // Load the requested toolchains into the ToolchainContext. if (toolchainContext != null) { @@ -339,36 +340,39 @@ public final class ConfiguredTargetFactory { MissingFragmentPolicy missingFragmentPolicy = configurationFragmentPolicy.getMissingFragmentPolicy(); - if (missingFragmentPolicy != MissingFragmentPolicy.IGNORE - && !configuration.hasAllFragments( - configurationFragmentPolicy.getRequiredConfigurationFragments())) { - if (missingFragmentPolicy == MissingFragmentPolicy.FAIL_ANALYSIS) { - ruleContext.ruleError(missingFragmentError(ruleContext, configurationFragmentPolicy)); - return null; - } - // Otherwise missingFragmentPolicy == MissingFragmentPolicy.CREATE_FAIL_ACTIONS: - return createFailConfiguredTarget(ruleContext); - } - if (rule.getRuleClassObject().isSkylark()) { - // TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder? - return SkylarkRuleConfiguredTargetUtil.buildRule( - ruleContext, - rule.getRuleClassObject().getConfiguredTargetFunction(), - env.getSkylarkSemantics()); - } else { - RuleClass.ConfiguredTargetFactory<ConfiguredTarget, RuleContext> factory = - rule.getRuleClassObject().<ConfiguredTarget, RuleContext>getConfiguredTargetFactory(); - Preconditions.checkNotNull(factory, rule.getRuleClassObject()); - try { + try { + if (missingFragmentPolicy != MissingFragmentPolicy.IGNORE + && !configuration.hasAllFragments( + configurationFragmentPolicy.getRequiredConfigurationFragments())) { + if (missingFragmentPolicy == MissingFragmentPolicy.FAIL_ANALYSIS) { + ruleContext.ruleError(missingFragmentError(ruleContext, configurationFragmentPolicy)); + return null; + } + // Otherwise missingFragmentPolicy == MissingFragmentPolicy.CREATE_FAIL_ACTIONS: + return createFailConfiguredTarget(ruleContext); + } + if (rule.getRuleClassObject().isSkylark()) { + // TODO(bazel-team): maybe merge with RuleConfiguredTargetBuilder? + return SkylarkRuleConfiguredTargetUtil.buildRule( + ruleContext, + rule.getRuleClassObject().getConfiguredTargetFunction(), + env.getSkylarkSemantics()); + } else { + RuleClass.ConfiguredTargetFactory<ConfiguredTarget, RuleContext, ActionConflictException> + factory = + rule.getRuleClassObject() + .<ConfiguredTarget, RuleContext, ActionConflictException> + getConfiguredTargetFactory(); + Preconditions.checkNotNull(factory, rule.getRuleClassObject()); return factory.create(ruleContext); - } catch (RuleErrorException ruleErrorException) { - // Returning null in this method is an indication an error occurred. Exceptions are not - // propagated, as this would show a nasty stack trace to users, and only provide info - // on one specific failure with poor messaging. By returning null, the caller can - // inspect ruleContext for multiple errors and output thorough messaging on each. - return null; } + } catch (RuleErrorException ruleErrorException) { + // Returning null in this method is an indication a rule error occurred. Exceptions are not + // propagated, as this would show a nasty stack trace to users, and only provide info + // on one specific failure with poor messaging. By returning null, the caller can + // inspect ruleContext for multiple errors and output thorough messaging on each. + return null; } } @@ -525,7 +529,8 @@ public final class ConfiguredTargetFactory { * A pseudo-implementation for configured targets that creates fail actions for all declared * outputs, both implicit and explicit. */ - private static ConfiguredTarget createFailConfiguredTarget(RuleContext ruleContext) { + private static ConfiguredTarget createFailConfiguredTarget(RuleContext ruleContext) + throws RuleErrorException, ActionConflictException { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(ruleContext); if (!ruleContext.getOutputArtifacts().isEmpty()) { ruleContext.registerAction(new FailAction(ruleContext.getActionOwner(), 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 954f512c4d..e40d8d3ac6 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 @@ -20,7 +20,10 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.Actions; +import com.google.devtools.build.lib.actions.Actions.GeneratingActions; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.analysis.constraints.ConstraintSemantics; import com.google.devtools.build.lib.analysis.constraints.EnvironmentCollection; @@ -40,6 +43,7 @@ import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.Provider; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.syntax.EvalException; import com.google.devtools.build.lib.syntax.Type; @@ -76,10 +80,8 @@ public final class RuleConfiguredTargetBuilder { add(VisibilityProvider.class, new VisibilityProviderImpl(ruleContext.getVisibility())); } - /** - * Constructs the RuleConfiguredTarget instance based on the values set for this Builder. - */ - public ConfiguredTarget build() { + /** Constructs the RuleConfiguredTarget instance based on the values set for this Builder. */ + public ConfiguredTarget build() throws RuleErrorException, ActionConflictException { if (ruleContext.getConfiguration().enforceConstraints()) { checkConstraints(); } @@ -140,8 +142,15 @@ public final class RuleConfiguredTargetBuilder { } TransitiveInfoProviderMap providers = providersBuilder.build(); - - return new RuleConfiguredTarget(ruleContext, providers); + AnalysisEnvironment analysisEnvironment = ruleContext.getAnalysisEnvironment(); + GeneratingActions generatingActions = + Actions.filterSharedActionsAndThrowActionConflict( + analysisEnvironment.getActionKeyContext(), analysisEnvironment.getRegisteredActions()); + return new RuleConfiguredTarget( + ruleContext, + providers, + generatingActions.getActions(), + generatingActions.getGeneratingActionIndex()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java index 30b1ef31e6..ba6272de8d 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleConfiguredTargetFactory.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.analysis; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.packages.RuleClass; /** @@ -21,100 +22,103 @@ import com.google.devtools.build.lib.packages.RuleClass; * * <p>Here follows an overview of how loading and analysis works in Bazel: * - * <p>Actions (i.e. commands that are run during the build) are created by configured targets - * (see {@link ConfiguredTarget}), which are a pair of a target (e.g. <code>//src:bazel</code>) and - * a {@link com.google.devtools.build.lib.analysis.config.BuildConfiguration}, which is a blob of - * data that contains extra information about how the target should be built (for example, for which + * <p>Actions (i.e. commands that are run during the build) are created by configured targets (see + * {@link ConfiguredTarget}), which are a pair of a target (e.g. <code>//src:bazel</code>) and a + * {@link com.google.devtools.build.lib.analysis.config.BuildConfiguration}, which is a blob of data + * that contains extra information about how the target should be built (for example, for which * platform or with which C++ preprocessor definitions). Accordingly, a target can give rise to * multiple configured targets, for example, if it needs to be built both for the host and the * target configuration. * * <p>The process of creating the appropriate {@link com.google.devtools.build.lib.actions.Action}s * for a configured target is called "analysis". The analysis of a configured target is composed of - * the following steps (which process is orchestrated by - * {@link com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction}): + * the following steps (which process is orchestrated by {@link + * com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction}): + * * <ol> - * <li>The corresponding {@link com.google.devtools.build.lib.packages.Target} is loaded, i.e. - * the BUILD file is parsed.</li> - * <li>Its direct dependencies are analyzed, during which in turn indirect dependencies are - * also analyzed.</li> + * <li>The corresponding {@link com.google.devtools.build.lib.packages.Target} is loaded, i.e. the + * BUILD file is parsed. + * <li>Its direct dependencies are analyzed, during which in turn indirect dependencies are also + * analyzed. * <li>Aspects specified by the configured target are analyzed. These can be thought of as - * visitations of the transitive dependencies of the target. For more information, see - * {@link com.google.devtools.build.lib.packages.AspectClass}. + * visitations of the transitive dependencies of the target. For more information, see {@link + * com.google.devtools.build.lib.packages.AspectClass}. * <li>The configured target and the actions it generates are created based on the data from the - * previous two steps.</li> + * previous two steps. * </ol> * * Targets can be of three main kinds (plus a few special ones which are not important for * understanding the big picture): + * * <p> - * <li>Input and output files. These represent either a file that is in the source tree or a - * file produced by during the build. Not every file produced during the build has a - * corresponding output file target.</li> - * <li>Rules. These describe things a build actually does. Each rule has a class (e.g. - * <code>cc_binary</code>). Rule classes can be defined either in Skylark using the - * <code>rule()</code> function or in Java code by implementing - * {@link com.google.devtools.build.lib.analysis.RuleDefinition}.</li> - * </p> - * <p>During the analysis of a configured target, the following pieces of data are available: - * <ul> - * <li>The corresponding target itself. This is necessary so that the analysis has access to e.g. - * the attributes a rule has in the BUILD file.</li> - * <li>The {@link com.google.devtools.build.lib.analysis.TransitiveInfoCollection}s of direct - * dependencies. They are used to gather information from the transitive closure, for example, - * the include path entries for C++ compilation or all the object files that need to be - * compiled into a C++ binary.</li> - * <li>The configuration, which is used to determine which compiler to use and to get access - * to some command line options of Bazel that influence analysis.</li> - * <li>Skyframe, for requesting arbitrary Skyframe nodes. This is an escape hatch that should be - * used when other mechanisms provided are not suitable and allows one to e.g. read arbitrary - * files. With great power... - * </ul> + * <li>Input and output files. These represent either a file that is in the source tree or a file + * produced by during the build. Not every file produced during the build has a corresponding + * output file target. + * <li>Rules. These describe things a build actually does. Each rule has a class (e.g. <code> + * cc_binary</code>). Rule classes can be defined either in Skylark using the <code>rule() + * </code> function or in Java code by implementing {@link + * com.google.devtools.build.lib.analysis.RuleDefinition}. + * + * <p>During the analysis of a configured target, the following pieces of data are available: + * + * <ul> + * <li>The corresponding target itself. This is necessary so that the analysis has access to + * e.g. the attributes a rule has in the BUILD file. + * <li>The {@link com.google.devtools.build.lib.analysis.TransitiveInfoCollection}s of direct + * dependencies. They are used to gather information from the transitive closure, for + * example, the include path entries for C++ compilation or all the object files that need + * to be compiled into a C++ binary. + * <li>The configuration, which is used to determine which compiler to use and to get access + * to some command line options of Bazel that influence analysis. + * <li>Skyframe, for requesting arbitrary Skyframe nodes. This is an escape hatch that should + * be used when other mechanisms provided are not suitable and allows one to e.g. read + * arbitrary files. With great power... + * </ul> + * + * <p>Analysis of non-rule configured targets is special-cased and is not covered here. * - * <p>Analysis of non-rule configured targets is special-cased and is not covered here. + * <p>The analysis of a rule itself is done by implementations {@link + * RuleConfiguredTargetFactory} (there should be one for each rule class). The data above is + * available using the {@link RuleContext} argument passed into its create() method. It should + * result in three things: * - * <p>The analysis of a rule itself is done by implementations {@link RuleConfiguredTargetFactory} - * (there should be one for each rule class). The data above is available using the - * {@link RuleContext} argument passed into its create() method. It should - * result in three things: - * <ul> - * <li>A set of actions. These should be passed to - * {@link RuleContext#registerAction(ActionAnalysisMetadata...)}, although for more - * common cases (e.g. {@link com.google.devtools.build.lib.analysis.actions.SpawnAction}), - * shortcuts are provided.</li> - * <li>A set of artifacts (files produced by actions). These should be created using methods of - * {@link RuleContext}. Each artifact thus created must have a generating action.</li> - * <li>A set of {@link com.google.devtools.build.lib.analysis.TransitiveInfoProvider}s that are - * passed on to direct dependencies. These must be registered using - * {@link com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder#add( - * Class, com.google.devtools.build.lib.analysis.TransitiveInfoProvider)} - * </li> - * </ul> + * <ul> + * <li>A set of actions. These should be passed to {@link + * RuleContext#registerAction(ActionAnalysisMetadata...)}, although for more common cases + * (e.g. {@link com.google.devtools.build.lib.analysis.actions.SpawnAction}), shortcuts + * are provided. + * <li>A set of artifacts (files produced by actions). These should be created using methods + * of {@link RuleContext}. Each artifact thus created must have a generating action. + * <li>A set of {@link com.google.devtools.build.lib.analysis.TransitiveInfoProvider}s that + * are passed on to direct dependencies. These must be registered using {@link + * com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder#add( Class, + * com.google.devtools.build.lib.analysis.TransitiveInfoProvider)} + * </ul> * - * <p>Configured targets are currently allowed to create artifacts at any exec path. It would be - * better if they could be constrained to a subtree based on the label of the configured target, - * but this is currently not feasible because multiple rules violate this constraint and the - * output format is part of its interface. + * <p>Configured targets are currently allowed to create artifacts at any exec path. It would be + * better if they could be constrained to a subtree based on the label of the configured target, + * but this is currently not feasible because multiple rules violate this constraint and the + * output format is part of its interface. * - * <p>In principle, multiple configured targets should not create actions with conflicting - * outputs. There are still a few exceptions to this rule that are slated to be eventually - * removed, we have provisions to handle this case (Action instances that share at least one - * output file are required to be exactly the same), but this does put some pressure on the design - * and we are eventually planning to eliminate this option. + * <p>In principle, multiple configured targets should not create actions with conflicting + * outputs. There are still a few exceptions to this rule that are slated to be eventually + * removed, we have provisions to handle this case (Action instances that share at least one + * output file are required to be exactly the same), but this does put some pressure on the + * design and we are eventually planning to eliminate this option. * - * <p>These restrictions together make it possible to: - * <ul> - * <li>Correctly cache the analysis phase; by tightly constraining what a configured target is - * allowed to access and what it is not, we can know when it needs to invalidate a particular - * one and when it can reuse an already existing one. - * <li>Serialize / deserialize individual configured targets at will, making it possible for - * example to swap out part of the analysis state if there is memory pressure or to move them in - * persistent storage so that the state can be reconstructed at a different time or in a - * different process. The stretch goal is to eventually facilitate cross-user caching of this - * information. - * </ul> + * <p>These restrictions together make it possible to: * + * <ul> + * <li>Correctly cache the analysis phase; by tightly constraining what a configured target is + * allowed to access and what it is not, we can know when it needs to invalidate a + * particular one and when it can reuse an already existing one. + * <li>Serialize / deserialize individual configured targets at will, making it possible for + * example to swap out part of the analysis state if there is memory pressure or to move + * them in persistent storage so that the state can be reconstructed at a different time + * or in a different process. The stretch goal is to eventually facilitate cross-user + * caching of this information. + * </ul> */ public interface RuleConfiguredTargetFactory - extends RuleClass.ConfiguredTargetFactory<ConfiguredTarget, RuleContext> { -} + extends RuleClass.ConfiguredTargetFactory< + ConfiguredTarget, RuleContext, ActionConflictException> {} diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java index 60d75e1ede..87e2130b86 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkTreeAction.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.Fingerprint; /** @@ -31,6 +32,7 @@ import com.google.devtools.build.lib.util.Fingerprint; * Used to generate runfiles and fileset symlink farms. */ @Immutable +@AutoCodec public final class SymlinkTreeAction extends AbstractAction { private static final String GUID = "63412bda-4026-4c8e-a3ad-7deb397728d4"; @@ -51,6 +53,7 @@ public final class SymlinkTreeAction extends AbstractAction { * @param filesetTree true if this is fileset symlink tree, * @param enableRunfiles true is the actual symlink tree needs to be created. */ + @AutoCodec.Instantiator public SymlinkTreeAction( ActionOwner owner, Artifact inputManifest, diff --git a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java index 770fee7edd..54b271f88b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/configuredtargets/RuleConfiguredTarget.java @@ -19,6 +19,8 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Interner; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -46,6 +48,8 @@ import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec. import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter; import com.google.devtools.build.lib.syntax.Printer; +import java.util.ArrayList; +import java.util.List; import java.util.function.Consumer; import javax.annotation.Nullable; @@ -58,6 +62,8 @@ import javax.annotation.Nullable; */ @AutoCodec public final class RuleConfiguredTarget extends AbstractConfiguredTarget { + private static final String ACTIONS_FIELD_NAME = "actions"; + /** * The configuration transition for an attribute through which a prerequisite * is requested. @@ -80,9 +86,12 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { private static final Interner<ImmutableSet<ConfiguredTargetKey>> IMPLICIT_DEPS_INTERNER = BlazeInterners.newWeakInterner(); + private boolean actionsAccessible = true; private final TransitiveInfoProviderMap providers; private final ImmutableMap<Label, ConfigMatchingProvider> configConditions; private final String ruleClassString; + private final ArrayList<ActionAnalysisMetadata> actions; + private final ImmutableMap<Artifact, Integer> generatingActionIndex; @Instantiator @VisibleForSerialization @@ -93,8 +102,11 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { TransitiveInfoProviderMap providers, ImmutableMap<Label, ConfigMatchingProvider> configConditions, ImmutableSet<ConfiguredTargetKey> implicitDeps, - String ruleClassString) { + String ruleClassString, + List<ActionAnalysisMetadata> actions, + ImmutableMap<Artifact, Integer> generatingActionIndex) { super(label, configuration, visibility); + // We don't use ImmutableMap.Builder here to allow augmenting the initial list of 'default' // providers by passing them in. TransitiveInfoProviderMapBuilder providerBuilder = @@ -115,9 +127,15 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { this.configConditions = configConditions; this.implicitDeps = IMPLICIT_DEPS_INTERNER.intern(implicitDeps); this.ruleClassString = ruleClassString; + this.actions = new ArrayList<>(actions); + this.generatingActionIndex = generatingActionIndex; } - public RuleConfiguredTarget(RuleContext ruleContext, TransitiveInfoProviderMap providers) { + public RuleConfiguredTarget( + RuleContext ruleContext, + TransitiveInfoProviderMap providers, + List<? extends ActionAnalysisMetadata> actions, + ImmutableMap<Artifact, Integer> generatingActionIndex) { this( ruleContext.getLabel(), ruleContext.getConfiguration(), @@ -125,7 +143,9 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { providers, ruleContext.getConfigConditions(), Util.findImplicitDeps(ruleContext), - ruleContext.getRule().getRuleClass()); + ruleContext.getRule().getRuleClass(), + (List<ActionAnalysisMetadata>) actions, + generatingActionIndex); // If this rule is the run_under target, then check that we have an executable; note that // run_under is only set in the target configuration, and the target must also be analyzed for @@ -184,6 +204,7 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { result.accept((String) classAt); } } + result.accept(ACTIONS_FIELD_NAME); } @Override @@ -193,6 +214,9 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { @Override protected Object rawGetSkylarkProvider(String providerKey) { + if (providerKey.equals(ACTIONS_FIELD_NAME)) { + return actionsAccessible ? actions : ImmutableList.of(); + } return providers.getProvider(providerKey); } @@ -217,4 +241,22 @@ public final class RuleConfiguredTarget extends AbstractConfiguredTarget { printer.append(Joiner.on(", ").join(skylarkProviderKeyStrings.build())); printer.append("]>"); } + + /** Returns a list of actions that this configured target generated. */ + public ArrayList<ActionAnalysisMetadata> getActions() { + return actions; + } + + /** + * Returns a map where keys are artifacts that are action outputs of this rule, and values are the + * index of the action that generates that artifact. + */ + public ImmutableMap<Artifact, Integer> getGeneratingActionIndex() { + return generatingActionIndex; + } + + /** Disables accessing actions via a provider skylark interface. */ + public void disableAcccesibleActions() { + this.actionsAccessible = false; + } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java index f31d26c3f4..c0e8493290 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/constraints/Environment.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.analysis.constraints; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -24,6 +25,7 @@ import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.EnvironmentGroup; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; /** * Implementation for the environment rule. @@ -31,7 +33,8 @@ import com.google.devtools.build.lib.packages.EnvironmentGroup; public class Environment implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { // The main analysis work to do here is to simply fill in SupportedEnvironmentsProvider to // pass the environment itself to depending rules. diff --git a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java index d22857e84d..f1aac64627 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/skylark/SkylarkRuleConfiguredTargetUtil.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ActionsProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.DefaultInfo; @@ -35,6 +36,7 @@ import com.google.devtools.build.lib.events.Location; import com.google.devtools.build.lib.packages.Info; import com.google.devtools.build.lib.packages.NativeProvider; import com.google.devtools.build.lib.packages.Rule; +import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.TargetUtils; import com.google.devtools.build.lib.skylarkinterface.SkylarkValue; import com.google.devtools.build.lib.syntax.BaseFunction; @@ -69,14 +71,10 @@ public final class SkylarkRuleConfiguredTargetUtil { private static final ImmutableSet<String> DEFAULT_PROVIDER_FIELDS = ImmutableSet.of("files", "runfiles", "data_runfiles", "default_runfiles", "executable"); - /** - * Create a Rule Configured Target from the ruleContext and the ruleImplementation. - */ + /** Create a Rule Configured Target from the ruleContext and the ruleImplementation. */ public static ConfiguredTarget buildRule( - RuleContext ruleContext, - BaseFunction ruleImplementation, - SkylarkSemantics skylarkSemantics) - throws InterruptedException { + RuleContext ruleContext, BaseFunction ruleImplementation, SkylarkSemantics skylarkSemantics) + throws InterruptedException, RuleErrorException, ActionConflictException { String expectFailure = ruleContext.attributes().get("expect_failure", Type.STRING); SkylarkRuleContext skylarkRuleContext = null; try (Mutability mutability = Mutability.create("configured target")) { @@ -152,7 +150,7 @@ public final class SkylarkRuleConfiguredTargetUtil { } private static ConfiguredTarget createTarget(SkylarkRuleContext context, Object target) - throws EvalException { + throws EvalException, RuleErrorException, ActionConflictException { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder( context.getRuleContext()); // Set the default files to build. diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntime.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntime.java index a65dac423a..4c96dbe5cb 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntime.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/python/BazelPyRuntime.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.bazel.rules.python; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -34,7 +35,7 @@ public final class BazelPyRuntime implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSet<Artifact> files = PrerequisiteArtifacts.nestedSet(ruleContext, "files", Mode.TARGET); Artifact interpreter = diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java index 8150feaed9..85de9e98d2 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShBinary.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.bazel.rules.sh; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -42,7 +43,8 @@ public class ShBinary implements RuleConfiguredTargetFactory { Template.forResource(ShBinary.class, "sh_stub_template_windows.txt"); @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { ImmutableList<Artifact> srcs = ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list(); if (srcs.size() != 1) { ruleContext.attributeError("srcs", "you must specify exactly one file in 'srcs'"); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java index ce715e1f1b..10fc471b96 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/sh/ShLibrary.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.bazel.rules.sh; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -30,7 +31,8 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; public class ShLibrary implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSet<Artifact> filesToBuild = NestedSetBuilder.<Artifact>stableOrder() .addAll(ruleContext.getPrerequisiteArtifacts("srcs", Mode.TARGET).list()) .addAll(ruleContext.getPrerequisiteArtifacts("deps", Mode.TARGET).list()) diff --git a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java index 51db54310a..34e246f30e 100644 --- a/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java +++ b/src/main/java/com/google/devtools/build/lib/packages/RuleClass.java @@ -174,22 +174,23 @@ public class RuleClass { } } - /** - * A factory or builder class for rule implementations. - */ - public interface ConfiguredTargetFactory<TConfiguredTarget, TContext> { + /** A factory or builder class for rule implementations. */ + public interface ConfiguredTargetFactory< + TConfiguredTarget, TContext, TActionConflictException extends Throwable> { /** * Returns a fully initialized configured target instance using the given context. * * @throws RuleErrorException if configured target creation could not be completed due to rule - * errors + * errors + * @throws TActionConflictException if there were conflicts during action registration */ - TConfiguredTarget create(TContext ruleContext) throws InterruptedException, RuleErrorException; + TConfiguredTarget create(TContext ruleContext) + throws InterruptedException, RuleErrorException, TActionConflictException; /** - * Exception indicating that configured target creation could not be completed. Error messaging - * should be done via {@link RuleErrorConsumer}; this exception only interrupts configured - * target creation in cases where it can no longer continue. + * Exception indicating that configured target creation could not be completed. General error + * messaging should be done via {@link RuleErrorConsumer}; this exception only interrupts + * configured target creation in cases where it can no longer continue. */ public static final class RuleErrorException extends Exception {} } @@ -586,7 +587,7 @@ public class RuleClass { private ImplicitOutputsFunction implicitOutputsFunction = ImplicitOutputsFunction.NONE; private RuleTransitionFactory transitionFactory; private RuleTransitionFactory outgoingTransitionFactory; - private ConfiguredTargetFactory<?, ?> configuredTargetFactory = null; + private ConfiguredTargetFactory<?, ?, ?> configuredTargetFactory = null; private PredicateWithMessage<Rule> validityPredicate = PredicatesWithMessage.<Rule>alwaysTrue(); private Predicate<String> preferredDependencyPredicate = Predicates.alwaysFalse(); @@ -911,7 +912,7 @@ public class RuleClass { return this; } - public Builder factory(ConfiguredTargetFactory<?, ?> factory) { + public Builder factory(ConfiguredTargetFactory<?, ?, ?> factory) { this.configuredTargetFactory = factory; return this; } @@ -1225,10 +1226,8 @@ public class RuleClass { */ private final RuleTransitionFactory outgoingTransitionFactory; - /** - * The factory that creates configured targets from this rule. - */ - private final ConfiguredTargetFactory<?, ?> configuredTargetFactory; + /** The factory that creates configured targets from this rule. */ + private final ConfiguredTargetFactory<?, ?, ?> configuredTargetFactory; /** * The constraint the package name of the rule instance must fulfill @@ -1318,7 +1317,7 @@ public class RuleClass { boolean isConfigMatcher, RuleTransitionFactory transitionFactory, RuleTransitionFactory outgoingRuleTransitionFactory, - ConfiguredTargetFactory<?, ?> configuredTargetFactory, + ConfiguredTargetFactory<?, ?, ?> configuredTargetFactory, PredicateWithMessage<Rule> validityPredicate, Predicate<String> preferredDependencyPredicate, AdvertisedProviderSet advertisedProviders, @@ -1421,8 +1420,9 @@ public class RuleClass { } @SuppressWarnings("unchecked") - public <CT, RC> ConfiguredTargetFactory<CT, RC> getConfiguredTargetFactory() { - return (ConfiguredTargetFactory<CT, RC>) configuredTargetFactory; + public <CT, RC, ACE extends Throwable> + ConfiguredTargetFactory<CT, RC, ACE> getConfiguredTargetFactory() { + return (ConfiguredTargetFactory<CT, RC, ACE>) configuredTargetFactory; } /** diff --git a/src/main/java/com/google/devtools/build/lib/rules/Alias.java b/src/main/java/com/google/devtools/build/lib/rules/Alias.java index 364f6744ea..ad57397452 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/Alias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/Alias.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -38,7 +39,7 @@ import com.google.devtools.build.lib.util.FileTypeSet; public class Alias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite("actual", Mode.TARGET); return new AliasConfiguredTarget( ruleContext, diff --git a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java index 6ddc531fa0..d0d25b282a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java +++ b/src/main/java/com/google/devtools/build/lib/rules/ToolchainType.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules; import com.google.common.base.Function; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PlatformConfiguration; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -62,7 +63,7 @@ public class ToolchainType implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { if (fragmentMap == null && fragmentMapFromRuleContext != null) { this.fragmentMap = fragmentMapFromRuleContext.apply(ruleContext); } diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java index 935844b15f..d0e1f37621 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AarImport.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -60,7 +61,7 @@ public class AarImport implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { AndroidSdkProvider.verifyPresence(ruleContext); RuleConfiguredTargetBuilder ruleBuilder = new RuleConfiguredTargetBuilder(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java index d70f57bc1d..44a171ae27 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidBinary.java @@ -31,6 +31,7 @@ import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.SpecialArtifact; import com.google.devtools.build.lib.actions.CommandLine; import com.google.devtools.build.lib.actions.FailAction; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.ParamFileInfo; import com.google.devtools.build.lib.actions.ParameterFile; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -93,7 +94,7 @@ public abstract class AndroidBinary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { CppSemantics cppSemantics = createCppSemantics(); JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java index f637f816e1..68a4f95f4a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDevice.java @@ -24,6 +24,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.ResourceSet; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; @@ -83,7 +84,7 @@ public class AndroidDevice implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { checkWhitelist(ruleContext); Artifact executable = ruleContext.createOutputArtifact(); Artifact metadata = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixture.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixture.java index fa3424d04b..ce7ed5666c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixture.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidDeviceScriptFixture.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -33,7 +34,7 @@ public class AndroidDeviceScriptFixture implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Artifact fixtureScript = getFixtureScript(ruleContext); return new RuleConfiguredTargetBuilder(ruleContext) .setFilesToBuild(NestedSetBuilder.<Artifact>stableOrder().add(fixtureScript).build()) diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java index 9996d47e5d..c8fbbe06bc 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidHostServiceFixture.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -31,7 +32,7 @@ public class AndroidHostServiceFixture implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { RuleConfiguredTargetBuilder ruleBuilder = new RuleConfiguredTargetBuilder(ruleContext); NestedSet<Artifact> supportApks = AndroidCommon.getSupportApks(ruleContext); FilesToRunProvider executable = ruleContext.getExecutablePrerequisite("executable", Mode.HOST); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java index 6a1523c5d5..abc34c1a9b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidInstrumentationTest.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Streams; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -63,7 +64,7 @@ public class AndroidInstrumentationTest implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { validateRuleContext(ruleContext); // The wrapper script that invokes the test entry point. diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java index 6173e3c890..21fcb618ba 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLibrary.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -109,7 +110,7 @@ public abstract class AndroidLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { validateRuleContext(ruleContext); JavaSemantics javaSemantics = createJavaSemantics(); AndroidSemantics androidSemantics = createAndroidSemantics(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java index 11dc93ed06..21cee094e2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidLocalTestBase.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.OutputGroupInfo; @@ -71,7 +72,7 @@ public abstract class AndroidLocalTestBase implements RuleConfiguredTargetFactor @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ruleContext.checkSrcsSamePackage(true); diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java index e8f7051b80..6ba38ddb12 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidSdk.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -32,7 +33,7 @@ import com.google.devtools.build.lib.syntax.Type; public class AndroidSdk implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { // If the user didn't specify --proguard_top, go with the proguard attribute in the android_sdk // rule. Otherwise, use what she told us to. FilesToRunProvider proguard = diff --git a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java index 36a889f6c4..1afc07f214 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java +++ b/src/main/java/com/google/devtools/build/lib/rules/android/AndroidToolsDefaultsJar.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.android; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -37,7 +38,7 @@ public class AndroidToolsDefaultsJar implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Artifact androidJar = AndroidSdkProvider.fromRuleContext(ruleContext).getAndroidJar(); return new RuleConfiguredTargetBuilder(ruleContext) diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD index a40e8f8ad9..4ad39bc4f1 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/BUILD @@ -17,6 +17,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:packages-internal", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", "//src/main/java/com/google/devtools/build/lib:syntax", + "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/analysis/skylark/annotations", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/concurrent", diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java index abb00c0a21..d9ae4a09c4 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfig.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Maps; import com.google.common.collect.Streams; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -50,7 +51,7 @@ public class XcodeConfig implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { AppleConfiguration appleConfig = ruleContext.getFragment(AppleConfiguration.class); AppleCommandLineOptions appleOptions = appleConfig.getOptions(); XcodeVersionRuleData defaultVersion = ruleContext.getPrerequisite( diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigAlias.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigAlias.java index a2d89f201b..677ff91a57 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigAlias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeConfigAlias.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.apple; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -38,7 +39,7 @@ import com.google.devtools.build.lib.rules.AliasConfiguredTarget; public class XcodeConfigAlias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite( XcodeConfigRule.XCODE_CONFIG_ATTR_NAME, Mode.TARGET); return new AliasConfiguredTarget( diff --git a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java index f341cbca45..6529c5b014 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java +++ b/src/main/java/com/google/devtools/build/lib/rules/apple/XcodeVersion.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.apple; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -27,7 +28,7 @@ public class XcodeVersion implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { XcodeVersionRuleData ruleData = new XcodeVersionRuleData(ruleContext.getLabel(), ruleContext.getRule()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java index 175588cc6d..4326d4a23c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java +++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigFeatureFlag.java @@ -25,6 +25,7 @@ import com.google.common.collect.ImmutableMultiset; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Multiset; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -37,7 +38,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.Attribute; import com.google.devtools.build.lib.packages.Attribute.ComputedDefault; import com.google.devtools.build.lib.packages.AttributeMap; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.syntax.Printer; import java.util.List; import java.util.Optional; @@ -89,7 +89,7 @@ public class ConfigFeatureFlag implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { if (!ConfigFeatureFlag.isAvailable(ruleContext)) { ruleContext.ruleError( String.format( diff --git a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java index 701c11ac15..1d475f97ea 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java +++ b/src/main/java/com/google/devtools/build/lib/rules/config/ConfigSetting.java @@ -28,6 +28,7 @@ import com.google.common.collect.ListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Multiset; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; @@ -50,7 +51,6 @@ import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.AttributeMap; import com.google.devtools.build.lib.packages.BuildType; import com.google.devtools.build.lib.packages.NonconfigurableAttributeMapper; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.packages.RuleErrorConsumer; import com.google.devtools.build.lib.rules.config.ConfigRuleClasses.ConfigSettingRule; import com.google.devtools.build.lib.syntax.Type; @@ -73,7 +73,7 @@ public class ConfigSetting implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { AttributeMap attributes = NonconfigurableAttributeMapper.of(ruleContext.getRule()); // Get the built-in Blaze flag settings that match this rule. ImmutableMultimap<String, String> nativeFlagSettings = diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java index 351644e91a..36c281f4db 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcBinary.java @@ -23,6 +23,7 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.ExecutionRequirements; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.ParamFileInfo; import com.google.devtools.build.lib.actions.ParameterFile.ParameterFileType; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -161,12 +162,12 @@ public abstract class CcBinary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext context) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { return CcBinary.init(semantics, context, /*fake =*/ false); } public static ConfiguredTarget init(CppSemantics semantics, RuleContext ruleContext, boolean fake) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ruleContext.checkSrcsSamePackage(true); CcCommon common = new CcCommon(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java index 031555bc49..3a100a777e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcImport.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -43,7 +44,7 @@ public abstract class CcImport implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws RuleErrorException, InterruptedException { + throws InterruptedException, RuleErrorException, ActionConflictException { Artifact staticLibrary = ruleContext.getPrerequisiteArtifact("static_library", Mode.TARGET); Artifact sharedLibrary = ruleContext.getPrerequisiteArtifact("shared_library", Mode.TARGET); Artifact interfaceLibrary = diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java index 3463012abd..84f86c7864 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcLibrary.java @@ -19,6 +19,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.FailAction; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.MakeVariableSupplier.MapBackedMakeVariableSupplier; import com.google.devtools.build.lib.analysis.OutputGroupInfo; @@ -89,7 +90,7 @@ public abstract class CcLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext context) - throws RuleErrorException, InterruptedException { + throws InterruptedException, RuleErrorException, ActionConflictException { RuleConfiguredTargetBuilder builder = new RuleConfiguredTargetBuilder(context); LinkTargetType staticLinkType = getStaticLinkType(context); boolean linkStatic = context.attributes().get("linkstatic", Type.BOOLEAN); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java index 8af5f16b19..4478b63cc0 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcTest.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.cpp; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -31,7 +32,7 @@ public abstract class CcTest implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext context) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { return CcBinary.init(semantics, context, /*fake =*/ false); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java index 11628db62f..a62abb5a16 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchain.java @@ -21,6 +21,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AnalysisUtils; import com.google.devtools.build.lib.analysis.CompilationHelper; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -303,7 +304,7 @@ public class CcToolchain implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws RuleErrorException, InterruptedException { + throws InterruptedException, RuleErrorException, ActionConflictException { TransitiveInfoCollection lipoContextCollector = ruleContext.getPrerequisite( TransitiveLipoInfoProvider.LIPO_CONTEXT_COLLECTOR, Mode.DONT_CHECK); diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java index dd401493c2..57837f6c21 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainAlias.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -38,7 +39,7 @@ public class CcToolchainAlias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite(":cc_toolchain", Mode.TARGET); return new AliasConfiguredTarget( diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java index e7d2089491..59b560a195 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CcToolchainSuite.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.cpp; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -34,7 +35,7 @@ public class CcToolchainSuite implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder(); for (TransitiveInfoCollection dep : ruleContext.getPrerequisiteMap("toolchains").values()) { CcToolchainProvider provider = diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java index da5d46bac4..91d76ebf22 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/proto/CcProtoLibrary.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.cpp.proto; import static com.google.common.base.Preconditions.checkNotNull; import static com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode.TARGET; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -29,7 +30,7 @@ import com.google.devtools.build.lib.rules.cpp.CcSkylarkApiProvider; public class CcProtoLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { if (ruleContext.getPrerequisites("deps", TARGET).size() != 1) { ruleContext.throwWithAttributeError( diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java index 82325c82ba..afbb2da522 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java +++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ActionListener.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.extra; import com.google.common.collect.Multimap; import com.google.common.collect.Sets; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -36,7 +37,8 @@ import java.util.Set; */ public final class ActionListener implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { // This rule doesn't produce any output when listed as a build target. // Only when used via the --experimental_action_listener flag, // this rule instructs the build system to add additional outputs. diff --git a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java index 1eb434e0f7..b2e029dec9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/extra/ExtraActionFactory.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CompositeRunfilesSupplier; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.CommandHelper; import com.google.devtools.build.lib.analysis.ConfigurationMakeVariableContext; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -39,7 +40,8 @@ import java.util.List; */ public final class ExtraActionFactory implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext context) throws RuleErrorException { + public ConfiguredTarget create(RuleContext context) + throws InterruptedException, RuleErrorException, ActionConflictException { // This rule doesn't produce any output when listed as a build target. // Only when used via the --experimental_action_listener flag, // this rule instructs the build system to add additional outputs. diff --git a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java index e8b3309fed..805a12bf77 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java +++ b/src/main/java/com/google/devtools/build/lib/rules/filegroup/Filegroup.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.analysis.OutputGroupInfo.INTERNAL_SU import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.CompilationHelper; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.MiddlemanProvider; @@ -51,7 +52,8 @@ public class Filegroup implements RuleConfiguredTargetFactory { "Output group %s is not permitted for " + "reference in filegroups."; @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { String outputGroupName = ruleContext.attributes().get("output_group", Type.STRING); if (outputGroupName.endsWith(INTERNAL_SUFFIX)) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java index b6619a9ec8..7b8ab125a8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genquery/GenQuery.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionKeyContext; import com.google.devtools.build.lib.actions.ActionOwner; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -104,7 +105,7 @@ public class GenQuery implements RuleConfiguredTargetFactory { @Override @Nullable public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Artifact outputArtifact = ruleContext.createOutputArtifact(); // The query string diff --git a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java index 74a2bd6443..33e52c01b9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java +++ b/src/main/java/com/google/devtools/build/lib/rules/genrule/GenRuleBase.java @@ -22,6 +22,7 @@ import com.google.common.collect.Maps; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CommandLine; import com.google.devtools.build.lib.actions.CompositeRunfilesSupplier; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.CommandHelper; import com.google.devtools.build.lib.analysis.ConfigurationMakeVariableContext; @@ -103,7 +104,7 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory { * Updates the {@link RuleConfiguredTargetBuilder} that is used for this rule. * * <p>GenRule implementations can override this method to enhance and update the builder without - * needing to entirely override the {@link #create} method. + * needing to entirely override the {@link ConfiguredTargetFactory#create} method. */ protected RuleConfiguredTargetBuilder updateBuilder( RuleConfiguredTargetBuilder builder, @@ -114,7 +115,7 @@ public abstract class GenRuleBase implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws RuleErrorException, InterruptedException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSet<Artifact> filesToBuild = NestedSetBuilder.wrap(Order.STABLE_ORDER, ruleContext.getOutputArtifacts()); NestedSetBuilder<Artifact> resolvedSrcsBuilder = NestedSetBuilder.stableOrder(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java index 9967d204a2..870c3b525e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaBinary.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.analysis.OutputGroupInfo; @@ -70,7 +71,7 @@ public class JavaBinary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { final JavaCommon common = new JavaCommon(ruleContext, semantics); DeployArchiveBuilder deployArchiveBuilder = new DeployArchiveBuilder(semantics, ruleContext); Runfiles.Builder runfilesBuilder = new Runfiles.Builder( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java index 79e2711a39..0ff1762470 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaImport.java @@ -18,6 +18,7 @@ import com.google.common.collect.ImmutableBiMap; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.OutputGroupInfo; @@ -50,7 +51,7 @@ public class JavaImport implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ImmutableList<Artifact> srcJars = ImmutableList.of(); ImmutableList<Artifact> jars = collectJars(ruleContext); Artifact srcJar = ruleContext.getPrerequisiteArtifact("srcjar", Mode.TARGET); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java index ed5f32c9c9..f329e83b88 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaLibrary.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -45,7 +46,7 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { JavaCommon common = new JavaCommon(ruleContext, semantics); return init( ruleContext, @@ -55,9 +56,11 @@ public class JavaLibrary implements RuleConfiguredTargetFactory { } final ConfiguredTarget init( - RuleContext ruleContext, final JavaCommon common, boolean includeGeneratedExtensionRegistry, + RuleContext ruleContext, + final JavaCommon common, + boolean includeGeneratedExtensionRegistry, boolean isJavaPluginRule) - throws InterruptedException { + throws InterruptedException, RuleErrorException, ActionConflictException { JavaTargetAttributes.Builder attributesBuilder = common.initCommon(); // Collect the transitive dependencies. diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java index 649957c3d5..3ea3935878 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPackageConfiguration.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PackageSpecificationProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -32,7 +33,8 @@ import java.util.List; public class JavaPackageConfiguration implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { List<PackageSpecificationProvider> packages = ImmutableList.copyOf( ruleContext.getPrerequisites( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java index f593fd9167..d07ee3503d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaPlugin.java @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.rules.java; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -30,7 +31,7 @@ public class JavaPlugin implements RuleConfiguredTargetFactory { @Override public final ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { return new JavaLibrary(semantics) .init( ruleContext, diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java index c060a49d90..54f2c7d614 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntime.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.java; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.CompilationHelper; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.PrerequisiteArtifacts; @@ -40,7 +41,7 @@ public class JavaRuntime implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSet<Artifact> filesToBuild = PrerequisiteArtifacts.nestedSet(ruleContext, "srcs", Mode.TARGET); PathFragment javaHome = defaultJavaHome(ruleContext.getLabel()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java index ce12aee4af..181e8106aa 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeAlias.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.java; import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; @@ -38,7 +39,7 @@ public class JavaRuntimeAlias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { // Sadly, we can't use an AliasConfiguredTarget here because we need to be prepared for the case // when --javabase is not a label. For the time being. TransitiveInfoCollection runtime = ruleContext.getPrerequisite(":jvm", Mode.TARGET); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java index e0d2a77dcb..f1c895f473 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaRuntimeSuite.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.java; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -28,7 +29,7 @@ import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTa public class JavaRuntimeSuite implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { TransitiveInfoCollection runtime = ruleContext.getPrerequisiteMap("runtimes").get(ruleContext.getConfiguration().getCpu()); if (runtime == null) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java index faa16d1dc6..eb8aa8b3f2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchain.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList.Builder; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -53,7 +54,8 @@ public class JavaToolchain implements RuleConfiguredTargetFactory { } @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { ImmutableList<String> javacopts = getJavacOpts(ruleContext); NestedSet<Artifact> bootclasspath = PrerequisiteArtifacts.nestedSet( ruleContext, "bootclasspath", Mode.HOST); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainAlias.java b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainAlias.java index d89ea110e0..ff12fc1f43 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainAlias.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/JavaToolchainAlias.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.packages.Attribute.attr; import static com.google.devtools.build.lib.packages.BuildType.LABEL; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.BaseRuleClasses; import com.google.devtools.build.lib.analysis.ConfiguredTarget; @@ -38,7 +39,7 @@ public class JavaToolchainAlias implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ConfiguredTarget actual = (ConfiguredTarget) ruleContext.getPrerequisite(":java_toolchain", Mode.TARGET); return new AliasConfiguredTarget( diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java index e92896e168..89a3d573ca 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaLiteProtoLibrary.java @@ -22,6 +22,7 @@ import static com.google.devtools.build.lib.rules.java.proto.StrictDepsUtils.con import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMultimap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -49,7 +50,7 @@ public class JavaLiteProtoLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(final RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders = ruleContext.getPrerequisites("deps", Mode.TARGET, JavaProtoLibraryAspectProvider.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java index 243251b7f5..be7e19a975 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/java/proto/JavaProtoLibrary.java @@ -21,6 +21,7 @@ import static com.google.devtools.build.lib.rules.java.proto.StrictDepsUtils.con import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.OutputGroupInfo; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; @@ -44,7 +45,7 @@ public class JavaProtoLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(final RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Iterable<JavaProtoLibraryAspectProvider> javaProtoLibraryAspectProviders = ruleContext.getPrerequisites("deps", TARGET, JavaProtoLibraryAspectProvider.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java index cb61b80adf..be2a83943d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java @@ -27,6 +27,7 @@ import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -114,7 +115,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { @Override public final ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { AppleBinaryOutput appleBinaryOutput = linkMultiArchBinary(ruleContext); return ruleConfiguredTargetFromProvider(ruleContext, appleBinaryOutput); @@ -131,7 +132,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { * @return a tuple containing all necessary information about the linked binary */ public static AppleBinaryOutput linkMultiArchBinary(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { MultiArchSplitTransitionProvider.validateMinimumOs(ruleContext); PlatformType platformType = MultiArchSplitTransitionProvider.getPlatformType(ruleContext); @@ -301,7 +302,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory { } private static ConfiguredTarget ruleConfiguredTargetFromProvider( - RuleContext ruleContext, AppleBinaryOutput appleBinaryOutput) throws RuleErrorException { + RuleContext ruleContext, AppleBinaryOutput appleBinaryOutput) + throws RuleErrorException, ActionConflictException { NativeInfo nativeInfo = appleBinaryOutput.getBinaryInfoProvider(); AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java index fa2cee202f..dfbcaecc7c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleSkylarkCommon.java @@ -18,6 +18,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.skylark.SkylarkRuleContext; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -497,7 +498,7 @@ public class AppleSkylarkCommon { RuleContext ruleContext = skylarkRuleContext.getRuleContext(); AppleBinaryOutput appleBinaryOutput = AppleBinary.linkMultiArchBinary(ruleContext); return appleBinaryOutput.getBinaryInfoProvider(); - } catch (RuleErrorException exception) { + } catch (RuleErrorException | ActionConflictException exception) { throw new EvalException(null, exception); } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java index 49cc884ad8..ab1f93e049 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibrary.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -71,7 +72,7 @@ public class AppleStaticLibrary implements RuleConfiguredTargetFactory { @Override public final ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { MultiArchSplitTransitionProvider.validateMinimumOs(ruleContext); PlatformType platformType = MultiArchSplitTransitionProvider.getPlatformType(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java index e73c66572a..e72b47c3a8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleStubBinary.java @@ -22,6 +22,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfigurationMakeVariableContext; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -104,7 +105,7 @@ public class AppleStubBinary implements RuleConfiguredTargetFactory { @Override public final ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { MultiArchSplitTransitionProvider.validateMinimumOs(ruleContext); PlatformType platformType = MultiArchSplitTransitionProvider.getPlatformType(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java index 92d02a83be..378e63bcae 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosDevice.java @@ -17,6 +17,7 @@ package com.google.devtools.build.lib.rules.objc; import static com.google.devtools.build.lib.syntax.Type.STRING; import com.google.common.base.Strings; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -34,7 +35,7 @@ import com.google.devtools.build.lib.rules.apple.XcodeVersionProperties; public final class IosDevice implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext context) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { context.ruleWarning( "This rule is deprecated. Please use the new Apple build rules " + "(https://github.com/bazelbuild/rules_apple) to build Apple targets."); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java index 69e42c312d..83a35b91bf 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java @@ -20,6 +20,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -59,7 +60,7 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { checkAttributes(ruleContext); if (ruleContext.hasErrors()) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java index efc3596128..12b7998902 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundle.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -31,7 +32,7 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; public class ObjcBundle implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ObjcCommon common = new ObjcCommon.Builder(ruleContext).build(); ImmutableList<Artifact> bundleImports = ruleContext diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java index 328b212045..3088b5df6b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java @@ -20,6 +20,7 @@ import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.BundlingR import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -51,7 +52,7 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ObjcCommon common = common(ruleContext); Bundling bundling = bundling(ruleContext, common); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java index 76b9fc86e8..baad025682 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcFramework.java @@ -18,6 +18,7 @@ import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -34,7 +35,7 @@ import com.google.devtools.build.lib.vfs.PathFragment; public class ObjcFramework implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { CompilationAttributes compilationAttributes = CompilationAttributes.Builder.fromRuleContext(ruleContext).build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java index 9f2a169b72..c01a04f222 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcImport.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -30,7 +31,7 @@ import com.google.devtools.build.lib.syntax.Type; public class ObjcImport implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ObjcCommon common = new ObjcCommon.Builder(ruleContext) .setCompilationAttributes( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index bebacd8757..0fa2870432 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -59,7 +60,7 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { validateAttributes(ruleContext); ObjcCommon common = common(ruleContext); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java index 5fa5a1d198..67292e3264 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.objc; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; @@ -30,13 +31,13 @@ import com.google.devtools.build.lib.rules.proto.ProtoSourcesProvider; public class ObjcProtoLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(final RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { new ProtoAttributes(ruleContext).validate(); return createProtobufTarget(ruleContext); } private ConfiguredTarget createProtobufTarget(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSetBuilder<Artifact> filesToBuild = NestedSetBuilder.stableOrder(); Iterable<ProtoSourcesProvider> protoProviders = diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD index c564fce0de..f398be1057 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/BUILD @@ -18,6 +18,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib:core-rules", "//src/main/java/com/google/devtools/build/lib:packages", "//src/main/java/com/google/devtools/build/lib:skylarkinterface", + "//src/main/java/com/google/devtools/build/lib/actions", "//src/main/java/com/google/devtools/build/lib/analysis/platform", "//src/main/java/com/google/devtools/build/lib/analysis/platform:utils", "//third_party:guava", diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java index 3723a886d9..d9ddbafb33 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintSetting.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.platform; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -31,7 +32,7 @@ public class ConstraintSetting implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java index 036ccf6138..98d625ff59 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/ConstraintValue.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.platform; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -31,7 +32,7 @@ public class ConstraintValue implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ConstraintSettingInfo constraint = PlatformProviderUtils.constraintSetting( diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/Platform.java b/src/main/java/com/google/devtools/build/lib/rules/platform/Platform.java index 07196bb41d..2cab122c8b 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/Platform.java +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/Platform.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.platform; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -36,7 +37,7 @@ import com.google.devtools.build.lib.util.Pair; public class Platform implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { PlatformInfo.Builder platformBuilder = PlatformInfo.builder().setLabel(ruleContext.getLabel()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java b/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java index 28a4c57671..0a407fc960 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/platform/Toolchain.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.platform; import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -34,7 +35,7 @@ public class Toolchain implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { Label toolchainType = ruleContext.attributes().get(ToolchainRule.TOOLCHAIN_TYPE_ATTR, BuildType.NODEP_LABEL); diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java index d1cd914016..384384250a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/BazelProtoLibrary.java @@ -20,6 +20,7 @@ import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -35,7 +36,7 @@ public class BazelProtoLibrary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { ImmutableList<Artifact> protoSources = ruleContext.getPrerequisiteArtifacts("srcs", TARGET).list(); NestedSet<Artifact> checkDepsProtoSources = diff --git a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java index e76736c1d5..d045ad15e8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java +++ b/src/main/java/com/google/devtools/build/lib/rules/proto/ProtoLangToolchain.java @@ -19,6 +19,7 @@ import static com.google.devtools.build.lib.analysis.configuredtargets.RuleConfi import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.FileProvider; import com.google.devtools.build.lib.analysis.FilesToRunProvider; @@ -34,7 +35,7 @@ import com.google.devtools.build.lib.syntax.Type; public class ProtoLangToolchain implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { NestedSetBuilder<Artifact> blacklistedProtos = NestedSetBuilder.stableOrder(); for (FileProvider protos : ruleContext.getPrerequisites("blacklisted_protos", TARGET, FileProvider.class)) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java index b2ef88db97..8415d171b9 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyBinary.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.python; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -44,7 +45,7 @@ public abstract class PyBinary implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { PyCommon common = new PyCommon(ruleContext); common.initCommon(common.getDefaultPythonVersion()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java index f41d99baca..43f33f7eb5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyLibrary.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.rules.python; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -43,7 +44,8 @@ public abstract class PyLibrary implements RuleConfiguredTargetFactory { protected abstract PythonSemantics createSemantics(); @Override - public ConfiguredTarget create(final RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(final RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { PythonSemantics semantics = createSemantics(); PyCommon common = new PyCommon(ruleContext); common.initCommon(common.getDefaultPythonVersion()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java b/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java index f0711086e9..b60b5a221e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/python/PyTest.java @@ -13,11 +13,11 @@ // limitations under the License. package com.google.devtools.build.lib.rules.python; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.syntax.Type; /** @@ -32,7 +32,7 @@ public abstract class PyTest implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { PythonSemantics semantics = createSemantics(); PyCommon common = new PyCommon(ruleContext); common.initCommon(getDefaultPythonVersion(ruleContext)); diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java index 4f9edc3487..2a6b4d14d5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/Bind.java @@ -16,6 +16,7 @@ package com.google.devtools.build.lib.rules.repository; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.AliasProvider; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -37,7 +38,7 @@ public class Bind implements RuleConfiguredTargetFactory { @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { if (ruleContext.getPrerequisite("actual", Mode.TARGET) == null) { ruleContext.ruleError(String.format("The external label '%s' is not bound to anything", ruleContext.getLabel())); diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java index 8a51c46323..802b499076 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/repository/WorkspaceConfiguredTargetFactory.java @@ -14,12 +14,12 @@ package com.google.devtools.build.lib.rules.repository; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; import com.google.devtools.build.lib.analysis.RuleContext; import com.google.devtools.build.lib.analysis.RunfilesProvider; -import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; /** * Implementation of workspace rules. Generally, these don't have any providers, since they @@ -30,7 +30,7 @@ public class WorkspaceConfiguredTargetFactory implements RuleConfiguredTargetFac @Override public ConfiguredTarget create(RuleContext ruleContext) - throws InterruptedException, RuleErrorException { + throws InterruptedException, RuleErrorException, ActionConflictException { return new RuleConfiguredTargetBuilder(ruleContext) .addProvider(RunfilesProvider.class, RunfilesProvider.EMPTY) .build(); diff --git a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java index 7a407c18b4..5767d83f7c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java +++ b/src/main/java/com/google/devtools/build/lib/rules/test/TestSuite.java @@ -15,6 +15,7 @@ package com.google.devtools.build.lib.rules.test; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder; import com.google.devtools.build.lib.analysis.RuleConfiguredTargetFactory; @@ -38,7 +39,8 @@ import java.util.List; public class TestSuite implements RuleConfiguredTargetFactory { @Override - public ConfiguredTarget create(RuleContext ruleContext) throws RuleErrorException { + public ConfiguredTarget create(RuleContext ruleContext) + throws InterruptedException, RuleErrorException, ActionConflictException { checkTestsAndSuites(ruleContext, "tests"); if (ruleContext.hasErrors()) { return null; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java index dd60938de0..3613787a2e 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionTemplateExpansionValue.java @@ -15,8 +15,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.MoreObjects; import com.google.common.collect.Interner; -import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.concurrent.BlazeInterners; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; @@ -25,7 +25,7 @@ import com.google.devtools.build.skyframe.SkyFunctionName; /** * Value that stores expanded actions from ActionTemplate. */ -public final class ActionTemplateExpansionValue extends ActionLookupValue { +public final class ActionTemplateExpansionValue extends BasicActionLookupValue { ActionTemplateExpansionValue( GeneratingActions generatingActions, boolean removeActionsAfterEvaluation) { super(generatingActions, removeActionsAfterEvaluation); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java index 08c8c06895..116d186c39 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectValue.java @@ -19,8 +19,8 @@ import com.google.common.base.Objects; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Interner; -import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.analysis.ConfiguredAspect; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.cmdline.Label; @@ -42,7 +42,7 @@ import javax.annotation.Nullable; /** * An aspect in the context of the Skyframe graph. */ -public final class AspectValue extends ActionLookupValue { +public final class AspectValue extends BasicActionLookupValue { /** * A base class for keys that have AspectValue as a Sky value. diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java index 485a6a7dcc..9232f7a5ba 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildInfoCollectionValue.java @@ -15,8 +15,8 @@ package com.google.devtools.build.lib.skyframe; import com.google.common.base.Preconditions; import com.google.common.collect.Interner; -import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoCollection; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; @@ -30,7 +30,7 @@ import java.util.Objects; * Value that stores {@link BuildInfoCollection}s generated by {@link BuildInfoFactory} instances. * These collections are used during analysis (see {@code CachingAnalysisEnvironment}). */ -public class BuildInfoCollectionValue extends ActionLookupValue { +public class BuildInfoCollectionValue extends BasicActionLookupValue { private final BuildInfoCollection collection; BuildInfoCollectionValue( diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 962f136eed..42b32c98ca 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -37,6 +37,7 @@ import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider; import com.google.devtools.build.lib.analysis.config.ConfigurationResolver; import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException; import com.google.devtools.build.lib.analysis.configuredtargets.MergedConfiguredTarget.DuplicateException; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; import com.google.devtools.build.lib.buildeventstream.BuildEventId; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSet; @@ -698,14 +699,19 @@ public final class ConfiguredTargetFunction implements SkyFunction { } Preconditions.checkNotNull(depValueMap); - ConfiguredTarget configuredTarget = - view.createConfiguredTarget( - target, - configuration, - analysisEnvironment, - depValueMap, - configConditions, - toolchainContext); + ConfiguredTarget configuredTarget; + try { + configuredTarget = + view.createConfiguredTarget( + target, + configuration, + analysisEnvironment, + depValueMap, + configConditions, + toolchainContext); + } catch (ActionConflictException e) { + throw new ConfiguredTargetFunctionException(e); + } events.replayOn(env.getListener()); if (events.hasErrors()) { @@ -725,24 +731,34 @@ public final class ConfiguredTargetFunction implements SkyFunction { analysisEnvironment.disable(target); Preconditions.checkNotNull(configuredTarget, target); - GeneratingActions generatingActions; - // Check for conflicting actions within this configured target (that indicates a bug in the - // rule implementation). - try { - generatingActions = - Actions.filterSharedActionsAndThrowActionConflict( - analysisEnvironment.getActionKeyContext(), - analysisEnvironment.getRegisteredActions()); - } catch (ActionConflictException e) { - throw new ConfiguredTargetFunctionException(e); + if (configuredTarget instanceof RuleConfiguredTarget) { + RuleConfiguredTarget ruleConfiguredTarget = (RuleConfiguredTarget) configuredTarget; + return new RuleConfiguredTargetValue( + ruleConfiguredTarget, + transitivePackagesForPackageRootResolution == null + ? null + : transitivePackagesForPackageRootResolution.build(), + removeActionsAfterEvaluation.get()); + } else { + GeneratingActions generatingActions; + // Check for conflicting actions within this configured target (that indicates a bug in the + // rule implementation). + try { + generatingActions = + Actions.filterSharedActionsAndThrowActionConflict( + analysisEnvironment.getActionKeyContext(), + analysisEnvironment.getRegisteredActions()); + } catch (ActionConflictException e) { + throw new ConfiguredTargetFunctionException(e); + } + return new NonRuleConfiguredTargetValue( + configuredTarget, + generatingActions, + transitivePackagesForPackageRootResolution == null + ? null + : transitivePackagesForPackageRootResolution.build(), + removeActionsAfterEvaluation.get()); } - return new ConfiguredTargetValue( - configuredTarget, - generatingActions, - transitivePackagesForPackageRootResolution == null - ? null - : transitivePackagesForPackageRootResolution.build(), - removeActionsAfterEvaluation.get()); } /** diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java index 341da8a6ec..b527d59f12 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetValue.java @@ -1,4 +1,4 @@ -// Copyright 2014 The Bazel Authors. All rights reserved. +// Copyright 2018 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. @@ -11,75 +11,41 @@ // 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.skyframe; -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; -import com.google.devtools.build.lib.actions.ActionLookupValue; -import com.google.devtools.build.lib.actions.Actions.GeneratingActions; -import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.ConfiguredTarget; 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.NestedSet; -import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; -import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; import com.google.devtools.build.lib.packages.Package; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; -import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; import java.util.List; -import javax.annotation.Nullable; - -/** A configured target in the context of a Skyframe graph. */ -@AutoCodec -@Immutable -@ThreadSafe -@VisibleForTesting -public final class ConfiguredTargetValue extends ActionLookupValue { - // These variables are only non-final because they may be clear()ed to save memory. - // configuredTarget is null only after it is cleared. - @Nullable private ConfiguredTarget configuredTarget; - - // May be null either after clearing or because transitive packages are not tracked. - @Nullable private NestedSet<Package> transitivePackagesForPackageRootResolution; - @AutoCodec.Instantiator - @VisibleForSerialization - ConfiguredTargetValue( - List<ActionAnalysisMetadata> actions, - ImmutableMap<Artifact, Integer> generatingActionIndex, - ConfiguredTarget configuredTarget, - NestedSet<Package> transitivePackagesForPackageRootResolution) { - super(actions, generatingActionIndex); - this.configuredTarget = configuredTarget; - this.transitivePackagesForPackageRootResolution = transitivePackagesForPackageRootResolution; - } - - ConfiguredTargetValue( - ConfiguredTarget configuredTarget, - GeneratingActions generatingActions, - @Nullable NestedSet<Package> transitivePackagesForPackageRootResolution, - boolean removeActionsAfterEvaluation) { - super(generatingActions, removeActionsAfterEvaluation); - this.configuredTarget = Preconditions.checkNotNull(configuredTarget, generatingActions); - this.transitivePackagesForPackageRootResolution = transitivePackagesForPackageRootResolution; +/** + * A {@link SkyValue} for a {@link ConfiguredTarget}. + */ +public interface ConfiguredTargetValue extends SkyValue { + static SkyKey key(Label label, BuildConfiguration configuration) { + return ConfiguredTargetKey.of(label, configuration); } - @VisibleForTesting - public ConfiguredTarget getConfiguredTarget() { - Preconditions.checkNotNull(configuredTarget); - return configuredTarget; + static ImmutableList<SkyKey> keys(Iterable<ConfiguredTargetKey> lacs) { + ImmutableList.Builder<SkyKey> keys = ImmutableList.builder(); + for (ConfiguredTargetKey lac : lacs) { + keys.add(lac); + } + return keys.build(); } - @VisibleForTesting - public List<ActionAnalysisMetadata> getActions() { - Preconditions.checkNotNull(configuredTarget, this); - return actions; - } + /** + * Returns the configured target for this value. + */ + ConfiguredTarget getConfiguredTarget(); /** * Returns the set of packages transitively loaded by this value. Must only be used for @@ -87,9 +53,17 @@ public final class ConfiguredTargetValue extends ActionLookupValue { * specified that this map needs to be constructed (via the constructor argument in {@link * ConfiguredTargetFunction#ConfiguredTargetFunction}), calling this will crash. */ - public NestedSet<Package> getTransitivePackagesForPackageRootResolution() { - return Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); - } + NestedSet<Package> getTransitivePackagesForPackageRootResolution(); + + /** + * Returns the actions registered by the configured target for this value. + */ + List<ActionAnalysisMetadata> getActions(); + + /** + * Returns the number of {@link Action} objects present in this value. + */ + int getNumActions(); /** * Clears configured target data from this value, leaving only the artifact->generating action @@ -98,45 +72,6 @@ public final class ConfiguredTargetValue extends ActionLookupValue { * <p>Should only be used when user specifies --discard_analysis_cache. Must be called at most * once per value, after which {@link #getConfiguredTarget} and {@link #getActions} cannot be * called. - * - * @param clearEverything if true, clear the {@link #configuredTarget}. If not, only the {@link - * #transitivePackagesForPackageRootResolution} field is cleared. Top-level targets need their - * {@link #configuredTarget} preserved, so should pass false here. */ - public void clear(boolean clearEverything) { - Preconditions.checkNotNull(configuredTarget); - Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); - if (clearEverything) { - configuredTarget = null; - } - transitivePackagesForPackageRootResolution = null; - } - - @VisibleForTesting - public static SkyKey key(Label label, BuildConfiguration configuration) { - return ConfiguredTargetKey.of(label, configuration); - } - - static ImmutableList<SkyKey> keys(Iterable<ConfiguredTargetKey> lacs) { - ImmutableList.Builder<SkyKey> keys = ImmutableList.builder(); - for (ConfiguredTargetKey lac : lacs) { - keys.add(lac); - } - return keys.build(); - } - - /** - * Returns a label of ConfiguredTargetValue. - */ - @ThreadSafe - static Label extractLabel(SkyKey value) { - Object valueName = value.argument(); - Preconditions.checkState(valueName instanceof ConfiguredTargetKey, valueName); - return ((ConfiguredTargetKey) valueName).getLabel(); - } - - @Override - public String toString() { - return getStringHelper().add("configuredTarget", configuredTarget).toString(); - } + void clear(boolean clearEverything); } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java index e7522851ba..ce7745a94b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/CoverageReportValue.java @@ -14,15 +14,15 @@ package com.google.devtools.build.lib.skyframe; -import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.skyframe.SkyFunctionName; /** * A SkyValue to store the coverage report Action and Artifacts. */ -public class CoverageReportValue extends ActionLookupValue { +public class CoverageReportValue extends BasicActionLookupValue { // There should only ever be one CoverageReportValue value in the graph. @AutoCodec public static final CoverageReportKey COVERAGE_REPORT_KEY = new CoverageReportKey(); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/NonRuleConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/NonRuleConfiguredTargetValue.java new file mode 100644 index 0000000000..b36318bede --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/NonRuleConfiguredTargetValue.java @@ -0,0 +1,117 @@ +// Copyright 2014 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.skyframe; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.Actions.GeneratingActions; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.cmdline.Label; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec.VisibleForSerialization; +import com.google.devtools.build.skyframe.SkyKey; +import java.util.ArrayList; +import javax.annotation.Nullable; + +/** + * A configured target in the context of a Skyframe graph. + */ +@Immutable +@ThreadSafe +@AutoCodec +@VisibleForTesting +public final class NonRuleConfiguredTargetValue + extends BasicActionLookupValue implements ConfiguredTargetValue { + + // These variables are only non-final because they may be clear()ed to save memory. + // configuredTarget is null only after it is cleared. + @Nullable private ConfiguredTarget configuredTarget; + + // May be null either after clearing or because transitive packages are not tracked. + @Nullable private NestedSet<Package> transitivePackagesForPackageRootResolution; + + @AutoCodec.Instantiator + @VisibleForSerialization + NonRuleConfiguredTargetValue( + ArrayList<ActionAnalysisMetadata> actions, + ImmutableMap<Artifact, Integer> generatingActionIndex, + ConfiguredTarget configuredTarget, + NestedSet<Package> transitivePackagesForPackageRootResolution) { + super(actions, generatingActionIndex, false); + this.configuredTarget = configuredTarget; + this.transitivePackagesForPackageRootResolution = transitivePackagesForPackageRootResolution; + } + + NonRuleConfiguredTargetValue( + ConfiguredTarget configuredTarget, + GeneratingActions generatingActions, + @Nullable NestedSet<Package> transitivePackagesForPackageRootResolution, + boolean removeActionsAfterEvaluation) { + super(generatingActions, removeActionsAfterEvaluation); + this.configuredTarget = Preconditions.checkNotNull(configuredTarget, generatingActions); + this.transitivePackagesForPackageRootResolution = transitivePackagesForPackageRootResolution; + } + + @VisibleForTesting + @Override + public ConfiguredTarget getConfiguredTarget() { + Preconditions.checkNotNull(configuredTarget); + return configuredTarget; + } + + @VisibleForTesting + @Override + public ArrayList<ActionAnalysisMetadata> getActions() { + Preconditions.checkNotNull(configuredTarget, this); + return actions; + } + + @Override + public NestedSet<Package> getTransitivePackagesForPackageRootResolution() { + return Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); + } + + @Override + public void clear(boolean clearEverything) { + Preconditions.checkNotNull(configuredTarget); + Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); + if (clearEverything) { + configuredTarget = null; + } + transitivePackagesForPackageRootResolution = null; + } + + /** + * Returns a label of NonRuleConfiguredTargetValue. + */ + @ThreadSafe + static Label extractLabel(SkyKey value) { + Object valueName = value.argument(); + Preconditions.checkState(valueName instanceof ConfiguredTargetKey, valueName); + return ((ConfiguredTargetKey) valueName).getLabel(); + } + + @Override + public String toString() { + return getStringHelper().add("configuredTarget", configuredTarget).toString(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RuleConfiguredTargetValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/RuleConfiguredTargetValue.java new file mode 100644 index 0000000000..8eaa0163d5 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/RuleConfiguredTargetValue.java @@ -0,0 +1,109 @@ +// Copyright 2014 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.skyframe; + +import com.google.common.annotations.VisibleForTesting; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableMap; +import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; +import com.google.devtools.build.lib.actions.ActionLookupValue; +import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget; +import com.google.devtools.build.lib.collect.nestedset.NestedSet; +import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; +import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadSafe; +import com.google.devtools.build.lib.packages.Package; +import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; +import java.util.ArrayList; +import javax.annotation.Nullable; + +/** + * A configured target in the context of a Skyframe graph. + */ +@Immutable +@ThreadSafe +@AutoCodec +@VisibleForTesting +public final class RuleConfiguredTargetValue extends ActionLookupValue + implements ConfiguredTargetValue { + + // This variable is non-final because it may be clear()ed to save memory. It is null only after + // clear(true) is called. + @Nullable private RuleConfiguredTarget configuredTarget; + private final ArrayList<ActionAnalysisMetadata> actions; + private final ImmutableMap<Artifact, Integer> generatingActionIndex; + + // May be null either after clearing or because transitive packages are not tracked. + @Nullable private NestedSet<Package> transitivePackagesForPackageRootResolution; + + @AutoCodec.Instantiator + RuleConfiguredTargetValue( + RuleConfiguredTarget configuredTarget, + @Nullable NestedSet<Package> transitivePackagesForPackageRootResolution) { + this(configuredTarget, transitivePackagesForPackageRootResolution, false); + } + + RuleConfiguredTargetValue( + RuleConfiguredTarget configuredTarget, + @Nullable NestedSet<Package> transitivePackagesForPackageRootResolution, + boolean removeActionsAfterEvaluation) { + super(removeActionsAfterEvaluation); + this.configuredTarget = Preconditions.checkNotNull(configuredTarget); + this.transitivePackagesForPackageRootResolution = transitivePackagesForPackageRootResolution; + // These are specifically *not* copied to save memory. + this.actions = configuredTarget.getActions(); + this.generatingActionIndex = configuredTarget.getGeneratingActionIndex(); + // If actions are removed after evaluation, the configured target's account of actions is + // incomplete and may be partially nulled-out. Thus, access of these actions via skylark should + // be disabled. + // TODO(b/70636031): Deprecate and remove this optimization. + if (removeActionsAfterEvaluation) { + configuredTarget.disableAcccesibleActions(); + } + } + + @VisibleForTesting + @Override + public ConfiguredTarget getConfiguredTarget() { + Preconditions.checkNotNull(configuredTarget); + return configuredTarget; + } + + @VisibleForTesting + @Override + public ArrayList<ActionAnalysisMetadata> getActions() { + return actions; + } + + @Override + protected ImmutableMap<Artifact, Integer> getGeneratingActionIndex() { + return generatingActionIndex; + } + + @Override + public NestedSet<Package> getTransitivePackagesForPackageRootResolution() { + return Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); + } + + @Override + public void clear(boolean clearEverything) { + Preconditions.checkNotNull(configuredTarget); + Preconditions.checkNotNull(transitivePackagesForPackageRootResolution); + if (clearEverything) { + configuredTarget = null; + } + transitivePackagesForPackageRootResolution = null; + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index 8d9c1512f2..5d9cde9c17 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -30,7 +30,6 @@ import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; import com.google.devtools.build.lib.actions.ArtifactPrefixConflictException; -import com.google.devtools.build.lib.actions.MutableActionGraph; import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException; import com.google.devtools.build.lib.actions.PackageRoots; import com.google.devtools.build.lib.analysis.AnalysisFailureEvent; @@ -270,7 +269,7 @@ public final class SkyframeBuildView { ConflictException ex = bad.getValue(); try { ex.rethrowTyped(); - } catch (MutableActionGraph.ActionConflictException ace) { + } catch (ActionConflictException ace) { ace.reportTo(eventHandler); String errorMsg = "Analysis of target '" + bad.getKey().getOwner().getLabel() + "' failed; build aborted"; @@ -294,7 +293,7 @@ public final class SkyframeBuildView { if (topLevel.argument() instanceof ConfiguredTargetKey) { errorMsg = "Analysis of target '" - + ConfiguredTargetValue.extractLabel(topLevel) + + NonRuleConfiguredTargetValue.extractLabel(topLevel) + "' failed; build aborted"; } else if (topLevel.argument() instanceof AspectValueKey) { AspectValueKey aspectKey = (AspectValueKey) topLevel.argument(); @@ -313,7 +312,7 @@ public final class SkyframeBuildView { } boolean hasLoadingError = false; - // --keep_going : We notify the error and return a ConfiguredTargetValue + // --keep_going : We notify the error and return a NonRuleConfiguredTargetValue for (Map.Entry<SkyKey, ErrorInfo> errorEntry : result.errorMap().entrySet()) { // Only handle errors of configured targets, not errors of top-level aspects. // TODO(ulfjack): this is quadratic - if there are a lot of CTs, this could be rather slow. @@ -363,7 +362,7 @@ public final class SkyframeBuildView { ConflictException ex = bad.getValue(); try { ex.rethrowTyped(); - } catch (MutableActionGraph.ActionConflictException ace) { + } catch (ActionConflictException ace) { ace.reportTo(eventHandler); eventHandler .handle(Event.warn("errors encountered while analyzing target '" @@ -508,7 +507,7 @@ public final class SkyframeBuildView { OrderedSetMultimap<Attribute, ConfiguredTargetAndTarget> prerequisiteMap, ImmutableMap<Label, ConfigMatchingProvider> configConditions, @Nullable ToolchainContext toolchainContext) - throws InterruptedException { + throws InterruptedException, ActionConflictException { Preconditions.checkState(enableAnalysis, "Already in execution phase %s %s", target, configuration); Preconditions.checkNotNull(analysisEnvironment); diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java index 0bbff1c424..0a748f9ea2 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/WorkspaceStatusValue.java @@ -13,8 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; -import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.Artifact; +import com.google.devtools.build.lib.actions.BasicActionLookupValue; import com.google.devtools.build.lib.analysis.WorkspaceStatusAction; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.skyframe.SkyFunctionName; @@ -26,7 +26,7 @@ import com.google.devtools.build.skyframe.SkyKey; */ // TODO(bazel-team): This seems to be superfluous now, but it cannot be removed without making // PrecomputedValue public instead of package-private -public class WorkspaceStatusValue extends ActionLookupValue { +public class WorkspaceStatusValue extends BasicActionLookupValue { private final Artifact stableArtifact; private final Artifact volatileArtifact; |