From 547b43e3c41355377beaed703837ce19420d0e31 Mon Sep 17 00:00:00 2001 From: Googler Date: Wed, 30 May 2018 10:09:02 -0700 Subject: [PATCH] Add --apple_enable_auto_dsym_dbg flag This new flag can be used to forcibly enable dSYM generation for dbg apple builds, which is especially useful for debugging in remote builds, which may require the use of dSYMs. RELNOTES: Added --apple_enable_auto_dsym_dbg flag. PiperOrigin-RevId: 198577541 --- .../rules/objc/ObjcCommandLineOptions.java | 8 +++ .../lib/rules/objc/ObjcConfiguration.java | 4 +- .../build/lib/rules/objc/AppleBinaryTest.java | 46 +++++++++++----- .../rules/objc/AppleStaticLibraryTest.java | 4 +- .../objc/AppleToolchainSelectionTest.java | 7 ++- .../lib/rules/objc/ObjcRuleTestCase.java | 54 +++++++++++-------- 6 files changed, 80 insertions(+), 43 deletions(-) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java index fed559423e66de..5766b7d5da2203 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java @@ -178,6 +178,14 @@ public class ObjcCommandLineOptions extends FragmentOptions { ) public boolean appleGenerateDsym; + @Option( + name = "apple_enable_auto_dsym_dbg", + defaultValue = "false", + documentationCategory = OptionDocumentationCategory.OUTPUT_SELECTION, + effectTags = {OptionEffectTag.AFFECTS_OUTPUTS, OptionEffectTag.ACTION_COMMAND_LINES}, + help = "Whether to force enable generating debug symbol(.dSYM) file(s) for dbg builds.") + public boolean appleEnableAutoDsymDbg; + @Option( name = "ios_signing_cert_name", defaultValue = "null", diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java index b5d532a100aad9..70fb596d70cb1d 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java @@ -92,11 +92,13 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment { Preconditions.checkNotNull(objcOptions.tvosSimulatorDevice, "tvosSimulatorDevice"); this.tvosSimulatorVersion = Preconditions.checkNotNull(objcOptions.tvosSimulatorVersion, "tvosSimulatorVersion"); - this.generateDsym = objcOptions.appleGenerateDsym; this.generateLinkmap = objcOptions.generateLinkmap; this.runMemleaks = objcOptions.runMemleaks; this.copts = ImmutableList.copyOf(objcOptions.copts); this.compilationMode = Preconditions.checkNotNull(options.compilationMode, "compilationMode"); + this.generateDsym = + objcOptions.appleGenerateDsym + || (objcOptions.appleEnableAutoDsymDbg && this.compilationMode == CompilationMode.DBG); this.fastbuildOptions = ImmutableList.copyOf(objcOptions.fastbuildOptions); this.enableBinaryStripping = objcOptions.enableBinaryStripping; this.moduleMapsEnabled = objcOptions.enableModuleMaps; diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java index cc8fb258ebff70..412a4255b5191d 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleBinaryTest.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.ConfiguredTarget; import com.google.devtools.build.lib.analysis.actions.SpawnAction; import com.google.devtools.build.lib.analysis.actions.SymlinkAction; +import com.google.devtools.build.lib.analysis.config.CompilationMode; import com.google.devtools.build.lib.analysis.test.InstrumentedFilesProvider; import com.google.devtools.build.lib.cmdline.RepositoryName; import com.google.devtools.build.lib.rules.apple.AppleConfiguration.ConfigurationDistinguisher; @@ -596,21 +597,21 @@ public void testBundleLoaderCantBeSetWithoutBundleBinaryType() throws Exception ")"); } - /** Returns the bcsymbolmap artifact for given architecture. */ - protected Artifact bitcodeSymbol(String arch) throws Exception { + /** Returns the bcsymbolmap artifact for given architecture and compilation mode. */ + protected Artifact bitcodeSymbol(String arch, CompilationMode mode) throws Exception { SpawnAction lipoAction = (SpawnAction) lipoBinAction("//examples/apple_skylark:bin"); String bin = - configurationBin(arch, ConfigurationDistinguisher.APPLEBIN_IOS) + configurationBin(arch, ConfigurationDistinguisher.APPLEBIN_IOS, null, mode) + "examples/apple_skylark/bin_bin"; Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), bin); CommandAction linkAction = (CommandAction) getGeneratingAction(binArtifact); return getFirstArtifactEndingWith(linkAction.getOutputs(), "bcsymbolmap"); } - /** Returns the path to the dSYM binary artifact for given architecture. */ - protected String dsymBinaryPath(String arch) throws Exception { - return configurationBin(arch, ConfigurationDistinguisher.APPLEBIN_IOS) + /** Returns the path to the dSYM binary artifact for given architecture and compilation mode. */ + protected String dsymBinaryPath(String arch, CompilationMode mode) throws Exception { + return configurationBin(arch, ConfigurationDistinguisher.APPLEBIN_IOS, null, mode) + "examples/apple_skylark/bin.app.dSYM/Contents/Resources/DWARF/bin_bin"; } @@ -1192,22 +1193,26 @@ public void testPlatformTypeIsConfigurable() throws Exception { } private void checkAppleDebugSymbolProvider_DsymEntries( - SkylarkDict> outputMap) throws Exception { + SkylarkDict> outputMap, CompilationMode compilationMode) + throws Exception { assertThat(outputMap).containsKey("arm64"); assertThat(outputMap).containsKey("armv7"); Map arm64 = outputMap.get("arm64"); - assertThat(arm64).containsEntry("bitcode_symbols", bitcodeSymbol("arm64")); - assertThat(arm64.get("dsym_binary").getExecPathString()).isEqualTo(dsymBinaryPath("arm64")); + assertThat(arm64).containsEntry("bitcode_symbols", bitcodeSymbol("arm64", compilationMode)); + String expectedArm64Path = dsymBinaryPath("arm64", compilationMode); + assertThat(arm64.get("dsym_binary").getExecPathString()).isEqualTo(expectedArm64Path); Map armv7 = outputMap.get("armv7"); - assertThat(armv7).containsEntry("bitcode_symbols", bitcodeSymbol("armv7")); - assertThat(armv7.get("dsym_binary").getExecPathString()).isEqualTo(dsymBinaryPath("armv7")); + assertThat(armv7).containsEntry("bitcode_symbols", bitcodeSymbol("armv7", compilationMode)); + String expectedArmv7Path = dsymBinaryPath("armv7", compilationMode); + assertThat(armv7.get("dsym_binary").getExecPathString()).isEqualTo(expectedArmv7Path); Map x8664 = outputMap.get("x86_64"); // Simulator build has bitcode disabled. assertThat(x8664).doesNotContainKey("bitcode_symbols"); - assertThat(x8664.get("dsym_binary").getExecPathString()).isEqualTo(dsymBinaryPath("x86_64")); + String expectedx8664Path = dsymBinaryPath("x86_64", compilationMode); + assertThat(x8664.get("dsym_binary").getExecPathString()).isEqualTo(expectedx8664Path); } private void checkAppleDebugSymbolProvider_LinkMapEntries( @@ -1229,7 +1234,20 @@ private void checkAppleDebugSymbolProvider_LinkMapEntries( public void testAppleDebugSymbolProviderWithDsymsExposedToSkylark() throws Exception { useConfiguration( "--apple_bitcode=embedded", "--apple_generate_dsym", "--ios_multi_cpus=armv7,arm64,x86_64"); - checkAppleDebugSymbolProvider_DsymEntries(generateAppleDebugOutputsSkylarkProviderMap()); + checkAppleDebugSymbolProvider_DsymEntries( + generateAppleDebugOutputsSkylarkProviderMap(), CompilationMode.FASTBUILD); + } + + @Test + public void testAppleDebugSymbolProviderWithAutoDsymDbgAndDsymsExposedToSkylark() + throws Exception { + useConfiguration( + "--apple_bitcode=embedded", + "--compilation_mode=dbg", + "--apple_enable_auto_dsym_dbg", + "--ios_multi_cpus=armv7,arm64,x86_64"); + checkAppleDebugSymbolProvider_DsymEntries( + generateAppleDebugOutputsSkylarkProviderMap(), CompilationMode.DBG); } @Test @@ -1251,7 +1269,7 @@ public void testAppleDebugSymbolProviderWithDsymsAndLinkMapsExposedToSkylark() t SkylarkDict> outputMap = generateAppleDebugOutputsSkylarkProviderMap(); - checkAppleDebugSymbolProvider_DsymEntries(outputMap); + checkAppleDebugSymbolProvider_DsymEntries(outputMap, CompilationMode.FASTBUILD); checkAppleDebugSymbolProvider_LinkMapEntries(outputMap); } diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java index 2649ebca97f74c..2809f0477dba1a 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleStaticLibraryTest.java @@ -215,8 +215,8 @@ public void testMultiarchCcDep() throws Exception { "--crosstool_top=//tools/osx/crosstool:crosstool"); CommandAction action = (CommandAction) lipoLibAction("//package:test"); - String i386Prefix = configurationBin("i386", ConfigurationDistinguisher.APPLEBIN_IOS, null); - String x8664Prefix = configurationBin("x86_64", ConfigurationDistinguisher.APPLEBIN_IOS, null); + String i386Prefix = configurationBin("i386", ConfigurationDistinguisher.APPLEBIN_IOS); + String x8664Prefix = configurationBin("x86_64", ConfigurationDistinguisher.APPLEBIN_IOS); CommandAction i386BinAction = (CommandAction) diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java index 87f86666aabefc..0d3f945da7f197 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/AppleToolchainSelectionTest.java @@ -70,7 +70,7 @@ public void testToolchainSelectionCcDepDefault() throws Exception { Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); String x8664Bin = - configurationBin("x86_64", ConfigurationDistinguisher.APPLEBIN_IOS, null) + "a/bin_bin"; + configurationBin("x86_64", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), x8664Bin); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction ccArchiveAction = @@ -93,7 +93,7 @@ public void testToolchainSelectionCcDepDevice() throws Exception { .write(); Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); String armv7Bin = - configurationBin("armv7", ConfigurationDistinguisher.APPLEBIN_IOS, null) + "a/bin_bin"; + configurationBin("armv7", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), armv7Bin); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction ccArchiveAction = @@ -118,8 +118,7 @@ public void testToolchainSelectionMultiArchIos() throws Exception { .write(); Action lipoAction = actionProducingArtifact("//a:bin", "_lipobin"); String armv64Bin = - configurationBin("arm64", ConfigurationDistinguisher.APPLEBIN_IOS, null) - + "a/bin_bin"; + configurationBin("arm64", ConfigurationDistinguisher.APPLEBIN_IOS) + "a/bin_bin"; Artifact binArtifact = getFirstArtifactEndingWith(lipoAction.getInputs(), armv64Bin); CppLinkAction linkAction = (CppLinkAction) getGeneratingAction(binArtifact); CppLinkAction objcLibArchiveAction = (CppLinkAction) getGeneratingAction( diff --git a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java index 0783ad2cf3ad4a..3606cd1cc157a0 100644 --- a/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java +++ b/src/test/java/com/google/devtools/build/lib/rules/objc/ObjcRuleTestCase.java @@ -129,25 +129,28 @@ public enum CodeCoverageMode { */ protected String configurationBin( String arch, ConfigurationDistinguisher configurationDistinguisher) { - return configurationBin(arch, configurationDistinguisher, null); + return configurationBin(arch, configurationDistinguisher, null, CompilationMode.FASTBUILD); } /** - * Returns the bin dir for artifacts built for a given Apple architecture and minimum OS - * version (as set by a configuration transition) and configuration distinguisher but the global - * default for {@code --cpu}. + * Returns the bin dir for artifacts built for a given Apple architecture and minimum OS version + * (as set by a configuration transition) and configuration distinguisher but the global default + * for {@code --cpu}. * * @param arch the given Apple architecture which artifacts are built under this configuration. * Note this will likely be different than the value of {@code --cpu}. - * @param configurationDistinguisher the configuration distinguisher used to describe the - * a configuration transition - * @param minOsVersion the minimum os version for which to compile artifacts in the - * configuration + * @param configurationDistinguisher the configuration distinguisher used to describe the a + * configuration transition + * @param minOsVersion the minimum os version for which to compile artifacts in the configuration + * @param compilationMode the compilation mode used during the build */ protected String configurationBin( - String arch, ConfigurationDistinguisher configurationDistinguisher, - DottedVersion minOsVersion) { - return configurationDir(arch, configurationDistinguisher, minOsVersion) + "bin/"; + String arch, + ConfigurationDistinguisher configurationDistinguisher, + DottedVersion minOsVersion, + CompilationMode compilationMode) { + return configurationDir(arch, configurationDistinguisher, minOsVersion, compilationMode) + + "bin/"; } /** @@ -165,10 +168,12 @@ protected String configurationBin( protected String configurationGenfiles( String arch, ConfigurationDistinguisher configurationDistinguisher, DottedVersion minOsVersion) { - return configurationDir(arch, configurationDistinguisher, minOsVersion) - + getTargetConfiguration().getGenfilesDirectory(RepositoryName.MAIN) - .getExecPath().getBaseName(); - + return configurationDir( + arch, configurationDistinguisher, minOsVersion, CompilationMode.FASTBUILD) + + getTargetConfiguration() + .getGenfilesDirectory(RepositoryName.MAIN) + .getExecPath() + .getBaseName(); } private static String toolExecutable(String toolSrcPath) { @@ -177,26 +182,31 @@ private static String toolExecutable(String toolSrcPath) { } private String configurationDir( - String arch, ConfigurationDistinguisher configurationDistinguisher, - DottedVersion minOsVersion) { + String arch, + ConfigurationDistinguisher configurationDistinguisher, + DottedVersion minOsVersion, + CompilationMode compilationMode) { String minOsSegment = minOsVersion == null ? "" : "-min" + minOsVersion; + String modeSegment = compilationModeFlag(compilationMode); switch (configurationDistinguisher) { case UNKNOWN: - return String.format("%s-out/ios_%s-fastbuild/", TestConstants.PRODUCT_NAME, arch); + return String.format("%s-out/ios_%s-%s/", TestConstants.PRODUCT_NAME, arch, modeSegment); case APPLEBIN_IOS: return String.format( - "%1$s-out/ios-%2$s%4$s-%3$s-ios_%2$s-fastbuild/", + "%1$s-out/ios-%2$s%4$s-%3$s-ios_%2$s-%5$s/", TestConstants.PRODUCT_NAME, arch, configurationDistinguisher.toString().toLowerCase(Locale.US), - minOsSegment); + minOsSegment, + modeSegment); case APPLEBIN_WATCHOS: return String.format( - "%1$s-out/watchos-%2$s%4$s-%3$s-watchos_%2$s-fastbuild/", + "%1$s-out/watchos-%2$s%4$s-%3$s-watchos_%2$s-%5$s/", TestConstants.PRODUCT_NAME, arch, configurationDistinguisher.toString().toLowerCase(Locale.US), - minOsSegment); + minOsSegment, + modeSegment); default: throw new AssertionError(); }