diff options
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/buildtool/BuildRequest.java | 10 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/buildtool/ExecutionTool.java | 83 |
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"); |