aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java
diff options
context:
space:
mode:
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.java30
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()