aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Googler <noreply@google.com>2015-04-16 15:12:37 +0000
committerGravatar Kristina Chodorow <kchodorow@google.com>2015-04-16 18:38:49 +0000
commit29b05c8e6c48b4028a06cd788d833506cce090eb (patch)
treedc5852c6c7d4e713d2bc3b746379cb558b55fdb2
parent352b9da0d738b56112252e97d601297852233fdd (diff)
RELNOTES:Observe "non_propagated_deps" on objc rules in generated XCode project files.
-- MOS_MIGRATED_REVID=91300378
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosTest.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcLibrary.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcProtoLibrary.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java106
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java23
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;
}
}