diff options
author | Cal Peyser <cpeyser@google.com> | 2017-03-28 13:57:22 +0000 |
---|---|---|
committer | Philipp Wollermann <philwo@google.com> | 2017-03-28 19:51:26 +0000 |
commit | caea6bd17766483503537cf17adf42860aaaf089 (patch) | |
tree | 83c20a1ef56ed2e874023042599cdedadb529a01 /src/main/java/com | |
parent | c2cc768cb1d891f2f2f942feb007d5508e04f585 (diff) |
Apple binary configures actions not just with it's child's config and provider,
but also its toolchain.
--
PiperOrigin-RevId: 151444602
MOS_MIGRATED_REVID=151444602
Diffstat (limited to 'src/main/java/com')
6 files changed, 193 insertions, 78 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java index a76d2c509a..124f3b97d5 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java @@ -23,6 +23,7 @@ import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Functions; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; +import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; @@ -41,8 +42,7 @@ import com.google.devtools.build.lib.rules.apple.Platform.PlatformType; import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.objc.AppleDebugOutputsProvider.OutputType; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; -import java.util.Map; -import java.util.Set; +import com.google.devtools.build.lib.rules.objc.MultiArchBinarySupport.DependencySpecificConfiguration; /** Implementation for the "apple_binary" rule. */ public class AppleBinary implements RuleConfiguredTargetFactory { @@ -118,14 +118,15 @@ public class AppleBinary implements RuleConfiguredTargetFactory { ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap = ruleContext.getPrerequisitesByConfiguration("deps", Mode.SPLIT); - Set<BuildConfiguration> childConfigurations = getChildConfigurations(ruleContext); + ImmutableMap<BuildConfiguration, CcToolchainProvider> childConfigurations = + getChildConfigurationsAndToolchains(ruleContext); Artifact outputArtifact = ObjcRuleClasses.intermediateArtifacts(ruleContext).combinedArchitectureBinary(); MultiArchBinarySupport multiArchBinarySupport = new MultiArchBinarySupport(ruleContext); - Map<BuildConfiguration, ObjcProvider> objcProviderByDepConfiguration = - multiArchBinarySupport.objcProviderByDepConfiguration( + ImmutableSet<DependencySpecificConfiguration> dependencySpecificConfigurations = + multiArchBinarySupport.getDependencySpecificConfigurations( childConfigurations, configToDepsCollectionMap, configurationToNonPropagatedObjcMap, @@ -135,7 +136,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory { multiArchBinarySupport.registerActions( platform, getExtraLinkArgs(ruleContext), - objcProviderByDepConfiguration, + dependencySpecificConfigurations, getExtraLinkInputs(ruleContext), configToDepsCollectionMap, outputArtifact); @@ -146,8 +147,9 @@ public class AppleBinary implements RuleConfiguredTargetFactory { ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build()); ObjcProvider.Builder objcProviderBuilder = new ObjcProvider.Builder(); - for (ObjcProvider objcProvider : objcProviderByDepConfiguration.values()) { - objcProviderBuilder.addTransitiveAndPropagate(objcProvider); + for (DependencySpecificConfiguration dependencySpecificConfiguration : + dependencySpecificConfigurations) { + objcProviderBuilder.addTransitiveAndPropagate(dependencySpecificConfiguration.objcProvider()); } objcProviderBuilder.add(MULTI_ARCH_LINKED_BINARIES, outputArtifact); @@ -172,12 +174,18 @@ public class AppleBinary implements RuleConfiguredTargetFactory { AppleDebugOutputsProvider.Builder builder = AppleDebugOutputsProvider.Builder.create(); - for (BuildConfiguration childConfig : childConfigurations) { - AppleConfiguration childAppleConfig = childConfig.getFragment(AppleConfiguration.class); - ObjcConfiguration childObjcConfig = childConfig.getFragment(ObjcConfiguration.class); + for (DependencySpecificConfiguration dependencySpecificConfiguration : + dependencySpecificConfigurations) { + AppleConfiguration childAppleConfig = + dependencySpecificConfiguration.config().getFragment(AppleConfiguration.class); + ObjcConfiguration childObjcConfig = + dependencySpecificConfiguration.config().getFragment(ObjcConfiguration.class); IntermediateArtifacts intermediateArtifacts = new IntermediateArtifacts( - ruleContext, /*archiveFileNameSuffix*/ "", /*outputPrefix*/ "", childConfig); + ruleContext, /*archiveFileNameSuffix*/ + "", /*outputPrefix*/ + "", + dependencySpecificConfiguration.config()); String arch = childAppleConfig.getSingleArchitecture(); if (childAppleConfig.getBitcodeMode() == AppleBitcodeMode.EMBEDDED) { @@ -272,7 +280,8 @@ public class AppleBinary implements RuleConfiguredTargetFactory { return ImmutableSet.<Artifact>of(); } - private Set<BuildConfiguration> getChildConfigurations(RuleContext ruleContext) { + private ImmutableMap<BuildConfiguration, CcToolchainProvider> getChildConfigurationsAndToolchains( + RuleContext ruleContext) { // This is currently a hack to obtain all child configurations regardless of the attribute // values of this rule -- this rule does not currently use the actual info provided by // this attribute. b/28403953 tracks cc toolchain usage. @@ -280,7 +289,13 @@ public class AppleBinary implements RuleConfiguredTargetFactory { ruleContext.getPrerequisitesByConfiguration( ObjcRuleClasses.CHILD_CONFIG_ATTR, Mode.SPLIT, CcToolchainProvider.class); - return configToProvider.keySet(); + ImmutableMap.Builder<BuildConfiguration, CcToolchainProvider> result = ImmutableMap.builder(); + for (BuildConfiguration config : configToProvider.keySet()) { + CcToolchainProvider toolchain = Iterables.getOnlyElement(configToProvider.get(config)); + result.put(config, toolchain); + } + + return result.build(); } private static BinaryType getBinaryType(RuleContext ruleContext) { diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD index a44e3afb9f..0e151d9e2f 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BUILD @@ -30,6 +30,7 @@ java_library( "//src/main/protobuf:extra_actions_base_java_proto", "//src/main/protobuf:plmerge_java_proto", "//src/main/protobuf:xcodegen_java_proto", + "//third_party:auto_value", "//third_party:guava", "//third_party:jsr305", "//third_party/java/dd_plist", diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java index 36fc313b11..18dc1d423e 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java @@ -423,6 +423,29 @@ public abstract class CompilationSupport { /** * Registers all actions necessary to compile this rule's sources and archive them. * + * @param compilationArtifacts collection of artifacts required for the compilation + * @param objcProvider provides all compiling and linking information to register these actions + * @param toolchain the toolchain to be used in determining command lines + * @return this compilation support + * @throws RuleErrorException for invalid crosstool files + */ + CompilationSupport registerCompileAndArchiveActions( + CompilationArtifacts compilationArtifacts, + ObjcProvider objcProvider, + CcToolchainProvider toolchain) + throws RuleErrorException, InterruptedException { + return registerCompileAndArchiveActions( + compilationArtifacts, + objcProvider, + ExtraCompileArgs.NONE, + ImmutableList.<PathFragment>of(), + toolchain, + maybeGetFdoSupport()); + } + + /** + * Registers all actions necessary to compile this rule's sources and archive them. + * * @param common common information about this rule and its dependencies * @return this compilation support * @throws RuleErrorException for invalid crosstool files @@ -707,7 +730,8 @@ public abstract class CompilationSupport { return this; } /** - * Registers any actions necessary to link this rule and its dependencies. + * Registers any actions necessary to link this rule and its dependencies. Manually sets the + * toolchain. * * <p>Dsym bundle is generated if {@link ObjcConfiguration#generateDsym()} is set. * @@ -722,6 +746,7 @@ public abstract class CompilationSupport { * @param extraLinkArgs any additional arguments to pass to the linker * @param extraLinkInputs any additional input artifacts to pass to the link action * @param dsymOutputType the file type of the dSYM bundle to be generated + * @param toolchain the CROSSTOOL-derived toolchain for use in linking * @return this compilation support */ abstract CompilationSupport registerLinkActions( @@ -730,7 +755,47 @@ public abstract class CompilationSupport { J2ObjcEntryClassProvider j2ObjcEntryClassProvider, ExtraLinkArgs extraLinkArgs, Iterable<Artifact> extraLinkInputs, - DsymOutputType dsymOutputType) throws InterruptedException; + DsymOutputType dsymOutputType, + CcToolchainProvider toolchain) + throws InterruptedException; + + /** + * Registers any actions necessary to link this rule and its dependencies. Automatically infers + * the toolchain from the configuration of this CompilationSupport - if a different toolchain is + * required, use the custom toolchain override. + * + * <p>Dsym bundle is generated if {@link ObjcConfiguration#generateDsym()} is set. + * + * <p>When Bazel flags {@code --compilation_mode=opt} and {@code --objc_enable_binary_stripping} + * are specified, additional optimizations will be performed on the linked binary: all-symbol + * stripping (using {@code /usr/bin/strip}) and dead-code stripping (using linker flags: {@code + * -dead_strip} and {@code -no_dead_strip_inits_and_terms}). + * + * @param objcProvider common information about this rule's attributes and its dependencies + * @param j2ObjcMappingFileProvider contains mapping files for j2objc transpilation + * @param j2ObjcEntryClassProvider contains j2objc entry class information for dead code removal + * @param extraLinkArgs any additional arguments to pass to the linker + * @param extraLinkInputs any additional input artifacts to pass to the link action + * @param dsymOutputType the file type of the dSYM bundle to be generated + * @return this compilation support + */ + CompilationSupport registerLinkActions( + ObjcProvider objcProvider, + J2ObjcMappingFileProvider j2ObjcMappingFileProvider, + J2ObjcEntryClassProvider j2ObjcEntryClassProvider, + ExtraLinkArgs extraLinkArgs, + Iterable<Artifact> extraLinkInputs, + DsymOutputType dsymOutputType) + throws InterruptedException { + return registerLinkActions( + objcProvider, + j2ObjcMappingFileProvider, + j2ObjcEntryClassProvider, + extraLinkArgs, + extraLinkInputs, + dsymOutputType, + CppHelper.getToolchain(ruleContext, ":cc_toolchain")); + } /** * Returns the copts for the compile action in the current rule context (using a combination of diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java index 6f561a4731..50afcd3c14 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java @@ -140,12 +140,13 @@ public class CrosstoolCompilationSupport extends CompilationSupport { @Nullable FdoSupportProvider fdoSupport) throws RuleErrorException, InterruptedException { Preconditions.checkNotNull(ccToolchain); Preconditions.checkNotNull(fdoSupport); - ObjcVariablesExtension.Builder extension = new ObjcVariablesExtension.Builder() - .setRuleContext(ruleContext) - .setObjcProvider(objcProvider) - .setCompilationArtifacts(compilationArtifacts) - .setIntermediateArtifacts(intermediateArtifacts) - .setConfiguration(ruleContext.getConfiguration()); + ObjcVariablesExtension.Builder extension = + new ObjcVariablesExtension.Builder() + .setRuleContext(ruleContext) + .setObjcProvider(objcProvider) + .setCompilationArtifacts(compilationArtifacts) + .setIntermediateArtifacts(intermediateArtifacts) + .setConfiguration(buildConfiguration); CcLibraryHelper helper; if (compilationArtifacts.getArchive().isPresent()) { @@ -185,14 +186,15 @@ public class CrosstoolCompilationSupport extends CompilationSupport { .getPackageDirectory() .getRelative(labelName.replaceName("lib" + labelName.getBaseName())) .getPathString(); - ObjcVariablesExtension extension = new ObjcVariablesExtension.Builder() - .setRuleContext(ruleContext) - .setObjcProvider(objcProvider) - .setConfiguration(ruleContext.getConfiguration()) - .setIntermediateArtifacts(intermediateArtifacts) - .setFullyLinkArchive(outputArchive) - .addVariableCategory(VariableCategory.FULLY_LINK_VARIABLES) - .build(); + ObjcVariablesExtension extension = + new ObjcVariablesExtension.Builder() + .setRuleContext(ruleContext) + .setObjcProvider(objcProvider) + .setConfiguration(buildConfiguration) + .setIntermediateArtifacts(intermediateArtifacts) + .setFullyLinkArchive(outputArchive) + .addVariableCategory(VariableCategory.FULLY_LINK_VARIABLES) + .build(); CppLinkAction fullyLinkAction = new CppLinkActionBuilder(ruleContext, outputArchive, ccToolchain, fdoSupport) .addActionInputs(objcProvider.getObjcLibraries()) @@ -223,7 +225,9 @@ public class CrosstoolCompilationSupport extends CompilationSupport { J2ObjcEntryClassProvider j2ObjcEntryClassProvider, ExtraLinkArgs extraLinkArgs, Iterable<Artifact> extraLinkInputs, - DsymOutputType dsymOutputType) throws InterruptedException { + DsymOutputType dsymOutputType, + CcToolchainProvider toolchain) + throws InterruptedException { Iterable<Artifact> prunedJ2ObjcArchives = computeAndStripPrunedJ2ObjcArchives( j2ObjcEntryClassProvider, j2ObjcMappingFileProvider, objcProvider); @@ -248,30 +252,30 @@ public class CrosstoolCompilationSupport extends CompilationSupport { ? LinkTargetType.OBJCPP_EXECUTABLE : LinkTargetType.OBJC_EXECUTABLE; - ObjcVariablesExtension extension = new ObjcVariablesExtension.Builder() - .setRuleContext(ruleContext) - .setObjcProvider(objcProvider) - .setConfiguration(ruleContext.getConfiguration()) - .setIntermediateArtifacts(intermediateArtifacts) - .setFrameworkNames(frameworkNames(objcProvider)) - .setLibraryNames(libraryNames(objcProvider)) - .setForceLoadArtifacts(getForceLoadArtifacts(objcProvider)) - .setAttributeLinkopts(attributes.linkopts()) - .addVariableCategory(VariableCategory.EXECUTABLE_LINKING_VARIABLES) - .build(); + ObjcVariablesExtension extension = + new ObjcVariablesExtension.Builder() + .setRuleContext(ruleContext) + .setObjcProvider(objcProvider) + .setConfiguration(buildConfiguration) + .setIntermediateArtifacts(intermediateArtifacts) + .setFrameworkNames(frameworkNames(objcProvider)) + .setLibraryNames(libraryNames(objcProvider)) + .setForceLoadArtifacts(getForceLoadArtifacts(objcProvider)) + .setAttributeLinkopts(attributes.linkopts()) + .addVariableCategory(VariableCategory.EXECUTABLE_LINKING_VARIABLES) + .build(); Artifact binaryToLink = getBinaryToLink(); - CcToolchainProvider ccToolchain = CppHelper.getToolchain(ruleContext, ":cc_toolchain"); FdoSupportProvider fdoSupport = CppHelper.getFdoSupport(ruleContext, ":cc_toolchain"); CppLinkAction executableLinkAction = - new CppLinkActionBuilder(ruleContext, binaryToLink, ccToolchain, fdoSupport) + new CppLinkActionBuilder(ruleContext, binaryToLink, toolchain, fdoSupport) .setMnemonic("ObjcLink") .addActionInputs(bazelBuiltLibraries) .addActionInputs(objcProvider.getCcLibraries()) .addTransitiveActionInputs(objcProvider.get(IMPORTED_LIBRARY)) .addTransitiveActionInputs(objcProvider.get(STATIC_FRAMEWORK_FILE)) .addTransitiveActionInputs(objcProvider.get(DYNAMIC_FRAMEWORK_FILE)) - .setCrosstoolInputs(ccToolchain.getLink()) + .setCrosstoolInputs(toolchain.getLink()) .addActionInputs(prunedJ2ObjcArchives) .addActionInput(inputFileList) .setLinkType(linkType) @@ -388,13 +392,13 @@ public class CrosstoolCompilationSupport extends CompilationSupport { .add(CppRuleClasses.INCLUDE_PATHS) .add(configuration.getCompilationMode().toString()); - if (ruleContext.getConfiguration().getFragment(ObjcConfiguration.class).moduleMapsEnabled()) { + if (configuration.getFragment(ObjcConfiguration.class).moduleMapsEnabled()) { activatedCrosstoolSelectables.add(OBJC_MODULE_FEATURE_NAME); } if (!CompilationAttributes.Builder.fromRuleContext(ruleContext).build().enableModules()) { activatedCrosstoolSelectables.add(NO_ENABLE_MODULES_FEATURE_NAME); } - if (ruleContext.getConfiguration().getFragment(ObjcConfiguration.class).shouldStripBinary()) { + if (configuration.getFragment(ObjcConfiguration.class).shouldStripBinary()) { activatedCrosstoolSelectables.add(DEAD_STRIP_FEATURE_NAME); } if (ruleContext.attributes().has("pch", BuildType.LABEL) diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java index bf1729d0f2..cd8db4c994 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java @@ -548,7 +548,8 @@ public class LegacyCompilationSupport extends CompilationSupport { J2ObjcEntryClassProvider j2ObjcEntryClassProvider, ExtraLinkArgs extraLinkArgs, Iterable<Artifact> extraLinkInputs, - DsymOutputType dsymOutputType) { + DsymOutputType dsymOutputType, + CcToolchainProvider toolchain) { Optional<Artifact> dsymBundleZip; Optional<Artifact> linkmap; Optional<Artifact> bitcodeSymbolMap; diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java index e212eb8d86..d400b38e4c 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java @@ -14,10 +14,11 @@ package com.google.devtools.build.lib.rules.objc; +import com.google.auto.value.AutoValue; import com.google.common.base.Optional; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableListMultimap; -import com.google.common.collect.ImmutableMap; +import com.google.common.collect.ImmutableSet; import com.google.common.collect.Iterables; import com.google.devtools.build.lib.actions.Artifact; import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode; @@ -29,9 +30,9 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException; import com.google.devtools.build.lib.rules.apple.Platform; import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider; +import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider; import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs; import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes; - import java.util.List; import java.util.Map; import java.util.Set; @@ -41,7 +42,27 @@ import java.util.Set; */ public class MultiArchBinarySupport { private final RuleContext ruleContext; - + + /** + * Configuration, toolchain, and provider for for single-arch dependency configurations of a + * multi-arch target. + */ + @AutoValue + abstract static class DependencySpecificConfiguration { + static DependencySpecificConfiguration create( + BuildConfiguration config, CcToolchainProvider toolchain, ObjcProvider objcProvider) { + return new AutoValue_MultiArchBinarySupport_DependencySpecificConfiguration( + config, toolchain, objcProvider); + } + + abstract BuildConfiguration config(); + + abstract CcToolchainProvider toolchain(); + + abstract ObjcProvider objcProvider(); + } + + /** * @param ruleContext the current rule context */ @@ -55,13 +76,12 @@ public class MultiArchBinarySupport { * @param platform the platform for which the binary is targeted * @param extraLinkArgs the extra linker args to add to link actions linking single-architecture * binaries together - * @param configurationToObjcProvider a map from from dependency configuration to the - * {@link ObjcProvider} which comprises all information about the dependencies in that - * configuration. Can be obtained via {@link #objcProviderByDepConfiguration} + * @param dependencySpecificConfigurations a set of {@link DependencySpecificConfiguration} that + * corresponds to child configurations for this target. Can be obtained via {@link + * #getDependencySpecificConfigurations} * @param extraLinkInputs the extra linker inputs to be made available during link actions - * @param configToDepsCollectionMap a multimap from dependency configuration to the - * list of provider collections which are propagated from the dependencies of that - * configuration + * @param configToDepsCollectionMap a multimap from dependency configuration to the list of + * provider collections which are propagated from the dependencies of that configuration * @param outputLipoBinary the artifact (lipo'ed binary) which should be output as a result of * this support * @throws RuleErrorException if there are attribute errors in the current rule context @@ -69,7 +89,7 @@ public class MultiArchBinarySupport { public void registerActions( Platform platform, ExtraLinkArgs extraLinkArgs, - Map<BuildConfiguration, ObjcProvider> configurationToObjcProvider, + Set<DependencySpecificConfiguration> dependencySpecificConfigurations, Iterable<Artifact> extraLinkInputs, ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap, Artifact outputLipoBinary) @@ -77,14 +97,17 @@ public class MultiArchBinarySupport { NestedSetBuilder<Artifact> binariesToLipo = NestedSetBuilder.<Artifact>stableOrder(); - for (BuildConfiguration childConfig : configurationToObjcProvider.keySet()) { + for (DependencySpecificConfiguration dependencySpecificConfiguration : + dependencySpecificConfigurations) { IntermediateArtifacts intermediateArtifacts = - ObjcRuleClasses.intermediateArtifacts(ruleContext, childConfig); + ObjcRuleClasses.intermediateArtifacts( + ruleContext, dependencySpecificConfiguration.config()); ImmutableList.Builder<J2ObjcMappingFileProvider> j2ObjcMappingFileProviders = ImmutableList.builder(); J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder = new J2ObjcEntryClassProvider.Builder(); - for (TransitiveInfoCollection dep : configToDepsCollectionMap.get(childConfig)) { + for (TransitiveInfoCollection dep : + configToDepsCollectionMap.get(dependencySpecificConfiguration.config())) { if (dep.getProvider(J2ObjcMappingFileProvider.class) != null) { j2ObjcMappingFileProviders.add(dep.getProvider(J2ObjcMappingFileProvider.class)); } @@ -99,19 +122,23 @@ public class MultiArchBinarySupport { binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary()); - ObjcProvider objcProvider = configurationToObjcProvider.get(childConfig); + ObjcProvider objcProvider = dependencySpecificConfiguration.objcProvider(); CompilationArtifacts compilationArtifacts = CompilationSupport.compilationArtifacts( - ruleContext, ObjcRuleClasses.intermediateArtifacts(ruleContext, childConfig)); - CompilationSupport.createForConfig(ruleContext, childConfig) - .registerCompileAndArchiveActions(compilationArtifacts, objcProvider) + ruleContext, + ObjcRuleClasses.intermediateArtifacts( + ruleContext, dependencySpecificConfiguration.config())); + CompilationSupport.createForConfig(ruleContext, dependencySpecificConfiguration.config()) + .registerCompileAndArchiveActions( + compilationArtifacts, objcProvider, dependencySpecificConfiguration.toolchain()) .registerLinkActions( objcProvider, j2ObjcMappingFileProvider, j2ObjcEntryClassProvider, extraLinkArgs, extraLinkInputs, - DsymOutputType.APP) + DsymOutputType.APP, + dependencySpecificConfiguration.toolchain()) .validateAttributes(); ruleContext.assertNoErrors(); } @@ -124,12 +151,13 @@ public class MultiArchBinarySupport { } /** - * Returns a map from from dependency configuration to the {@link ObjcCommon} which comprises all - * information about the dependencies in that configuration. This can be used both to register - * actions in {@link #registerActions} and collect provider information to be propagated upstream. + * Returns a set of {@link DependencySpecificConfiguration} instances that comprise all + * information about the dependencies for each child configuration. This can be used both to + * register actions in {@link #registerActions} and collect provider information to be propagated + * upstream. * - * @param childConfigurations the set of configurations in which dependencies of the current rule - * are built + * @param childConfigurationsAndToolchains the set of configurations and toolchains for which + * dependencies of the current rule are built * @param configToDepsCollectionMap a map from child configuration to providers that "deps" of the * current rule have propagated in that configuration * @param configurationToNonPropagatedObjcMap a map from child configuration to providers that @@ -142,17 +170,16 @@ public class MultiArchBinarySupport { * included in this binary's compilation actions * @throws RuleErrorException if there are attribute errors in the current rule context */ - public Map<BuildConfiguration, ObjcProvider> objcProviderByDepConfiguration( - Set<BuildConfiguration> childConfigurations, + public ImmutableSet<DependencySpecificConfiguration> getDependencySpecificConfigurations( + Map<BuildConfiguration, CcToolchainProvider> childConfigurationsAndToolchains, ImmutableListMultimap<BuildConfiguration, TransitiveInfoCollection> configToDepsCollectionMap, ImmutableListMultimap<BuildConfiguration, ObjcProvider> configurationToNonPropagatedObjcMap, Iterable<ObjcProvider> dylibObjcProviders, Iterable<ObjcProtoProvider> dylibProtoProviders) throws RuleErrorException, InterruptedException { - ImmutableMap.Builder<BuildConfiguration, ObjcProvider> configurationToObjcProviderBuilder = - ImmutableMap.builder(); + ImmutableSet.Builder<DependencySpecificConfiguration> childInfoBuilder = ImmutableSet.builder(); - for (BuildConfiguration childConfig : childConfigurations) { + for (BuildConfiguration childConfig : childConfigurationsAndToolchains.keySet()) { Optional<ObjcProvider> protosObjcProvider; if (ObjcRuleClasses.objcConfiguration(ruleContext).enableAppleBinaryNativeProtos()) { ProtobufSupport protoSupport = @@ -185,10 +212,12 @@ public class MultiArchBinarySupport { ObjcProvider objcProvider = common.getObjcProvider().subtractSubtrees(dylibObjcProviders, ImmutableList.<CcLinkParamsProvider>of()); - configurationToObjcProviderBuilder.put(childConfig, objcProvider); + childInfoBuilder.add( + DependencySpecificConfiguration.create( + childConfig, childConfigurationsAndToolchains.get(childConfig), objcProvider)); } - return configurationToObjcProviderBuilder.build(); + return childInfoBuilder.build(); } private ObjcCommon common( |