aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Sergio Campama <kaipi@google.com>2016-09-01 16:31:08 +0000
committerGravatar Klaus Aehlig <aehlig@google.com>2016-09-02 08:24:00 +0000
commit26389edbc1595599de67742effd13ca7da829c05 (patch)
tree060764d4d7d1af787629098ff9ddd84f4a9d4a2b /src/main/java/com
parentff4d006bf0daf5b30564d5d46288a2bc7cb0f0bc (diff)
Adds strict header propagation for xcodegen projects.
-- MOS_MIGRATED_REVID=131956896
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java71
2 files changed, 66 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
index 0af84d64d1..8c4e49671f 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ProtobufSupport.java
@@ -277,7 +277,12 @@ final class ProtobufSupport {
XcodeProvider bundleProvider =
getBundleXcodeProvider(
common, bundleIntermediateArtifacts, getUniqueBundledProtosSuffix(actionId));
- xcodeProviderBuilder.addPropagatedDependencies(ImmutableSet.of(bundleProvider));
+ if (isLinkingTarget()) {
+ xcodeProviderBuilder.addPropagatedDependencies(ImmutableSet.of(bundleProvider));
+ } else {
+ xcodeProviderBuilder.addPropagatedDependenciesWithStrictDependencyHeaders(
+ ImmutableSet.of(bundleProvider));
+ }
actionId++;
}
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 36cd017fd1..12d80b753d 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
@@ -76,21 +76,32 @@ public final class XcodeProvider implements TransitiveInfoProvider {
*/
public static final class Builder {
private Label label;
+ // Propagated dependencies and search paths are seen by all transitive dependents of this
+ // target. Non propagated dependencies are only seen by this target; none of the direct and
+ // transitive dependents of this target will see this provider. Strictly propagated dependencies
+ // are only seen by this target and only direct dependents; transitive dependents won't see this
+ // provider.
private final NestedSetBuilder<String> propagatedUserHeaderSearchPaths =
NestedSetBuilder.linkOrder();
private final NestedSetBuilder<String> nonPropagatedUserHeaderSearchPaths =
NestedSetBuilder.linkOrder();
+ private final NestedSetBuilder<String> strictlyPropagatedUserHeaderSearchPaths =
+ NestedSetBuilder.linkOrder();
private final NestedSetBuilder<String> propagatedHeaderSearchPaths =
NestedSetBuilder.linkOrder();
private final NestedSetBuilder<String> nonPropagatedHeaderSearchPaths =
NestedSetBuilder.linkOrder();
- private Optional<Artifact> bundleInfoplist = Optional.absent();
+ private final NestedSetBuilder<String> strictlyPropagatedHeaderSearchPaths =
+ NestedSetBuilder.linkOrder();
// Dependencies must be in link order because XCode observes the dependency ordering for
// binary linking.
private final NestedSetBuilder<XcodeProvider> propagatedDependencies =
NestedSetBuilder.linkOrder();
private final NestedSetBuilder<XcodeProvider> nonPropagatedDependencies =
NestedSetBuilder.linkOrder();
+ private final NestedSetBuilder<XcodeProvider> strictlyPropagatedDependencies =
+ NestedSetBuilder.linkOrder();
+ private Optional<Artifact> bundleInfoplist = Optional.absent();
private final NestedSetBuilder<XcodeProvider> jreDependencies = NestedSetBuilder.linkOrder();
private final ImmutableList.Builder<XcodeprojBuildSetting> xcodeprojBuildSettings =
new ImmutableList.Builder<>();
@@ -174,6 +185,27 @@ public final class XcodeProvider implements TransitiveInfoProvider {
return addDependencies(dependencies, /*doPropagate=*/true);
}
+ /**
+ * Adds {@link XcodeProvider}s corresponding to direct dependencies of this target which should
+ * be added in the {@code .xcodeproj} file and only propagate the header search paths to direct
+ * dependents of this target. Propagated dependencies of this target are still propagated as the
+ * code still needs to be linked, and only limits the propagation of this target's header search
+ * paths.
+ */
+ public Builder addPropagatedDependenciesWithStrictDependencyHeaders(
+ Iterable<XcodeProvider> dependencies) {
+ for (XcodeProvider dependency : dependencies) {
+ this.strictlyPropagatedDependencies.add(dependency);
+ this.propagatedDependencies.addTransitive(dependency.propagatedDependencies);
+ this.nonPropagatedDependencies.addTransitive(dependency.strictlyPropagatedDependencies);
+ this.strictlyPropagatedUserHeaderSearchPaths.addTransitive(
+ dependency.propagatedUserHeaderSearchPaths);
+ this.strictlyPropagatedHeaderSearchPaths.addTransitive(
+ dependency.propagatedHeaderSearchPaths);
+ }
+ return this;
+ }
+
/**
* Adds {@link XcodeProvider}s corresponding to direct dependencies of this target which should
* be added in the {@code .xcodeproj} file and not propagated up the dependency chain.
@@ -219,6 +251,10 @@ public final class XcodeProvider implements TransitiveInfoProvider {
.addTransitive(dependency.propagatedHeaderSearchPaths);
this.inputsToXcodegen.addTransitive(dependency.inputsToXcodegen);
}
+ this.nonPropagatedUserHeaderSearchPaths.addTransitive(
+ dependency.strictlyPropagatedUserHeaderSearchPaths);
+ this.nonPropagatedHeaderSearchPaths.addTransitive(
+ dependency.strictlyPropagatedHeaderSearchPaths);
}
}
return this;
@@ -440,11 +476,14 @@ public final class XcodeProvider implements TransitiveInfoProvider {
private final Label label;
private final NestedSet<String> propagatedUserHeaderSearchPaths;
private final NestedSet<String> nonPropagatedUserHeaderSearchPaths;
+ private final NestedSet<String> strictlyPropagatedUserHeaderSearchPaths;
private final NestedSet<String> propagatedHeaderSearchPaths;
private final NestedSet<String> nonPropagatedHeaderSearchPaths;
+ private final NestedSet<String> strictlyPropagatedHeaderSearchPaths;
private final Optional<Artifact> bundleInfoplist;
private final NestedSet<XcodeProvider> propagatedDependencies;
private final NestedSet<XcodeProvider> nonPropagatedDependencies;
+ private final NestedSet<XcodeProvider> strictlyPropagatedDependencies;
private final NestedSet<XcodeProvider> jreDependencies;
private final ImmutableList<XcodeprojBuildSetting> xcodeprojBuildSettings;
private final ImmutableList<XcodeprojBuildSetting> companionTargetXcodeprojBuildSettings;
@@ -466,11 +505,15 @@ public final class XcodeProvider implements TransitiveInfoProvider {
this.label = Preconditions.checkNotNull(builder.label);
this.propagatedUserHeaderSearchPaths = builder.propagatedUserHeaderSearchPaths.build();
this.nonPropagatedUserHeaderSearchPaths = builder.nonPropagatedUserHeaderSearchPaths.build();
+ this.strictlyPropagatedUserHeaderSearchPaths =
+ builder.strictlyPropagatedUserHeaderSearchPaths.build();
this.propagatedHeaderSearchPaths = builder.propagatedHeaderSearchPaths.build();
this.nonPropagatedHeaderSearchPaths = builder.nonPropagatedHeaderSearchPaths.build();
+ this.strictlyPropagatedHeaderSearchPaths = builder.strictlyPropagatedHeaderSearchPaths.build();
this.bundleInfoplist = builder.bundleInfoplist;
this.propagatedDependencies = builder.propagatedDependencies.build();
this.nonPropagatedDependencies = builder.nonPropagatedDependencies.build();
+ this.strictlyPropagatedDependencies = builder.strictlyPropagatedDependencies.build();
this.jreDependencies = builder.jreDependencies.build();
this.xcodeprojBuildSettings = builder.xcodeprojBuildSettings.build();
this.companionTargetXcodeprojBuildSettings =
@@ -493,8 +536,10 @@ public final class XcodeProvider implements TransitiveInfoProvider {
private void collectProviders(Set<XcodeProvider> allProviders) {
if (allProviders.add(this)) {
- for (XcodeProvider dependency : Iterables.concat(propagatedDependencies,
- nonPropagatedDependencies)) {
+ Iterable<XcodeProvider> allDependencies =
+ Iterables.concat(
+ propagatedDependencies, nonPropagatedDependencies, strictlyPropagatedDependencies);
+ for (XcodeProvider dependency : allDependencies) {
dependency.collectProviders(allProviders);
}
for (XcodeProvider justTestHost : testHost.asSet()) {
@@ -568,14 +613,18 @@ public final class XcodeProvider implements TransitiveInfoProvider {
private TargetControl targetControl() {
String buildFilePath = label.getPackageFragment().getSafePathString() + "/BUILD";
- NestedSet<String> userHeaderSearchPaths = NestedSetBuilder.<String>linkOrder()
- .addTransitive(propagatedUserHeaderSearchPaths)
- .addTransitive(nonPropagatedUserHeaderSearchPaths)
- .build();
- NestedSet<String> headerSearchPaths = NestedSetBuilder.<String>linkOrder()
- .addTransitive(propagatedHeaderSearchPaths)
- .addTransitive(nonPropagatedHeaderSearchPaths)
- .build();
+ NestedSet<String> userHeaderSearchPaths =
+ NestedSetBuilder.<String>linkOrder()
+ .addTransitive(propagatedUserHeaderSearchPaths)
+ .addTransitive(nonPropagatedUserHeaderSearchPaths)
+ .addTransitive(strictlyPropagatedUserHeaderSearchPaths)
+ .build();
+ NestedSet<String> headerSearchPaths =
+ NestedSetBuilder.<String>linkOrder()
+ .addTransitive(propagatedHeaderSearchPaths)
+ .addTransitive(nonPropagatedHeaderSearchPaths)
+ .addTransitive(strictlyPropagatedHeaderSearchPaths)
+ .build();
// TODO(bazel-team): Add provisioning profile information when Xcodegen supports it.
TargetControl.Builder targetControl =