Use toolchain type provider in toolchain resolution
Part of #6015.
Closes #6616.
PiperOrigin-RevId: 220465567
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
index 35c7005..368b53f 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainContext.java
@@ -22,6 +22,7 @@
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
@@ -31,6 +32,7 @@
import com.google.devtools.build.lib.skylarkinterface.SkylarkPrinter;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.syntax.EvalUtils;
+import java.util.Optional;
import java.util.Set;
import javax.annotation.Nullable;
@@ -57,10 +59,10 @@
Builder setTargetPlatform(PlatformInfo targetPlatform);
/** Sets the toolchain types that were requested. */
- Builder setRequiredToolchainTypes(Set<Label> requiredToolchainTypes);
+ Builder setRequiredToolchainTypes(Set<ToolchainTypeInfo> requiredToolchainTypes);
/** Sets the map from toolchain type to toolchain provider. */
- Builder setToolchains(ImmutableMap<Label, ToolchainInfo> toolchains);
+ Builder setToolchains(ImmutableMap<ToolchainTypeInfo, ToolchainInfo> toolchains);
/** Sets the template variables that these toolchains provide. */
Builder setTemplateVariableProviders(ImmutableList<TemplateVariableInfo> providers);
@@ -82,9 +84,9 @@
public abstract PlatformInfo targetPlatform();
/** Returns the toolchain types that were requested. */
- public abstract ImmutableSet<Label> requiredToolchainTypes();
+ public abstract ImmutableSet<ToolchainTypeInfo> requiredToolchainTypes();
- abstract ImmutableMap<Label, ToolchainInfo> toolchains();
+ abstract ImmutableMap<ToolchainTypeInfo, ToolchainInfo> toolchains();
/** Returns the template variables that these toolchains provide. */
public abstract ImmutableList<TemplateVariableInfo> templateVariableProviders();
@@ -97,7 +99,20 @@
* required in this context.
*/
@Nullable
- public ToolchainInfo forToolchainType(Label toolchainType) {
+ public ToolchainInfo forToolchainType(Label toolchainTypeLabel) {
+ Optional<ToolchainTypeInfo> toolchainType =
+ toolchains().keySet().stream()
+ .filter(info -> info.typeLabel().equals(toolchainTypeLabel))
+ .findFirst();
+ if (toolchainType.isPresent()) {
+ return forToolchainType(toolchainType.get());
+ } else {
+ return null;
+ }
+ }
+
+ @Nullable
+ public ToolchainInfo forToolchainType(ToolchainTypeInfo toolchainType) {
return toolchains().get(toolchainType);
}
@@ -109,13 +124,19 @@
@Override
public void repr(SkylarkPrinter printer) {
printer.append("<toolchain_context.resolved_labels: ");
- printer.append(toolchains().keySet().stream().map(Label::toString).collect(joining(", ")));
+ printer.append(
+ toolchains().keySet().stream()
+ .map(ToolchainTypeInfo::typeLabel)
+ .map(Label::toString)
+ .collect(joining(", ")));
printer.append(">");
}
private Label transformKey(Object key, Location loc) throws EvalException {
if (key instanceof Label) {
return (Label) key;
+ } else if (key instanceof ToolchainTypeInfo) {
+ return ((ToolchainTypeInfo) key).typeLabel();
} else if (key instanceof String) {
Label toolchainType;
String rawLabel = (String) key;
@@ -137,23 +158,31 @@
@Override
public ToolchainInfo getIndex(Object key, Location loc) throws EvalException {
- Label toolchainType = transformKey(key, loc);
+ Label toolchainTypeLabel = transformKey(key, loc);
- if (!requiredToolchainTypes().contains(toolchainType)) {
+ if (!containsKey(key, loc)) {
throw new EvalException(
loc,
String.format(
"In %s, toolchain type %s was requested but only types [%s] are configured",
targetDescription(),
- toolchainType,
- requiredToolchainTypes().stream().map(Label::toString).collect(joining())));
+ toolchainTypeLabel,
+ requiredToolchainTypes().stream()
+ .map(ToolchainTypeInfo::typeLabel)
+ .map(Label::toString)
+ .collect(joining(", "))));
}
- return forToolchainType(toolchainType);
+ return forToolchainType(toolchainTypeLabel);
}
@Override
public boolean containsKey(Object key, Location loc) throws EvalException {
- Label toolchainType = transformKey(key, loc);
- return toolchains().containsKey(toolchainType);
+ Label toolchainTypeLabel = transformKey(key, loc);
+ Optional<Label> matching =
+ toolchains().keySet().stream()
+ .map(ToolchainTypeInfo::typeLabel)
+ .filter(label -> label.equals(toolchainTypeLabel))
+ .findAny();
+ return matching.isPresent();
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
index c2f3819..e8c5c5d 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/ToolchainResolver.java
@@ -19,7 +19,6 @@
import static java.util.stream.Collectors.joining;
import com.google.auto.value.AutoValue;
-import com.google.common.base.Joiner;
import com.google.common.collect.HashBasedTable;
import com.google.common.collect.ImmutableBiMap;
import com.google.common.collect.ImmutableList;
@@ -31,6 +30,7 @@
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
import com.google.devtools.build.lib.analysis.platform.PlatformProviderUtils;
import com.google.devtools.build.lib.analysis.platform.ToolchainInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.packages.Attribute;
@@ -71,7 +71,7 @@
// Optional data.
private String targetDescription = "";
- private ImmutableSet<Label> requiredToolchainTypes = ImmutableSet.of();
+ private ImmutableSet<Label> requiredToolchainTypeLabels = ImmutableSet.of();
private ImmutableSet<Label> execConstraintLabels = ImmutableSet.of();
// Determined during execution.
@@ -98,9 +98,12 @@
return this;
}
- /** Sets the required toolchain types that this resolver needs to find toolchains for. */
- public ToolchainResolver setRequiredToolchainTypes(Set<Label> requiredToolchainTypes) {
- this.requiredToolchainTypes = ImmutableSet.copyOf(requiredToolchainTypes);
+ /**
+ * Sets the labels of the required toolchain types that this resolver needs to find toolchains
+ * for.
+ */
+ public ToolchainResolver setRequiredToolchainTypes(Set<Label> requiredToolchainTypeLabels) {
+ this.requiredToolchainTypeLabels = ImmutableSet.copyOf(requiredToolchainTypeLabels);
return this;
}
@@ -137,9 +140,7 @@
try {
UnloadedToolchainContext.Builder unloadedToolchainContext =
UnloadedToolchainContext.builder();
- unloadedToolchainContext
- .setTargetDescription(targetDescription)
- .setRequiredToolchainTypes(requiredToolchainTypes);
+ unloadedToolchainContext.setTargetDescription(targetDescription);
// Determine the configuration being used.
BuildConfigurationValue value =
@@ -307,11 +308,11 @@
// Find the toolchains for the required toolchain types.
List<ToolchainResolutionValue.Key> registeredToolchainKeys = new ArrayList<>();
- for (Label toolchainType : requiredToolchainTypes) {
+ for (Label toolchainTypeLabel : requiredToolchainTypeLabels) {
registeredToolchainKeys.add(
ToolchainResolutionValue.key(
configurationKey,
- toolchainType,
+ toolchainTypeLabel,
platformKeys.targetPlatformKey(),
platformKeys.executionPlatformKeys()));
}
@@ -325,14 +326,14 @@
boolean valuesMissing = false;
// Determine the potential set of toolchains.
- Table<ConfiguredTargetKey, Label, Label> resolvedToolchains = HashBasedTable.create();
+ Table<ConfiguredTargetKey, ToolchainTypeInfo, Label> resolvedToolchains =
+ HashBasedTable.create();
+ ImmutableSet.Builder<ToolchainTypeInfo> requiredToolchainTypesBuilder = ImmutableSet.builder();
List<Label> missingToolchains = new ArrayList<>();
for (Map.Entry<
SkyKey, ValueOrException2<NoToolchainFoundException, InvalidToolchainLabelException>>
entry : results.entrySet()) {
try {
- Label requiredToolchainType =
- ((ToolchainResolutionValue.Key) entry.getKey().argument()).toolchainType();
ValueOrException2<NoToolchainFoundException, InvalidToolchainLabelException>
valueOrException = entry.getValue();
ToolchainResolutionValue toolchainResolutionValue =
@@ -342,11 +343,13 @@
continue;
}
+ ToolchainTypeInfo requiredToolchainType = toolchainResolutionValue.toolchainType();
+ requiredToolchainTypesBuilder.add(requiredToolchainType);
resolvedToolchains.putAll(
findPlatformsAndLabels(requiredToolchainType, toolchainResolutionValue));
} catch (NoToolchainFoundException e) {
// Save the missing type and continue looping to check for more.
- missingToolchains.add(e.missingToolchainType());
+ missingToolchains.add(e.missingToolchainTypeLabel());
}
}
@@ -358,9 +361,11 @@
throw new ValueMissingException();
}
+ ImmutableSet<ToolchainTypeInfo> requiredToolchainTypes = requiredToolchainTypesBuilder.build();
+
// Find and return the first execution platform which has all required toolchains.
Optional<ConfiguredTargetKey> selectedExecutionPlatformKey;
- if (requiredToolchainTypes.isEmpty()
+ if (requiredToolchainTypeLabels.isEmpty()
&& platformKeys.executionPlatformKeys().contains(platformKeys.hostPlatformKey())) {
// Fall back to the legacy behavior: use the host platform if it's available, otherwise the
// first execution platform.
@@ -369,12 +374,12 @@
// If there are no toolchains, this will return the first execution platform.
selectedExecutionPlatformKey =
findExecutionPlatformForToolchains(
- platformKeys.executionPlatformKeys(), resolvedToolchains);
+ requiredToolchainTypes, platformKeys.executionPlatformKeys(), resolvedToolchains);
}
if (!selectedExecutionPlatformKey.isPresent()) {
throw new NoMatchingPlatformException(
- requiredToolchainTypes,
+ requiredToolchainTypeLabels,
platformKeys.executionPlatformKeys(),
platformKeys.targetPlatformKey());
}
@@ -387,11 +392,13 @@
throw new ValueMissingException();
}
+ unloadedToolchainContext.setRequiredToolchainTypes(requiredToolchainTypes);
unloadedToolchainContext.setExecutionPlatform(
platforms.get(selectedExecutionPlatformKey.get()));
unloadedToolchainContext.setTargetPlatform(platforms.get(platformKeys.targetPlatformKey()));
- Map<Label, Label> toolchains = resolvedToolchains.row(selectedExecutionPlatformKey.get());
+ Map<ToolchainTypeInfo, Label> toolchains =
+ resolvedToolchains.row(selectedExecutionPlatformKey.get());
unloadedToolchainContext.setToolchainTypeToResolved(ImmutableBiMap.copyOf(toolchains));
}
@@ -399,10 +406,11 @@
* Adds all of toolchain labels from{@code toolchainResolutionValue} to {@code
* resolvedToolchains}.
*/
- private static Table<ConfiguredTargetKey, Label, Label> findPlatformsAndLabels(
- Label requiredToolchainType, ToolchainResolutionValue toolchainResolutionValue) {
+ private static Table<ConfiguredTargetKey, ToolchainTypeInfo, Label> findPlatformsAndLabels(
+ ToolchainTypeInfo requiredToolchainType, ToolchainResolutionValue toolchainResolutionValue) {
- Table<ConfiguredTargetKey, Label, Label> resolvedToolchains = HashBasedTable.create();
+ Table<ConfiguredTargetKey, ToolchainTypeInfo, Label> resolvedToolchains =
+ HashBasedTable.create();
for (Map.Entry<ConfiguredTargetKey, Label> entry :
toolchainResolutionValue.availableToolchainLabels().entrySet()) {
resolvedToolchains.put(entry.getKey(), requiredToolchainType, entry.getValue());
@@ -415,10 +423,12 @@
* resolvedToolchains} and has all required toolchain types.
*/
private Optional<ConfiguredTargetKey> findExecutionPlatformForToolchains(
+ ImmutableSet<ToolchainTypeInfo> requiredToolchainTypes,
ImmutableList<ConfiguredTargetKey> availableExecutionPlatformKeys,
- Table<ConfiguredTargetKey, Label, Label> resolvedToolchains) {
+ Table<ConfiguredTargetKey, ToolchainTypeInfo, Label> resolvedToolchains) {
for (ConfiguredTargetKey executionPlatformKey : availableExecutionPlatformKeys) {
- Map<Label, Label> toolchains = resolvedToolchains.row(executionPlatformKey);
+ Map<ToolchainTypeInfo, Label> toolchains = resolvedToolchains.row(executionPlatformKey);
+
if (!toolchains.keySet().containsAll(requiredToolchainTypes)) {
// Not all toolchains are present, keep going
continue;
@@ -427,7 +437,10 @@
if (debug) {
String selectedToolchains =
toolchains.entrySet().stream()
- .map(e -> String.format("type %s -> toolchain %s", e.getKey(), e.getValue()))
+ .map(
+ e ->
+ String.format(
+ "type %s -> toolchain %s", e.getKey().typeLabel(), e.getValue()))
.collect(joining(", "));
environment
.getListener()
@@ -467,9 +480,10 @@
Builder setTargetPlatform(PlatformInfo targetPlatform);
/** Sets the toolchain types that were requested. */
- Builder setRequiredToolchainTypes(Set<Label> requiredToolchainTypes);
+ Builder setRequiredToolchainTypes(Set<ToolchainTypeInfo> requiredToolchainTypes);
- Builder setToolchainTypeToResolved(ImmutableBiMap<Label, Label> toolchainTypeToResolved);
+ Builder setToolchainTypeToResolved(
+ ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved);
UnloadedToolchainContext build();
}
@@ -484,10 +498,10 @@
abstract PlatformInfo targetPlatform();
/** Returns the toolchain types that were requested. */
- abstract ImmutableSet<Label> requiredToolchainTypes();
+ abstract ImmutableSet<ToolchainTypeInfo> requiredToolchainTypes();
/** The map of toolchain type to resolved toolchain to be used. */
- abstract ImmutableBiMap<Label, Label> toolchainTypeToResolved();
+ abstract ImmutableBiMap<ToolchainTypeInfo, Label> toolchainTypeToResolved();
/** Returns the labels of the specific toolchains being used. */
public ImmutableSet<Label> resolvedToolchainLabels() {
@@ -517,13 +531,15 @@
attribute ->
attribute.getName().equals(PlatformSemantics.RESOLVED_TOOLCHAINS_ATTR))
.findFirst();
- ImmutableMap.Builder<Label, ToolchainInfo> toolchains = new ImmutableMap.Builder<>();
+ ImmutableMap.Builder<ToolchainTypeInfo, ToolchainInfo> toolchains =
+ new ImmutableMap.Builder<>();
ImmutableList.Builder<TemplateVariableInfo> templateVariableProviders =
new ImmutableList.Builder<>();
if (toolchainAttribute.isPresent()) {
for (ConfiguredTargetAndData target : prerequisiteMap.get(toolchainAttribute.get())) {
Label discoveredLabel = target.getTarget().getLabel();
- Label toolchainType = toolchainTypeToResolved().inverse().get(discoveredLabel);
+ ToolchainTypeInfo toolchainType =
+ toolchainTypeToResolved().inverse().get(discoveredLabel);
// If the toolchainType hadn't been resolved to an actual toolchain, resolution would have
// failed with an error much earlier. This null check is just for safety.
@@ -560,17 +576,19 @@
/** Exception used when no execution platform can be found. */
static final class NoMatchingPlatformException extends ToolchainException {
NoMatchingPlatformException(
- Set<Label> requiredToolchains,
+ Set<Label> requiredToolchainTypeLabels,
ImmutableList<ConfiguredTargetKey> availableExecutionPlatformKeys,
ConfiguredTargetKey targetPlatformKey) {
- super(formatError(requiredToolchains, availableExecutionPlatformKeys, targetPlatformKey));
+ super(
+ formatError(
+ requiredToolchainTypeLabels, availableExecutionPlatformKeys, targetPlatformKey));
}
private static String formatError(
- Set<Label> requiredToolchains,
+ Set<Label> requiredToolchainTypeLabels,
ImmutableList<ConfiguredTargetKey> availableExecutionPlatformKeys,
ConfiguredTargetKey targetPlatformKey) {
- if (requiredToolchains.isEmpty()) {
+ if (requiredToolchainTypeLabels.isEmpty()) {
return String.format(
"Unable to find an execution platform for target platform %s"
+ " from available execution platforms [%s]",
@@ -582,7 +600,7 @@
return String.format(
"Unable to find an execution platform for toolchains [%s] and target platform %s"
+ " from available execution platforms [%s]",
- Joiner.on(", ").join(requiredToolchains),
+ requiredToolchainTypeLabels.stream().map(Label::toString).collect(joining(", ")),
targetPlatformKey.getLabel(),
availableExecutionPlatformKeys.stream()
.map(key -> key.getLabel().toString())
@@ -596,7 +614,7 @@
super(
String.format(
"no matching toolchains found for types %s",
- Joiner.on(", ").join(missingToolchainTypes)));
+ missingToolchainTypes.stream().map(Label::toString).collect(joining(", "))));
}
}
}
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 427ca61..61d3f25 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
@@ -26,6 +26,7 @@
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
@@ -76,24 +77,13 @@
// Find the right one.
boolean debug = configuration.getOptions().get(PlatformOptions.class).toolchainResolutionDebug;
- ImmutableMap<ConfiguredTargetKey, Label> resolvedToolchainLabels =
- resolveConstraints(
- key.toolchainType(),
- key.availableExecutionPlatformKeys(),
- key.targetPlatformKey(),
- toolchains.registeredToolchains(),
- env,
- debug ? env.getListener() : null);
- if (resolvedToolchainLabels == null) {
- return null;
- }
-
- if (resolvedToolchainLabels.isEmpty()) {
- throw new ToolchainResolutionFunctionException(
- new NoToolchainFoundException(key.toolchainType()));
- }
-
- return ToolchainResolutionValue.create(resolvedToolchainLabels);
+ return resolveConstraints(
+ key.toolchainTypeLabel(),
+ key.availableExecutionPlatformKeys(),
+ key.targetPlatformKey(),
+ toolchains.registeredToolchains(),
+ env,
+ debug ? env.getListener() : null);
}
/**
@@ -102,8 +92,8 @@
* platform.
*/
@Nullable
- private static ImmutableMap<ConfiguredTargetKey, Label> resolveConstraints(
- Label toolchainType,
+ private static ToolchainResolutionValue resolveConstraints(
+ Label toolchainTypeLabel,
List<ConfiguredTargetKey> availableExecutionPlatformKeys,
ConfiguredTargetKey targetPlatformKey,
ImmutableList<DeclaredToolchainInfo> toolchains,
@@ -135,11 +125,12 @@
// check whether a platform has already been seen during processing.
Set<ConfiguredTargetKey> platformKeysSeen = new HashSet<>();
ImmutableMap.Builder<ConfiguredTargetKey, Label> builder = ImmutableMap.builder();
+ ToolchainTypeInfo toolchainType = null;
- debugMessage(eventHandler, "Looking for toolchain of type %s...", toolchainType);
+ debugMessage(eventHandler, "Looking for toolchain of type %s...", toolchainTypeLabel);
for (DeclaredToolchainInfo toolchain : toolchains) {
// Make sure the type matches.
- if (!toolchain.toolchainType().typeLabel().equals(toolchainType)) {
+ if (!toolchain.toolchainType().typeLabel().equals(toolchainTypeLabel)) {
continue;
}
debugMessage(eventHandler, " Considering toolchain %s...", toolchain.toolchainLabel());
@@ -164,6 +155,7 @@
// Only add the toolchains if this is a new platform.
if (!platformKeysSeen.contains(executionPlatformKey)) {
+ toolchainType = toolchain.toolchainType();
builder.put(executionPlatformKey, toolchain.toolchainLabel());
platformKeysSeen.add(executionPlatformKey);
}
@@ -177,15 +169,18 @@
debugMessage(
eventHandler,
" For toolchain type %s, possible execution platforms and toolchains: {%s}",
- toolchainType,
- resolvedToolchainLabels
- .entrySet()
- .stream()
+ toolchainTypeLabel,
+ resolvedToolchainLabels.entrySet().stream()
.map(e -> String.format("%s -> %s", e.getKey().getLabel(), e.getValue()))
.collect(joining(", ")));
}
- return resolvedToolchainLabels;
+ if (toolchainType == null || resolvedToolchainLabels.isEmpty()) {
+ throw new ToolchainResolutionFunctionException(
+ new NoToolchainFoundException(toolchainTypeLabel));
+ }
+
+ return ToolchainResolutionValue.create(toolchainType, resolvedToolchainLabels);
}
/**
@@ -247,15 +242,15 @@
/** Used to indicate that a toolchain was not found for the current request. */
public static final class NoToolchainFoundException extends NoSuchThingException {
- private final Label missingToolchainType;
+ private final Label missingToolchainTypeLabel;
- public NoToolchainFoundException(Label missingToolchainType) {
- super(String.format("no matching toolchain found for %s", missingToolchainType));
- this.missingToolchainType = missingToolchainType;
+ public NoToolchainFoundException(Label missingToolchainTypeLabel) {
+ super(String.format("no matching toolchain found for %s", missingToolchainTypeLabel));
+ this.missingToolchainTypeLabel = missingToolchainTypeLabel;
}
- public Label missingToolchainType() {
- return missingToolchainType;
+ public Label missingToolchainTypeLabel() {
+ return missingToolchainTypeLabel;
}
}
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
index 341be5a..128269c 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionValue.java
@@ -17,6 +17,7 @@
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.skyframe.SkyFunctionName;
@@ -37,11 +38,11 @@
// A key representing the input data.
public static Key key(
BuildConfigurationValue.Key configurationKey,
- Label toolchainType,
+ Label toolchainTypeLabel,
ConfiguredTargetKey targetPlatformKey,
List<ConfiguredTargetKey> availableExecutionPlatformKeys) {
return Key.create(
- configurationKey, toolchainType, targetPlatformKey, availableExecutionPlatformKeys);
+ configurationKey, toolchainTypeLabel, targetPlatformKey, availableExecutionPlatformKeys);
}
/** {@link SkyKey} implementation used for {@link ToolchainResolutionFunction}. */
@@ -57,7 +58,7 @@
abstract BuildConfigurationValue.Key configurationKey();
- public abstract Label toolchainType();
+ public abstract Label toolchainTypeLabel();
abstract ConfiguredTargetKey targetPlatformKey();
@@ -66,12 +67,12 @@
@AutoCodec.Instantiator
static Key create(
BuildConfigurationValue.Key configurationKey,
- Label toolchainType,
+ Label toolchainTypeLabel,
ConfiguredTargetKey targetPlatformKey,
List<ConfiguredTargetKey> availableExecutionPlatformKeys) {
return new AutoValue_ToolchainResolutionValue_Key(
configurationKey,
- toolchainType,
+ toolchainTypeLabel,
targetPlatformKey,
ImmutableList.copyOf(availableExecutionPlatformKeys));
}
@@ -79,10 +80,14 @@
@AutoCodec.Instantiator
public static ToolchainResolutionValue create(
+ ToolchainTypeInfo toolchainType,
ImmutableMap<ConfiguredTargetKey, Label> availableToolchainLabels) {
- return new AutoValue_ToolchainResolutionValue(availableToolchainLabels);
+ return new AutoValue_ToolchainResolutionValue(toolchainType, availableToolchainLabels);
}
+ /** Returns the resolved details about the requested toolchain type. */
+ public abstract ToolchainTypeInfo toolchainType();
+
/**
* Returns the resolved set of toolchain labels (as {@link Label}) for the requested toolchain
* type, keyed by the execution platforms (as {@link ConfiguredTargetKey}). Ordering is not
diff --git a/src/test/java/com/google/devtools/build/lib/BUILD b/src/test/java/com/google/devtools/build/lib/BUILD
index 4a2b649..d29b4a7 100644
--- a/src/test/java/com/google/devtools/build/lib/BUILD
+++ b/src/test/java/com/google/devtools/build/lib/BUILD
@@ -812,6 +812,7 @@
"//src/main/java/com/google/devtools/build/lib:skylarkinterface",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/actions",
+ "//src/main/java/com/google/devtools/build/lib/analysis/platform",
"//src/main/java/com/google/devtools/build/lib/buildeventstream",
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
"//src/main/java/com/google/devtools/build/lib/causes",
diff --git a/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java b/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
index f518354..5ceade0 100644
--- a/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
+++ b/src/test/java/com/google/devtools/build/lib/analysis/ToolchainResolverTest.java
@@ -25,6 +25,7 @@
import com.google.devtools.build.lib.analysis.ToolchainResolver.NoMatchingPlatformException;
import com.google.devtools.build.lib.analysis.ToolchainResolver.UnloadedToolchainContext;
import com.google.devtools.build.lib.analysis.ToolchainResolver.UnresolvedToolchainsException;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.analysis.util.AnalysisMock;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.Attribute;
@@ -97,7 +98,8 @@
useConfiguration("--platforms=//platforms:linux");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -196,7 +198,7 @@
ResolveToolchainsKey.create(
"test",
ImmutableSet.of(
- testToolchainType, Label.parseAbsoluteUnchecked("//fake/toolchain:type_1")),
+ testToolchainTypeLabel, Label.parseAbsoluteUnchecked("//fake/toolchain:type_1")),
targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -219,7 +221,7 @@
ResolveToolchainsKey.create(
"test",
ImmutableSet.of(
- testToolchainType,
+ testToolchainTypeLabel,
Label.parseAbsoluteUnchecked("//fake/toolchain:type_1"),
Label.parseAbsoluteUnchecked("//fake/toolchain:type_2")),
targetConfigKey);
@@ -238,7 +240,8 @@
scratch.file("invalid/BUILD", "filegroup(name = 'not_a_platform')");
useConfiguration("--platforms=//invalid:not_a_platform");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -261,7 +264,8 @@
scratch.resolve("invalid").delete();
useConfiguration("--platforms=//invalid:not_a_platform");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -282,7 +286,8 @@
scratch.file("invalid/BUILD", "filegroup(name = 'not_a_platform')");
useConfiguration("--host_platform=//invalid:not_a_platform");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -303,7 +308,8 @@
scratch.file("invalid/BUILD", "filegroup(name = 'not_a_platform')");
useConfiguration("--extra_execution_platforms=//invalid:not_a_platform");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -343,7 +349,7 @@
ResolveToolchainsKey key =
ResolveToolchainsKey.create(
"test",
- ImmutableSet.of(testToolchainType),
+ ImmutableSet.of(testToolchainTypeLabel),
ImmutableSet.of(Label.parseAbsoluteUnchecked("//constraints:linux")),
targetConfigKey);
@@ -372,7 +378,7 @@
ResolveToolchainsKey key =
ResolveToolchainsKey.create(
"test",
- ImmutableSet.of(testToolchainType),
+ ImmutableSet.of(testToolchainTypeLabel),
ImmutableSet.of(Label.parseAbsoluteUnchecked("//platforms:linux")),
targetConfigKey);
@@ -451,7 +457,8 @@
useConfiguration("--platforms=//platforms:linux");
ResolveToolchainsKey key =
- ResolveToolchainsKey.create("test", ImmutableSet.of(testToolchainType), targetConfigKey);
+ ResolveToolchainsKey.create(
+ "test", ImmutableSet.of(testToolchainTypeLabel), targetConfigKey);
// Create the UnloadedToolchainContext.
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
@@ -479,8 +486,9 @@
@Test
public void unloadedToolchainContext_load_withTemplateVariables() throws Exception {
// Add new toolchain rule that provides template variables.
- Label variableToolchainType =
+ Label variableToolchainTypeLabel =
Label.parseAbsoluteUnchecked("//variable:variable_toolchain_type");
+ ToolchainTypeInfo variableToolchainType = ToolchainTypeInfo.create(variableToolchainTypeLabel);
scratch.file(
"variable/variable_toolchain_def.bzl",
"def _impl(ctx):",
@@ -512,7 +520,7 @@
ResolveToolchainsKey key =
ResolveToolchainsKey.create(
- "test", ImmutableSet.of(variableToolchainType), targetConfigKey);
+ "test", ImmutableSet.of(variableToolchainTypeLabel), targetConfigKey);
// Create the UnloadedToolchainContext.
EvaluationResult<ResolveToolchainsValue> result = createToolchainContextBuilder(key);
diff --git a/src/test/java/com/google/devtools/build/lib/rules/platform/ToolchainTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/platform/ToolchainTestCase.java
index 43750e0..7349164 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/platform/ToolchainTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/platform/ToolchainTestCase.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.analysis.platform.ConstraintValueInfo;
import com.google.devtools.build.lib.analysis.platform.DeclaredToolchainInfo;
import com.google.devtools.build.lib.analysis.platform.PlatformInfo;
+import com.google.devtools.build.lib.analysis.platform.ToolchainTypeInfo;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.skyframe.RegisteredToolchainsValue;
@@ -46,7 +47,8 @@
public ConstraintValueInfo linuxConstraint;
public ConstraintValueInfo macConstraint;
- public Label testToolchainType;
+ public Label testToolchainTypeLabel;
+ public ToolchainTypeInfo testToolchainType;
protected static IterableSubject assertToolchainLabels(
RegisteredToolchainsValue registeredToolchainsValue) {
@@ -174,7 +176,8 @@
ImmutableList.of("//constraints:linux"),
"bar");
- testToolchainType = makeLabel("//toolchain:test_toolchain");
+ testToolchainTypeLabel = makeLabel("//toolchain:test_toolchain");
+ testToolchainType = ToolchainTypeInfo.create(testToolchainTypeLabel);
}
protected EvaluationResult<RegisteredToolchainsValue> requestToolchainsFromSkyframe(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
index e00912f..98c40fc 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RegisteredToolchainsFunctionTest.java
@@ -48,8 +48,7 @@
// Check that the number of toolchains created for this test is correct.
assertThat(
value.registeredToolchains().stream()
- .filter(
- toolchain -> toolchain.toolchainType().typeLabel().equals(testToolchainType))
+ .filter(toolchain -> toolchain.toolchainType().equals(testToolchainType))
.collect(Collectors.toList()))
.hasSize(2);
@@ -57,7 +56,7 @@
value.registeredToolchains().stream()
.anyMatch(
toolchain ->
- toolchain.toolchainType().typeLabel().equals(testToolchainType)
+ toolchain.toolchainType().equals(testToolchainType)
&& toolchain.execConstraints().get(setting).equals(linuxConstraint)
&& toolchain.targetConstraints().get(setting).equals(macConstraint)
&& toolchain
@@ -69,7 +68,7 @@
value.registeredToolchains().stream()
.anyMatch(
toolchain ->
- toolchain.toolchainType().typeLabel().equals(testToolchainType)
+ toolchain.toolchainType().equals(testToolchainType)
&& toolchain.execConstraints().get(setting).equals(macConstraint)
&& toolchain.targetConstraints().get(setting).equals(linuxConstraint)
&& toolchain
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
index 7026749..126224a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ToolchainResolutionFunctionTest.java
@@ -89,7 +89,7 @@
public void testResolution_singleExecutionPlatform() throws Exception {
SkyKey key =
ToolchainResolutionValue.key(
- targetConfigKey, testToolchainType, LINUX_CTKEY, ImmutableList.of(MAC_CTKEY));
+ targetConfigKey, testToolchainTypeLabel, LINUX_CTKEY, ImmutableList.of(MAC_CTKEY));
EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
assertThatEvaluationResult(result).hasNoError();
@@ -116,7 +116,7 @@
SkyKey key =
ToolchainResolutionValue.key(
targetConfigKey,
- testToolchainType,
+ testToolchainTypeLabel,
LINUX_CTKEY,
ImmutableList.of(LINUX_CTKEY, MAC_CTKEY));
EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
@@ -139,7 +139,7 @@
SkyKey key =
ToolchainResolutionValue.key(
- targetConfigKey, testToolchainType, LINUX_CTKEY, ImmutableList.of(MAC_CTKEY));
+ targetConfigKey, testToolchainTypeLabel, LINUX_CTKEY, ImmutableList.of(MAC_CTKEY));
EvaluationResult<ToolchainResolutionValue> result = invokeToolchainResolution(key);
assertThatEvaluationResult(result)
@@ -154,24 +154,30 @@
new EqualsTester()
.addEqualityGroup(
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.of(LINUX_CTKEY, makeLabel("//test:toolchain_impl_1"))),
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.of(LINUX_CTKEY, makeLabel("//test:toolchain_impl_1"))))
// Different execution platform, same label.
.addEqualityGroup(
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.of(MAC_CTKEY, makeLabel("//test:toolchain_impl_1"))))
// Same execution platform, different label.
.addEqualityGroup(
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.of(LINUX_CTKEY, makeLabel("//test:toolchain_impl_2"))))
// Different execution platform, different label.
.addEqualityGroup(
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.of(MAC_CTKEY, makeLabel("//test:toolchain_impl_2"))))
// Multiple execution platforms.
.addEqualityGroup(
ToolchainResolutionValue.create(
+ testToolchainType,
ImmutableMap.<ConfiguredTargetKey, Label>builder()
.put(LINUX_CTKEY, makeLabel("//test:toolchain_impl_1"))
.put(MAC_CTKEY, makeLabel("//test:toolchain_impl_1"))