diff options
6 files changed, 91 insertions, 17 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 4f3f63b8b0..e9fef91231 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -410,6 +410,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/cmdline", ], deps = [ + ":buildeventstream", ":collect", ":concurrent", ":events", @@ -418,6 +419,7 @@ java_library( ":transitive-info-provider", ":util", ":vfs", + "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/common/options", "//src/main/protobuf:build_java_proto", diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java index 6415241f02..8262cd4b8b 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java @@ -14,6 +14,7 @@ package com.google.devtools.build.lib.buildeventstream; +import com.google.devtools.build.lib.cmdline.Label; import com.google.protobuf.TextFormat; import java.io.Serializable; import java.util.List; @@ -90,4 +91,13 @@ public final class BuildEventId implements Serializable { return new BuildEventId( BuildEventStreamProtos.BuildEventId.newBuilder().setPattern(patternId).build()); } + + public static BuildEventId targetCompleted(Label target) { + BuildEventStreamProtos.BuildEventId.TargetCompletedId targetId = + BuildEventStreamProtos.BuildEventId.TargetCompletedId.newBuilder() + .setLabel(target.toString()) + .build(); + return new BuildEventId( + BuildEventStreamProtos.BuildEventId.newBuilder().setTargetCompleted(targetId).build()); + } } diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto index 74e20ce55e..5d3ca56f6c 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto @@ -55,11 +55,18 @@ message BuildEventId { repeated string pattern = 1; } + // Identifier of an event indicating that a target was built completely; this + // does not include running the test if the target is a test target. + message TargetCompletedId { + string label = 1; + } + oneof id { UnknownBuildEventId unknown = 1; ProgressId progress = 2; BuildStartedId started = 3; PatternExpandedId pattern = 4; + TargetCompletedId target_completed = 5; } } @@ -123,6 +130,13 @@ message BuildStarted { string workspace_directory = 7; } +// Payload of the event indicating the expansion of a target pattern. +// The main information is in the chaining part: the id will contain the +// target pattern that was expanded and the children id will contain the +// target or target pattern it was expanded to. +message PatternExpanded { +} + // Message describing a build event. Events will have an identifier that // is unique within a given build invocation; they also announce follow-up // events as children. More details, which are specific to the kind of event @@ -135,5 +149,6 @@ message BuildEvent { Progress progress = 3; Aborted aborted = 4; BuildStarted started = 5; + PatternExpanded expanded = 6; }; } diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java b/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java index 6d7fc3f251..388e4b84f8 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/LegacyLoadingPhaseRunner.java @@ -174,9 +174,13 @@ public final class LegacyLoadingPhaseRunner extends LoadingPhaseRunner { } } - eventBus.post(new TargetParsingCompleteEvent(targets.getTargets(), - filteredTargets, testFilteredTargets, - timer.stop().elapsed(TimeUnit.MILLISECONDS))); + eventBus.post( + new TargetParsingCompleteEvent( + targets.getTargets(), + filteredTargets, + testFilteredTargets, + timer.stop().elapsed(TimeUnit.MILLISECONDS), + targetPatterns)); if (targets.hasError()) { eventHandler.handle(Event.warn("Target pattern parsing failed. Continuing anyway")); diff --git a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetParsingCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetParsingCompleteEvent.java index 56aff59aee..8e0022a46a 100644 --- a/src/main/java/com/google/devtools/build/lib/pkgcache/TargetParsingCompleteEvent.java +++ b/src/main/java/com/google/devtools/build/lib/pkgcache/TargetParsingCompleteEvent.java @@ -15,18 +15,23 @@ package com.google.devtools.build.lib.pkgcache; import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Function; +import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; +import com.google.devtools.build.lib.buildeventstream.BuildEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEventId; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.Target; - +import com.google.devtools.build.lib.packages.TargetUtils; import java.util.Collection; +import java.util.List; -/** - * This event is fired just after target pattern evaluation is completed. - */ -public class TargetParsingCompleteEvent { +/** This event is fired just after target pattern evaluation is completed. */ +public class TargetParsingCompleteEvent implements BuildEvent { + private final ImmutableList<String> originalTargetPattern; private final ImmutableSet<Target> targets; private final ImmutableSet<Target> filteredTargets; private final ImmutableSet<Target> testFilteredTargets; @@ -34,21 +39,30 @@ public class TargetParsingCompleteEvent { /** * Construct the event. - * @param targets The targets that were parsed from the - * command-line pattern. + * + * @param targets The targets that were parsed from the command-line pattern. */ - public TargetParsingCompleteEvent(Collection<Target> targets, - Collection<Target> filteredTargets, Collection<Target> testFilteredTargets, - long timeInMs) { + public TargetParsingCompleteEvent( + Collection<Target> targets, + Collection<Target> filteredTargets, + Collection<Target> testFilteredTargets, + long timeInMs, + List<String> originalTargetPattern) { this.timeInMs = timeInMs; this.targets = ImmutableSet.copyOf(targets); this.filteredTargets = ImmutableSet.copyOf(filteredTargets); this.testFilteredTargets = ImmutableSet.copyOf(testFilteredTargets); + this.originalTargetPattern = ImmutableList.copyOf(originalTargetPattern); } @VisibleForTesting public TargetParsingCompleteEvent(Collection<Target> targets) { - this(targets, ImmutableSet.<Target>of(), ImmutableSet.<Target>of(), 0); + this( + targets, + ImmutableSet.<Target>of(), + ImmutableSet.<Target>of(), + 0, + ImmutableList.<String>of()); } /** @@ -84,4 +98,29 @@ public class TargetParsingCompleteEvent { public long getTimeInMs() { return timeInMs; } + + @Override + public BuildEventId getEventId() { + return BuildEventId.targetPatternExpanded(originalTargetPattern); + } + + @Override + public Collection<BuildEventId> getChildrenEvents() { + ImmutableList.Builder childrenBuilder = ImmutableList.builder(); + for (Target target : targets) { + // Test suits won't produce a target-complete event, so do not anounce their + // completion as children. + if (!TargetUtils.isTestSuiteRule(target)) { + childrenBuilder.add(BuildEventId.targetCompleted(target.getLabel())); + } + } + return childrenBuilder.build(); + } + + @Override + public BuildEventStreamProtos.BuildEvent asStreamProto() { + return GenericBuildEvent.protoChaining(this) + .setExpanded(BuildEventStreamProtos.PatternExpanded.newBuilder().build()) + .build(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java index 9d4d72d2c7..90f28ea14a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java @@ -1839,9 +1839,13 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { long time = timer.stop().elapsed(TimeUnit.MILLISECONDS); TargetPatternPhaseValue patternParsingValue = evalResult.get(key); - eventBus.post(new TargetParsingCompleteEvent(patternParsingValue.getOriginalTargets(), - patternParsingValue.getFilteredTargets(), patternParsingValue.getTestFilteredTargets(), - time)); + eventBus.post( + new TargetParsingCompleteEvent( + patternParsingValue.getOriginalTargets(), + patternParsingValue.getFilteredTargets(), + patternParsingValue.getTestFilteredTargets(), + time, + targetPatterns)); if (callback != null) { callback.notifyTargets(patternParsingValue.getTargets()); } |