diff options
Diffstat (limited to 'src/main/java/com')
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) { |