diff options
author | 2015-04-16 15:12:37 +0000 | |
---|---|---|
committer | 2015-04-16 18:38:49 +0000 | |
commit | 29b05c8e6c48b4028a06cd788d833506cce090eb (patch) | |
tree | dc5852c6c7d4e713d2bc3b746379cb558b55fdb2 | |
parent | 352b9da0d738b56112252e97d601297852233fdd (diff) |
RELNOTES:Observe "non_propagated_deps" on objc rules in generated XCode project files.
--
MOS_MIGRATED_REVID=91300378
6 files changed, 105 insertions, 35 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java index 6b85809ae3..d50bdd8bf8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java @@ -127,7 +127,8 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory .addXcodeSettings(xcodeProviderBuilder, objcProvider, productType) .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET)) .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET)) - .addDependencies(xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) + .addNonPropagatedDependencies( + xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) .addFilesToBuild(filesToBuild); XcodeProvider xcodeProvider = xcodeProviderBuilder.build(); xcodeSupport.registerActions(xcodeProvider); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java index 0b4e5d6032..7171706dd8 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java @@ -146,7 +146,8 @@ public abstract class IosTest implements RuleConfiguredTargetFactory { .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), productType) .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET)) .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET)) - .addDependencies(xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) + .addNonPropagatedDependencies( + xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) .addFilesToBuild(filesToBuild) .registerActions(xcodeProviderBuilder.build()); diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java index 36fed31bc3..7d62173376 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java @@ -102,7 +102,8 @@ public class ObjcLibrary implements RuleConfiguredTargetFactory { .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), LIBRARY_STATIC) .addDependencies(xcodeProviderBuilder, new Attribute("bundles", Mode.TARGET)) .addDependencies(xcodeProviderBuilder, new Attribute("deps", Mode.TARGET)) - .addDependencies(xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) + .addNonPropagatedDependencies( + xcodeProviderBuilder, new Attribute("non_propagated_deps", Mode.TARGET)) .registerActions(xcodeProviderBuilder.build()); return common.configuredTarget( diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java index f4a9a10fd3..90483b4095 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java @@ -180,7 +180,7 @@ public class ObjcProtoLibrary implements RuleConfiguredTargetFactory { .setLabel(ruleContext.getLabel()) .setArchitecture(configuration.getIosCpu()) .addUserHeaderSearchPaths(searchPathEntries) - .addDependencies(protoDeps, configuration) + .addPropagatedDependencies(protoDeps, configuration) .addCopts(configuration.getCopts()) .setProductType(LIBRARY_STATIC) .addHeaders(protoGeneratedHeaders) 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 07f9885c51..64268664ab 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 @@ -64,10 +64,19 @@ public final class XcodeProvider implements TransitiveInfoProvider { */ public static final class Builder { private Label label; - private final NestedSetBuilder<String> userHeaderSearchPaths = NestedSetBuilder.stableOrder(); - private final NestedSetBuilder<String> headerSearchPaths = NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<String> propagatedUserHeaderSearchPaths = + NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<String> nonPropagatedUserHeaderSearchPaths = + NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<String> propagatedHeaderSearchPaths = + NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<String> nonPropagatedHeaderSearchPaths = + NestedSetBuilder.stableOrder(); private Optional<InfoplistMerging> infoplistMerging = Optional.absent(); - private final NestedSetBuilder<XcodeProvider> dependencies = NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<XcodeProvider> propagatedDependencies = + NestedSetBuilder.stableOrder(); + private final NestedSetBuilder<XcodeProvider> nonPropagatedDependencies = + NestedSetBuilder.stableOrder(); private final ImmutableList.Builder<XcodeprojBuildSetting> xcodeprojBuildSettings = new ImmutableList.Builder<>(); private final ImmutableList.Builder<String> copts = new ImmutableList.Builder<>(); @@ -96,7 +105,8 @@ public final class XcodeProvider implements TransitiveInfoProvider { * Adds user header search paths for this target. */ public Builder addUserHeaderSearchPaths(Iterable<PathFragment> userHeaderSearchPaths) { - this.userHeaderSearchPaths.addAll(rootEach("$(WORKSPACE_ROOT)", userHeaderSearchPaths)); + this.propagatedUserHeaderSearchPaths + .addAll(rootEach("$(WORKSPACE_ROOT)", userHeaderSearchPaths)); return this; } @@ -105,7 +115,7 @@ public final class XcodeProvider implements TransitiveInfoProvider { * root, such as {@code "$(WORKSPACE_ROOT)"}. */ public Builder addHeaderSearchPaths(String root, Iterable<PathFragment> paths) { - this.headerSearchPaths.addAll(rootEach(root, paths)); + this.propagatedHeaderSearchPaths.addAll(rootEach(root, paths)); return this; } @@ -125,16 +135,30 @@ public final class XcodeProvider implements TransitiveInfoProvider { */ private void addTransitiveSets(XcodeProvider dependencyish) { inputsToXcodegen.addTransitive(dependencyish.inputsToXcodegen); - userHeaderSearchPaths.addTransitive(dependencyish.userHeaderSearchPaths); - headerSearchPaths.addTransitive(dependencyish.headerSearchPaths); + propagatedUserHeaderSearchPaths.addTransitive(dependencyish.propagatedUserHeaderSearchPaths); + propagatedHeaderSearchPaths.addTransitive(dependencyish.propagatedHeaderSearchPaths); } - /** + /** + * Adds {@link XcodeProvider}s corresponding to direct dependencies of this target which should + * be added in the {@code .xcodeproj} file and propagated up the dependency chain. + */ + public Builder addPropagatedDependencies(Iterable<XcodeProvider> dependencies, + ObjcConfiguration configuration) { + return addDependencies(dependencies, configuration, /*doPropagate=*/true); + } + + /** * Adds {@link XcodeProvider}s corresponding to direct dependencies of this target which should - * be added in the {@code .xcodeproj} file. + * be added in the {@code .xcodeproj} file and not propagated up the dependency chain. */ - public Builder addDependencies( - Iterable<XcodeProvider> dependencies, ObjcConfiguration configuration) { + public Builder addNonPropagatedDependencies(Iterable<XcodeProvider> dependencies, + ObjcConfiguration configuration) { + return addDependencies(dependencies, configuration, /*doPropagate=*/false); + } + + private Builder addDependencies(Iterable<XcodeProvider> dependencies, + ObjcConfiguration configuration, boolean doPropagate) { String architecture = configuration.getDependencySingleArchitecture(); for (XcodeProvider dependency : dependencies) { // TODO(bazel-team): This is messy. Maybe we should make XcodeProvider be able to specify @@ -144,9 +168,19 @@ public final class XcodeProvider implements TransitiveInfoProvider { this.extensions.add(dependency); this.inputsToXcodegen.addTransitive(dependency.inputsToXcodegen); } else if (dependency.architecture.equals(architecture)) { - this.dependencies.add(dependency); - this.dependencies.addTransitive(dependency.dependencies); - this.addTransitiveSets(dependency); + if (doPropagate) { + this.propagatedDependencies.add(dependency); + this.propagatedDependencies.addTransitive(dependency.propagatedDependencies); + this.addTransitiveSets(dependency); + } else { + this.nonPropagatedDependencies.add(dependency); + this.nonPropagatedDependencies.addTransitive(dependency.propagatedDependencies); + this.nonPropagatedUserHeaderSearchPaths + .addTransitive(dependency.propagatedUserHeaderSearchPaths); + this.nonPropagatedHeaderSearchPaths + .addTransitive(dependency.propagatedHeaderSearchPaths); + this.inputsToXcodegen.addTransitive(dependency.inputsToXcodegen); + } } } return this; @@ -313,10 +347,13 @@ public final class XcodeProvider implements TransitiveInfoProvider { } private final Label label; - private final NestedSet<String> userHeaderSearchPaths; - private final NestedSet<String> headerSearchPaths; + private final NestedSet<String> propagatedUserHeaderSearchPaths; + private final NestedSet<String> nonPropagatedUserHeaderSearchPaths; + private final NestedSet<String> propagatedHeaderSearchPaths; + private final NestedSet<String> nonPropagatedHeaderSearchPaths; private final Optional<InfoplistMerging> infoplistMerging; - private final NestedSet<XcodeProvider> dependencies; + private final NestedSet<XcodeProvider> propagatedDependencies; + private final NestedSet<XcodeProvider> nonPropagatedDependencies; private final ImmutableList<XcodeprojBuildSetting> xcodeprojBuildSettings; private final ImmutableList<String> copts; private final ImmutableList<String> compilationModeCopts; @@ -333,10 +370,13 @@ public final class XcodeProvider implements TransitiveInfoProvider { private XcodeProvider(Builder builder) { this.label = Preconditions.checkNotNull(builder.label); - this.userHeaderSearchPaths = builder.userHeaderSearchPaths.build(); - this.headerSearchPaths = builder.headerSearchPaths.build(); + this.propagatedUserHeaderSearchPaths = builder.propagatedUserHeaderSearchPaths.build(); + this.nonPropagatedUserHeaderSearchPaths = builder.nonPropagatedUserHeaderSearchPaths.build(); + this.propagatedHeaderSearchPaths = builder.propagatedHeaderSearchPaths.build(); + this.nonPropagatedHeaderSearchPaths = builder.nonPropagatedHeaderSearchPaths.build(); this.infoplistMerging = builder.infoplistMerging; - this.dependencies = builder.dependencies.build(); + this.propagatedDependencies = builder.propagatedDependencies.build(); + this.nonPropagatedDependencies = builder.nonPropagatedDependencies.build(); this.xcodeprojBuildSettings = builder.xcodeprojBuildSettings.build(); this.copts = builder.copts.build(); this.compilationModeCopts = builder.compilationModeCopts.build(); @@ -354,7 +394,8 @@ public final class XcodeProvider implements TransitiveInfoProvider { private void collectProviders(Set<XcodeProvider> allProviders) { if (allProviders.add(this)) { - for (XcodeProvider dependency : dependencies) { + for (XcodeProvider dependency : Iterables.concat(propagatedDependencies, + nonPropagatedDependencies)) { dependency.collectProviders(allProviders); } for (XcodeProvider justTestHost : testHost.asSet()) { @@ -366,7 +407,8 @@ public final class XcodeProvider implements TransitiveInfoProvider { } } - private static final EnumSet<XcodeProductType> CAN_LINK_PRODUCT_TYPES = EnumSet.of( + @VisibleForTesting + static final EnumSet<XcodeProductType> CAN_LINK_PRODUCT_TYPES = EnumSet.of( XcodeProductType.APPLICATION, XcodeProductType.BUNDLE, XcodeProductType.UNIT_TEST, XcodeProductType.EXTENSION); @@ -385,6 +427,15 @@ public final class XcodeProvider implements TransitiveInfoProvider { private TargetControl targetControl() { String buildFilePath = label.getPackageFragment().getSafePathString() + "/BUILD"; + NestedSet<String> userHeaderSearchPaths = NestedSetBuilder.<String>stableOrder() + .addTransitive(propagatedUserHeaderSearchPaths) + .addTransitive(nonPropagatedUserHeaderSearchPaths) + .build(); + NestedSet<String> headerSearchPaths = NestedSetBuilder.<String>stableOrder() + .addTransitive(propagatedHeaderSearchPaths) + .addTransitive(nonPropagatedHeaderSearchPaths) + .build(); + // TODO(bazel-team): Add provisioning profile information when Xcodegen supports it. TargetControl.Builder targetControl = TargetControl.newBuilder() .setName(label.getName()) @@ -415,11 +466,12 @@ public final class XcodeProvider implements TransitiveInfoProvider { .addSupportFile(buildFilePath); if (CAN_LINK_PRODUCT_TYPES.contains(productType)) { - for (XcodeProvider dependency : dependencies) { - // Only add a library target to a binary's dependencies if it has source files to compile. - // Xcode cannot build targets without a source file in the PBXSourceFilesBuildPhase, so if - // such a target is present in the control file, it is only to get Xcodegen to put headers - // and resources not used by the final binary in the Project Navigator. + 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 + // without a source file in the PBXSourceFilesBuildPhase, so if such a target is present in + // the control file, it is only to get Xcodegen to put headers and resources not used by the + // final binary in the Project Navigator. // // The exceptions to this rule are objc_bundle_library and ios_extension targets. Bundles // are generally used for resources and can lack a PBXSourceFilesBuildPhase in the project diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java index e176346570..db59f0112a 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java +++ b/src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java @@ -107,11 +107,26 @@ public final class XcodeSupport { * @return this xcode support */ XcodeSupport addDependencies(Builder xcodeProviderBuilder, Attribute attribute) { - Iterable<XcodeProvider> dependencies = ruleContext.getPrerequisites( - attribute.getName(), attribute.getAccessMode(), XcodeProvider.class); + xcodeProviderBuilder.addPropagatedDependencies( + ruleContext.getPrerequisites( + attribute.getName(), attribute.getAccessMode(), XcodeProvider.class), + ObjcRuleClasses.objcConfiguration(ruleContext)); + return this; + } - xcodeProviderBuilder - .addDependencies(dependencies, ObjcRuleClasses.objcConfiguration(ruleContext)); + /** + * Adds non-propagated dependencies to the given provider builder from the given attribute. + * + * <p>A non-propagated dependency will not be linked into the final app bundle and can only serve + * as a compile-only dependency for its direct dependent. + * + * @return this xcode support + */ + XcodeSupport addNonPropagatedDependencies(Builder xcodeProviderBuilder, Attribute attribute) { + xcodeProviderBuilder.addNonPropagatedDependencies( + ruleContext.getPrerequisites( + attribute.getName(), attribute.getAccessMode(), XcodeProvider.class), + ObjcRuleClasses.objcConfiguration(ruleContext)); return this; } } |