aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/J2ObjcLibrary.java63
1 files changed, 44 insertions, 19 deletions
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 b761f53fdc..317fbbb221 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
@@ -15,8 +15,6 @@
package com.google.devtools.build.lib.rules.objc;
import static com.google.devtools.build.lib.collect.nestedset.Order.STABLE_ORDER;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.JRE_LIBRARY;
-import static com.google.devtools.build.lib.rules.objc.ObjcProvider.LIBRARY;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
@@ -29,6 +27,7 @@ import com.google.devtools.build.lib.analysis.RunfilesProvider;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.packages.BuildType;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetAndData;
import com.google.devtools.build.lib.syntax.Type;
import com.google.devtools.build.lib.vfs.PathFragment;
import java.util.List;
@@ -48,13 +47,51 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
ImmutableList.of("java_import", "java_library", "proto_library");
private ObjcCommon common(RuleContext ruleContext) throws InterruptedException {
+ List<ConfiguredTargetAndData> deps =
+ ruleContext.getPrerequisiteConfiguredTargetAndTargets("deps", Mode.TARGET);
+ List<ConfiguredTargetAndData> jreDeps =
+ ruleContext.getPrerequisiteConfiguredTargetAndTargets("jre_deps", Mode.TARGET);
+
+ ImmutableList.Builder<ObjcProvider> repropagatedModuleMapsProviders =
+ new ImmutableList.Builder<>();
+
+ // In order to support strict Obj-C deps from Swift, we need to repropagate the module maps of
+ // targets that swift_libraries cannot directly depend on, like java_library. So we repropagate
+ // for any dependency *except* j2objc_library (which are detected by looking for
+ // J2ObjcEntryClassProvider). This keeps dependencies between j2objc_libraries strict (Swift
+ // can't indirectly depend on a j2objc_library through another one), but ensures that the
+ // underlying java_library/proto_library dependencies can be imported.
+ for (ConfiguredTargetAndData dep : deps) {
+ ConfiguredTarget target = dep.getConfiguredTarget();
+ if (target.getProvider(J2ObjcEntryClassProvider.class) == null) {
+ ObjcProvider objcProvider = target.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+ if (objcProvider != null) {
+ repropagatedModuleMapsProviders.add(objcProvider);
+ }
+ }
+ }
+
+ // JRE deps are objc_libraries, so always repropagate them.
+ for (ConfiguredTargetAndData dep : jreDeps) {
+ ConfiguredTarget target = dep.getConfiguredTarget();
+ ObjcProvider objcProvider = target.get(ObjcProvider.SKYLARK_CONSTRUCTOR);
+ if (objcProvider != null) {
+ repropagatedModuleMapsProviders.add(objcProvider);
+ }
+ }
+
+ // Adding the deps and jreDeps here is still required to propagate the rest of the dependencies'
+ // providers' information up the tree (whether transitively or only to direct dependencies,
+ // depending on the key in question). The repropagated module map providers merely decide which
+ // providers should *also* have their module maps re-propagated to the next direct dependency.
return new ObjcCommon.Builder(ruleContext)
.setCompilationAttributes(
CompilationAttributes.Builder.fromRuleContext(ruleContext).build())
- .addDeps(ruleContext.getPrerequisiteConfiguredTargetAndTargets("deps", Mode.TARGET))
- .addDeps(ruleContext.getPrerequisiteConfiguredTargetAndTargets("jre_deps", Mode.TARGET))
+ .addDeps(deps)
+ .addDeps(jreDeps)
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setHasModuleMap()
+ .addRepropagatedModuleMapObjcProviders(repropagatedModuleMapsProviders.build())
.build();
}
@@ -72,24 +109,12 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
.addEntryClasses(ruleContext.attributes().get("entry_classes", Type.STRING_LIST))
.build();
- Iterable<ObjcProvider> jreDeps =
- ruleContext.getPrerequisites("jre_deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR);
- ObjcProvider.Builder objcProviderBuilder =
- new ObjcProvider.Builder(ruleContext.getAnalysisEnvironment().getSkylarkSemantics())
- .addTransitiveAndPropagate(jreDeps)
- .addTransitiveAndPropagate(
- ruleContext.getPrerequisites(
- "deps", Mode.TARGET, ObjcProvider.SKYLARK_CONSTRUCTOR));
- for (ObjcProvider prereq : jreDeps) {
- objcProviderBuilder.addTransitiveAndPropagate(JRE_LIBRARY, prereq.get(LIBRARY));
- }
-
- ObjcProvider objcProvider = objcProviderBuilder.build();
+ ObjcCommon common = common(ruleContext);
+ ObjcProvider objcProvider = common.getObjcProvider();
J2ObjcMappingFileProvider j2ObjcMappingFileProvider = J2ObjcMappingFileProvider.union(
ruleContext.getPrerequisites("deps", Mode.TARGET, J2ObjcMappingFileProvider.class));
- ObjcCommon common = common(ruleContext);
CompilationArtifacts moduleMapCompilationArtifacts =
new CompilationArtifacts.Builder()
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
@@ -101,7 +126,7 @@ public class J2ObjcLibrary implements RuleConfiguredTargetFactory {
.doNotUsePch()
.build()
.registerFullyLinkAction(
- common.getObjcProvider(),
+ objcProvider,
ruleContext.getImplicitOutputArtifact(CompilationSupport.FULLY_LINKED_LIB))
.registerGenerateModuleMapAction(moduleMapCompilationArtifacts)
.validateAttributes();