aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
diff options
context:
space:
mode:
authorGravatar John Cater <jcater@google.com>2017-07-13 19:18:50 +0200
committerGravatar László Csomor <laszlocsomor@google.com>2017-07-14 10:52:01 +0200
commit98375a24ab40bfe0ff124401ca2d95740f67e072 (patch)
tree4c6ceb24dbe0dd396286d04cd3ead7a705bcea89 /src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
parent8002b6205e004721f771df20d1d8c1402c03964e (diff)
Add a SkyFunction to perform toolchain resolution.
Part of #2219. Change-Id: I339009c13639144ca756eb07c520df7d430a64e3 PiperOrigin-RevId: 161826487
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java125
1 files changed, 125 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
new file mode 100644
index 0000000000..7a61c67271
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
@@ -0,0 +1,125 @@
+// 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.common.collect.ImmutableList;
+import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
+import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.packages.NoSuchThingException;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException;
+import com.google.devtools.build.lib.skyframe.RegisteredToolchainsFunction.InvalidTargetException;
+import com.google.devtools.build.lib.skyframe.ToolchainResolutionValue.ToolchainResolutionKey;
+import com.google.devtools.build.lib.syntax.EvalException;
+import com.google.devtools.build.skyframe.SkyFunction;
+import com.google.devtools.build.skyframe.SkyFunctionException;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.SkyValue;
+import javax.annotation.Nullable;
+
+/** {@link SkyFunction} which performs toolchain resolution for a class of rules. */
+public class ToolchainResolutionFunction implements SkyFunction {
+
+ @Nullable
+ @Override
+ public SkyValue compute(SkyKey skyKey, Environment env)
+ throws SkyFunctionException, InterruptedException {
+ ToolchainResolutionKey key = (ToolchainResolutionKey) skyKey.argument();
+
+ // Get all toolchains.
+ RegisteredToolchainsValue toolchains;
+ try {
+ toolchains =
+ (RegisteredToolchainsValue)
+ env.getValueOrThrow(
+ RegisteredToolchainsValue.key(key.configuration()),
+ ConfiguredValueCreationException.class,
+ InvalidTargetException.class,
+ EvalException.class);
+ if (toolchains == null) {
+ return null;
+ }
+ } catch (ConfiguredValueCreationException e) {
+ throw new ToolchainResolutionFunctionException(e);
+ } catch (InvalidTargetException e) {
+ throw new ToolchainResolutionFunctionException(e);
+ } catch (EvalException e) {
+ throw new ToolchainResolutionFunctionException(e);
+ }
+
+ // Find the right one.
+ DeclaredToolchainInfo toolchain =
+ resolveConstraints(
+ key.toolchainType(),
+ key.targetPlatform(),
+ key.execPlatform(),
+ toolchains.registeredToolchains());
+ return ToolchainResolutionValue.create(toolchain.toolchainLabel());
+ }
+
+ // TODO(katre): Implement real resolution.
+ private DeclaredToolchainInfo resolveConstraints(
+ Label toolchainType,
+ PlatformInfo targetPlatform,
+ PlatformInfo execPlatform,
+ ImmutableList<DeclaredToolchainInfo> toolchains)
+ throws ToolchainResolutionFunctionException {
+ for (DeclaredToolchainInfo toolchain : toolchains) {
+ if (toolchain.toolchainType().equals(toolchainType)) {
+ return toolchain;
+ }
+ }
+ throw new ToolchainResolutionFunctionException(new NoToolchainFoundException(toolchainType));
+ }
+
+ @Nullable
+ @Override
+ public String extractTag(SkyKey skyKey) {
+ return null;
+ }
+
+ /** Used to indicate that a toolchain was not found for the current request. */
+ public static final class NoToolchainFoundException extends NoSuchThingException {
+ private final Label missingToolchainType;
+
+ public NoToolchainFoundException(Label missingToolchainType) {
+ super(String.format("no matching toolchain found for %s", missingToolchainType));
+ this.missingToolchainType = missingToolchainType;
+ }
+
+ public Label missingToolchainType() {
+ return missingToolchainType;
+ }
+ }
+
+ /** Used to indicate errors during the computation of an {@link ToolchainResolutionValue}. */
+ private static final class ToolchainResolutionFunctionException extends SkyFunctionException {
+ public ToolchainResolutionFunctionException(NoToolchainFoundException e) {
+ super(e, Transience.PERSISTENT);
+ }
+
+ public ToolchainResolutionFunctionException(ConfiguredValueCreationException e) {
+ super(e, Transience.PERSISTENT);
+ }
+
+ public ToolchainResolutionFunctionException(InvalidTargetException e) {
+ super(e, Transience.PERSISTENT);
+ }
+
+ public ToolchainResolutionFunctionException(EvalException e) {
+ super(e, Transience.PERSISTENT);
+ }
+ }
+}