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(); }