diff options
author | janakr <janakr@google.com> | 2017-08-18 22:52:37 +0200 |
---|---|---|
committer | Damien Martin-Guillerez <dmarting@google.com> | 2017-08-21 14:16:06 +0200 |
commit | dc8b2e9a40770dde7638898bf3e3573eb51a79f8 (patch) | |
tree | 4ec53fe63861f5de8275953552aaabf3fd0b00a3 /src/main/java/com/google/devtools/build/lib/skyframe | |
parent | 8529746358ff5d88dc7ddf584a85ba0aa1a269a8 (diff) |
Initial (partial) implementation of configured target query. Activated by passing the --post_build_query flag to a build command, with a query expression as the argument. Bazel then executes this query on the configured target graph as constructed by the build command.
Since the prepare graph -> query workflow is how SkyQueryEnvironment works, this is mostly just copying that.
Main missing features/code cleanups:
* Recursive target patterns (/...) are not supported.
* There is no way to specify the configuration of the targets in your query.
* Configuration output is totally opaque (just the hash, or null if no configuration).
* More generally, no output options.
* Some features (visibility, label attrs) not supported.
* No edge filtering (host deps, implicit deps).
* Aspects are totally ignored.
* Graceful failure on errors, edge cases, incompatible flags (like the TAP flags that discard edges).
* Code hygiene issues (calling test-only method to get to Skyframe graph, some code duplication across ConfiguredTargetQueryEnvironment and SkyQueryEnvironment).
Most of the features I plan to leave to rules-side people, since I think they won't be too hard for a general Blaze developer to implement, and designing the right features and user interfaces for these things is better left to the rules side.
PiperOrigin-RevId: 165747829
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java new file mode 100644 index 0000000000..42029c15d9 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutorWrappingWalkableGraph.java @@ -0,0 +1,64 @@ +// Copyright 2017 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.skyframe; + +import com.google.devtools.build.skyframe.DelegatingWalkableGraph; +import com.google.devtools.build.skyframe.MemoizingEvaluator; +import com.google.devtools.build.skyframe.NodeEntry; +import com.google.devtools.build.skyframe.QueryableGraph; +import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.WalkableGraph; +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Nullable; + +/** {@link WalkableGraph} backed by a {@link SkyframeExecutor}. */ +public class SkyframeExecutorWrappingWalkableGraph extends DelegatingWalkableGraph { + + public SkyframeExecutorWrappingWalkableGraph(MemoizingEvaluator evaluator) { + super( + new QueryableGraph() { + @Nullable + @Override + public NodeEntry get(@Nullable SkyKey requestor, Reason reason, SkyKey key) + throws InterruptedException { + return evaluator.getGraphMap().get(key); + } + + @Override + public Map<SkyKey, ? extends NodeEntry> getBatch( + @Nullable SkyKey requestor, Reason reason, Iterable<? extends SkyKey> keys) + throws InterruptedException { + Map<SkyKey, NodeEntry> result = new HashMap<>(); + for (SkyKey key : keys) { + NodeEntry nodeEntry = get(requestor, reason, key); + if (nodeEntry != null) { + result.put(key, nodeEntry); + } + } + return result; + } + + @Override + public Iterable<SkyKey> getCurrentlyAvailableNodes(Iterable<SkyKey> keys, Reason reason) { + return keys; + } + }); + } + + public static SkyframeExecutorWrappingWalkableGraph of(SkyframeExecutor skyframeExecutor) { + // TODO(janakr): Provide the graph in a more principled way. + return new SkyframeExecutorWrappingWalkableGraph(skyframeExecutor.getEvaluatorForTesting()); + } +} |