aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java83
2 files changed, 81 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
index 718b7f8e37..9bd1a5e486 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java
@@ -225,6 +225,16 @@ public class BuildRequest implements OptionsClassProvider {
+ "causes printing of the result to occur always. The default is one.")
public int maxResultTargets;
+ @Option(name = "experimental_detailed_result",
+ defaultValue = "false",
+ category = "undocumented",
+ help = "Detailed format for build results (see --show_results). "
+ + "Output all produced files. Use output format suitable for tool consumption. "
+ + "This flag is temporary and intended to facilitate Android Studio integration. "
+ + "This output format will likely change in the future or disappear completely."
+ )
+ public boolean detailedResult;
+
@Option(name = "announce",
defaultValue = "false",
category = "verbosity",
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 24391f3b61..8a9c9c3cd4 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
@@ -65,6 +65,7 @@ import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollectio
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionPhaseCompleteEvent;
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionStartingEvent;
import com.google.devtools.build.lib.collect.CollectionUtils;
+import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.EventKind;
@@ -473,7 +474,7 @@ public class ExecutionTool {
long startTime = Profiler.nanoTimeMaybe();
determineSuccessfulTargets(buildResult, configuredTargets, builtTargets, timer);
- showBuildResult(request, buildResult, configuredTargets);
+ showBuildResult(request, buildResult, configuredTargets, analysisResult.getAspects());
Preconditions.checkNotNull(buildResult.getSuccessfulTargets());
Profiler.instance().logSimpleTask(startTime, ProfilerTask.INFO, "Show results");
if (explanationHandler != null) {
@@ -647,18 +648,51 @@ public class ExecutionTool {
result.setSuccessfulTargets(successfulTargets);
}
+
+ private interface ArtifactFormatter {
+ boolean shouldPrint(Artifact artifact);
+ String format(Artifact artifact);
+ }
+
+ private class BriefArtifactFormatter implements ArtifactFormatter {
+ @Override
+ public boolean shouldPrint(Artifact artifact) {
+ return !artifact.isSourceArtifact() && !artifact.isMiddlemanArtifact();
+ }
+
+ @Override
+ public String format(Artifact artifact) {
+ return " " +
+ OutputDirectoryLinksUtils.getPrettyPath(artifact.getPath(),
+ runtime.getWorkspaceName(), getWorkspace(), request.getSymlinkPrefix());
+ }
+ }
+
+ private class DetailedArtifactFormatter implements ArtifactFormatter {
+ @Override
+ public boolean shouldPrint(Artifact artifact) {
+ return !artifact.isSourceArtifact();
+ }
+
+ @Override
+ public String format(Artifact artifact) {
+ return ">>>" + artifact.getPath();
+ }
+ }
+
/**
* Shows the result of the build. Information includes the list of up-to-date
* and failed targets and list of output artifacts for successful targets
- *
- * @param request The build request, which specifies various options.
+ * @param request The build request, which specifies various options.
* @param configuredTargets The configured targets whose artifacts are to be
* built.
- *
- * TODO(bazel-team): (2010) refactor into using Reporter and info/progress events
+ *@param aspects
*/
- private void showBuildResult(BuildRequest request, BuildResult result,
- Collection<ConfiguredTarget> configuredTargets) {
+ private void showBuildResult(
+ BuildRequest request,
+ BuildResult result,
+ Collection<ConfiguredTarget> configuredTargets,
+ Collection<AspectValue> aspects) {
// NOTE: be careful what you print! We don't want to create a consistency
// problem where the summary message and the exit code disagree. The logic
// here is already complex.
@@ -700,12 +734,18 @@ public class ExecutionTool {
}
// Suppress summary if --show_result value is exceeded:
- if (succeeded.size() + failed.size() > request.getBuildOptions().maxResultTargets) {
+ if (succeeded.size() + failed.size() + aspects.size()
+ > request.getBuildOptions().maxResultTargets) {
return;
}
OutErr outErr = request.getOutErr();
+ ArtifactFormatter formatter =
+ request.getBuildOptions().detailedResult
+ ? new DetailedArtifactFormatter()
+ : new BriefArtifactFormatter();
+
TopLevelArtifactContext context = request.getTopLevelArtifactContext();
for (ConfiguredTarget target : succeeded) {
Label label = target.getLabel();
@@ -714,14 +754,12 @@ public class ExecutionTool {
boolean headerFlag = true;
for (Artifact artifact :
TopLevelArtifactHelper.getAllArtifactsToBuild(target, context).getImportantArtifacts()) {
- if (!artifact.isSourceArtifact() && !artifact.isMiddlemanArtifact()) {
+ if (formatter.shouldPrint(artifact)) {
if (headerFlag) {
outErr.printErr("Target " + label + " up-to-date:\n");
headerFlag = false;
}
- outErr.printErrLn(" " +
- OutputDirectoryLinksUtils.getPrettyPath(artifact.getPath(),
- runtime.getWorkspaceName(), getWorkspace(), request.getSymlinkPrefix()));
+ outErr.printErrLn(formatter.format(artifact));
}
}
if (headerFlag) {
@@ -729,6 +767,27 @@ public class ExecutionTool {
}
}
+ for (AspectValue aspect : aspects) {
+ Label label = aspect.getLabel();
+ String aspectName = aspect.getAspect().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 (formatter.shouldPrint(importantArtifact)) {
+ outErr.printErrLn(formatter.format(importantArtifact));
+ }
+ }
+ if (headerFlag) {
+ outErr.printErr(
+ "Aspect " + aspectName + " of " + label + " up-to-date (nothing to build)\n");
+ }
+ }
+
for (ConfiguredTarget target : failed) {
outErr.printErr("Target " + target.getLabel() + " failed to build\n");