aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Cal Peyser <cpeyser@google.com>2017-03-28 13:57:22 +0000
committerGravatar Philipp Wollermann <philwo@google.com>2017-03-28 19:51:26 +0000
commitcaea6bd17766483503537cf17adf42860aaaf089 (patch)
tree83c20a1ef56ed2e874023042599cdedadb529a01 /src/main/java/com
parentc2cc768cb1d891f2f2f942feb007d5508e04f585 (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')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java43
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java69
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CrosstoolCompilationSupport.java66
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/LegacyCompilationSupport.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/MultiArchBinarySupport.java89
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(