diff options
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java | 30 |
1 files changed, 29 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java index 10fd279e68..38e39348a6 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java @@ -57,6 +57,7 @@ import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBu import java.util.Arrays; import java.util.EnumSet; import java.util.HashMap; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Map; @@ -91,6 +92,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { NestedSetBuilder.linkOrder(); private final NestedSetBuilder<XcodeProvider> nonPropagatedDependencies = NestedSetBuilder.linkOrder(); + private final NestedSetBuilder<XcodeProvider> jreDependencies = NestedSetBuilder.linkOrder(); private final ImmutableList.Builder<XcodeprojBuildSetting> xcodeprojBuildSettings = new ImmutableList.Builder<>(); private final ImmutableList.Builder<XcodeprojBuildSetting> @@ -181,6 +183,18 @@ public final class XcodeProvider implements TransitiveInfoProvider { return addDependencies(dependencies, /*doPropagate=*/false); } + /** + * Adds {@link XcodeProvider}s corresponding to direct J2ObjC JRE dependencies of this target + * which should be added in the {@code .xcodeproj} file and propagated up the dependency chain. + */ + public Builder addJreDependencies(Iterable<XcodeProvider> dependencies) { + for (XcodeProvider dependency : dependencies) { + this.jreDependencies.add(dependency); + this.jreDependencies.addTransitive(dependency.propagatedDependencies); + } + return addDependencies(dependencies, /*doPropagate=*/true); + } + private Builder addDependencies(Iterable<XcodeProvider> dependencies, boolean doPropagate) { for (XcodeProvider dependency : dependencies) { // TODO(bazel-team): This is messy. Maybe we should make XcodeProvider be able to specify @@ -195,6 +209,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { if (doPropagate) { this.propagatedDependencies.add(dependency); this.propagatedDependencies.addTransitive(dependency.propagatedDependencies); + this.jreDependencies.addTransitive(dependency.jreDependencies); this.addTransitiveSets(dependency); } else { this.nonPropagatedDependencies.add(dependency); @@ -431,6 +446,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { private final Optional<Artifact> bundleInfoplist; private final NestedSet<XcodeProvider> propagatedDependencies; private final NestedSet<XcodeProvider> nonPropagatedDependencies; + private final NestedSet<XcodeProvider> jreDependencies; private final ImmutableList<XcodeprojBuildSetting> xcodeprojBuildSettings; private final ImmutableList<XcodeprojBuildSetting> companionTargetXcodeprojBuildSettings; private final ImmutableList<String> copts; @@ -456,6 +472,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { this.bundleInfoplist = builder.bundleInfoplist; this.propagatedDependencies = builder.propagatedDependencies.build(); this.nonPropagatedDependencies = builder.nonPropagatedDependencies.build(); + this.jreDependencies = builder.jreDependencies.build(); this.xcodeprojBuildSettings = builder.xcodeprojBuildSettings.build(); this.companionTargetXcodeprojBuildSettings = builder.companionTargetXcodeprojBuildSettings.build(); @@ -599,7 +616,12 @@ public final class XcodeProvider implements TransitiveInfoProvider { // For builds with --ios_multi_cpus set, we may have several copies of some XCodeProviders // in the dependencies (one per cpu architecture). We deduplicate the corresponding // xcode target names with a LinkedHashSet before adding to the TargetControl. + Set<String> jreTargetNames = new HashSet<>(); + for (XcodeProvider jreDependency : jreDependencies) { + jreTargetNames.add(jreDependency.dependencyXcodeTargetName()); + } Set<DependencyControl> dependencySet = new LinkedHashSet<>(); + Set<DependencyControl> jreDependencySet = new LinkedHashSet<>(); for (XcodeProvider dependency : propagatedDependencies) { // Only add a library target to a binary's dependencies if it has source files to compile // and it is not from the "non_propagated_deps" attribute. Xcode cannot build targets @@ -618,7 +640,9 @@ public final class XcodeProvider implements TransitiveInfoProvider { if (hasSources || (dependency.productType == XcodeProductType.BUNDLE || (dependency.productType == XcodeProductType.WATCH_OS1_APPLICATION))) { String dependencyXcodeTargetName = dependency.dependencyXcodeTargetName(); - dependencySet.add(DependencyControl.newBuilder() + Set<DependencyControl> set = jreTargetNames.contains(dependencyXcodeTargetName) + ? jreDependencySet : dependencySet; + set.add(DependencyControl.newBuilder() .setTargetLabel(dependencyXcodeTargetName) .build()); } @@ -627,6 +651,10 @@ public final class XcodeProvider implements TransitiveInfoProvider { for (DependencyControl dependencyControl : dependencySet) { targetControl.addDependency(dependencyControl); } + // Make sure that JRE dependencies are ordered after other propagated dependencies. + for (DependencyControl dependencyControl : jreDependencySet) { + targetControl.addDependency(dependencyControl); + } } for (XcodeProvider justTestHost : testHost.asSet()) { targetControl.addDependency(DependencyControl.newBuilder() |