From 11d94060c6b65e39d7e21150f035e9ebdd5edf2f Mon Sep 17 00:00:00 2001 From: John Cater Date: Mon, 22 Mar 2021 11:46:07 -0400 Subject: [PATCH 1/3] Update ConfiguredTargetFunction.computeUnloadedToolchainContexts to directly require the correct execution platform. This fixes several issues around toolchains that depend on toolchains. Fixes #13243. --- .../skyframe/ConfiguredTargetFunction.java | 41 ++++---- .../lib/skyframe/ToolchainContextKey.java | 14 ++- .../skyframe/ToolchainResolutionFunction.java | 57 +++++++++-- .../skyframe/UnloadedToolchainContext.java | 3 - .../UnloadedToolchainContextImpl.java | 5 - .../ToolchainResolutionFunctionTest.java | 41 ++++++++ .../skyframe/ToolchainsForTargetsTest.java | 48 ++++----- src/test/shell/bazel/toolchain_test.sh | 99 +++++++++++++++++++ 8 files changed, 249 insertions(+), 59 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java index 01d11bd04795ec..d283ddae1a594b 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java @@ -520,18 +520,31 @@ static ToolchainCollection computeUnloadedToolchainCon Map toolchainContextKeys = new HashMap<>(); String targetUnloadedToolchainContext = "target-unloaded-toolchain-context"; - ToolchainContextKey toolchainContextKey; + + ToolchainContextKey.Builder toolchainContextKeyBuilder = + ToolchainContextKey.key() + .configurationKey(toolchainConfig) + .requiredToolchainTypeLabels(requiredDefaultToolchains) + .execConstraintLabels(defaultExecConstraintLabels) + .shouldSanityCheckConfiguration(configuration.trimConfigurationsRetroactively()); + if (parentToolchainContextKey != null) { - toolchainContextKey = parentToolchainContextKey; - } else { - toolchainContextKey = - ToolchainContextKey.key() - .configurationKey(toolchainConfig) - .requiredToolchainTypeLabels(requiredDefaultToolchains) - .execConstraintLabels(defaultExecConstraintLabels) - .shouldSanityCheckConfiguration(configuration.trimConfigurationsRetroactively()) - .build(); + // Find out what execution platform the parent used, and force that. + // This key should always be present, but check just in case. + ToolchainContext parentToolchainContext = + (ToolchainContext) + env.getValueOrThrow(parentToolchainContextKey, ToolchainException.class); + if (env.valuesMissing()) { + return null; + } + + Label execPlatform = parentToolchainContext.executionPlatform().label(); + if (execPlatform != null) { + toolchainContextKeyBuilder.forceExecutionPlatform(execPlatform); + } } + + ToolchainContextKey toolchainContextKey = toolchainContextKeyBuilder.build(); toolchainContextKeys.put(targetUnloadedToolchainContext, toolchainContextKey); for (Map.Entry group : execGroups.entrySet()) { ExecGroup execGroup = group.getValue(); @@ -558,14 +571,6 @@ static ToolchainCollection computeUnloadedToolchainCon (UnloadedToolchainContext) values.get(unloadedToolchainContextKey.getValue()).get(); if (!valuesMissing) { String execGroup = unloadedToolchainContextKey.getKey(); - if (parentToolchainContextKey != null) { - // Since we inherited the toolchain context from the parent of the dependency, the current - // target may also be in the resolved toolchains list. We need to clear it out. - // TODO(configurability): When updating this for config_setting, only remove the current - // target, not everything, because config_setting might want to check the toolchain - // dependencies. - unloadedToolchainContext = unloadedToolchainContext.withoutResolvedToolchains(); - } if (execGroup.equals(targetUnloadedToolchainContext)) { toolchainContexts.addDefaultContext(unloadedToolchainContext); } else { diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java index 05749e71583a22..f82b27a05306e7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/ToolchainContextKey.java @@ -14,10 +14,12 @@ package com.google.devtools.build.lib.skyframe; import com.google.auto.value.AutoValue; +import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableSet; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; +import java.util.Optional; /** * {@link SkyKey} implementation used for {@link ToolchainResolutionFunction} to produce {@link @@ -31,7 +33,8 @@ public static Builder key() { return new AutoValue_ToolchainContextKey.Builder() .requiredToolchainTypeLabels(ImmutableSet.of()) .execConstraintLabels(ImmutableSet.of()) - .shouldSanityCheckConfiguration(false); + .shouldSanityCheckConfiguration(false) + .forceExecutionPlatform(Optional.empty()); } @Override @@ -47,6 +50,8 @@ public SkyFunctionName functionName() { abstract boolean shouldSanityCheckConfiguration(); + abstract Optional