diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/AqueryProcessor.java b/src/main/java/com/google/devtools/build/lib/buildtool/AqueryProcessor.java index 303d791a2ed1b7..d3070fea08e5ed 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/AqueryProcessor.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/AqueryProcessor.java @@ -87,6 +87,7 @@ public BlazeCommandResult dumpActionGraphFromSkyframe(CommandEnvironment env) { new ActionGraphDump( aqueryOptions.includeCommandline, aqueryOptions.includeArtifacts, + aqueryOptions.includeSchedulingDependencies, actionFilters, aqueryOptions.includeParamFiles, aqueryOptions.includeFileWriteContents, diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java index c63788562d5c53..2bb2545b5c6964 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java @@ -436,6 +436,7 @@ private void dumpSkyframeStateAfterBuild( new ActionGraphDump( /* includeActionCmdLine= */ false, /* includeArtifacts= */ true, + /* includeSchedulingDependencies= */ true, /* actionFilters= */ null, /* includeParamFiles= */ false, /* includeFileWriteContents */ false, diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphProtoOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphProtoOutputFormatterCallback.java index 0de141643d5d4a..b843ee1eb2410e 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphProtoOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphProtoOutputFormatterCallback.java @@ -72,6 +72,7 @@ public class ActionGraphProtoOutputFormatterCallback extends AqueryThreadsafeCal new ActionGraphDump( options.includeCommandline, options.includeArtifacts, + options.includeSchedulingDependencies, this.actionFilters, options.includeParamFiles, options.includeFileWriteContents, diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java index e1796b7a0798d5..984eda79e504a5 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/ActionGraphTextOutputFormatterCallback.java @@ -207,7 +207,19 @@ private void writeAction(ActionAnalysisMetadata action, PrintStream printStream) action.getInputs().toList().stream() .map(input -> escapeBytestringUtf8(input.getExecPathString())) .sorted() - .collect(Collectors.joining(", "))) + .collect(Collectors.joining(", "))); + + if (options.includeSchedulingDependencies && !action.getSchedulingDependencies().isEmpty()) { + stringBuilder + .append(" SchedulingDependencies: [") + .append( + action.getSchedulingDependencies().toList().stream() + .map(input -> escapeBytestringUtf8(input.getExecPathString())) + .sorted() + .collect(Collectors.joining(", "))); + } + + stringBuilder .append("]\n") .append(" Outputs: [") .append( diff --git a/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryOptions.java index 6deee8958f623e..845477c0a639b9 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryOptions.java +++ b/src/main/java/com/google/devtools/build/lib/query2/aquery/AqueryOptions.java @@ -47,6 +47,17 @@ public class AqueryOptions extends CommonQueryOptions { "Includes names of the action inputs and outputs in the output " + "(potentially large).") public boolean includeArtifacts; + @Option( + name = "include_scheduling_dependencies", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.QUERY, + effectTags = {OptionEffectTag.TERMINAL_OUTPUT}, + help = + "Includes names of the scheduling dependencies of actions " + + "(potentially large). " + + "Only takes effect if --include_artifacts is also set.") + public boolean includeSchedulingDependencies; + @Option( name = "include_param_files", defaultValue = "false", diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java index 9f247f5575f88d..aced4bac2f9b36 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java @@ -68,6 +68,7 @@ public class ActionGraphDump { @Nullable private final AqueryActionFilter actionFilters; private final boolean includeActionCmdLine; private final boolean includeArtifacts; + private final boolean includeSchedulingDependencies; private final boolean includeParamFiles; private final boolean includeFileWriteContents; private final AqueryOutputHandler aqueryOutputHandler; @@ -78,6 +79,7 @@ public class ActionGraphDump { public ActionGraphDump( boolean includeActionCmdLine, boolean includeArtifacts, + boolean includeSchedulingDependencies, AqueryActionFilter actionFilters, boolean includeParamFiles, boolean includeFileWriteContents, @@ -87,6 +89,7 @@ public ActionGraphDump( /* actionGraphTargets= */ ImmutableList.of("..."), includeActionCmdLine, includeArtifacts, + includeSchedulingDependencies, actionFilters, includeParamFiles, includeFileWriteContents, @@ -98,6 +101,7 @@ public ActionGraphDump( List actionGraphTargets, boolean includeActionCmdLine, boolean includeArtifacts, + boolean includeSchedulingDependencies, AqueryActionFilter actionFilters, boolean includeParamFiles, boolean includeFileWriteContents, @@ -106,6 +110,7 @@ public ActionGraphDump( this.actionGraphTargets = ImmutableSet.copyOf(actionGraphTargets); this.includeActionCmdLine = includeActionCmdLine; this.includeArtifacts = includeArtifacts; + this.includeSchedulingDependencies = includeSchedulingDependencies; this.actionFilters = actionFilters; this.includeParamFiles = includeParamFiles; this.includeFileWriteContents = includeFileWriteContents; @@ -261,6 +266,12 @@ private void dumpSingleAction(ConfiguredTarget configuredTarget, ActionAnalysisM actionBuilder.addInputDepSetIds(knownNestedSets.dataToIdAndStreamOutputProto(inputs)); } + NestedSet schedulingDependencies = action.getSchedulingDependencies(); + if (includeSchedulingDependencies && !schedulingDependencies.isEmpty()) { + actionBuilder.addInputDepSetIds( + knownNestedSets.dataToIdAndStreamOutputProto(schedulingDependencies)); + } + // store outputs for (Artifact artifact : action.getOutputs()) { actionBuilder.addOutputIds(knownArtifacts.dataToIdAndStreamOutputProto(artifact)); diff --git a/src/main/protobuf/analysis_v2.proto b/src/main/protobuf/analysis_v2.proto index 20fa8e7b358f65..a22bcc6f5d3bc9 100644 --- a/src/main/protobuf/analysis_v2.proto +++ b/src/main/protobuf/analysis_v2.proto @@ -83,6 +83,11 @@ message Action { // input discovery, the contents of this set might change during execution. repeated uint32 input_dep_set_ids = 8; + // The set of scheduling dependency dep sets the action depends on. + // Only set of both --include_artifacts and --include_scheduling_dependencies + // is set to true. + repeated uint32 scheduling_dep_dep_set_ids = 20; + // The list of Artifact IDs that represent the output files that this action // will generate. repeated uint32 output_ids = 9; diff --git a/src/test/shell/integration/aquery_test.sh b/src/test/shell/integration/aquery_test.sh index c657b36d73e703..ed7172ef6b5596 100755 --- a/src/test/shell/integration/aquery_test.sh +++ b/src/test/shell/integration/aquery_test.sh @@ -243,6 +243,34 @@ EOF assert_not_contains "Outputs: \[" output } +function test_aquery_include_scheduling_dependencies() { + local pkg="${FUNCNAME[0]}" + mkdir -p "$pkg" || fail "mkdir -p $pkg" + cat > "$pkg/BUILD" <<'EOF' +cc_binary(name="b", srcs=["b.cc"], deps=[":l"]) +cc_library(name="l", hdrs=["library_header.h"]) +EOF + + bazel aquery \ + --include_artifacts \ + --include_scheduling_dependencies \ + "mnemonic(CppCompile,//$pkg:b)" > output 2> "$TEST_log" \ + || fail "Expected success" + cat output >> "$TEST_log" + + assert_contains "SchedulingDependencies:.*library_header.h" output + + bazel aquery \ + --include_artifacts \ + --include_scheduling_dependencies \ + --output=jsonproto \ + "mnemonic(CppCompile,//$pkg:b)" > output 2> "$TEST_log" \ + || fail "Expected success" + cat output >> "$TEST_log" + assert_contains "library_header.h" output +} + + function test_aquery_starlark_env() { local pkg="${FUNCNAME[0]}" mkdir -p "$pkg" || fail "mkdir -p $pkg"