diff options
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.java | 63 |
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(); |