diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD index 37fc8dfb170db7..40db26d5710ecc 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD +++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD @@ -1688,6 +1688,7 @@ java_library( ":config/transitions/patch_transition", ":config/transitions/transition_factory", ":platform_options", + ":starlark/function_transition_util", "//src/main/java/com/google/devtools/build/lib/cmdline", "//src/main/java/com/google/devtools/build/lib/events", "//src/main/java/com/google/devtools/build/lib/packages", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java index db63b744b0b2c4..ba71302d801d2e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java @@ -287,6 +287,45 @@ public String getTypeDescription() { metadataTags = {OptionMetadataTag.INTERNAL}) public List affectedByStarlarkTransition; + /** Values for the --experimental_exec_configuration_distinguisher options * */ + public enum ExecConfigurationDistinguisherScheme { + /** Use hash of selected execution platform for platform_suffix. * */ + LEGACY, + /** Do not touch platform_suffix or do anything else. * */ + OFF, + /** Use hash of entire configuration (with platform_suffix="") for platform_suffix. * */ + FULL_HASH, + /** Set platform_suffix to "exec", instead update `affected by starlark transition` * */ + DIFF_TO_AFFECTED + } + + /** Converter for the {@code --experimental_exec_configuration_distinguisher} options. */ + public static class ExecConfigurationDistinguisherSchemeConverter + extends EnumConverter { + public ExecConfigurationDistinguisherSchemeConverter() { + super( + ExecConfigurationDistinguisherScheme.class, + "Exec transition configuration distinguisher scheme"); + } + } + + @Option( + name = "experimental_exec_configuration_distinguisher", + defaultValue = "legacy", + converter = ExecConfigurationDistinguisherSchemeConverter.class, + documentationCategory = OptionDocumentationCategory.UNDOCUMENTED, + effectTags = {OptionEffectTag.AFFECTS_OUTPUTS}, + metadataTags = {OptionMetadataTag.EXPERIMENTAL}, + help = + "Please only use this flag as part of a suggested migration or testing strategy due to" + + " potential for action conflicts. Controls how the execution transition changes the" + + " platform_suffix flag. In legacy mode, sets it to a hash of the execution" + + " platform. In fullhash mode, sets it to a hash of the entire configuration. In off" + + " mode, does not touch it.") + public ExecConfigurationDistinguisherScheme execConfigurationDistinguisherScheme; + + /* At the moment, EXPLICIT_IN_OUTPUT_PATH is not being set here because platform_suffix + * is being used as a configuration distinguisher for the exec transition. */ @Option( name = "platform_suffix", defaultValue = "null", @@ -858,6 +897,7 @@ public FragmentOptions getHost() { host.compilationMode = hostCompilationMode; host.isHost = true; host.isExec = false; + host.execConfigurationDistinguisherScheme = execConfigurationDistinguisherScheme; host.outputPathsMode = outputPathsMode; host.enableRunfiles = enableRunfiles; host.executionInfoModifier = executionInfoModifier; diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java b/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java index 9112b169a56e9f..9627b1f0fbb37b 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java @@ -23,6 +23,7 @@ import com.google.devtools.build.lib.analysis.PlatformOptions; import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition; import com.google.devtools.build.lib.analysis.config.transitions.TransitionFactory; +import com.google.devtools.build.lib.analysis.starlark.FunctionTransitionUtil; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.events.EventHandler; import com.google.devtools.build.lib.packages.AttributeTransitionData; @@ -127,8 +128,6 @@ private static BuildOptions transitionImpl(BuildOptionsView options, Label execu CoreOptions coreOptions = checkNotNull(execOptions.get(CoreOptions.class)); coreOptions.isHost = false; coreOptions.isExec = true; - coreOptions.platformSuffix = - String.format("exec-%X", executionPlatform.getCanonicalForm().hashCode()); // Disable extra actions coreOptions.actionListeners = null; @@ -138,20 +137,57 @@ private static BuildOptions transitionImpl(BuildOptionsView options, Label execu platformOptions.platforms = ImmutableList.of(executionPlatform); } - BuildOptions result = execOptions.underlying(); // Remove any FeatureFlags that were set. ImmutableList