Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Include source files with cquery --output=files #16602

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
4 changes: 2 additions & 2 deletions site/en/query/cquery.md
Expand Up @@ -369,8 +369,8 @@ This option prints a list of the output files produced by each target matched
by the query similar to the list printed at the end of a `bazel build`
invocation. The output contains only the files advertised in the requested
output groups as determined by the
[`--output_groups`](/reference/command-line-reference#flag--output_groups) flag
and never contains source files.
[`--output_groups`](/reference/command-line-reference#flag--output_groups) flag.
It does include source files.

Note: The output of `bazel cquery --output=files //pkg:foo` contains the output
files of `//pkg:foo` in *all* configurations that occur in the build (also see
Expand Down
Expand Up @@ -17,6 +17,7 @@
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
import com.google.devtools.build.lib.analysis.TopLevelArtifactHelper;
import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
import com.google.devtools.build.lib.events.ExtendedEventHandler;
import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor;
Expand Down Expand Up @@ -53,14 +54,16 @@ public void processOutput(Iterable<KeyedConfiguredTarget> partialResult)
throws IOException, InterruptedException {
for (KeyedConfiguredTarget keyedTarget : partialResult) {
ConfiguredTarget target = keyedTarget.getConfiguredTarget();
if (!TopLevelArtifactHelper.shouldConsiderForDisplay(target)) {
if (!TopLevelArtifactHelper.shouldConsiderForDisplay(target)
&& !(target instanceof InputFileConfiguredTarget)) {
continue;
}
TopLevelArtifactHelper.getAllArtifactsToBuild(target, topLevelArtifactContext)
.getImportantArtifacts()
.toList()
.stream()
.filter(TopLevelArtifactHelper::shouldDisplay)
.filter(artifact -> TopLevelArtifactHelper.shouldDisplay(artifact)
|| artifact.isSourceArtifact())
.map(Artifact::getExecPathString)
.forEach(this::addResult);
}
Expand Down
Expand Up @@ -33,6 +33,7 @@
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;
import org.junit.Before;
import org.junit.Test;

Expand Down Expand Up @@ -71,7 +72,7 @@ public final void defineSimpleRule() throws Exception {
" runfiles = ctx.runfiles([runfile]),",
" ),",
" OutputGroupInfo(",
" foobar = [output_group_only],",
" foobar = [output_group_only, ctx.file.explicit_source_dep],",
" ),",
" ]",
"r = rule(",
Expand Down Expand Up @@ -134,21 +135,31 @@ private List<String> getOutput(String queryExpression, List<String> outputGroups
@Test
public void basicQuery_defaultOutputGroup() throws Exception {
List<String> output = getOutput("//pkg:all", ImmutableList.of());
assertContainsExactlyWithBinDirPrefix(
output, "pkg/main_default_file", "pkg/other_default_file");
var sourceAndGeneratedFiles = output.stream()
.collect(Collectors.<String>partitioningBy(path -> path.matches("^[^/]*-out/.*")));
assertThat(sourceAndGeneratedFiles.get(false)).containsExactly("pkg/BUILD", "defs/rules.bzl");
assertContainsExactlyWithBinDirPrefix(sourceAndGeneratedFiles.get(true),
"pkg/main_default_file", "pkg/other_default_file");
}

@Test
public void basicQuery_defaultAndCustomOutputGroup() throws Exception {
List<String> output = getOutput("//pkg:main", ImmutableList.of("+foobar"));
var sourceAndGeneratedFiles = output.stream()
.collect(Collectors.<String>partitioningBy(path -> path.matches("^[^/]*-out/.*")));
assertThat(sourceAndGeneratedFiles.get(false)).containsExactly("pkg/BUILD", "defs/rules.bzl");
assertContainsExactlyWithBinDirPrefix(
output, "pkg/main_default_file", "pkg/main_output_group_only");
sourceAndGeneratedFiles.get(true), "pkg/main_default_file", "pkg/main_output_group_only");
}

@Test
public void basicQuery_customOutputGroupOnly() throws Exception {
List<String> output = getOutput("//pkg:other", ImmutableList.of("foobar"));
assertContainsExactlyWithBinDirPrefix(output, "pkg/other_output_group_only");
var sourceAndGeneratedFiles = output.stream()
.collect(Collectors.<String>partitioningBy(path -> path.matches("^[^/]*-out/.*")));
assertThat(sourceAndGeneratedFiles.get(false)).containsExactly("pkg/BUILD");
assertContainsExactlyWithBinDirPrefix(sourceAndGeneratedFiles.get(true),
"pkg/other_output_group_only");
}

private void assertContainsExactlyWithBinDirPrefix(
Expand Down
13 changes: 13 additions & 0 deletions src/test/shell/integration/configured_query_test.sh
Expand Up @@ -1445,5 +1445,18 @@ EOF
expect_log "//peach:harken"
}

function test_files_include_source_files() {
local -r pkg=$FUNCNAME
mkdir -p $pkg
cat > $pkg/BUILD <<'EOF'
filegroup(name="files", srcs=["BUILD"])
alias(name="alias", actual="single_file")
EOF
touch $pkg/single_file

bazel cquery --output=files //$pkg:all > output 2>"$TEST_log" || fail "Unexpected failure"
assert_contains "$pkg/BUILD" output
assert_contains "$pkg/single_file" output
}

run_suite "${PRODUCT_NAME} configured query tests"