aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java124
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java79
5 files changed, 147 insertions, 108 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
index 3e9cf4976b..2f73f5aa20 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/platform/PlatformInfo.java
@@ -124,7 +124,7 @@ public class PlatformInfo extends NativeInfo implements PlatformInfoApi<Constrai
public static class Builder {
private Label label;
private final List<ConstraintValueInfo> constraints = new ArrayList<>();
- private String remoteExecutionProperties;
+ private String remoteExecutionProperties = "";
private Location location = Location.BUILTIN;
/**
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java
new file mode 100644
index 0000000000..d9f998b803
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PlatformLookupUtil.java
@@ -0,0 +1,124 @@
+// 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.skyframe;
+
+import com.google.devtools.build.lib.actions.MutableActionGraph.ActionConflictException;
+import com.google.devtools.build.lib.analysis.ConfiguredTarget;
+import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
+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.skyframe.SkyFunction.Environment;
+import com.google.devtools.build.skyframe.SkyKey;
+import com.google.devtools.build.skyframe.ValueOrException3;
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.Nullable;
+
+/** Helper class that looks up {@link PlatformInfo} data. */
+public class PlatformLookupUtil {
+
+ @Nullable
+ public static Map<ConfiguredTargetKey, PlatformInfo> getPlatformInfo(
+ Iterable<ConfiguredTargetKey> platformKeys, Environment env)
+ throws InterruptedException, InvalidPlatformException {
+
+ Map<
+ SkyKey,
+ ValueOrException3<
+ ConfiguredValueCreationException, NoSuchThingException, ActionConflictException>>
+ values =
+ env.getValuesOrThrow(
+ platformKeys,
+ ConfiguredValueCreationException.class,
+ NoSuchThingException.class,
+ ActionConflictException.class);
+ boolean valuesMissing = env.valuesMissing();
+ Map<ConfiguredTargetKey, PlatformInfo> platforms = valuesMissing ? null : new HashMap<>();
+ for (ConfiguredTargetKey key : platformKeys) {
+ PlatformInfo platformInfo = findPlatformInfo(key, values.get(key));
+ if (!valuesMissing && platformInfo != null) {
+ platforms.put(key, platformInfo);
+ }
+ }
+ if (valuesMissing) {
+ return null;
+ }
+
+ return platforms;
+ }
+
+ /**
+ * Returns the {@link PlatformInfo} provider from the {@link ConfiguredTarget} in the {@link
+ * ValueOrException3}, or {@code null} if the {@link ConfiguredTarget} is not present. If the
+ * {@link ConfiguredTarget} does not have a {@link PlatformInfo} provider, a {@link
+ * InvalidPlatformException} is thrown.
+ */
+ @Nullable
+ private static PlatformInfo findPlatformInfo(
+ ConfiguredTargetKey key,
+ ValueOrException3<
+ ConfiguredValueCreationException, NoSuchThingException, ActionConflictException>
+ valueOrException)
+ throws InvalidPlatformException {
+
+ try {
+ ConfiguredTargetValue ctv = (ConfiguredTargetValue) valueOrException.get();
+ if (ctv == null) {
+ return null;
+ }
+
+ ConfiguredTarget configuredTarget = ctv.getConfiguredTarget();
+ PlatformInfo platformInfo = PlatformProviderUtils.platform(configuredTarget);
+ if (platformInfo == null) {
+ throw new InvalidPlatformException(configuredTarget.getLabel());
+ }
+
+ return platformInfo;
+ } catch (ConfiguredValueCreationException e) {
+ throw new InvalidPlatformException(key.getLabel(), e);
+ } catch (NoSuchThingException e) {
+ throw new InvalidPlatformException(key.getLabel(), e);
+ } catch (ActionConflictException e) {
+ throw new InvalidPlatformException(key.getLabel(), e);
+ }
+ }
+
+ /** Exception used when a platform label is not a valid platform. */
+ public static final class InvalidPlatformException extends ToolchainException {
+ InvalidPlatformException(Label label) {
+ super(formatError(label));
+ }
+
+ InvalidPlatformException(Label label, ConfiguredValueCreationException e) {
+ super(formatError(label), e);
+ }
+
+ public InvalidPlatformException(Label label, NoSuchThingException e) {
+ // Just propagate the inner exception, because it's directly actionable.
+ super(e);
+ }
+
+ public InvalidPlatformException(Label label, ActionConflictException e) {
+ super(formatError(label), e);
+ }
+
+ private static String formatError(Label label) {
+ return String.format(
+ "Target %s was referenced as a platform, but does not provide PlatformInfo", label);
+ }
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
index ad775ca9a5..4ec5e7faca 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RegisteredExecutionPlatformsFunction.java
@@ -20,21 +20,17 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.PlatformConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
-import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.packages.Package;
import com.google.devtools.build.lib.pkgcache.FilteringPolicies;
-import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException;
-import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException;
+import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.SkyValue;
-import com.google.devtools.build.skyframe.ValueOrException;
import java.util.List;
-import java.util.Map;
import javax.annotation.Nullable;
/** {@link SkyFunction} that returns all registered execution platforms available. */
@@ -122,38 +118,17 @@ public class RegisteredExecutionPlatformsFunction implements SkyFunction {
.collect(ImmutableList.toImmutableList());
// Load the actual configured targets and ensure that they have real, valid PlatformInfo
- // instances. These are loaded later during toolchain resolution (see
- // ToolchainUtil#getPlatformInfo), so this is work that needs to be done anyway, but here we can
- // fail fast on an error.
- Map<SkyKey, ValueOrException<ConfiguredValueCreationException>> values =
- env.getValuesOrThrow(keys, ConfiguredValueCreationException.class);
- boolean valuesMissing = false;
- for (SkyKey key : keys) {
- ConfiguredTargetKey configuredTargetKey = (ConfiguredTargetKey) key.argument();
- Label platformLabel = configuredTargetKey.getLabel();
- try {
- ValueOrException<ConfiguredValueCreationException> valueOrException = values.get(key);
- if (valueOrException.get() == null) {
- valuesMissing = true;
- continue;
- }
- ConfiguredTarget target =
- ((ConfiguredTargetValue) valueOrException.get()).getConfiguredTarget();
- PlatformInfo platformInfo = PlatformProviderUtils.platform(target);
-
- if (platformInfo == null) {
- throw new RegisteredExecutionPlatformsFunctionException(
- new InvalidPlatformException(platformLabel), Transience.PERSISTENT);
- }
- } catch (ConfiguredValueCreationException e) {
- throw new RegisteredExecutionPlatformsFunctionException(
- new InvalidPlatformException(platformLabel, e), Transience.PERSISTENT);
+ // instances. These are loaded later during toolchain resolution, so this is work that needs to
+ // be done anyway, but here we can fail fast on an error.
+ try {
+ PlatformLookupUtil.getPlatformInfo(keys, env);
+ if (env.valuesMissing()) {
+ return null;
}
+ } catch (InvalidPlatformException e) {
+ throw new RegisteredExecutionPlatformsFunctionException(e, Transience.PERSISTENT);
}
- if (valuesMissing) {
- return null;
- }
return keys;
}
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
index 737bbd8982..0667d196b3 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunction.java
@@ -27,8 +27,8 @@ import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.packages.NoSuchThingException;
+import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException;
import com.google.devtools.build.lib.skyframe.RegisteredToolchainsFunction.InvalidToolchainLabelException;
-import com.google.devtools.build.lib.skyframe.ToolchainUtil.InvalidPlatformException;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
import com.google.devtools.build.skyframe.SkyKey;
@@ -111,14 +111,15 @@ public class ToolchainResolutionFunction implements SkyFunction {
// Load the PlatformInfo needed to check constraints.
Map<ConfiguredTargetKey, PlatformInfo> platforms;
try {
+
platforms =
- ToolchainUtil.getPlatformInfo(
+ PlatformLookupUtil.getPlatformInfo(
new ImmutableList.Builder<ConfiguredTargetKey>()
.add(targetPlatformKey)
.addAll(availableExecutionPlatformKeys)
.build(),
env);
- if (platforms == null) {
+ if (env.valuesMissing()) {
return null;
}
} catch (InvalidPlatformException e) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
index 7f69391025..156f62e05c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainUtil.java
@@ -37,6 +37,7 @@ import com.google.devtools.build.lib.cmdline.TargetParsingException;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.pkgcache.FilteringPolicy;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetFunction.ConfiguredValueCreationException;
+import com.google.devtools.build.lib.skyframe.PlatformLookupUtil.InvalidPlatformException;
import com.google.devtools.build.lib.skyframe.RegisteredToolchainsFunction.InvalidToolchainLabelException;
import com.google.devtools.build.lib.skyframe.ToolchainResolutionFunction.NoToolchainFoundException;
import com.google.devtools.build.skyframe.SkyFunction.Environment;
@@ -44,7 +45,6 @@ import com.google.devtools.build.skyframe.SkyKey;
import com.google.devtools.build.skyframe.ValueOrException;
import com.google.devtools.build.skyframe.ValueOrException2;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -120,7 +120,10 @@ public class ToolchainUtil {
.collect(toImmutableList());
// Load the host and target platforms early, to check for errors.
- getPlatformInfo(ImmutableList.of(hostPlatformKey, targetPlatformKey), env);
+ PlatformLookupUtil.getPlatformInfo(ImmutableList.of(hostPlatformKey, targetPlatformKey), env);
+ if (env.valuesMissing()) {
+ return null;
+ }
// Load all available execution platform keys. This will find any errors in the execution
// platform definitions.
@@ -180,56 +183,6 @@ public class ToolchainUtil {
return registeredExecutionPlatforms;
}
- @Nullable
- static Map<ConfiguredTargetKey, PlatformInfo> getPlatformInfo(
- Iterable<ConfiguredTargetKey> platformKeys, Environment env)
- throws InterruptedException, InvalidPlatformException {
-
- Map<SkyKey, ValueOrException<ConfiguredValueCreationException>> values =
- env.getValuesOrThrow(platformKeys, ConfiguredValueCreationException.class);
- boolean valuesMissing = env.valuesMissing();
- Map<ConfiguredTargetKey, PlatformInfo> platforms = valuesMissing ? null : new HashMap<>();
- for (ConfiguredTargetKey key : platformKeys) {
- PlatformInfo platformInfo = findPlatformInfo(key.getLabel(), values.get(key));
- if (!valuesMissing && platformInfo != null) {
- platforms.put(key, platformInfo);
- }
- }
- if (valuesMissing) {
- return null;
- }
- return platforms;
- }
-
- /**
- * Returns the {@link PlatformInfo} provider from the {@link ConfiguredTarget} in the {@link
- * ValueOrException}, or {@code null} if the {@link ConfiguredTarget} is not present. If the
- * {@link ConfiguredTarget} does not have a {@link PlatformInfo} provider, a {@link
- * InvalidPlatformException} is thrown.
- */
- @Nullable
- private static PlatformInfo findPlatformInfo(
- Label label, ValueOrException<ConfiguredValueCreationException> valueOrException)
- throws InvalidPlatformException {
-
- try {
- ConfiguredTargetValue ctv = (ConfiguredTargetValue) valueOrException.get();
- if (ctv == null) {
- return null;
- }
-
- ConfiguredTarget configuredTarget = ctv.getConfiguredTarget();
- PlatformInfo platformInfo = PlatformProviderUtils.platform(configuredTarget);
- if (platformInfo == null) {
- throw new InvalidPlatformException(label);
- }
-
- return platformInfo;
- } catch (ConfiguredValueCreationException e) {
- throw new InvalidPlatformException(label, e);
- }
- }
-
/** Data class to hold the result of resolving toolchain labels. */
@AutoValue
protected abstract static class ResolvedToolchains {
@@ -391,7 +344,8 @@ public class ToolchainUtil {
throws InterruptedException, InvalidPlatformException {
Map<ConfiguredTargetKey, PlatformInfo> platforms =
- getPlatformInfo(ImmutableList.of(executionPlatformKey, targetPlatformKey), env);
+ PlatformLookupUtil.getPlatformInfo(
+ ImmutableList.of(executionPlatformKey, targetPlatformKey), env);
if (platforms == null) {
return null;
@@ -460,7 +414,8 @@ public class ToolchainUtil {
return platformKeys;
}
- Map<ConfiguredTargetKey, PlatformInfo> platformInfoMap = getPlatformInfo(platformKeys, env);
+ Map<ConfiguredTargetKey, PlatformInfo> platformInfoMap =
+ PlatformLookupUtil.getPlatformInfo(platformKeys, env);
if (platformInfoMap == null) {
return null;
}
@@ -611,22 +566,6 @@ public class ToolchainUtil {
}
}
- /** Exception used when a platform label is not a valid platform. */
- static final class InvalidPlatformException extends ToolchainException {
- InvalidPlatformException(Label label) {
- super(formatError(label));
- }
-
- InvalidPlatformException(Label label, ConfiguredValueCreationException e) {
- super(formatError(label), e);
- }
-
- private static String formatError(Label label) {
- return String.format(
- "Target %s was referenced as a platform, but does not provide PlatformInfo", label);
- }
- }
-
/** Exception used when a constraint value label is not a valid constraint value. */
static final class InvalidConstraintValueException extends ToolchainException {
InvalidConstraintValueException(Label label) {