aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-04-03 10:01:10 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-04-03 10:02:35 -0700
commit6ed4fd55ac792b4b6a5003cb1530a5a8b1b8b55d (patch)
tree6f05fd4b3c4be367b25980a06998beb8cb8605de
parent87cd8d6dc4180692fa6d773683fea7a9d02107f1 (diff)
Fix build results for aspect builds.
The current output was pretty much completely incorrect. However since the result output was always hidden for the default value of --show_result, users simply didn't see the incorrect output (instead getting no output at all). This CL fixes both the --show_result problem and makes the output correct. RELNOTES: Print correct build result for builds with --aspects flag. PiperOrigin-RevId: 191456352
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java159
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java36
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/Builder.java36
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java3
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java10
9 files changed, 187 insertions, 111 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
index b8dedd1973..5ca0204cf6 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResult.java
@@ -19,6 +19,7 @@ import com.google.common.base.MoreObjects;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
+import com.google.devtools.build.lib.skyframe.AspectValue;
import com.google.devtools.build.lib.util.ExitCode;
import java.util.Collection;
import java.util.Collections;
@@ -42,6 +43,7 @@ public final class BuildResult {
private Collection<ConfiguredTarget> testTargets;
private Collection<ConfiguredTarget> successfulTargets;
private Collection<ConfiguredTarget> skippedTargets;
+ private Collection<AspectValue> successfulAspects;
public BuildResult(long startTimeMillis) {
this.startTimeMillis = startTimeMillis;
@@ -194,20 +196,36 @@ public final class BuildResult {
this.successfulTargets = successfulTargets;
}
+ /** @see #getSuccessfulAspects */
+ void setSuccessfulAspects(Collection<AspectValue> successfulAspects) {
+ this.successfulAspects = successfulAspects;
+ }
+
/**
- * Returns the set of targets which successfully built. This value
- * is set at the end of the build, after the target patterns have been parsed
- * and resolved and after attempting to build the targets. If --keep_going
- * is specified, this set may exclude targets that could not be found or
- * successfully analyzed, or could not be built. It may be examined after
- * the build. May be null if the execution phase was not attempted, as
- * may happen if there are errors in the loading phase, for example.
+ * Returns the set of targets that were successfully built. This value is set at the end of the
+ * build, after the target patterns have been parsed and resolved and after attempting to build
+ * the targets. If --keep_going is specified, this set may exclude targets that could not be found
+ * or successfully analyzed, or could not be built. It may be examined after the build. May be
+ * null if the execution phase was not attempted, as may happen if there are errors in the loading
+ * phase, for example.
*/
public Collection<ConfiguredTarget> getSuccessfulTargets() {
return successfulTargets;
}
/**
+ * Returns the set of aspects that were successfully built. This value is set at the end of the
+ * build, after the target patterns have been parsed and resolved and after attempting to build
+ * the targets. If --keep_going is specified, this set may exclude targets that could not be found
+ * or successfully analyzed, or could not be built. It may be examined after the build. May be
+ * null if the execution phase was not attempted, as may happen if there are errors in the loading
+ * phase, for example.
+ */
+ public Collection<AspectValue> getSuccessfulAspects() {
+ return successfulAspects;
+ }
+
+ /**
* See {@link #getSkippedTargets()}.
*/
void setSkippedTargets(Collection<ConfiguredTarget> skippedTargets) {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
index d0b8b0c11c..005b1858a3 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildResultPrinter.java
@@ -66,92 +66,111 @@ class BuildResultPrinter {
// problem where the summary message and the exit code disagree. The logic
// here is already complex.
+ OutErr outErr = request.getOutErr();
Collection<ConfiguredTarget> targetsToPrint = filterTargetsToPrint(configuredTargets);
Collection<AspectValue> aspectsToPrint = filterAspectsToPrint(aspects);
-
- // Filter the targets we care about into two buckets:
- Collection<ConfiguredTarget> succeeded = new ArrayList<>();
- Collection<ConfiguredTarget> failed = new ArrayList<>();
- for (ConfiguredTarget target : targetsToPrint) {
+ final boolean success;
+ if (aspectsToPrint.isEmpty()) {
+ // Suppress summary if --show_result value is exceeded:
+ if (targetsToPrint.size() > request.getBuildOptions().maxResultTargets) {
+ return;
+ }
+ // Filter the targets we care about into two buckets:
+ Collection<ConfiguredTarget> succeeded = new ArrayList<>();
+ Collection<ConfiguredTarget> failed = new ArrayList<>();
Collection<ConfiguredTarget> successfulTargets = result.getSuccessfulTargets();
- (successfulTargets.contains(target) ? succeeded : failed).add(target);
- }
-
- // TODO(bazel-team): convert these to a new "SKIPPED" status when ready: b/62191890.
- failed.addAll(configuredTargetsToSkip);
-
- // Suppress summary if --show_result value is exceeded:
- if (succeeded.size() + failed.size() + aspectsToPrint.size()
- > request.getBuildOptions().maxResultTargets) {
- return;
- }
+ for (ConfiguredTarget target : targetsToPrint) {
+ (successfulTargets.contains(target) ? succeeded : failed).add(target);
+ }
- OutErr outErr = request.getOutErr();
+ // TODO(bazel-team): convert these to a new "SKIPPED" status when ready: b/62191890.
+ failed.addAll(configuredTargetsToSkip);
- TopLevelArtifactContext context = request.getTopLevelArtifactContext();
- for (ConfiguredTarget target : succeeded) {
- Label label = target.getLabel();
- // For up-to-date targets report generated artifacts, but only
- // if they have associated action and not middleman artifacts.
- boolean headerFlag = true;
- for (Artifact artifact :
- TopLevelArtifactHelper.getAllArtifactsToBuild(target, context).getImportantArtifacts()) {
- if (shouldPrint(artifact)) {
- if (headerFlag) {
- outErr.printErr("Target " + label + " up-to-date:\n");
- headerFlag = false;
+ TopLevelArtifactContext context = request.getTopLevelArtifactContext();
+ for (ConfiguredTarget target : succeeded) {
+ Label label = target.getLabel();
+ // For up-to-date targets report generated artifacts, but only
+ // if they have associated action and not middleman artifacts.
+ boolean headerFlag = true;
+ for (Artifact artifact :
+ TopLevelArtifactHelper.getAllArtifactsToBuild(target, context)
+ .getImportantArtifacts()) {
+ if (shouldPrint(artifact)) {
+ if (headerFlag) {
+ outErr.printErr("Target " + label + " up-to-date:\n");
+ headerFlag = false;
+ }
+ outErr.printErrLn(formatArtifactForShowResults(artifact, request));
}
- outErr.printErrLn(formatArtifactForShowResults(artifact, request));
}
- }
- if (headerFlag) {
- outErr.printErr("Target " + label + " up-to-date (nothing to build)\n");
- }
- }
-
- for (AspectValue aspect : aspectsToPrint) {
- Label label = aspect.getLabel();
- String aspectName = aspect.getConfiguredAspect().getName();
- boolean headerFlag = true;
- NestedSet<Artifact> importantArtifacts =
- TopLevelArtifactHelper.getAllArtifactsToBuild(aspect, context).getImportantArtifacts();
- for (Artifact importantArtifact : importantArtifacts) {
if (headerFlag) {
- outErr.printErr("Aspect " + aspectName + " of " + label + " up-to-date:\n");
- headerFlag = false;
+ outErr.printErr("Target " + label + " up-to-date (nothing to build)\n");
}
- if (shouldPrint(importantArtifact)) {
- outErr.printErrLn(formatArtifactForShowResults(importantArtifact, request));
+ }
+ for (ConfiguredTarget target : failed) {
+ outErr.printErr("Target " + target.getLabel() + " failed to build\n");
+
+ // For failed compilation, it is still useful to examine temp artifacts,
+ // (ie, preprocessed and assembler files).
+ OutputGroupInfo topLevelProvider = OutputGroupInfo.get(target);
+ String productName = env.getRuntime().getProductName();
+ if (topLevelProvider != null) {
+ for (Artifact temp : topLevelProvider.getOutputGroup(OutputGroupInfo.TEMP_FILES)) {
+ if (temp.getPath().exists()) {
+ outErr.printErrLn(
+ " See temp at "
+ + OutputDirectoryLinksUtils.getPrettyPath(
+ temp.getPath(),
+ env.getWorkspaceName(),
+ env.getWorkspace(),
+ request.getBuildOptions().getSymlinkPrefix(productName),
+ productName));
+ }
+ }
}
}
- if (headerFlag) {
- outErr.printErr(
- "Aspect " + aspectName + " of " + label + " up-to-date (nothing to build)\n");
+ success = failed.isEmpty();
+ } else {
+ // Suppress summary if --show_result value is exceeded:
+ if (aspectsToPrint.size() > request.getBuildOptions().maxResultTargets) {
+ return;
}
- }
-
- for (ConfiguredTarget target : failed) {
- outErr.printErr("Target " + target.getLabel() + " failed to build\n");
-
- // For failed compilation, it is still useful to examine temp artifacts,
- // (ie, preprocessed and assembler files).
- OutputGroupInfo topLevelProvider =
- OutputGroupInfo.get(target);
- String productName = env.getRuntime().getProductName();
- if (topLevelProvider != null) {
- for (Artifact temp : topLevelProvider.getOutputGroup(OutputGroupInfo.TEMP_FILES)) {
- if (temp.getPath().exists()) {
- outErr.printErrLn(" See temp at "
- + OutputDirectoryLinksUtils.getPrettyPath(temp.getPath(),
- env.getWorkspaceName(),
- env.getWorkspace(),
- request.getBuildOptions().getSymlinkPrefix(productName),
- productName));
+ // Filter the targets we care about into two buckets:
+ Collection<AspectValue> succeeded = new ArrayList<>();
+ Collection<AspectValue> failed = new ArrayList<>();
+ Collection<AspectValue> successfulAspects = result.getSuccessfulAspects();
+ for (AspectValue aspect : aspectsToPrint) {
+ (successfulAspects.contains(aspect) ? succeeded : failed).add(aspect);
+ }
+ TopLevelArtifactContext context = request.getTopLevelArtifactContext();
+ for (AspectValue aspect : succeeded) {
+ Label label = aspect.getLabel();
+ String aspectName = aspect.getConfiguredAspect().getName();
+ boolean headerFlag = true;
+ NestedSet<Artifact> importantArtifacts =
+ TopLevelArtifactHelper.getAllArtifactsToBuild(aspect, context).getImportantArtifacts();
+ for (Artifact importantArtifact : importantArtifacts) {
+ if (headerFlag) {
+ outErr.printErr("Aspect " + aspectName + " of " + label + " up-to-date:\n");
+ headerFlag = false;
+ }
+ if (shouldPrint(importantArtifact)) {
+ outErr.printErrLn(formatArtifactForShowResults(importantArtifact, request));
}
}
+ if (headerFlag) {
+ outErr.printErr(
+ "Aspect " + aspectName + " of " + label + " up-to-date (nothing to build)\n");
+ }
+ }
+ for (AspectValue aspect : failed) {
+ Label label = aspect.getLabel();
+ String aspectName = aspect.getConfiguredAspect().getName();
+ outErr.printErr("Aspect " + aspectName + " of " + label + " failed to build\n");
}
+ success = failed.isEmpty();
}
- if (!failed.isEmpty() && !request.getOptions(ExecutionOptions.class).verboseFailures) {
+ if (!success && !request.getOptions(ExecutionOptions.class).verboseFailures) {
outErr.printErr("Use --verbose_failures to see the command lines of failed build steps.\n");
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
index ef4319573a..1becb5bc93 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java
@@ -22,6 +22,9 @@ import com.google.devtools.build.lib.actions.ActionLookupData;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.clock.BlazeClock;
import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog;
+import com.google.devtools.build.lib.skyframe.AspectCompletionValue;
+import com.google.devtools.build.lib.skyframe.AspectCompletionValue.AspectCompletionKey;
+import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
import com.google.devtools.build.lib.skyframe.SkyFunctions;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor;
import com.google.devtools.build.lib.skyframe.TargetCompletionValue;
@@ -47,6 +50,7 @@ public final class ExecutionProgressReceiver
// Must be thread-safe!
private final Set<ConfiguredTarget> builtTargets;
+ private final Set<AspectKey> builtAspects;
private final Set<ActionLookupData> enqueuedActions = Sets.newConcurrentHashSet();
private final Set<ActionLookupData> completedActions = Sets.newConcurrentHashSet();
private final Set<ActionLookupData> ignoredActions = Sets.newConcurrentHashSet();
@@ -65,9 +69,9 @@ public final class ExecutionProgressReceiver
* permitted while this receiver is active.
*/
ExecutionProgressReceiver(
- Set<ConfiguredTarget> builtTargets,
- int exclusiveTestsCount) {
+ Set<ConfiguredTarget> builtTargets, Set<AspectKey> builtAspects, int exclusiveTestsCount) {
this.builtTargets = Collections.synchronizedSet(builtTargets);
+ this.builtAspects = Collections.synchronizedSet(builtAspects);
this.exclusiveTestsCount = exclusiveTestsCount;
}
@@ -103,9 +107,15 @@ public final class ExecutionProgressReceiver
if (value == null) {
return;
}
-
ConfiguredTarget target = value.getConfiguredTarget();
builtTargets.add(target);
+ } else if (type.equals(SkyFunctions.ASPECT_COMPLETION)) {
+ AspectCompletionValue value = (AspectCompletionValue) skyValueSupplier.get();
+ if (value == null) {
+ return;
+ }
+ AspectKey aspectKey = ((AspectCompletionKey) skyKey).aspectKey();
+ builtAspects.add(aspectKey);
} else if (type.equals(SkyFunctions.ACTION_EXECUTION)) {
// Remember all completed actions, even those in error, regardless of having been cached or
// really executed.
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
index 3323f58f26..6971aaca39 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java
@@ -14,7 +14,6 @@
package com.google.devtools.build.lib.buildtool;
import static com.google.common.collect.ImmutableSet.toImmutableSet;
-import static java.util.concurrent.TimeUnit.MILLISECONDS;
import com.google.common.base.Preconditions;
import com.google.common.base.Predicate;
@@ -75,6 +74,7 @@ import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.BlazeRuntime;
import com.google.devtools.build.lib.runtime.CommandEnvironment;
import com.google.devtools.build.lib.skyframe.AspectValue;
+import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
import com.google.devtools.build.lib.skyframe.Builder;
import com.google.devtools.build.lib.skyframe.OutputService;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
@@ -295,6 +295,7 @@ public class ExecutionTool {
request.getOptionsDescription());
Set<ConfiguredTarget> builtTargets = new HashSet<>();
+ Set<AspectKey> builtAspects = new HashSet<>();
Collection<AspectValue> aspects = analysisResult.getAspects();
Iterable<Artifact> allArtifactsForProviders =
@@ -345,6 +346,7 @@ public class ExecutionTool {
analysisResult.getAspects(),
executor,
builtTargets,
+ builtAspects,
request.getBuildOptions().explanationPath != null,
env.getBlazeWorkspace().getLastExecutionTimeRange(),
topLevelArtifactContext);
@@ -377,9 +379,13 @@ public class ExecutionTool {
saveActionCache(actionCache);
}
+ env.getEventBus()
+ .post(new ExecutionPhaseCompleteEvent(timer.stop().elapsed(TimeUnit.MILLISECONDS)));
+
try (AutoProfiler p = AutoProfiler.profiled("Show results", ProfilerTask.INFO)) {
buildResult.setSuccessfulTargets(
- determineSuccessfulTargets(configuredTargets, builtTargets, timer));
+ determineSuccessfulTargets(configuredTargets, builtTargets));
+ buildResult.setSuccessfulAspects(determineSuccessfulAspects(aspects, builtAspects));
buildResult.setSkippedTargets(analysisResult.getTargetsToSkip());
BuildResultPrinter buildResultPrinter = new BuildResultPrinter(env);
buildResultPrinter.showBuildResult(request, buildResult, configuredTargets,
@@ -529,16 +535,13 @@ public class ExecutionTool {
}
/**
- * Computes the result of the build. Sets the list of successful (up-to-date)
- * targets in the request object.
+ * Computes the result of the build. Sets the list of successful (up-to-date) targets in the
+ * request object.
*
- * @param configuredTargets The configured targets whose artifacts are to be
- * built.
- * @param timer A timer that was started when the execution phase started.
+ * @param configuredTargets The configured targets whose artifacts are to be built.
*/
private Collection<ConfiguredTarget> determineSuccessfulTargets(
- Collection<ConfiguredTarget> configuredTargets, Set<ConfiguredTarget> builtTargets,
- Stopwatch timer) {
+ Collection<ConfiguredTarget> configuredTargets, Set<ConfiguredTarget> builtTargets) {
// Maintain the ordering by copying builtTargets into a LinkedHashSet in the same iteration
// order as configuredTargets.
Collection<ConfiguredTarget> successfulTargets = new LinkedHashSet<>();
@@ -547,11 +550,22 @@ public class ExecutionTool {
successfulTargets.add(target);
}
}
- env.getEventBus().post(
- new ExecutionPhaseCompleteEvent(timer.stop().elapsed(MILLISECONDS)));
return successfulTargets;
}
+ private Collection<AspectValue> determineSuccessfulAspects(
+ Collection<AspectValue> aspects, Set<AspectKey> builtAspects) {
+ // Maintain the ordering by copying builtTargets into a LinkedHashSet in the same iteration
+ // order as configuredTargets.
+ Collection<AspectValue> successfulAspects = new LinkedHashSet<>();
+ for (AspectValue aspect : aspects) {
+ if (builtAspects.contains(aspect.getKey())) {
+ successfulAspects.add(aspect);
+ }
+ }
+ return successfulAspects;
+ }
+
/** Get action cache if present or reload it from the on-disk cache. */
private ActionCache getActionCache() throws LocalEnvironmentException {
try {
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
index e72eda9ed0..f557e62ffe 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
@@ -39,6 +39,7 @@ import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.packages.BuildFileNotFoundException;
import com.google.devtools.build.lib.skyframe.ActionExecutionInactivityWatchdog;
import com.google.devtools.build.lib.skyframe.AspectValue;
+import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
import com.google.devtools.build.lib.skyframe.Builder;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
import com.google.devtools.build.lib.util.AbruptExitException;
@@ -103,6 +104,7 @@ public class SkyframeBuilder implements Builder {
Collection<AspectValue> aspects,
Executor executor,
Set<ConfiguredTarget> builtTargets,
+ Set<AspectKey> builtAspects,
boolean explain,
@Nullable Range<Long> lastExecutionTimeRange,
TopLevelArtifactContext topLevelArtifactContext)
@@ -114,6 +116,7 @@ public class SkyframeBuilder implements Builder {
ExecutionProgressReceiver executionProgressReceiver =
new ExecutionProgressReceiver(
Preconditions.checkNotNull(builtTargets),
+ Preconditions.checkNotNull(builtAspects),
countTestActions(exclusiveTests));
skyframeExecutor
.getEventBus()
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java
index 7b33d0bfe4..64066cf948 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectCompletionValue.java
@@ -37,8 +37,9 @@ public class AspectCompletionValue implements SkyValue {
targets, aspectValue -> AspectCompletionKey.create(aspectValue.getKey(), ctx));
}
+ /** The key of an AspectCompletionValue. */
@AutoValue
- abstract static class AspectCompletionKey implements SkyKey {
+ public abstract static class AspectCompletionKey implements SkyKey {
public static AspectCompletionKey create(
AspectKey aspectKey, TopLevelArtifactContext topLevelArtifactContext) {
return new AutoValue_AspectCompletionValue_AspectCompletionKey(
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java b/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
index 1b88199614..5ce1016200 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/Builder.java
@@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
import com.google.devtools.build.lib.concurrent.ThreadSafety.ThreadCompatible;
import com.google.devtools.build.lib.events.Reporter;
+import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
import com.google.devtools.build.lib.util.AbruptExitException;
import java.util.Collection;
import java.util.Set;
@@ -43,33 +44,35 @@ public interface Builder {
/**
* Transitively build all given artifacts, targets, and tests, and all necessary prerequisites
- * thereof. For sequential implementations of this interface, the top-level requests will be
- * built in the iteration order of the Set provided; for concurrent implementations, the order
- * is undefined.
+ * thereof. For sequential implementations of this interface, the top-level requests will be built
+ * in the iteration order of the Set provided; for concurrent implementations, the order is
+ * undefined.
*
* <p>This method should not be invoked more than once concurrently on the same Builder instance.
*
* @param artifacts the set of Artifacts to build
* @param parallelTests tests to execute in parallel with the other top-level targetsToBuild and
- * artifacts.
+ * artifacts.
* @param exclusiveTests are executed one at a time, only after all other tasks have completed
* @param targetsToBuild Set of targets which will be built
* @param targetsToSkip Set of targets which should be skipped (they still show up in build
- * results, but with a "SKIPPED" status and without the cost of any actual build work)
+ * results, but with a "SKIPPED" status and without the cost of any actual build work)
* @param aspects Set of aspects that will be built
- * @param executor an opaque application-specific value that will be
- * passed down to the execute() method of any Action executed during
- * this call
+ * @param executor an opaque application-specific value that will be passed down to the execute()
+ * method of any Action executed during this call
* @param builtTargets (out) set of successfully built subset of targetsToBuild. This set is
- * populated immediately upon confirmation that artifact is built so it will be
- * valid even if a future action throws ActionExecutionException
- * @param lastExecutionTimeRange If not null, the start/finish time of the last build that
- * run the execution phase.
- * @param topLevelArtifactContext contains the options which determine the artifacts to build
- * for the top-level targets.
+ * populated immediately upon confirmation that artifact is built so it will be valid even if
+ * a future action throws ActionExecutionException
+ * @param builtAspects (out) set of successfully built subset of targetsToBuild with the passed
+ * aspects applied. This set is populated immediately upon confirmation that artifact is built
+ * so it will be valid even if a future action throws ActionExecutionException
+ * @param lastExecutionTimeRange If not null, the start/finish time of the last build that run the
+ * execution phase.
+ * @param topLevelArtifactContext contains the options which determine the artifacts to build for
+ * the top-level targets.
* @throws BuildFailedException if there were problems establishing the action execution
- * environment, if the metadata of any file during the build could not be obtained,
- * if any input files are missing, or if an action fails during execution
+ * environment, if the metadata of any file during the build could not be obtained, if any
+ * input files are missing, or if an action fails during execution
* @throws InterruptedException if there was an asynchronous stop request
* @throws TestExecException if any test fails
*/
@@ -84,6 +87,7 @@ public interface Builder {
Collection<AspectValue> aspects,
Executor executor,
Set<ConfiguredTarget> builtTargets,
+ Set<AspectKey> builtAspects,
boolean explain,
@Nullable Range<Long> lastExecutionTimeRange,
TopLevelArtifactContext topLevelArtifactContext)
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
index 0a83696c54..5332637254 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java
@@ -407,6 +407,7 @@ public class SkyframeAwareActionTest extends TimestampBuilderTestCase {
null,
executor,
null,
+ null,
false,
null,
null);
@@ -436,6 +437,7 @@ public class SkyframeAwareActionTest extends TimestampBuilderTestCase {
null,
executor,
null,
+ null,
false,
null,
null);
@@ -816,6 +818,7 @@ public class SkyframeAwareActionTest extends TimestampBuilderTestCase {
null,
executor,
null,
+ null,
false,
null,
null);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 94ab81df76..b327612ad6 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -64,6 +64,7 @@ import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.events.StoredEventHandler;
import com.google.devtools.build.lib.exec.SingleBuildFileCache;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
+import com.google.devtools.build.lib.skyframe.AspectValue.AspectKey;
import com.google.devtools.build.lib.skyframe.ExternalFilesHelper.ExternalFileAction;
import com.google.devtools.build.lib.skyframe.PackageLookupFunction.CrossRepositoryLabelViolationStrategy;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
@@ -259,6 +260,7 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase {
Collection<AspectValue> aspects,
Executor executor,
Set<ConfiguredTarget> builtTargets,
+ Set<AspectKey> builtAspects,
boolean explain,
Range<Long> lastExecutionTimeRange,
TopLevelArtifactContext topLevelArtifactContext)
@@ -400,7 +402,8 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase {
tsgm.setCommandStartTime();
Set<Artifact> artifactsToBuild = Sets.newHashSet(artifacts);
- Set<ConfiguredTarget> builtArtifacts = new HashSet<>();
+ Set<ConfiguredTarget> builtTargets = new HashSet<>();
+ Set<AspectKey> builtAspects = new HashSet<>();
try {
builder.buildArtifacts(
reporter,
@@ -411,8 +414,9 @@ public abstract class TimestampBuilderTestCase extends FoundationTestCase {
null,
null,
executor,
- builtArtifacts, /*explain=*/
- false,
+ builtTargets,
+ builtAspects,
+ false /*explain*/,
null,
null);
} finally {