aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Chris Parsons <cparsons@google.com>2016-05-05 23:01:28 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-05-06 09:35:22 +0000
commitc0c74cd265dc22946df7c0170cd67d7729d20f0d (patch)
treec02dbc74a576cc29196e03559012d09f0f059264 /src/main
parente4880eb0eea91307aa2a79e106d745b40281d5d3 (diff)
apple_binary builds without implicit requirement of cc-relevant flags.
Notable changes: - Obtain J2Objc providers from deps attribute of the current rule, even if "deps" is not Mode.TARGET. It is up to the rule implementation to correctly obtain and propagate these providers. - "srcs" on apple_binary no longer has a split transition. These are files, not labels. -- MOS_MIGRATED_REVID=121625691
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinary.java40
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java21
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/CompilationSupport.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java10
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java30
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java6
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java62
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java18
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java20
11 files changed, 140 insertions, 127 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 9928c4a821..3971a3572f 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
@@ -32,7 +32,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.cpp.CcToolchainProvider;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -74,6 +73,23 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
nullToEmptyList(configToDepsCollectionMap.get(childConfig)),
nullToEmptyList(configurationToNonPropagatedObjcMap.get(childConfig)));
ObjcProvider objcProvider = common.getObjcProvider();
+ ImmutableList.Builder<J2ObjcMappingFileProvider> j2ObjcMappingFileProviders =
+ ImmutableList.builder();
+ J2ObjcEntryClassProvider.Builder j2ObjcEntryClassProviderBuilder =
+ new J2ObjcEntryClassProvider.Builder();
+ for (TransitiveInfoCollection dep : configToDepsCollectionMap.get(childConfig)) {
+ if (dep.getProvider(J2ObjcMappingFileProvider.class) != null) {
+ j2ObjcMappingFileProviders.add(dep.getProvider(J2ObjcMappingFileProvider.class));
+ }
+ if (dep.getProvider(J2ObjcEntryClassProvider.class) != null) {
+ j2ObjcEntryClassProviderBuilder.addTransitive(
+ dep.getProvider(J2ObjcEntryClassProvider.class));
+ }
+ }
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider =
+ J2ObjcMappingFileProvider.union(j2ObjcMappingFileProviders.build());
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider = j2ObjcEntryClassProviderBuilder.build();
+
if (!hasLibraryOrSources(objcProvider)) {
ruleContext.ruleError(REQUIRES_AT_LEAST_ONE_LIBRARY_OR_SOURCE_FILE);
return null;
@@ -81,11 +97,13 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
if (ruleContext.hasErrors()) {
return null;
}
+
binariesToLipo.add(intermediateArtifacts.strippedSingleArchitectureBinary());
new CompilationSupport(ruleContext, childConfig)
.registerCompileAndArchiveActions(common)
.registerLinkActions(
- objcProvider, new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
+ common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+ new ExtraLinkArgs(), ImmutableList.<Artifact>of(),
DsymOutputType.APP)
.validateAttributes();
@@ -116,18 +134,6 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
IntermediateArtifacts intermediateArtifacts,
List<TransitiveInfoCollection> propagatedDeps,
List<ObjcProvider> nonPropagatedObjcDeps) {
- ImmutableList.Builder<ObjcProvider> propagatedObjcDeps = ImmutableList.<ObjcProvider>builder();
- ImmutableList.Builder<CppCompilationContext> cppDeps =
- ImmutableList.<CppCompilationContext>builder();
-
- for (TransitiveInfoCollection dep : propagatedDeps) {
- if (dep.getProvider(ObjcProvider.class) != null) {
- propagatedObjcDeps.add(dep.getProvider(ObjcProvider.class));
- }
- if (dep.getProvider(CppCompilationContext.class) != null) {
- cppDeps.add(dep.getProvider(CppCompilationContext.class));
- }
- }
CompilationArtifacts compilationArtifacts =
CompilationSupport.compilationArtifacts(ruleContext, intermediateArtifacts);
@@ -137,9 +143,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
.setResourceAttributes(new ResourceAttributes(ruleContext))
.setCompilationArtifacts(compilationArtifacts)
.addDefines(ruleContext.getTokenizedStringListAttr("defines"))
- .addDepObjcProviders(propagatedObjcDeps.build())
- .addDepCcHeaderProviders(cppDeps.build())
- .addDepCcLinkProviders(propagatedDeps)
+ .addDeps(propagatedDeps)
.addDepObjcProviders(
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(nonPropagatedObjcDeps)
@@ -149,7 +153,7 @@ public class AppleBinary implements RuleConfiguredTargetFactory {
.setLinkedBinary(intermediateArtifacts.strippedSingleArchitectureBinary())
.build();
}
-
+
private <T> List<T> nullToEmptyList(List<T> inputList) {
return inputList != null ? inputList : ImmutableList.<T>of();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
index 498789c3fa..0979c8fe23 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/AppleBinaryRule.java
@@ -16,7 +16,6 @@ package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.packages.Attribute.attr;
import static com.google.devtools.build.lib.packages.BuildType.LABEL;
-import static com.google.devtools.build.lib.packages.BuildType.LABEL_LIST;
import static com.google.devtools.build.lib.packages.ImplicitOutputsFunction.fromTemplates;
import static com.google.devtools.build.lib.syntax.Type.BOOLEAN;
@@ -43,24 +42,12 @@ public class AppleBinaryRule implements RuleDefinition {
@Override
public RuleClass build(Builder builder, RuleDefinitionEnvironment env) {
return builder
- .requiresConfigurationFragments(ObjcConfiguration.class, J2ObjcConfiguration.class,
- AppleConfiguration.class)
+ .requiresConfigurationFragments(
+ ObjcConfiguration.class, J2ObjcConfiguration.class, AppleConfiguration.class)
.add(attr("$is_executable", BOOLEAN).value(true)
.nonconfigurable("Called from RunCommand.isExecutable, which takes a Target"))
- .override(attr("deps", LABEL_LIST)
- .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
- .direct_compile_time_input()
- .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
- .allowedFileTypes())
- .override(attr("non_propagated_deps", LABEL_LIST)
- .direct_compile_time_input()
- .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
- .allowedRuleClasses(ObjcRuleClasses.CompilingRule.ALLOWED_DEPS_RULE_CLASSES)
- .allowedFileTypes())
- .override(attr("srcs", LABEL_LIST)
- .direct_compile_time_input()
- .cfg(IosApplication.SPLIT_ARCH_TRANSITION)
- .allowedFileTypes(ObjcRuleClasses.SRCS_TYPE))
+ .override(builder.copy("deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
+ .override(builder.copy("non_propagated_deps").cfg(IosApplication.SPLIT_ARCH_TRANSITION))
// 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.
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
index d06a374f07..ef86fe6ea9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java
@@ -31,7 +31,6 @@ import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.Platform;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.objc.CompilationSupport.ExtraLinkArgs;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.ResourceAttributes;
@@ -97,13 +96,20 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
return null;
}
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+ .build();
+
CompilationSupport compilationSupport =
new CompilationSupport(ruleContext)
.registerCompileAndArchiveActions(common)
.registerFullyLinkAction(common.getObjcProvider())
.addXcodeSettings(xcodeProviderBuilder, common)
.registerLinkActions(
- objcProvider,
+ objcProvider, j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
getExtraLinkArgs(ruleContext),
ImmutableList.<Artifact>of(),
DsymOutputType.APP)
@@ -202,11 +208,7 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
.setResourceAttributes(new ResourceAttributes(ruleContext))
.setCompilationArtifacts(compilationArtifacts)
.addDefines(ruleContext.getTokenizedStringListAttr("defines"))
- .addDepObjcProviders(
- ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
- .addDepCcHeaderProviders(
- ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
- .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
+ .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
.addDepObjcProviders(
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(
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 e2d0a0bd10..395a2beaa2 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
@@ -784,6 +784,8 @@ public final class CompilationSupport {
* {@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
@@ -792,6 +794,8 @@ public final class CompilationSupport {
*/
CompilationSupport registerLinkActions(
ObjcProvider objcProvider,
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider,
ExtraLinkArgs extraLinkArgs,
Iterable<Artifact> extraLinkInputs,
DsymOutputType dsymOutputType) {
@@ -809,9 +813,9 @@ public final class CompilationSupport {
}
Iterable<Artifact> prunedJ2ObjcArchives = ImmutableList.<Artifact>of();
- if (stripJ2ObjcDeadCode()) {
- J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
- registerJ2ObjcDeadCodeRemovalActions(objcProvider, provider.getEntryClasses());
+ if (stripJ2ObjcDeadCode(j2ObjcEntryClassProvider)) {
+ registerJ2ObjcDeadCodeRemovalActions(objcProvider, j2ObjcMappingFileProvider,
+ j2ObjcEntryClassProvider);
prunedJ2ObjcArchives = j2objcPrunedLibraries(objcProvider);
}
@@ -831,13 +835,13 @@ public final class CompilationSupport {
return this;
}
- private boolean stripJ2ObjcDeadCode() {
- J2ObjcEntryClassProvider provider = J2ObjcEntryClassProvider.buildFrom(ruleContext);
+ private boolean stripJ2ObjcDeadCode(J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
J2ObjcConfiguration j2objcConfiguration =
buildConfiguration.getFragment(J2ObjcConfiguration.class);
// Only perform J2ObjC dead code stripping if flag --j2objc_dead_code_removal is specified and
// users have specified entry classes.
- return j2objcConfiguration.removeDeadCode() && !provider.getEntryClasses().isEmpty();
+ return j2objcConfiguration.removeDeadCode()
+ && !j2ObjcEntryClassProvider.getEntryClasses().isEmpty();
}
/**
@@ -1175,12 +1179,16 @@ public final class CompilationSupport {
}
private void registerJ2ObjcDeadCodeRemovalActions(ObjcProvider objcProvider,
- Iterable<String> entryClasses) {
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider,
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider) {
+ NestedSet<String> entryClasses = j2ObjcEntryClassProvider.getEntryClasses();
Artifact pruner = ruleContext.getPrerequisiteArtifact("$j2objc_dead_code_pruner", Mode.HOST);
- J2ObjcMappingFileProvider provider = ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext);
- NestedSet<Artifact> j2ObjcDependencyMappingFiles = provider.getDependencyMappingFiles();
- NestedSet<Artifact> j2ObjcHeaderMappingFiles = provider.getHeaderMappingFiles();
- NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles = provider.getArchiveSourceMappingFiles();
+ NestedSet<Artifact> j2ObjcDependencyMappingFiles =
+ j2ObjcMappingFileProvider.getDependencyMappingFiles();
+ NestedSet<Artifact> j2ObjcHeaderMappingFiles =
+ j2ObjcMappingFileProvider.getHeaderMappingFiles();
+ NestedSet<Artifact> j2ObjcArchiveSourceMappingFiles =
+ j2ObjcMappingFileProvider.getArchiveSourceMappingFiles();
for (Artifact j2objcArchive : objcProvider.get(ObjcProvider.J2OBJC_LIBRARY)) {
PathFragment paramFilePath = FileSystemUtils.replaceExtension(
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
index 89541d6508..c21a7806ea 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java
@@ -129,10 +129,18 @@ public final class IosTest implements RuleConfiguredTargetFactory {
filesToBuild.add(testApp.getIpa());
}
+
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class))
+ .build();
new CompilationSupport(ruleContext)
.registerLinkActions(
- common.getObjcProvider(), extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
+ common.getObjcProvider(), j2ObjcMappingFileProvider, j2ObjcEntryClassProvider,
+ extraLinkArgs, extraLinkInputs, DsymOutputType.TEST)
.registerCompileAndArchiveActions(common)
.registerFullyLinkAction(common.getObjcProvider())
.addXcodeSettings(xcodeProviderBuilder, common)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
index 6bbc6a505f..0b3cd38d51 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcEntryClassProvider.java
@@ -54,6 +54,20 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider {
}
/**
+ * Transitively adds the given {@link J2ObjcEntryClassProvider}s
+ * and all their properties to this builder.
+ *
+ * @param providers the J2ObjcEntryClassProviders to add
+ * @return this builder
+ */
+ public Builder addTransitive(Iterable<J2ObjcEntryClassProvider> providers) {
+ for (J2ObjcEntryClassProvider provider : providers) {
+ addTransitive(provider);
+ }
+ return this;
+ }
+
+ /**
* Transitively adds all the J2ObjcEntryClassProviders and all their properties
* that can be reached through the "deps" attribute.
*
@@ -62,10 +76,8 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider {
*/
public Builder addTransitive(RuleContext ruleContext) {
if (ruleContext.attributes().has("deps", BuildType.LABEL_LIST)) {
- for (J2ObjcEntryClassProvider provider :
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class)) {
- addTransitive(provider);
- }
+ addTransitive(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcEntryClassProvider.class));
}
return this;
@@ -93,16 +105,6 @@ public final class J2ObjcEntryClassProvider implements TransitiveInfoProvider {
}
/**
- * Constructs a new J2ObjcEntryClassProvider that contains all the information
- * that can be transitively reached through the "deps" attribute of the given rule context.
- *
- * @param ruleContext the rule context in which to look for deps
- */
- public static J2ObjcEntryClassProvider buildFrom(RuleContext ruleContext) {
- return new Builder().addTransitive(ruleContext).build();
- }
-
- /**
* Constructs a {@link J2ObjcEntryClassProvider} to supply J2ObjC-translated ObjC sources to
* objc_binary for compilation and linking.
*
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
index fd37871cc8..2cf414f1b4 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
@@ -74,12 +74,14 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
ObjcProvider objcProvider = objcProviderBuilder.build();
xcodeSupport.addXcodeSettings(xcodeProviderBuilder, objcProvider, LIBRARY_STATIC);
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+
return new RuleConfiguredTargetBuilder(ruleContext)
.setFilesToBuild(NestedSetBuilder.<Artifact>emptySet(STABLE_ORDER))
.add(RunfilesProvider.class, RunfilesProvider.EMPTY)
.addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
- .addProvider(
- J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+ .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
.addProvider(ObjcProvider.class, objcProvider)
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
.build();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
index e785130329..2d40857e07 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcMappingFileProvider.java
@@ -33,6 +33,20 @@ public final class J2ObjcMappingFileProvider implements TransitiveInfoProvider {
private final NestedSet<Artifact> archiveSourceMappingFiles;
/**
+ * Returns a {@link J2ObjcMappingFileProvider} which combines all input
+ * {@link J2ObjcMappingFileProvider}s. All mapping files present in any of the input providers
+ * will be present in the output provider.
+ */
+ public static J2ObjcMappingFileProvider union(Iterable<J2ObjcMappingFileProvider> providers) {
+ J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
+ for (J2ObjcMappingFileProvider provider : providers) {
+ builder.addTransitive(provider);
+ }
+
+ return builder.build();
+ }
+
+ /**
* Constructs a {@link J2ObjcMappingFileProvider} with mapping files to export mappings required
* by J2ObjC translation and proto compilation.
*
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
index 5f832ebc27..bf35252ec6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommon.java
@@ -65,6 +65,7 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.TransitiveInfoCollection;
+import com.google.devtools.build.lib.analysis.TransitiveInfoProvider;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.packages.BuildType;
@@ -375,6 +376,39 @@ public final class ObjcCommon {
return this;
}
+ Builder addDeps(List<? extends TransitiveInfoCollection> deps) {
+ ImmutableList.Builder<ObjcProvider> propagatedObjcDeps =
+ ImmutableList.<ObjcProvider>builder();
+ ImmutableList.Builder<CppCompilationContext> cppDeps =
+ ImmutableList.<CppCompilationContext>builder();
+ ImmutableList.Builder<CcLinkParamsProvider> cppDepLinkParams =
+ ImmutableList.<CcLinkParamsProvider>builder();
+
+ for (TransitiveInfoCollection dep : deps) {
+ addAnyProviders(propagatedObjcDeps, dep, ObjcProvider.class);
+ addAnyProviders(cppDeps, dep, CppCompilationContext.class);
+ // Hack to determine if dep is a cc target. Required so objc_library archives packed in
+ // CcLinkParamsProvider do not get consumed as cc targets.
+ if (dep.getProvider(CppRunfilesProvider.class) != null) {
+ cppDepLinkParams.add(dep.getProvider(CcLinkParamsProvider.class));
+ }
+ }
+ addDepObjcProviders(propagatedObjcDeps.build());
+ this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, cppDeps.build());
+ this.depCcLinkProviders =
+ Iterables.concat(this.depCcLinkProviders, cppDepLinkParams.build());
+ return this;
+ }
+
+ private <T extends TransitiveInfoProvider> ImmutableList.Builder<T> addAnyProviders(
+ ImmutableList.Builder<T> listBuilder, TransitiveInfoCollection collection,
+ Class<T> providerClass) {
+ if (collection.getProvider(providerClass) != null) {
+ listBuilder.add(collection.getProvider(providerClass));
+ }
+ return listBuilder;
+ }
+
/**
* Add providers which will be exposed both to the declaring rule and to any dependers on the
* declaring rule.
@@ -469,34 +503,6 @@ public final class ObjcCommon {
return this;
}
- /**
- * Sets information from {@code cc_library} dependencies to be used during compilation.
- */
- public Builder addDepCcHeaderProviders(Iterable<CppCompilationContext> depCcHeaderProviders) {
- this.depCcHeaderProviders = Iterables.concat(this.depCcHeaderProviders, depCcHeaderProviders);
- return this;
- }
-
- /**
- * Sets information from {@code cc_library} dependencies to be used during linking from
- * the {@link TransitiveInfoCollection} objects which contain the relevant link providers
- * (for example, from the current rule's "deps" attribute).
- */
- public Builder addDepCcLinkProviders(List<? extends TransitiveInfoCollection> deps) {
- for (TransitiveInfoCollection dep : deps) {
- // Hack to determine if dep is a cc target. Required so objc_library archives packed in
- // CcLinkParamsProvider do not get consumed as cc targets.
- if (dep.getProvider(CppRunfilesProvider.class) != null) {
- CcLinkParamsProvider ccLinkParamsProvider = dep.getProvider(CcLinkParamsProvider.class);
- this.depCcLinkProviders =
- Iterables.concat(
- this.depCcLinkProviders,
- ImmutableList.<CcLinkParamsProvider>of(ccLinkParamsProvider));
- }
- }
- return this;
- }
-
ObjcCommon build() {
Iterable<BundleableFile> bundleImports = BundleableFile.bundleImportsFromRule(context);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
index aad16f1e1b..76130d94a1 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java
@@ -27,7 +27,6 @@ import com.google.devtools.build.lib.rules.RuleConfiguredTargetFactory;
import com.google.devtools.build.lib.rules.cpp.CcLinkParams;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsProvider;
import com.google.devtools.build.lib.rules.cpp.CcLinkParamsStore;
-import com.google.devtools.build.lib.rules.cpp.CppCompilationContext;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs;
import com.google.devtools.build.lib.rules.cpp.LinkerInputs.LibraryToLink;
import com.google.devtools.build.lib.rules.objc.ObjcCommon.CompilationAttributes;
@@ -82,14 +81,11 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
.addExtraSdkFrameworks(extraSdkFrameworks)
.addDefines(ruleContext.getTokenizedStringListAttr("defines"))
.setCompilationArtifacts(compilationArtifacts)
- .addDepObjcProviders(ruleContext.getPrerequisites("deps", Mode.TARGET, ObjcProvider.class))
+ .addDeps(ruleContext.getPrerequisites("deps", Mode.TARGET))
.addDepObjcProviders(
ruleContext.getPrerequisites("bundles", Mode.TARGET, ObjcProvider.class))
.addNonPropagatedDepObjcProviders(
ruleContext.getPrerequisites("non_propagated_deps", Mode.TARGET, ObjcProvider.class))
- .addDepCcHeaderProviders(
- ruleContext.getPrerequisites("deps", Mode.TARGET, CppCompilationContext.class))
- .addDepCcLinkProviders(ruleContext.getPrerequisites("deps", Mode.TARGET))
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setAlwayslink(alwayslink)
.setHasModuleMap()
@@ -130,13 +126,17 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory {
xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET))
.registerActions(xcodeProviderBuilder.build());
+ J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
+ ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
+ J2ObjcEntryClassProvider j2ObjcEntryClassProvider = new J2ObjcEntryClassProvider.Builder()
+ .addTransitive(ruleContext.getPrerequisites("deps", Mode.TARGET,
+ J2ObjcEntryClassProvider.class)).build();
+
return ObjcRuleClasses.ruleConfiguredTarget(ruleContext, filesToBuild.build())
.addProvider(XcodeProvider.class, xcodeProviderBuilder.build())
.addProvider(ObjcProvider.class, common.getObjcProvider())
- .addProvider(
- J2ObjcEntryClassProvider.class, J2ObjcEntryClassProvider.buildFrom(ruleContext))
- .addProvider(
- J2ObjcMappingFileProvider.class, ObjcRuleClasses.j2ObjcMappingFileProvider(ruleContext))
+ .addProvider(J2ObjcEntryClassProvider.class, j2ObjcEntryClassProvider)
+ .addProvider(J2ObjcMappingFileProvider.class, j2ObjcMappingFileProvider)
.addProvider(
InstrumentedFilesProvider.class,
compilationSupport.getInstrumentedFilesProvider(common))
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
index 8ccc437db9..b11e26fba9 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcRuleClasses.java
@@ -29,7 +29,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.BaseRuleClasses;
-import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.RuleDefinition;
@@ -107,25 +106,6 @@ public class ObjcRuleClasses {
/*archiveFileNameSuffix=*/"_j2objc");
}
- /**
- * Returns a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files from rules
- * that can be reached transitively through the "deps" attribute.
- *
- * @param ruleContext the rule context of the current rule
- * @return a {@link J2ObjcMappingFileProvider} containing J2ObjC mapping files information from
- * the transitive closure.
- */
- public static J2ObjcMappingFileProvider j2ObjcMappingFileProvider(RuleContext ruleContext) {
- J2ObjcMappingFileProvider.Builder builder = new J2ObjcMappingFileProvider.Builder();
- Iterable<J2ObjcMappingFileProvider> providers =
- ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class);
- for (J2ObjcMappingFileProvider provider : providers) {
- builder.addTransitive(provider);
- }
-
- return builder.build();
- }
-
public static Artifact artifactByAppendingToBaseName(RuleContext context, String suffix) {
return context.getPackageRelativeArtifact(
context.getLabel().getName() + suffix, context.getBinOrGenfilesDirectory());