From 57fc3d2b3542ef59a032022dad5ab42619c42e73 Mon Sep 17 00:00:00 2001 From: Fabian Meumertzheim Date: Fri, 6 Jan 2023 16:42:09 +0100 Subject: [PATCH 1/2] Do not clear `--platforms` on no-op change to `--cpu` Resolves a TODO in the code to not unnecessarily fork the configuration when a transition has `--cpu` as a declared output but doesn't change it. --- .../starlark/FunctionTransitionUtil.java | 30 ++++++------ .../StarlarkAttrTransitionProviderTest.java | 48 +++++++++++++++++++ 2 files changed, 64 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java index c6903b01cc68d0..2c8bf969e9bdbe 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/starlark/FunctionTransitionUtil.java @@ -99,7 +99,8 @@ static ImmutableMap applyAndValidate( } for (Map.Entry> entry : transitions.entrySet()) { - Map newValues = handleImplicitPlatformChange(entry.getValue()); + Map newValues = handleImplicitPlatformChange(buildOptions, + entry.getValue()); BuildOptions transitionedOptions = applyTransition(buildOptions, newValues, optionInfoMap, starlarkTransition); splitBuildOptions.put(entry.getKey(), transitionedOptions); @@ -127,21 +128,22 @@ static ImmutableMap applyAndValidate( *

Transitions can also explicitly set --platforms to be clear what platform they set. * *

Platform mappings: https://bazel.build/concepts/platforms-intro#platform-mappings. - * - *

This doesn't check that the changed value is actually different than the source (i.e. - * setting {@code --cpu=foo} when {@code --cpu} is already {@code foo}). That could unnecessarily - * fork configurations that are really the same. That's a possible optimization TODO. */ private static Map handleImplicitPlatformChange( - Map originalOutput) { - boolean changesCpu = originalOutput.containsKey(COMMAND_LINE_OPTION_PREFIX + "cpu"); - boolean changesPlatforms = originalOutput.containsKey(COMMAND_LINE_OPTION_PREFIX + "platforms"); - return changesCpu && !changesPlatforms - ? ImmutableMap.builder() - .putAll(originalOutput) - .put(COMMAND_LINE_OPTION_PREFIX + "platforms", ImmutableList.

Platform mappings: https://bazel.build/concepts/platforms-intro#platform-mappings. */ private static Map handleImplicitPlatformChange( - BuildOptions options, Map originalOutput) { - Object newCpu = originalOutput.get(COMMAND_LINE_OPTION_PREFIX + "cpu"); + BuildOptions options, Map rawTransitionOutput) { + Object newCpu = rawTransitionOutput.get(COMMAND_LINE_OPTION_PREFIX + "cpu"); if (newCpu == null || newCpu.equals(options.get(CoreOptions.class).cpu)) { // No effective change to --cpu, so no need to prevent the platform mapping from resetting it. - return originalOutput; + return rawTransitionOutput; } - if (originalOutput.containsKey(COMMAND_LINE_OPTION_PREFIX + "platforms")) { + if (rawTransitionOutput.containsKey(COMMAND_LINE_OPTION_PREFIX + "platforms")) { // Explicitly setting --platforms overrides the implicit clearing. - return originalOutput; + return rawTransitionOutput; } return ImmutableMap.builder() - .putAll(originalOutput) + .putAll(rawTransitionOutput) .put(COMMAND_LINE_OPTION_PREFIX + "platforms", ImmutableList.