aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java125
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java75
4 files changed, 203 insertions, 0 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java
index 76193e976f..e0762b33bb 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyFunctions.java
@@ -109,6 +109,8 @@ public final class SkyFunctions {
SkyFunctionName.create("LOCAL_REPOSITORY_LOOKUP");
public static final SkyFunctionName REGISTERED_TOOLCHAINS =
SkyFunctionName.create("REGISTERED_TOOLCHAINS");
+ public static final SkyFunctionName TOOLCHAIN_RESOLUTION =
+ SkyFunctionName.create("TOOLCHAIN_RESOLUTION");
public static Predicate<SkyKey> isSkyFunction(final SkyFunctionName functionName) {
return new Predicate<SkyKey>() {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 1dfe85f30c..463e3f3d5f 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -456,6 +456,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
new ActionTemplateExpansionFunction(removeActionsAfterEvaluation));
map.put(SkyFunctions.LOCAL_REPOSITORY_LOOKUP, new LocalRepositoryLookupFunction());
map.put(SkyFunctions.REGISTERED_TOOLCHAINS, new RegisteredToolchainsFunction());
+ map.put(SkyFunctions.TOOLCHAIN_RESOLUTION, new ToolchainResolutionFunction());
map.putAll(extraSkyFunctions);
return map.build();
}
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);
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
new file mode 100644
index 0000000000..1f553e6350
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
@@ -0,0 +1,75 @@
+// 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.auto.value.AutoValue;
+import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.skyframe.SkyFunctionName;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.SkyValue;
+
+/** A value which represents the selected toolchain for a specific target and execution platform. */
+@AutoValue
+public abstract class ToolchainResolutionValue implements SkyValue {
+
+ // A key representing the input data.
+ public static SkyKey key(
+ BuildConfiguration configuration,
+ Label toolchainType,
+ PlatformInfo targetPlatform,
+ PlatformInfo execPlatform) {
+ return ToolchainResolutionKey.create(
+ configuration, toolchainType, targetPlatform, execPlatform);
+ }
+
+ /** {@link SkyKey} implementation used for {@link ToolchainResolutionFunction}. */
+ @AutoValue
+ public abstract static class ToolchainResolutionKey implements SkyKey {
+ @Override
+ public SkyFunctionName functionName() {
+ return SkyFunctions.TOOLCHAIN_RESOLUTION;
+ }
+
+ @Override
+ public ToolchainResolutionKey argument() {
+ return this;
+ }
+
+ public abstract BuildConfiguration configuration();
+
+ public abstract Label toolchainType();
+
+ public abstract PlatformInfo targetPlatform();
+
+ public abstract PlatformInfo execPlatform();
+
+ public static ToolchainResolutionKey create(
+ BuildConfiguration configuration,
+ Label toolchainType,
+ PlatformInfo targetPlatform,
+ PlatformInfo execPlatform) {
+ return new AutoValue_ToolchainResolutionValue_ToolchainResolutionKey(
+ configuration, toolchainType, targetPlatform, execPlatform);
+ }
+ }
+
+ public static ToolchainResolutionValue create(Label toolchainLabel) {
+ return new AutoValue_ToolchainResolutionValue(toolchainLabel);
+ }
+
+ public abstract Label toolchainLabel();
+}