From 26389edbc1595599de67742effd13ca7da829c05 Mon Sep 17 00:00:00 2001 From: Sergio Campama Date: Thu, 1 Sep 2016 16:31:08 +0000 Subject: Adds strict header propagation for xcodegen projects. -- MOS_MIGRATED_REVID=131956896 --- .../build/lib/rules/objc/ProtobufSupport.java | 7 ++- .../build/lib/rules/objc/XcodeProvider.java | 71 ++++++++++++++++++---- 2 files changed, 66 insertions(+), 12 deletions(-) (limited to 'src') 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 propagatedUserHeaderSearchPaths = NestedSetBuilder.linkOrder(); private final NestedSetBuilder nonPropagatedUserHeaderSearchPaths = NestedSetBuilder.linkOrder(); + private final NestedSetBuilder strictlyPropagatedUserHeaderSearchPaths = + NestedSetBuilder.linkOrder(); private final NestedSetBuilder propagatedHeaderSearchPaths = NestedSetBuilder.linkOrder(); private final NestedSetBuilder nonPropagatedHeaderSearchPaths = NestedSetBuilder.linkOrder(); - private Optional bundleInfoplist = Optional.absent(); + private final NestedSetBuilder strictlyPropagatedHeaderSearchPaths = + NestedSetBuilder.linkOrder(); // Dependencies must be in link order because XCode observes the dependency ordering for // binary linking. private final NestedSetBuilder propagatedDependencies = NestedSetBuilder.linkOrder(); private final NestedSetBuilder nonPropagatedDependencies = NestedSetBuilder.linkOrder(); + private final NestedSetBuilder strictlyPropagatedDependencies = + NestedSetBuilder.linkOrder(); + private Optional bundleInfoplist = Optional.absent(); private final NestedSetBuilder jreDependencies = NestedSetBuilder.linkOrder(); private final ImmutableList.Builder 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 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 propagatedUserHeaderSearchPaths; private final NestedSet nonPropagatedUserHeaderSearchPaths; + private final NestedSet strictlyPropagatedUserHeaderSearchPaths; private final NestedSet propagatedHeaderSearchPaths; private final NestedSet nonPropagatedHeaderSearchPaths; + private final NestedSet strictlyPropagatedHeaderSearchPaths; private final Optional bundleInfoplist; private final NestedSet propagatedDependencies; private final NestedSet nonPropagatedDependencies; + private final NestedSet strictlyPropagatedDependencies; private final NestedSet jreDependencies; private final ImmutableList xcodeprojBuildSettings; private final ImmutableList 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 allProviders) { if (allProviders.add(this)) { - for (XcodeProvider dependency : Iterables.concat(propagatedDependencies, - nonPropagatedDependencies)) { + Iterable 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 userHeaderSearchPaths = NestedSetBuilder.linkOrder() - .addTransitive(propagatedUserHeaderSearchPaths) - .addTransitive(nonPropagatedUserHeaderSearchPaths) - .build(); - NestedSet headerSearchPaths = NestedSetBuilder.linkOrder() - .addTransitive(propagatedHeaderSearchPaths) - .addTransitive(nonPropagatedHeaderSearchPaths) - .build(); + NestedSet userHeaderSearchPaths = + NestedSetBuilder.linkOrder() + .addTransitive(propagatedUserHeaderSearchPaths) + .addTransitive(nonPropagatedUserHeaderSearchPaths) + .addTransitive(strictlyPropagatedUserHeaderSearchPaths) + .build(); + NestedSet headerSearchPaths = + NestedSetBuilder.linkOrder() + .addTransitive(propagatedHeaderSearchPaths) + .addTransitive(nonPropagatedHeaderSearchPaths) + .addTransitive(strictlyPropagatedHeaderSearchPaths) + .build(); // TODO(bazel-team): Add provisioning profile information when Xcodegen supports it. TargetControl.Builder targetControl = -- cgit v1.2.3