diff options
Diffstat (limited to 'src/main')
8 files changed, 138 insertions, 10 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java index 52f3752781..6883e7982e 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/CqueryBuildTool.java @@ -133,7 +133,8 @@ public class CqueryBuildTool extends BuildTool { cqueryOptions, env.getReporter(), env.getSkyframeExecutor(), - hostConfiguration); + hostConfiguration, + cqueryOptions.aspectDeps.createResolver(env.getPackageManager(), env.getReporter())); CqueryThreadsafeCallback callback = CqueryThreadsafeCallback.getCallback(cqueryOptions.outputFormat, callbacks); if (callback == null) { diff --git a/src/main/java/com/google/devtools/build/lib/query2/BUILD b/src/main/java/com/google/devtools/build/lib/query2/BUILD index 196a23d5c9..cb0dc139d8 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/BUILD +++ b/src/main/java/com/google/devtools/build/lib/query2/BUILD @@ -36,6 +36,8 @@ java_library( "//src/main/java/com/google/devtools/build/skyframe", "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects", "//src/main/java/com/google/devtools/common/options", + "//src/main/protobuf:analysis_java_proto", + "//src/main/protobuf:build_java_proto", "//third_party:guava", "//third_party:jsr305", ], diff --git a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java index 4014f825a1..bae38019ac 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java +++ b/src/main/java/com/google/devtools/build/lib/query2/ConfiguredTargetQueryEnvironment.java @@ -52,6 +52,7 @@ import com.google.devtools.build.lib.query2.engine.QueryUtil.ThreadSafeMutableKe import com.google.devtools.build.lib.query2.engine.QueryUtil.UniquifierImpl; import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback; import com.google.devtools.build.lib.query2.engine.Uniquifier; +import com.google.devtools.build.lib.query2.output.AspectResolver; import com.google.devtools.build.lib.query2.output.CqueryOptions; import com.google.devtools.build.lib.query2.output.QueryOptions; import com.google.devtools.build.lib.rules.AliasConfiguredTarget; @@ -210,15 +211,19 @@ public class ConfiguredTargetQueryEnvironment CqueryOptions options, Reporter reporter, SkyframeExecutor skyframeExecutor, - BuildConfiguration hostConfiguration) { + BuildConfiguration hostConfiguration, + AspectResolver resolver) { OutputStream out = reporter.getOutErr().getOutputStream(); return new ImmutableList.Builder<CqueryThreadsafeCallback>() .add( new LabelAndConfigurationOutputFormatterCallback( - reporter, options, out, skyframeExecutor)) + reporter, options, out, skyframeExecutor, accessor)) .add( new TransitionsOutputFormatterCallback( reporter, options, out, skyframeExecutor, accessor, hostConfiguration)) + .add( + new ProtoOutputFormatterCallback( + reporter, options, out, skyframeExecutor, accessor, resolver)) .build(); } @@ -660,3 +665,4 @@ public class ConfiguredTargetQueryEnvironment return parser.getOptions(QueryOptions.class); } } + diff --git a/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java b/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java index 2a5a2dc060..1466433c9a 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/CqueryThreadsafeCallback.java @@ -19,6 +19,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.collect.Streams; import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.events.Reporter; +import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor; import com.google.devtools.build.lib.query2.engine.ThreadSafeOutputFormatterCallback; import com.google.devtools.build.lib.query2.output.CqueryOptions; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; @@ -39,6 +40,7 @@ public abstract class CqueryThreadsafeCallback protected final CqueryOptions options; protected PrintStream printStream = null; protected final SkyframeExecutor skyframeExecutor; + protected final ConfiguredTargetAccessor accessor; private final List<String> result = new ArrayList<>(); @@ -46,13 +48,15 @@ public abstract class CqueryThreadsafeCallback Reporter reporter, CqueryOptions options, OutputStream out, - SkyframeExecutor skyframeExecutor) { + SkyframeExecutor skyframeExecutor, + TargetAccessor<ConfiguredTarget> accessor) { this.reporter = reporter; this.options = options; if (out != null) { this.printStream = new PrintStream(out); } this.skyframeExecutor = skyframeExecutor; + this.accessor = (ConfiguredTargetAccessor) accessor; } public abstract String getName(); @@ -87,3 +91,4 @@ public abstract class CqueryThreadsafeCallback } } } + diff --git a/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java index ccc7b91fe7..e8446db22b 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/LabelAndConfigurationOutputFormatterCallback.java @@ -17,6 +17,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.config.BuildConfiguration; import com.google.devtools.build.lib.events.NullEventHandler; import com.google.devtools.build.lib.events.Reporter; +import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor; import com.google.devtools.build.lib.query2.output.CqueryOptions; import com.google.devtools.build.lib.skyframe.SkyframeExecutor; import java.io.OutputStream; @@ -28,8 +29,9 @@ public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsa Reporter reporter, CqueryOptions options, OutputStream out, - SkyframeExecutor skyframeExecutor) { - super(reporter, options, out, skyframeExecutor); + SkyframeExecutor skyframeExecutor, + TargetAccessor<ConfiguredTarget> accessor) { + super(reporter, options, out, skyframeExecutor, accessor); } @Override @@ -52,4 +54,4 @@ public class LabelAndConfigurationOutputFormatterCallback extends CqueryThreadsa addResult(output.toString()); } } -} +}
\ No newline at end of file diff --git a/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java new file mode 100644 index 0000000000..ff405e4bb6 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/query2/ProtoOutputFormatterCallback.java @@ -0,0 +1,103 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.query2; + +import com.google.common.annotations.VisibleForTesting; +import com.google.devtools.build.lib.analysis.AnalysisProtos; +import com.google.devtools.build.lib.analysis.ConfiguredTarget; +import com.google.devtools.build.lib.events.Reporter; +import com.google.devtools.build.lib.query2.engine.QueryEnvironment.TargetAccessor; +import com.google.devtools.build.lib.query2.output.AspectResolver; +import com.google.devtools.build.lib.query2.output.CqueryOptions; +import com.google.devtools.build.lib.query2.output.ProtoOutputFormatter; +import com.google.devtools.build.lib.query2.proto.proto2api.Build; +import com.google.devtools.build.lib.query2.proto.proto2api.Build.QueryResult.Builder; +import com.google.devtools.build.lib.skyframe.SkyframeExecutor; +import java.io.IOException; +import java.io.OutputStream; + +/** Proto output formatter for cquery results. */ +public class ProtoOutputFormatterCallback extends CqueryThreadsafeCallback { + + private final AspectResolver resolver; + + private AnalysisProtos.CqueryResult.Builder protoResult; + + ProtoOutputFormatterCallback( + Reporter reporter, + CqueryOptions options, + OutputStream out, + SkyframeExecutor skyframeExecutor, + TargetAccessor<ConfiguredTarget> accessor, + AspectResolver resolver) { + super(reporter, options, out, skyframeExecutor, accessor); + this.resolver = resolver; + } + + @Override + public void start() { + protoResult = AnalysisProtos.CqueryResult.newBuilder(); + } + + @Override + public void close(boolean failFast) throws IOException { + if (!failFast && printStream != null) { + if (options.protoIncludeConfigurations) { + protoResult.build().writeTo(printStream); + } else { + // Documentation promises that setting this flag to false means we convert directly + // to the build.proto format. This is hard to test in integration testing due to the way + // proto output is turned readable (codex). So change the following code with caution. + Builder queryResult = Build.QueryResult.newBuilder(); + protoResult.getResultsList().forEach(ct -> queryResult.addTarget(ct.getTarget())); + queryResult.build().writeTo(printStream); + } + } + } + + @Override + public String getName() { + return "proto"; + } + + @VisibleForTesting + public AnalysisProtos.CqueryResult getProtoResult() { + return protoResult.build(); + } + + @Override + public void processOutput(Iterable<ConfiguredTarget> partialResult) throws InterruptedException { + ProtoOutputFormatter formatter = new ProtoOutputFormatter(); + formatter.setOptions(options, resolver); + for (ConfiguredTarget configuredTarget : partialResult) { + AnalysisProtos.ConfiguredTarget.Builder builder = + AnalysisProtos.ConfiguredTarget.newBuilder(); + + // Re: testing. Since this formatter relies on the heavily tested ProtoOutputFormatter class + // for all its work with targets, ProtoOuputFormatterCallbackTest doesn't test any of the + // logic in this next line. If this were to change (i.e. we manipulate targets any further), + // we will want to add relevant tests. + builder.setTarget( + formatter.toTargetProtoBuffer(accessor.getTargetFromConfiguredTarget(configuredTarget))); + + if (options.protoIncludeConfigurations) { + String checksum = configuredTarget.getConfigurationChecksum(); + builder.setConfiguration( + AnalysisProtos.Configuration.newBuilder().setChecksum(String.valueOf(checksum))); + } + + protoResult.addResults(builder.build()); + } + } +} diff --git a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java index 06e1069fb5..92922d5d0a 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java +++ b/src/main/java/com/google/devtools/build/lib/query2/TransitionsOutputFormatterCallback.java @@ -68,7 +68,6 @@ import java.util.stream.Collectors; */ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback { - protected final ConfiguredTargetAccessor accessor; protected final BuildConfiguration hostConfiguration; private final HashMap<Label, Target> partialResultMap; @@ -89,8 +88,7 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback SkyframeExecutor skyframeExecutor, TargetAccessor<ConfiguredTarget> accessor, BuildConfiguration hostConfiguration) { - super(reporter, options, out, skyframeExecutor); - this.accessor = (ConfiguredTargetAccessor) accessor; + super(reporter, options, out, skyframeExecutor, accessor); this.hostConfiguration = hostConfiguration; this.partialResultMap = Maps.newHashMap(); } @@ -280,3 +278,4 @@ public class TransitionsOutputFormatterCallback extends CqueryThreadsafeCallback } } } + diff --git a/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java b/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java index 9d9cb0d099..860e3ca9ae 100644 --- a/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java +++ b/src/main/java/com/google/devtools/build/lib/query2/output/CqueryOptions.java @@ -46,4 +46,14 @@ public class CqueryOptions extends CommonQueryOptions { ) public Transitions transitions; + @Option( + name = "proto:include_configurations", + defaultValue = "true", + documentationCategory = OptionDocumentationCategory.QUERY, + effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, + help = + "if enabled, proto output will include information about configurations. When disabled," + + "cquery proto output format resembles query output format" + ) + public boolean protoIncludeConfigurations; } |