diff options
Diffstat (limited to 'src/main/java/com/google')
23 files changed, 162 insertions, 64 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/Action.java b/src/main/java/com/google/devtools/build/lib/actions/Action.java index 9faddfea0c..e87d79edcf 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/Action.java +++ b/src/main/java/com/google/devtools/build/lib/actions/Action.java @@ -89,32 +89,31 @@ public interface Action extends ActionExecutionMetadata, Describable { void prepare(Path execRoot) throws IOException; /** - * Executes this action; called by the Builder when all of this Action's - * inputs have been successfully created. (Behaviour is undefined if the - * prerequisites are not up to date.) This method <i>actually does the work - * of the Action, unconditionally</i>; in other words, it is invoked by the - * Builder only when dependency analysis has deemed it necessary.</p> + * Executes this action; called by the Builder when all of this Action's inputs have been + * successfully created. (Behaviour is undefined if the prerequisites are not up to date.) This + * method <i>actually does the work of the Action, unconditionally</i>; in other words, it is + * invoked by the Builder only when dependency analysis has deemed it necessary. * - * <p>The framework guarantees that the output directory for each file in - * <code>getOutputs()</code> has already been created, and will check to - * ensure that each of those files is indeed created.</p> + * <p>The framework guarantees that the output directory for each file in <code>getOutputs() + * </code> has already been created, and will check to ensure that each of those files is indeed + * created. * - * <p>Implementations of this method should try to honour the {@link - * java.lang.Thread#interrupted} contract: if an interrupt is delivered to - * the thread in which execution occurs, the action should detect this on a - * best-effort basis and terminate as quickly as possible by throwing an + * <p>Implementations of this method should try to honour the {@link java.lang.Thread#interrupted} + * contract: if an interrupt is delivered to the thread in which execution occurs, the action + * should detect this on a best-effort basis and terminate as quickly as possible by throwing an * ActionExecutionException. * - * <p>Action execution must be ThreadCompatible in order to be safely used - * with a concurrent Builder implementation such as ParallelBuilder. + * <p>Action execution must be ThreadCompatible in order to be safely used with a concurrent + * Builder implementation such as ParallelBuilder. * - * @param actionExecutionContext Services in the scope of the action, like the output and error - * streams to use for messages arising during action execution. - * @throws ActionExecutionException if execution fails for any reason. + * @param actionExecutionContext services in the scope of the action, like the output and error + * streams to use for messages arising during action execution + * @return returns an ActionResult containing action execution metadata + * @throws ActionExecutionException if execution fails for any reason * @throws InterruptedException */ @ConditionallyThreadCompatible - void execute(ActionExecutionContext actionExecutionContext) + ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException; /** diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java new file mode 100644 index 0000000000..3ae8e02f92 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java @@ -0,0 +1,55 @@ +// Copyright 2017 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.auto.value.AutoValue; +import com.google.common.collect.ImmutableSet; +import java.util.Set; + +/** Holds the result(s) of an action's execution. */ +@AutoValue +public abstract class ActionResult { + + /** An empty ActionResult used by Actions that don't have any metadata to return. */ + public static final ActionResult EMPTY = ActionResult.create(ImmutableSet.of()); + + /** Returns the SpawnResults for the action. */ + public abstract Set<SpawnResult> spawnResults(); + + /** Returns a builder that can be used to construct a {@link ActionResult} object. */ + public static Builder builder() { + return new AutoValue_ActionResult.Builder(); + } + + /** Creates an ActionResult given a set of SpawnResults. */ + public static ActionResult create(Set<SpawnResult> spawnResults) { + if (spawnResults == null) { + return EMPTY; + } else { + return builder().setSpawnResults(spawnResults).build(); + } + } + + /** Builder for a {@link ActionResult} instance, which is immutable once built. */ + @AutoValue.Builder + public abstract static class Builder { + + /** Sets the SpawnResults for the action. */ + public abstract Builder setSpawnResults(Set<SpawnResult> spawnResults); + + /** Builds and returns an ActionResult object. */ + public abstract ActionResult build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/actions/FailAction.java b/src/main/java/com/google/devtools/build/lib/actions/FailAction.java index 8bebf4eb99..7f217409c8 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/FailAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/FailAction.java @@ -39,7 +39,7 @@ public final class FailAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException { throw new ActionExecutionException(errorMessage, this, false); } diff --git a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanAction.java b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanAction.java index 7474c7c13d..6713032058 100644 --- a/src/main/java/com/google/devtools/build/lib/actions/MiddlemanAction.java +++ b/src/main/java/com/google/devtools/build/lib/actions/MiddlemanAction.java @@ -51,8 +51,7 @@ public final class MiddlemanAction extends AbstractAction { } @Override - public final void execute( - ActionExecutionContext actionExecutionContext) { + public final ActionResult execute(ActionExecutionContext actionExecutionContext) { throw new IllegalStateException("MiddlemanAction should never be executed"); } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/PseudoAction.java b/src/main/java/com/google/devtools/build/lib/analysis/PseudoAction.java index d37770fd77..4c85dc0ada 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/PseudoAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/PseudoAction.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.CommandLineExpansionException; import com.google.devtools.build.lib.actions.extra.ExtraActionInfo; @@ -50,7 +51,7 @@ public class PseudoAction<InfoType extends MessageLite> extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException { throw new ActionExecutionException( mnemonic + "ExtraAction should not be executed.", this, false); diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java index 53a03d6308..3789e986b4 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/AbstractFileWriteAction.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.ExecException; import com.google.devtools.build.lib.cmdline.Label; @@ -55,10 +56,13 @@ public abstract class AbstractFileWriteAction extends AbstractAction { } @Override - public final void execute(ActionExecutionContext actionExecutionContext) + public final ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { + ActionResult actionResult; try { - getStrategy(actionExecutionContext).exec(this, actionExecutionContext); + actionResult = + ActionResult.create( + getStrategy(actionExecutionContext).exec(this, actionExecutionContext)); } catch (ExecException e) { throw e.toActionExecutionException( "Writing file for rule '" + Label.print(getOwner().getLabel()) + "'", @@ -66,6 +70,7 @@ public abstract class AbstractFileWriteAction extends AbstractAction { this); } afterWrite(actionExecutionContext); + return actionResult; } /** diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java index 4cdf2f1e12..74131b1295 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/ExecutableSymlinkAction.java @@ -18,6 +18,7 @@ import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.vfs.Path; import java.io.IOException; @@ -33,7 +34,7 @@ public final class ExecutableSymlinkAction extends SymlinkAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException { Path inputPath = getPrimaryInput().getPath(); try { @@ -56,7 +57,7 @@ public final class ExecutableSymlinkAction extends SymlinkAction { + "' due to I/O error: " + e.getMessage(), e, this, false); } - super.execute(actionExecutionContext); + return super.execute(actionExecutionContext); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java index 8efe29ffef..7f64be3f40 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/PopulateTreeArtifactAction.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionMetadata; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputHelper; import com.google.devtools.build.lib.actions.ActionOwner; +import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.TreeFileArtifact; @@ -34,6 +35,7 @@ import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.RunfilesSupplier; import com.google.devtools.build.lib.actions.Spawn; import com.google.devtools.build.lib.actions.SpawnActionContext; +import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.analysis.FilesToRunProvider; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.Preconditions; @@ -43,6 +45,7 @@ import java.io.IOException; import java.util.Collection; import java.util.List; import java.util.Map; +import java.util.Set; /** * An action that populates a TreeArtifact with the contents of an archive file. @@ -151,7 +154,7 @@ public final class PopulateTreeArtifactAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { Spawn spawn; @@ -167,7 +170,7 @@ public final class PopulateTreeArtifactAction extends AbstractAction { // If the spawn does not have any output, it means the archive file contains nothing. In this // case we just return without generating anything under the output TreeArtifact. if (spawn.getOutputFiles().isEmpty()) { - return; + return ActionResult.EMPTY; } // Check spawn output TreeFileArtifact conflicts. @@ -188,8 +191,9 @@ public final class PopulateTreeArtifactAction extends AbstractAction { } // Execute the spawn. + Set<SpawnResult> spawnResults; try { - getContext(actionExecutionContext).exec(spawn, actionExecutionContext); + spawnResults = getContext(actionExecutionContext).exec(spawn, actionExecutionContext); } catch (ExecException e) { throw e.toActionExecutionException( getMnemonic() + " action failed for target: " + getOwner().getLabel(), @@ -202,6 +206,7 @@ public final class PopulateTreeArtifactAction extends AbstractAction { actionExecutionContext.getMetadataHandler().addExpandedTreeOutput( (TreeFileArtifact) fileEntry); } + return ActionResult.create(spawnResults); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java index 688d2aaa94..cd19919d47 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SpawnAction.java @@ -28,6 +28,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputHelper; 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.actions.Artifact.ArtifactExpander; import com.google.devtools.build.lib.actions.BaseSpawn; @@ -262,11 +263,10 @@ public class SpawnAction extends AbstractAction implements ExecutionInfoSpecifie } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { try { - // TODO(b/62588075): internalExecute() now returns a set of SpawnResults, we could capture it. - internalExecute(actionExecutionContext); + return ActionResult.create(internalExecute(actionExecutionContext)); } catch (ExecException e) { String failMessage; if (isShellCommand()) { diff --git a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java index df3b56f829..e9bbdf7e19 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/actions/SymlinkAction.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.util.Fingerprint; import com.google.devtools.build.lib.util.Preconditions; @@ -107,7 +108,7 @@ public class SymlinkAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException { Path srcPath; if (inputPath == null) { @@ -123,6 +124,7 @@ public class SymlinkAction extends AbstractAction { + "' to the '" + Iterables.getOnlyElement(getInputs()).prettyPrint() + "' due to I/O error: " + e.getMessage(), e, this, false); } + return ActionResult.EMPTY; } @Override 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 25da294619..d510c28e86 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 @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.util.Fingerprint; @@ -113,10 +114,11 @@ public final class SymlinkTreeAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { - actionExecutionContext - .getContext(SymlinkTreeActionContext.class) - .createSymlinks(this, actionExecutionContext, shellEnvironment, enableRunfiles); + return ActionResult.create( + actionExecutionContext + .getContext(SymlinkTreeActionContext.class) + .createSymlinks(this, actionExecutionContext, shellEnvironment, enableRunfiles)); } } diff --git a/src/main/java/com/google/devtools/build/lib/analysis/extra/ExtraAction.java b/src/main/java/com/google/devtools/build/lib/analysis/extra/ExtraAction.java index 8c4d14aa79..39b9f4c5bd 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/extra/ExtraAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/extra/ExtraAction.java @@ -24,6 +24,7 @@ import com.google.devtools.build.lib.actions.Action; import com.google.devtools.build.lib.actions.ActionEnvironment; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; +import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.CompositeRunfilesSupplier; import com.google.devtools.build.lib.actions.RunfilesSupplier; @@ -147,17 +148,16 @@ public final class ExtraAction extends SpawnAction { /** * @InheritDoc * - * This method calls in to {@link AbstractAction#getInputFilesForExtraAction} and - * {@link Action#getExtraActionInfo} of the action being shadowed from the thread executing this + * <p>This method calls in to {@link AbstractAction#getInputFilesForExtraAction} and {@link + * Action#getExtraActionInfo} of the action being shadowed from the thread executing this * ExtraAction. It assumes these methods are safe to call from a different thread than the thread * responsible for the execution of the action being shadowed. */ @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { // PHASE 2: execution of extra_action. - - super.execute(actionExecutionContext); + ActionResult actionResult = super.execute(actionExecutionContext); // PHASE 3: create dummy output. // If the user didn't specify output, we need to create dummy output @@ -171,6 +171,8 @@ public final class ExtraAction extends SpawnAction { } } } + + return actionResult; } /** diff --git a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java index 49a56222e7..a3525e5501 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/test/TestRunnerAction.java @@ -25,6 +25,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionInput; import com.google.devtools.build.lib.actions.ActionInputHelper; 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.actions.CommandLineExpansionException; import com.google.devtools.build.lib.actions.ExecException; @@ -656,11 +657,11 @@ public class TestRunnerAction extends AbstractAction implements NotifyOnActionCa } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { TestActionContext context = actionExecutionContext.getContext(TestActionContext.class); try { - context.exec(this, actionExecutionContext); + return ActionResult.create(context.exec(this, actionExecutionContext)); } catch (ExecException e) { throw e.toActionExecutionException(this); } finally { diff --git a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java index 16f882fd11..3bdb6d48ed 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/BazelWorkspaceStatusModule.java @@ -24,6 +24,7 @@ import com.google.common.eventbus.Subscribe; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.ArtifactFactory; import com.google.devtools.build.lib.actions.ArtifactOwner; @@ -177,7 +178,7 @@ public class BazelWorkspaceStatusModule extends BlazeModule { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException { try { Map<String, String> statusMap = parseWorkspaceStatus( @@ -231,6 +232,7 @@ public class BazelWorkspaceStatusModule extends BlazeModule { this, true); } + return ActionResult.EMPTY; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java index 5d6c3689d4..3d93900fa6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppCompileAction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionLookupValue; import com.google.devtools.build.lib.actions.ActionLookupValue.ActionLookupKey; import com.google.devtools.build.lib.actions.ActionOwner; +import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.ActionStatusMessage; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Artifact.ArtifactExpander; @@ -37,6 +38,7 @@ import com.google.devtools.build.lib.actions.ExecException; import com.google.devtools.build.lib.actions.ExecutionInfoSpecifier; import com.google.devtools.build.lib.actions.ExecutionRequirements; import com.google.devtools.build.lib.actions.ResourceSet; +import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.actions.extra.CppCompileInfo; import com.google.devtools.build.lib.actions.extra.EnvironmentVariable; import com.google.devtools.build.lib.actions.extra.ExtraActionInfo; @@ -1150,11 +1152,9 @@ public class CppCompileAction extends AbstractAction @Override @ThreadCompatible - public void execute( - ActionExecutionContext actionExecutionContext) - throws ActionExecutionException, InterruptedException { + public ActionResult execute(ActionExecutionContext actionExecutionContext) + throws ActionExecutionException, InterruptedException { setModuleFileFlags(); - CppCompileActionContext.Reply reply; ShowIncludesFilter showIncludesFilterForStdout = null; ShowIncludesFilter showIncludesFilterForStderr = null; @@ -1166,13 +1166,15 @@ public class CppCompileAction extends AbstractAction actionExecutionContext.getFileOutErr().setOutputFilter(showIncludesFilterForStdout); actionExecutionContext.getFileOutErr().setErrorFilter(showIncludesFilterForStderr); } + + Set<SpawnResult> spawnResults; try { CppCompileActionResult cppCompileActionResult = actionExecutionContext .getContext(actionContext) .execWithReply(this, actionExecutionContext); - // TODO(b/62588075) Save spawnResults from cppCompileActionResult and return them upwards. reply = cppCompileActionResult.contextReply(); + spawnResults = cppCompileActionResult.spawnResults(); } catch (ExecException e) { throw e.toActionExecutionException( "C++ compilation of rule '" + getOwner().getLabel() + "'", @@ -1213,6 +1215,7 @@ public class CppCompileAction extends AbstractAction actionExecutionContext.getArtifactExpander(), actionExecutionContext.getEventHandler()); } + return ActionResult.create(spawnResults); } @VisibleForTesting diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java index 806ecfc96a..63a8b6ce88 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CppLinkAction.java @@ -26,6 +26,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.CommandAction; import com.google.devtools.build.lib.actions.CommandLineExpansionException; @@ -302,10 +303,11 @@ public final class CppLinkAction extends AbstractAction @Override @ThreadCompatible - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { if (fake) { executeFake(); + return ActionResult.EMPTY; } else { try { Spawn spawn = new SimpleSpawn( @@ -316,8 +318,10 @@ public final class CppLinkAction extends AbstractAction ImmutableList.copyOf(getMandatoryInputs()), getOutputs().asList(), estimateResourceConsumptionLocal()); - actionExecutionContext.getSpawnActionContext(getMnemonic()) - .exec(spawn, actionExecutionContext); + return ActionResult.create( + actionExecutionContext + .getSpawnActionContext(getMnemonic()) + .exec(spawn, actionExecutionContext)); } catch (ExecException e) { throw e.toActionExecutionException( "Linking of rule '" + getOwner().getLabel() + "'", diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java index ee8e92b2ef..c0da518642 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/CreateIncSymlinkAction.java @@ -22,6 +22,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.util.Fingerprint; @@ -61,8 +62,8 @@ public final class CreateIncSymlinkAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) - throws ActionExecutionException { + public ActionResult execute(ActionExecutionContext actionExecutionContext) + throws ActionExecutionException { try { for (Map.Entry<Artifact, Artifact> entry : symlinks.entrySet()) { Path symlink = entry.getKey().getPath(); @@ -72,6 +73,7 @@ public final class CreateIncSymlinkAction extends AbstractAction { String message = "IO Error while creating symlink"; throw new ActionExecutionException(message, e, this, false); } + return ActionResult.EMPTY; } @VisibleForTesting diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java index e66fae1f63..1bd76c280c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/ExtractInclusionAction.java @@ -19,6 +19,7 @@ import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.ExecException; import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable; @@ -64,7 +65,7 @@ final class ExtractInclusionAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { IncludeScanningContext context = actionExecutionContext.getContext(IncludeScanningContext.class); @@ -76,5 +77,6 @@ final class ExtractInclusionAction extends AbstractAction { } catch (ExecException e) { throw e.toActionExecutionException(this); } + return ActionResult.EMPTY; } } diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java index dc36e72f69..7f00e3eb24 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FakeCppCompileAction.java @@ -23,9 +23,11 @@ import com.google.common.collect.ImmutableMap; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; 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.actions.ExecException; import com.google.devtools.build.lib.actions.ResourceSet; +import com.google.devtools.build.lib.actions.SpawnResult; import com.google.devtools.build.lib.collect.nestedset.NestedSet; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible; @@ -37,6 +39,7 @@ import com.google.devtools.build.lib.vfs.FileSystemUtils; import com.google.devtools.build.lib.vfs.Path; import com.google.devtools.build.lib.vfs.PathFragment; import java.io.IOException; +import java.util.Set; import java.util.UUID; import java.util.logging.Logger; @@ -120,9 +123,10 @@ public class FakeCppCompileAction extends CppCompileAction { @Override @ThreadCompatible - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { setModuleFileFlags(); + Set<SpawnResult> spawnResults; // First, do a normal compilation, to generate the ".d" file. The generated object file is built // to a temporary location (tempOutputFile) and ignored afterwards. logger.info("Generating " + getDotdFile()); @@ -131,8 +135,8 @@ public class FakeCppCompileAction extends CppCompileAction { try { CppCompileActionResult cppCompileActionResult = context.execWithReply(this, actionExecutionContext); - // TODO(b/62588075) Save spawnResults from cppCompileActionResult and return them upwards. reply = cppCompileActionResult.contextReply(); + spawnResults = cppCompileActionResult.spawnResults(); } catch (ExecException e) { throw e.toActionExecutionException( "C++ compilation of rule '" + getOwner().getLabel() + "'", @@ -238,6 +242,7 @@ public class FakeCppCompileAction extends CppCompileAction { throw new ActionExecutionException("failed to create fake compile command for rule '" + getOwner().getLabel() + ": " + e.getMessage(), this, false); } + return ActionResult.create(spawnResults); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java index be9624625b..26b0276488 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/FdoStubAction.java @@ -17,6 +17,7 @@ import com.google.common.collect.ImmutableList; import com.google.devtools.build.lib.actions.AbstractAction; import com.google.devtools.build.lib.actions.ActionExecutionContext; 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.vfs.Path; @@ -43,7 +44,8 @@ public final class FdoStubAction extends AbstractAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) { + public ActionResult execute(ActionExecutionContext actionExecutionContext) { + return ActionResult.EMPTY; } @Override diff --git a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java index 98b3f2fa54..48b12a80ac 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/cpp/SolibSymlinkAction.java @@ -20,6 +20,7 @@ import com.google.devtools.build.lib.actions.ActionAnalysisMetadata; import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionOwner; +import com.google.devtools.build.lib.actions.ActionResult; import com.google.devtools.build.lib.actions.Actions; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.actions.Root; @@ -54,8 +55,8 @@ public final class SolibSymlinkAction extends AbstractAction { } @Override - public void execute( - ActionExecutionContext actionExecutionContext) throws ActionExecutionException { + public ActionResult execute(ActionExecutionContext actionExecutionContext) + throws ActionExecutionException { Path mangledPath = symlink.getPath(); try { mangledPath.createSymbolicLink(target); @@ -63,6 +64,7 @@ public final class SolibSymlinkAction extends AbstractAction { throw new ActionExecutionException("failed to create _solib symbolic link '" + symlink.prettyPrint() + "' to target '" + target + "'", e, this, false); } + return ActionResult.EMPTY; } diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java index cabab193d3..0e179314a2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCompileAction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.actions.ActionExecutionContext; import com.google.devtools.build.lib.actions.ActionExecutionException; import com.google.devtools.build.lib.actions.ActionInput; 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.actions.ArtifactResolver; import com.google.devtools.build.lib.actions.CommandLineExpansionException; @@ -213,9 +214,9 @@ public class ObjcCompileAction extends SpawnAction { } @Override - public void execute(ActionExecutionContext actionExecutionContext) + public ActionResult execute(ActionExecutionContext actionExecutionContext) throws ActionExecutionException, InterruptedException { - super.execute(actionExecutionContext); + ActionResult actionResult = super.execute(actionExecutionContext); if (dotdPruningPlan == HeaderDiscovery.DotdPruningMode.USE) { IncludeScanningContext scanningContext = @@ -232,6 +233,8 @@ public class ObjcCompileAction extends SpawnAction { // haven't quite managed to get that right yet. updateActionInputs(getInputs()); } + + return actionResult; } @VisibleForTesting diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java index be0ba39ae3..81192024af 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeActionExecutor.java @@ -847,8 +847,9 @@ public final class SkyframeActionExecutor implements ActionExecutionContextFacto // instead. FileOutErr outErrBuffer = actionExecutionContext.getFileOutErr(); try { + // TODO(b/62588075): Now that execute() returns information about the execution, we could log + // the data to the invocations table. action.execute(actionExecutionContext); - // Action terminated fine, now report the output. // The .showOutput() method is not necessarily a quick check: in its // current implementation it uses regular expression matching. |