Skip to content

Commit 94d8bd3

Browse files
fmeumcopybara-github
authored andcommitted
Enable revised output directory hash suffix computation
Flips `--experimental_output_directory_naming_scheme` and `--experimental_exec_configuration_distinguisher` to `diff_against_baseline` and `off`, respectively, which makes it so that Starlark transitions can return to previous configurations, thus improving cache hit rates. Also changes the fixed platform suffix in the exec configuration from an empty string to `"exec"` for compatibility with logic that looks for the substring `-exec-` in paths to determine whether the current configuration is the exec configuration. As a result of this commit, output directory paths can change in the following ways: * `-ST-<hash>` suffixes can change or disappear and, in rare cases, appear where they previously didn't * for exec configuration directories, `k8-opt-exec-2B5CBBC6` becomes `k8-opt-exec-ST-011b9bdc32ed` This may result in tool paths that are seven characters longer, which can cause builds on Windows to fail that were already very close to the `MAX_PATH` limit. A follow-up commit will reduce the length of the hash by three characters, bringing that increase down to four. Work towards #14023 Closes #16910. PiperOrigin-RevId: 523999034 Change-Id: Id5548a00b62ebfe7889cd40177995210ecc224c1
1 parent 3485512 commit 94d8bd3

8 files changed

Lines changed: 52 additions & 11 deletions

File tree

‎src/main/java/com/google/devtools/build/lib/analysis/config/CoreOptions.java‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -348,7 +348,7 @@ public ExecConfigurationDistinguisherSchemeConverter() {
348348

349349
@Option(
350350
name = "experimental_exec_configuration_distinguisher",
351-
defaultValue = "legacy",
351+
defaultValue = "off",
352352
converter = ExecConfigurationDistinguisherSchemeConverter.class,
353353
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
354354
effectTags = {OptionEffectTag.AFFECTS_OUTPUTS},
@@ -593,7 +593,7 @@ public OutputDirectoryNamingSchemeConverter() {
593593

594594
@Option(
595595
name = "experimental_output_directory_naming_scheme",
596-
defaultValue = "legacy",
596+
defaultValue = "diff_against_baseline",
597597
converter = OutputDirectoryNamingSchemeConverter.class,
598598
documentationCategory = OptionDocumentationCategory.UNDOCUMENTED,
599599
effectTags = {OptionEffectTag.AFFECTS_OUTPUTS},

‎src/main/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactory.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -184,7 +184,8 @@ private static BuildOptions transitionImpl(BuildOptionsView options, Label execu
184184
result = result.clone();
185185
break;
186186
default:
187-
// else if OFF do nothing
187+
// else if OFF just mark that we are now in an exec transition
188+
coreOptions.platformSuffix = "exec";
188189
}
189190

190191
return result;

‎src/main/java/com/google/devtools/build/lib/skyframe/BuildConfigurationFunction.java‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ private static final class BuildConfigurationFunctionException extends SkyFuncti
140140
* Compute the hash for the new BuildOptions based on the names and values of all options (both
141141
* native and Starlark) that are different from some supplied baseline configuration.
142142
*/
143-
private static String computeNameFragmentWithDiff(
143+
@VisibleForTesting
144+
public static String computeNameFragmentWithDiff(
144145
BuildOptions toOptions, BuildOptions baselineOptions) {
145146
// Quick short-circuit for trivial case.
146147
if (toOptions.equals(baselineOptions)) {

‎src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,6 @@ public void executionTransition_confDist_off()
211211
new StoredEventHandler());
212212

213213
assertThat(result.get(CoreOptions.class).affectedByStarlarkTransition).isEmpty();
214-
assertThat(result.get(CoreOptions.class).platformSuffix)
215-
.isEqualTo(options.get(CoreOptions.class).platformSuffix);
214+
assertThat(result.get(CoreOptions.class).platformSuffix).isEqualTo("exec");
216215
}
217216
}

‎src/test/java/com/google/devtools/build/lib/analysis/util/BUILD‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ java_library(
5050
"//src/main/java/com/google/devtools/build/lib/analysis:config/config_conditions",
5151
"//src/main/java/com/google/devtools/build/lib/analysis:config/config_matching_provider",
5252
"//src/main/java/com/google/devtools/build/lib/analysis:config/core_option_converters",
53+
"//src/main/java/com/google/devtools/build/lib/analysis:config/core_options",
5354
"//src/main/java/com/google/devtools/build/lib/analysis:config/execution_transition_factory",
5455
"//src/main/java/com/google/devtools/build/lib/analysis:config/fragment",
5556
"//src/main/java/com/google/devtools/build/lib/analysis:config/fragment_factory",

‎src/test/java/com/google/devtools/build/lib/analysis/util/ConfigurationTestCase.java‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import com.google.devtools.build.lib.analysis.ServerDirectories;
2525
import com.google.devtools.build.lib.analysis.config.BuildConfigurationValue;
2626
import com.google.devtools.build.lib.analysis.config.BuildOptions;
27+
import com.google.devtools.build.lib.analysis.config.CoreOptions;
2728
import com.google.devtools.build.lib.analysis.config.FragmentFactory;
2829
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
2930
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -130,6 +131,10 @@ public final void initializeSkyframeExecutor() throws Exception {
130131
SkyframeExecutorTestHelper.process(skyframeExecutor);
131132
skyframeExecutor.injectExtraPrecomputedValues(
132133
ImmutableList.of(
134+
PrecomputedValue.injected(
135+
PrecomputedValue.BASELINE_CONFIGURATION,
136+
BuildOptions.getDefaultBuildOptionsForFragments(
137+
ImmutableList.of(CoreOptions.class))),
133138
PrecomputedValue.injected(
134139
RepositoryDelegatorFunction.RESOLVED_FILE_INSTEAD_OF_WORKSPACE, Optional.empty()),
135140
PrecomputedValue.injected(

‎src/test/java/com/google/devtools/build/lib/rules/objc/BUILD‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ java_library(
8080
"//src/main/java/com/google/devtools/build/lib/analysis:config/build_configuration",
8181
"//src/main/java/com/google/devtools/build/lib/analysis:config/build_options",
8282
"//src/main/java/com/google/devtools/build/lib/analysis:config/compilation_mode",
83+
"//src/main/java/com/google/devtools/build/lib/analysis:config/core_options",
8384
"//src/main/java/com/google/devtools/build/lib/analysis:config/invalid_configuration_exception",
8485
"//src/main/java/com/google/devtools/build/lib/analysis:config/transitions/split_transition",
8586
"//src/main/java/com/google/devtools/build/lib/analysis:configured_target",
@@ -94,6 +95,7 @@ java_library(
9495
"//src/main/java/com/google/devtools/build/lib/rules/apple/cpp",
9596
"//src/main/java/com/google/devtools/build/lib/rules/cpp",
9697
"//src/main/java/com/google/devtools/build/lib/rules/objc",
98+
"//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster",
9799
"//src/main/java/com/google/devtools/build/lib/util",
98100
"//src/main/java/com/google/devtools/build/lib/vfs",
99101
"//src/main/java/com/google/devtools/build/lib/vfs:pathfragment",

‎src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java‎

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939
import com.google.devtools.build.lib.analysis.config.BuildOptions;
4040
import com.google.devtools.build.lib.analysis.config.BuildOptionsView;
4141
import com.google.devtools.build.lib.analysis.config.CompilationMode;
42+
import com.google.devtools.build.lib.analysis.config.CoreOptions;
43+
import com.google.devtools.build.lib.analysis.config.CoreOptions.OutputDirectoryNamingScheme;
4244
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
4345
import com.google.devtools.build.lib.analysis.config.transitions.SplitTransition;
4446
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
@@ -48,12 +50,14 @@
4850
import com.google.devtools.build.lib.packages.util.MockObjcSupport;
4951
import com.google.devtools.build.lib.rules.apple.AppleCommandLineOptions;
5052
import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher;
53+
import com.google.devtools.build.lib.rules.apple.ApplePlatform.PlatformType;
5154
import com.google.devtools.build.lib.rules.apple.AppleToolchain;
5255
import com.google.devtools.build.lib.rules.apple.DottedVersion;
5356
import com.google.devtools.build.lib.rules.cpp.CcCompilationContext;
5457
import com.google.devtools.build.lib.rules.cpp.CcInfo;
5558
import com.google.devtools.build.lib.rules.cpp.CppLinkAction;
5659
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
60+
import com.google.devtools.build.lib.skyframe.BuildConfigurationFunction;
5761
import com.google.devtools.build.lib.testutil.Scratch;
5862
import com.google.devtools.build.lib.testutil.TestConstants;
5963
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -169,13 +173,39 @@ private static String toolExecutable(String toolSrcPath) {
169173
TestConstants.PRODUCT_NAME, TestConstants.TOOLS_REPOSITORY_PATH_PREFIX + toolSrcPath);
170174
}
171175

176+
@SuppressWarnings("MissingCasesInEnumSwitch")
172177
private String configurationDir(
173178
String arch,
174179
ConfigurationDistinguisher configurationDistinguisher,
175180
DottedVersion minOsVersion,
176181
CompilationMode compilationMode) {
177182
String minOsSegment = minOsVersion == null ? "" : "-min" + minOsVersion;
178183
String modeSegment = compilationModeFlag(compilationMode);
184+
185+
String hash = "";
186+
if (targetConfig.getOptions().get(CoreOptions.class).outputDirectoryNamingScheme
187+
== OutputDirectoryNamingScheme.DIFF_AGAINST_BASELINE) {
188+
PlatformType platformType = null;
189+
switch (configurationDistinguisher) {
190+
case APPLEBIN_IOS:
191+
platformType = PlatformType.IOS;
192+
break;
193+
case APPLEBIN_WATCHOS:
194+
platformType = PlatformType.WATCHOS;
195+
break;
196+
}
197+
BuildOptions transitionedConfig = targetConfig.cloneOptions();
198+
transitionedConfig.get(CoreOptions.class).cpu = platformType + "_" + arch;
199+
transitionedConfig.get(AppleCommandLineOptions.class).configurationDistinguisher =
200+
configurationDistinguisher;
201+
transitionedConfig.get(AppleCommandLineOptions.class).applePlatformType = platformType;
202+
transitionedConfig.get(AppleCommandLineOptions.class).appleSplitCpu = arch;
203+
hash =
204+
"-"
205+
+ BuildConfigurationFunction.computeNameFragmentWithDiff(
206+
transitionedConfig, targetConfig.getOptions());
207+
}
208+
179209
switch (configurationDistinguisher) {
180210
case UNKNOWN:
181211
return String.format("%s-out/ios_%s-%s/", TestConstants.PRODUCT_NAME, arch, modeSegment);
@@ -185,20 +215,22 @@ private String configurationDir(
185215
TestConstants.PRODUCT_NAME, arch, minOsSegment, modeSegment);
186216
case APPLEBIN_IOS:
187217
return String.format(
188-
"%1$s-out/ios-%2$s%4$s-%3$s-ios_%2$s-%5$s/",
218+
"%1$s-out/ios-%2$s%4$s-%3$s-ios_%2$s-%5$s%6$s/",
189219
TestConstants.PRODUCT_NAME,
190220
arch,
191221
configurationDistinguisher.toString().toLowerCase(Locale.US),
192222
minOsSegment,
193-
modeSegment);
223+
modeSegment,
224+
hash);
194225
case APPLEBIN_WATCHOS:
195226
return String.format(
196-
"%1$s-out/watchos-%2$s%4$s-%3$s-watchos_%2$s-%5$s/",
227+
"%1$s-out/watchos-%2$s%4$s-%3$s-watchos_%2$s-%5$s%6$s/",
197228
TestConstants.PRODUCT_NAME,
198229
arch,
199230
configurationDistinguisher.toString().toLowerCase(Locale.US),
200231
minOsSegment,
201-
modeSegment);
232+
modeSegment,
233+
hash);
202234
default:
203235
throw new AssertionError();
204236
}
@@ -669,7 +701,7 @@ protected void checkProvidesHdrsAndIncludes(RuleType ruleType, Optional<String>
669701
getConfiguredTarget("//x:x", getAppleCrosstoolConfiguration())
670702
.get(CcInfo.PROVIDER)
671703
.getCcCompilationContext();
672-
List<String> declaredIncludeSrcs =
704+
ImmutableList<String> declaredIncludeSrcs =
673705
ccCompilationContext.getDeclaredIncludeSrcs().toList().stream()
674706
.map(x -> removeConfigFragment(x.getExecPathString()))
675707
.collect(toImmutableList());

0 commit comments

Comments
 (0)