aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib
diff options
context:
space:
mode:
authorGravatar Peter Schmitt <schmitt@google.com>2015-04-22 22:35:28 +0000
committerGravatar Laszlo Csomor <laszlocsomor@google.com>2015-04-23 09:20:04 +0000
commit679d01c50cb0826425e32d0fe2b279949e18aa77 (patch)
tree98c394576d563086b17416fbbd989b3be8c81a63 /src/main/java/com/google/devtools/build/lib
parente31b97436487c6f99280f2ff776661b9a6287791 (diff)
Ensure extension's bundle minimum OS version is at least 8.0.
This is required because Apple does not accept extensions whose plist has a minimum OS value lower than 8.0, or whose code is compiled at less than 8.0, even if it is included in an application that is compiled for, and marked compatible with, a lower OS version. Note that I didn't make this an attribute for now as there are no use cases for setting the value to anything but 8.0. If we ever need to make this user-configurable, a value can easily be set. -- MOS_MIGRATED_REVID=91831415
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BinaryLinkingTargetFactory.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java34
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java11
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java2
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java79
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java2
-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/ObjcBundleLibrary.java4
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java25
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java19
-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/ReleaseBundlingSupport.java113
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java14
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java13
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeProvider.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XcodeSupport.java26
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/XibFiles.java42
20 files changed, 312 insertions, 149 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 0566525aac..7475baf6f2 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
@@ -90,10 +90,12 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
Optional<RunfilesSupport> maybeRunfilesSupport = Optional.absent();
switch (hasReleaseBundlingSupport) {
case YES:
+ ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
// TODO(bazel-team): Remove once all bundle users are migrated to ios_application.
ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport(
ruleContext, objcProvider, optionsProvider,
- LinkedBinary.LOCAL_AND_DEPENDENCIES, ReleaseBundlingSupport.APP_BUNDLE_DIR_FORMAT);
+ LinkedBinary.LOCAL_AND_DEPENDENCIES, ReleaseBundlingSupport.APP_BUNDLE_DIR_FORMAT,
+ objcConfiguration.getMinimumOs());
releaseBundlingSupport
.registerActions()
.addXcodeSettings(xcodeProviderBuilder)
@@ -101,7 +103,6 @@ abstract class BinaryLinkingTargetFactory implements RuleConfiguredTargetFactory
.validateResources()
.validateAttributes();
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
xcTestAppProvider = Optional.of(releaseBundlingSupport.xcTestAppProvider());
if (objcConfiguration.getBundlingPlatform() == Platform.SIMULATOR) {
Artifact runnerScript = intermediateArtifacts.runnerScript();
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java
index d0be20c12e..a90e23b8e6 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleMergeControlBytes.java
@@ -67,7 +67,7 @@ final class BundleMergeControlBytes extends ByteSource {
.addAllSourcePlistFile(Artifact.toExecPaths(
bundling.getInfoplistMerging().getPlistWithEverything().asSet()))
// TODO(bazel-team): Add rule attribute for specifying targeted device family
- .setMinimumOsVersion(objcConfiguration.getMinimumOs())
+ .setMinimumOsVersion(bundling.getMinimumOsVersion())
.setSdkVersion(objcConfiguration.getIosSdkVersion())
.setPlatform(objcConfiguration.getBundlingPlatform().name())
.setBundleRoot(bundling.getBundleDir());
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
index 8d51f5752d..4b586c1e6a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/BundleSupport.java
@@ -20,7 +20,6 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XCASSETS_DIR
import com.google.common.base.Optional;
import com.google.common.base.Verify;
-import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.FilesToRunProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
@@ -192,8 +191,6 @@ final class BundleSupport {
private void registerInterfaceBuilderActions(ObjcProvider objcProvider) {
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
- String minimumOs = objcConfiguration.getMinimumOs();
for (Artifact storyboardInput : objcProvider.get(ObjcProvider.STORYBOARD)) {
String archiveRoot = BundleableFile.flatBundlePath(storyboardInput.getExecPath()) + "c";
Artifact zipOutput = intermediateArtifacts.compiledStoryboardZip(storyboardInput);
@@ -208,7 +205,7 @@ final class BundleSupport {
.add(archiveRoot)
.addPath(ObjcActionsBuilder.IBTOOL)
- .add("--minimum-deployment-target").add(minimumOs)
+ .add("--minimum-deployment-target").add(bundling.getMinimumOsVersion())
.addPath(storyboardInput.getExecPath())
.build())
.addOutput(zipOutput)
@@ -234,25 +231,21 @@ final class BundleSupport {
.addPath(outputZip.getExecPath())
.add(datamodel.archiveRootForMomczip())
.add(IosSdkCommands.MOMC_PATH)
- .add(commonMomczipArguments(objcConfiguration))
+
+ .add("-XD_MOMC_SDKROOT=" + IosSdkCommands.sdkDir(objcConfiguration))
+ .add("-XD_MOMC_IOS_TARGET_VERSION=" + bundling.getMinimumOsVersion())
+ .add("-MOMC_PLATFORMS")
+ .add(objcConfiguration.getBundlingPlatform().getLowerCaseNameInPlist())
+ .add("-XD_MOMC_TARGET_VERSION=10.6")
.add(datamodel.getContainer().getSafePathString())
.build())
.build(ruleContext));
}
}
- static Iterable<String> commonMomczipArguments(ObjcConfiguration configuration) {
- return ImmutableList.of(
- "-XD_MOMC_SDKROOT=" + IosSdkCommands.sdkDir(configuration),
- "-XD_MOMC_IOS_TARGET_VERSION=" + configuration.getMinimumOs(),
- "-MOMC_PLATFORMS", configuration.getBundlingPlatform().getLowerCaseNameInPlist(),
- "-XD_MOMC_TARGET_VERSION=10.6");
- }
-
private void registerConvertXibsActions(ObjcProvider objcProvider) {
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
- ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
for (Artifact original : objcProvider.get(ObjcProvider.XIB)) {
Artifact zipOutput = intermediateArtifacts.compiledXibFileZip(original);
String archiveRoot = BundleableFile.flatBundlePath(
@@ -267,7 +260,7 @@ final class BundleSupport {
.add(archiveRoot)
.addPath(ObjcActionsBuilder.IBTOOL)
- .add("--minimum-deployment-target").add(objcConfiguration.getMinimumOs())
+ .add("--minimum-deployment-target").add(bundling.getMinimumOsVersion())
.addPath(original.getExecPath())
.build())
.addOutput(zipOutput)
@@ -294,15 +287,6 @@ final class BundleSupport {
}
}
- /**
- * Validates any rule attributes and dependencies related to this bundle.
- *
- * @return this bundle support
- */
- BundleSupport validateAttributes() {
- return this;
- }
-
private void registerMergeInfoplistAction() {
// TODO(bazel-team): Move action implementation from InfoplistMerging to this class.
ruleContext.registerAction(bundling.getInfoplistMerging().getMergeAction());
@@ -348,7 +332,7 @@ final class BundleSupport {
.add("--platform").add(objcConfiguration.getBundlingPlatform().getLowerCaseNameInPlist())
.addExecPath("--output-partial-info-plist", partialInfoPlist)
- .add("--minimum-deployment-target").add(objcConfiguration.getMinimumOs());
+ .add("--minimum-deployment-target").add(bundling.getMinimumOsVersion());
for (TargetDeviceFamily targetDeviceFamily : targetDeviceFamilies) {
commandLine.add("--target-device").add(targetDeviceFamily.name().toLowerCase(Locale.US));
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
index 8b5edfdabb..1ddc16a749 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java
@@ -28,7 +28,6 @@ import static com.google.devtools.build.lib.rules.objc.ObjcProvider.XIB;
import com.google.common.base.Optional;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
-import com.google.common.collect.ImmutableList.Builder;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
@@ -57,6 +56,7 @@ final class Bundling {
private String primaryBundleId;
private String fallbackBundleId;
private String architecture;
+ private String minimumOsVersion;
public Builder setName(String name) {
this.name = name;
@@ -107,6 +107,15 @@ final class Bundling {
return this;
}
+ /**
+ * Sets the minimum OS version for this bundle which will be used when constructing the bundle's
+ * plist.
+ */
+ public Builder setMinimumOsVersion(String minimumOsVersion) {
+ this.minimumOsVersion = minimumOsVersion;
+ return this;
+ }
+
private static NestedSet<Artifact> nestedBundleContentArtifacts(Iterable<Bundling> bundles) {
NestedSetBuilder<Artifact> artifacts = NestedSetBuilder.stableOrder();
for (Bundling bundle : bundles) {
@@ -175,7 +184,7 @@ final class Bundling {
return new Bundling(name, bundleDirFormat, combinedArchitectureBinary, extraBundleFiles,
objcProvider, infoplistMerging, actoolzipOutput, bundleContentArtifactsBuilder.build(),
- mergeZips, primaryBundleId, fallbackBundleId, architecture);
+ mergeZips, primaryBundleId, fallbackBundleId, architecture, minimumOsVersion);
}
}
@@ -191,6 +200,7 @@ final class Bundling {
private final NestedSet<Artifact> mergeZips;
private final String primaryBundleId;
private final String fallbackBundleId;
+ private final String minimumOsVersion;
private Bundling(
String name,
@@ -204,7 +214,8 @@ final class Bundling {
NestedSet<Artifact> mergeZips,
String primaryBundleId,
String fallbackBundleId,
- String architecture) {
+ String architecture,
+ String minimumOsVersion) {
this.name = Preconditions.checkNotNull(name);
this.bundleDirFormat = Preconditions.checkNotNull(bundleDirFormat);
this.combinedArchitectureBinary = Preconditions.checkNotNull(combinedArchitectureBinary);
@@ -217,6 +228,7 @@ final class Bundling {
this.fallbackBundleId = fallbackBundleId;
this.primaryBundleId = primaryBundleId;
this.architecture = Preconditions.checkNotNull(architecture);
+ this.minimumOsVersion = Preconditions.checkNotNull(minimumOsVersion);
}
/**
@@ -328,4 +340,12 @@ final class Bundling {
public String getArchitecture() {
return architecture;
}
+
+ /**
+ * Returns the minimum iOS version this bundle's plist and resources should be generated for
+ * (does <b>not</b> affect the minimum OS version its binary is compiled with).
+ */
+ public String getMinimumOsVersion() {
+ return minimumOsVersion;
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
index d852bb49cd..ee1a3edf88 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java
@@ -43,7 +43,7 @@ final class IntermediateArtifacts {
private final String archiveFileNameSuffix;
/**
- * Label to scope the output paths of generated artifacts, in addition to {@link ownerLabel}.
+ * Label to scope the output paths of generated artifacts, in addition to {@link #ownerLabel}.
*/
private final Optional<Label> scopingLabel;
@@ -231,9 +231,8 @@ final class IntermediateArtifacts {
* file.
*/
public Artifact compiledXibFileZip(Artifact originalFile) {
- return analysisEnvironment.getDerivedArtifact(
- FileSystemUtils.replaceExtension(originalFile.getExecPath(), ".nib.zip"),
- binDirectory);
+ return appendExtension(
+ "/" + FileSystemUtils.replaceExtension(originalFile.getExecPath(), ".nib.zip"));
}
/**
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java
index 4b8c7603aa..d76d1c0af5 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplication.java
@@ -20,12 +20,23 @@ import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition;
/**
* Implementation for {@code ios_application}.
*/
public class IosApplication extends ReleaseBundlingTargetFactory {
+ /**
+ * Transition that when applied to a target generates a configured target for each value in
+ * {@code --ios_multi_cpus}, such that {@code --ios_cpu} is set to a different one of those values
+ * in the configured targets.
+ */
+ public static final SplitTransition<BuildOptions> SPLIT_ARCH_TRANSITION =
+ new SplitArchTransition();
+
private static final ImmutableSet<Attribute> DEPENDENCY_ATTRIBUTES =
ImmutableSet.of(
new Attribute("binary", Mode.SPLIT),
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java
index 898150baa9..37a08c4530 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosApplicationRule.java
@@ -54,7 +54,7 @@ public class IosApplicationRule implements RuleDefinition {
.allowedFileTypes()
.mandatory()
.direct_compile_time_input()
- .cfg(ReleaseBundlingSupport.SPLIT_ARCH_TRANSITION))
+ .cfg(IosApplication.SPLIT_ARCH_TRANSITION))
/* <!-- #BLAZE_RULE(ios_application).ATTRIBUTE(extensions) -->
Any extensions to include in the final application.
${SYNOPSIS}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java
index fa2e8fbef6..c1ceab997c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtension.java
@@ -14,18 +14,41 @@
package com.google.devtools.build.lib.rules.objc;
+import com.google.common.annotations.VisibleForTesting;
+import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.analysis.RuleConfiguredTarget.Mode;
import com.google.devtools.build.lib.analysis.RuleContext;
+import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition;
+
+import java.io.Serializable;
/**
* Implementation for {@code ios_extension}.
*/
public class IosExtension extends ReleaseBundlingTargetFactory {
+ /**
+ * Transition that when applied to a target generates a configured target for each value in
+ * {@code --ios_multi_cpus}, such that {@code --ios_cpu} is set to a different one of those values
+ * in the configured targets.
+ *
+ * <p>Also ensures that, no matter whether {@code --ios_multi_cpus} is set, {@code
+ * --ios_minimum_os} is at least {@code 8.0} as Apple requires this for extensions.
+ */
+ static final SplitTransition<BuildOptions> MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION =
+ new ExtensionSplitArchTransition();
+
+ // Apple only accepts extensions starting at 8.0.
+ @VisibleForTesting
+ static final String EXTENSION_MINIMUM_OS_VERSION = "8.0";
+
public IosExtension() {
super(ReleaseBundlingSupport.EXTENSION_BUNDLE_DIR_FORMAT, XcodeProductType.EXTENSION,
- ExposeAsNestedBundle.YES, ImmutableSet.of(new Attribute("binary", Mode.SPLIT)));
+ ExposeAsNestedBundle.YES, ImmutableSet.of(new Attribute("binary", Mode.SPLIT))
+ );
}
protected OptionsProvider optionsProvider(RuleContext ruleContext) {
@@ -33,4 +56,58 @@ public class IosExtension extends ReleaseBundlingTargetFactory {
.addInfoplists(ruleContext.getPrerequisiteArtifacts("infoplist", Mode.TARGET).list())
.build();
}
+
+ @Override
+ protected String bundleMinimumOsVersion(RuleContext ruleContext) {
+ return determineMinimumOsVersion(ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs());
+ }
+
+ private static String determineMinimumOsVersion(String fromFlag) {
+ if (Double.parseDouble(fromFlag) < Double.parseDouble(EXTENSION_MINIMUM_OS_VERSION)) {
+ // Extensions are not accepted by Apple below version 8.0. While applications built with a
+ // minimum iOS version of less than 8.0 may contain extensions in their bundle, the extension
+ // itself needs to be built with 8.0 or higher. This logic overrides (if necessary) any
+ // flag-set minimum iOS version for extensions only so that this requirement is not violated.
+ return EXTENSION_MINIMUM_OS_VERSION;
+ }
+ return fromFlag;
+ }
+
+ /**
+ * Split transition that configures the minimum iOS version in addition to architecture splitting.
+ */
+ private static class ExtensionSplitArchTransition extends SplitArchTransition
+ implements Serializable {
+
+ @Override
+ protected ImmutableList<BuildOptions> defaultOptions(BuildOptions originalOptions) {
+ ObjcCommandLineOptions objcOptions = originalOptions.get(ObjcCommandLineOptions.class);
+ String newMinimumVersion = determineMinimumOsVersion(objcOptions.iosMinimumOs);
+
+ if (newMinimumVersion.equals(objcOptions.iosMinimumOs)) {
+ return ImmutableList.of();
+ }
+
+ BuildOptions splitOptions = originalOptions.clone();
+ setMinimumOsVersion(splitOptions, newMinimumVersion);
+ splitOptions.get(ObjcCommandLineOptions.class).configurationDistinguisher =
+ getConfigurationDistinguisher();
+ return ImmutableList.of(splitOptions);
+ }
+
+ @Override
+ protected void setAdditionalOptions(BuildOptions splitOptions, BuildOptions originalOptions) {
+ String fromFlag = originalOptions.get(ObjcCommandLineOptions.class).iosMinimumOs;
+ setMinimumOsVersion(splitOptions, determineMinimumOsVersion(fromFlag));
+ }
+
+ @Override
+ protected ConfigurationDistinguisher getConfigurationDistinguisher() {
+ return ConfigurationDistinguisher.EXTENSION;
+ }
+
+ private void setMinimumOsVersion(BuildOptions splitOptions, String newMinimumVersion) {
+ splitOptions.get(ObjcCommandLineOptions.class).iosMinimumOs = newMinimumVersion;
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
index eaf0f0a8fd..76d6290561 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/IosExtensionRule.java
@@ -50,7 +50,7 @@ public class IosExtensionRule implements RuleDefinition {
.allowedFileTypes()
.mandatory()
.direct_compile_time_input()
- .cfg(ReleaseBundlingSupport.SPLIT_ARCH_TRANSITION))
+ .cfg(IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION))
.build();
}
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 17e8395789..a76af46b61 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
@@ -122,9 +122,10 @@ public abstract class IosTest implements RuleConfiguredTargetFactory {
.addXcodeSettings(xcodeProviderBuilder, common, optionsProvider)
.validateAttributes();
+ ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport(
ruleContext, common.getObjcProvider(), optionsProvider, LinkedBinary.LOCAL_AND_DEPENDENCIES,
- ReleaseBundlingSupport.APP_BUNDLE_DIR_FORMAT);
+ ReleaseBundlingSupport.APP_BUNDLE_DIR_FORMAT, objcConfiguration.getMinimumOs());
releaseBundlingSupport
.registerActions()
.addXcodeSettings(xcodeProviderBuilder)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java
index 7e4c48c15a..005eb67a36 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcBundleLibrary.java
@@ -82,15 +82,17 @@ public class ObjcBundleLibrary implements RuleConfiguredTargetFactory {
RuleContext ruleContext, ObjcCommon common, OptionsProvider optionsProvider) {
IntermediateArtifacts intermediateArtifacts =
ObjcRuleClasses.intermediateArtifacts(ruleContext);
+ ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
return new Bundling.Builder()
.setName(ruleContext.getLabel().getName())
- .setArchitecture(ObjcRuleClasses.objcConfiguration(ruleContext).getIosCpu())
+ .setArchitecture(objcConfiguration.getIosCpu())
.setBundleDirFormat("%s.bundle")
.setObjcProvider(common.getObjcProvider())
.setInfoplistMerging(
BundleSupport.infoPlistMerging(ruleContext, common.getObjcProvider(), optionsProvider,
new BundleSupport.ExtraMergePlists()))
.setIntermediateArtifacts(intermediateArtifacts)
+ .setMinimumOsVersion(objcConfiguration.getMinimumOs())
.build();
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
index b835e7a416..9d9d1735bb 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcCommandLineOptions.java
@@ -21,8 +21,10 @@ import com.google.devtools.build.lib.analysis.config.BuildConfiguration.LabelCon
import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.FragmentOptions;
import com.google.devtools.build.lib.packages.Attribute.SplitTransition;
+import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher;
import com.google.devtools.build.lib.syntax.Label;
import com.google.devtools.common.options.Converters.CommaSeparatedOptionListConverter;
+import com.google.devtools.common.options.EnumConverter;
import com.google.devtools.common.options.Option;
import java.util.List;
@@ -127,6 +129,19 @@ public class ObjcCommandLineOptions extends FragmentOptions {
help = "Whether to add include path entries for every individual proto file.")
public boolean perProtoIncludes;
+ // This option exists because two configurations are not allowed to have the same cache key
+ // (partially derived from options). Since we have multiple transitions (see
+ // getPotentialSplitTransitions below) that may result in the same configuration values at runtime
+ // we need an artificial way to distinguish between them. This option must only be set by those
+ // transitions for this purpose.
+ // TODO(bazel-team): Remove this once we have dynamic configurations but make sure that different
+ // configurations (e.g. by min os version) always use different output paths.
+ @Option(name = "DO_NOT_USE_configuration_distinguisher",
+ defaultValue = "UNKNOWN",
+ converter = ConfigurationDistinguisherConverter.class,
+ category = "undocumented")
+ public ConfigurationDistinguisher configurationDistinguisher;
+
@VisibleForTesting static final String DEFAULT_MINIMUM_IOS = "7.0";
@VisibleForTesting static final String DEFAULT_IOS_CPU = "i386";
@@ -152,6 +167,14 @@ public class ObjcCommandLineOptions extends FragmentOptions {
@Override
public List<SplitTransition<BuildOptions>> getPotentialSplitTransitions() {
- return ImmutableList.of(ReleaseBundlingSupport.SPLIT_ARCH_TRANSITION);
+ return ImmutableList.of(
+ IosApplication.SPLIT_ARCH_TRANSITION, IosExtension.MINIMUM_OS_AND_SPLIT_ARCH_TRANSITION);
+ }
+
+ public static final class ConfigurationDistinguisherConverter
+ extends EnumConverter<ConfigurationDistinguisher> {
+ public ConfigurationDistinguisherConverter() {
+ super(ConfigurationDistinguisher.class, "configuration distinguisher");
+ }
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
index 6d4310d5cd..870292cb8c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ObjcConfiguration.java
@@ -15,6 +15,7 @@
package com.google.devtools.build.lib.rules.objc;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Joiner;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
@@ -22,9 +23,12 @@ import com.google.devtools.build.lib.analysis.config.BuildOptions;
import com.google.devtools.build.lib.analysis.config.CompilationMode;
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
+import com.google.devtools.build.lib.rules.objc.ReleaseBundlingSupport.SplitArchTransition.ConfigurationDistinguisher;
import com.google.devtools.build.lib.syntax.Label;
+import java.util.ArrayList;
import java.util.List;
+import java.util.Locale;
import javax.annotation.Nullable;
@@ -58,6 +62,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
private final List<String> iosMultiCpus;
private final String iosSplitCpu;
private final boolean perProtoIncludes;
+ private final ConfigurationDistinguisher configurationDistinguisher;
// We only load these labels if the mode which uses them is enabled. That is know as part of the
// BuildConfiguration. This label needs to be part of a configuration because only configurations
@@ -88,6 +93,7 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
this.iosMultiCpus = Preconditions.checkNotNull(objcOptions.iosMultiCpus, "iosMultiCpus");
this.iosSplitCpu = Preconditions.checkNotNull(objcOptions.iosSplitCpu, "iosSplitCpu");
this.perProtoIncludes = objcOptions.perProtoIncludes;
+ this.configurationDistinguisher = objcOptions.configurationDistinguisher;
}
public String getIosSdkVersion() {
@@ -243,7 +249,18 @@ public class ObjcConfiguration extends BuildConfiguration.Fragment {
@Nullable
@Override
public String getOutputDirectoryName() {
- return !iosSplitCpu.isEmpty() ? "ios-" + iosSplitCpu : null;
+ List<String> components = new ArrayList<>();
+ if (!iosSplitCpu.isEmpty()) {
+ components.add("ios-" + iosSplitCpu);
+ }
+ if (configurationDistinguisher != ConfigurationDistinguisher.UNKNOWN) {
+ components.add(configurationDistinguisher.toString().toLowerCase(Locale.US));
+ }
+
+ if (components.isEmpty()) {
+ return null;
+ }
+ return Joiner.on('-').join(components);
}
@Override
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 90483b4095..63587e5325 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)
- .addPropagatedDependencies(protoDeps, configuration)
+ .addPropagatedDependencies(protoDeps)
.addCopts(configuration.getCopts())
.setProductType(LIBRARY_STATIC)
.addHeaders(protoGeneratedHeaders)
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
index 56f65d3bed..762bd84d3c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java
@@ -70,36 +70,6 @@ public final class ReleaseBundlingSupport {
*/
public static final SafeImplicitOutputsFunction IPA = fromTemplates("%{name}.ipa");
- /**
- * Transition that when applied to a target generates a configured target for each value in
- * {@code --ios_multi_cpus}, such that {@code --ios_cpu} is set to a different one of those values
- * in the configured targets.
- */
- public static final SplitTransition<BuildOptions> SPLIT_ARCH_TRANSITION =
- new SplitTransition<BuildOptions>() {
- @Override
- public List<BuildOptions> split(BuildOptions buildOptions) {
- List<String> iosMultiCpus = buildOptions.get(ObjcCommandLineOptions.class).iosMultiCpus;
- if (iosMultiCpus.isEmpty()) {
- return ImmutableList.of();
- }
-
- ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder();
- for (String iosCpu : iosMultiCpus) {
- BuildOptions splitOptions = buildOptions.clone();
- splitOptions.get(ObjcCommandLineOptions.class).iosSplitCpu = iosCpu;
- splitOptions.get(ObjcCommandLineOptions.class).iosCpu = iosCpu;
- splitBuildOptions.add(splitOptions);
- }
- return splitBuildOptions.build();
- }
-
- @Override
- public boolean defaultsToSelf() {
- return true;
- }
- };
-
@VisibleForTesting
static final String NO_ASSET_CATALOG_ERROR_FORMAT =
"a value was specified (%s), but this app does not have any asset catalogs";
@@ -154,18 +124,22 @@ public final class ReleaseBundlingSupport {
* @param linkedBinary whether to look for a linked binary from this rule and dependencies or just
* the latter
* @param bundleDirFormat format string representing the bundle's directory with a single
- * placeholder for the target name (e.g. {@code "Payload/%s.app"})
+ * placeholder for the target name (e.g. {@code "Payload/%s.app"})
+ * @param bundleMinimumOsVersion the minimum OS version this bundle's plist should be generated
+ * for (<b>not</b> the minimum OS version its binary is compiled with, that needs to be set
+ * through the configuration)
*/
ReleaseBundlingSupport(
RuleContext ruleContext, ObjcProvider objcProvider, OptionsProvider optionsProvider,
- LinkedBinary linkedBinary, String bundleDirFormat) {
+ LinkedBinary linkedBinary, String bundleDirFormat, String bundleMinimumOsVersion) {
this.linkedBinary = linkedBinary;
this.attributes = new Attributes(ruleContext);
this.ruleContext = ruleContext;
this.objcProvider = objcProvider;
this.families = ImmutableSet.copyOf(attributes.families());
this.intermediateArtifacts = ObjcRuleClasses.intermediateArtifacts(ruleContext);
- bundling = bundling(ruleContext, objcProvider, optionsProvider, bundleDirFormat);
+ bundling = bundling(
+ ruleContext, objcProvider, optionsProvider, bundleDirFormat, bundleMinimumOsVersion);
bundleSupport = new BundleSupport(ruleContext, families, bundling, extraActoolArgs());
}
@@ -414,7 +388,7 @@ public final class ReleaseBundlingSupport {
private Bundling bundling(
RuleContext ruleContext, ObjcProvider objcProvider, OptionsProvider optionsProvider,
- String bundleDirFormat) {
+ String bundleDirFormat, String minimumOsVersion) {
ImmutableList<BundleableFile> extraBundleFiles;
ObjcConfiguration objcConfiguration = ObjcRuleClasses.objcConfiguration(ruleContext);
if (objcConfiguration.getBundlingPlatform() == Platform.DEVICE) {
@@ -447,6 +421,7 @@ public final class ReleaseBundlingSupport {
.setIntermediateArtifacts(ObjcRuleClasses.intermediateArtifacts(ruleContext))
.setPrimaryBundleId(primaryBundleId)
.setFallbackBundleId(fallbackBundleId)
+ .setMinimumOsVersion(minimumOsVersion)
.build();
}
@@ -752,4 +727,74 @@ public final class ReleaseBundlingSupport {
return value.isEmpty() ? null : value;
}
}
+
+ /**
+ * Transition that results in one configured target per architecture set in {@code
+ * --ios_multi_cpus}.
+ */
+ protected static class SplitArchTransition implements SplitTransition<BuildOptions> {
+
+ @Override
+ public final List<BuildOptions> split(BuildOptions buildOptions) {
+ List<String> iosMultiCpus = buildOptions.get(ObjcCommandLineOptions.class).iosMultiCpus;
+ if (iosMultiCpus.isEmpty()) {
+ return defaultOptions(buildOptions);
+ }
+
+ ImmutableList.Builder<BuildOptions> splitBuildOptions = ImmutableList.builder();
+ for (String iosCpu : iosMultiCpus) {
+ BuildOptions splitOptions = buildOptions.clone();
+ setArchitectureOptions(splitOptions, iosCpu);
+ setAdditionalOptions(splitOptions, buildOptions);
+ splitOptions.get(ObjcCommandLineOptions.class).configurationDistinguisher =
+ getConfigurationDistinguisher();
+ splitBuildOptions.add(splitOptions);
+ }
+ return splitBuildOptions.build();
+ }
+
+ /**
+ * Returns the default options to use if no split architectures are specified.
+ *
+ * @param originalOptions original options before this transition
+ */
+ protected ImmutableList<BuildOptions> defaultOptions(BuildOptions originalOptions) {
+ return ImmutableList.of();
+ }
+
+ /**
+ * Sets or overwrites flags on the given split options.
+ *
+ * <p>Invoked once for each configuration produced by this transition.
+ *
+ * @param splitOptions options to use after this transition
+ * @param originalOptions original options before this transition
+ */
+ protected void setAdditionalOptions(BuildOptions splitOptions, BuildOptions originalOptions) {}
+
+ private void setArchitectureOptions(BuildOptions splitOptions, String iosCpu) {
+ splitOptions.get(ObjcCommandLineOptions.class).iosSplitCpu = iosCpu;
+ splitOptions.get(ObjcCommandLineOptions.class).iosCpu = iosCpu;
+ }
+
+ @Override
+ public boolean defaultsToSelf() {
+ return true;
+ }
+
+ /**
+ * Returns the configuration distinguisher for this transition instance.
+ */
+ protected ConfigurationDistinguisher getConfigurationDistinguisher() {
+ return ConfigurationDistinguisher.APPLICATION;
+ }
+
+ /**
+ * Value used to avoid multiple configurations from conflicting. No two instances of this
+ * transition may exist with the same value in a single Bazel invocation.
+ */
+ enum ConfigurationDistinguisher {
+ EXTENSION, APPLICATION, UNKNOWN
+ }
+ }
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java
index af98af5dce..8157bd73ca 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingTargetFactory.java
@@ -67,7 +67,7 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg
ReleaseBundlingSupport releaseBundlingSupport = new ReleaseBundlingSupport(
ruleContext, common.getObjcProvider(), optionsProvider(ruleContext),
- LinkedBinary.DEPENDENCIES_ONLY, bundleDirFormat);
+ LinkedBinary.DEPENDENCIES_ONLY, bundleDirFormat, bundleMinimumOsVersion(ruleContext));
releaseBundlingSupport
.registerActions()
.addXcodeSettings(xcodeProviderBuilder)
@@ -77,7 +77,8 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg
XcodeSupport xcodeSupport = new XcodeSupport(ruleContext)
.addFilesToBuild(filesToBuild)
- .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), xcodeProductType)
+ .addXcodeSettings(xcodeProviderBuilder, common.getObjcProvider(), xcodeProductType,
+ ObjcRuleClasses.objcConfiguration(ruleContext).getDependencySingleArchitecture())
.addDummySource(xcodeProviderBuilder);
for (Attribute attribute : dependencyAttributes) {
@@ -106,6 +107,15 @@ public abstract class ReleaseBundlingTargetFactory implements RuleConfiguredTarg
}
/**
+ * Returns the minimum OS version this bundle's plist and resources should be generated for
+ * (<b>not</b> the minimum OS version its binary is compiled with, that needs to be set in the
+ * configuration).
+ */
+ protected String bundleMinimumOsVersion(RuleContext ruleContext) {
+ return ObjcRuleClasses.objcConfiguration(ruleContext).getMinimumOs();
+ }
+
+ /**
* Returns a provider based on this rule's options and those of its option-providing dependencies.
*/
protected abstract OptionsProvider optionsProvider(RuleContext ruleContext);
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java
index ff8601cb96..a7ac20cb59 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/objc/Xcdatamodel.java
@@ -19,7 +19,6 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.devtools.build.lib.actions.Artifact;
-import com.google.devtools.build.lib.util.FileType;
import com.google.devtools.build.lib.vfs.PathFragment;
/**
@@ -118,16 +117,4 @@ class Xcdatamodel extends Value<Xcdatamodel> {
}
});
}
-
- /**
- * Returns a sequence of all unique *.xcdatamodel directories that contain all the artifacts of
- * the given models. Note that this does not return any *.xcdatamodeld directories.
- */
- static Iterable<PathFragment> xcdatamodelDirs(Iterable<Xcdatamodel> models) {
- ImmutableSet.Builder<PathFragment> result = new ImmutableSet.Builder<>();
- for (Xcdatamodel model : models) {
- result.addAll(ObjcCommon.uniqueContainers(model.getInputs(), FileType.of(".xcdatamodel")));
- }
- return result.build();
- }
}
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 a7cbd61883..ab6b4f7384 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
@@ -49,8 +49,10 @@ 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.LinkedHashSet;
import java.util.List;
+import java.util.Map;
import java.util.Set;
/**
@@ -147,23 +149,19 @@ public final class XcodeProvider implements TransitiveInfoProvider {
* 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);
+ public Builder addPropagatedDependencies(Iterable<XcodeProvider> dependencies) {
+ 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 not propagated up the dependency chain.
*/
- public Builder addNonPropagatedDependencies(Iterable<XcodeProvider> dependencies,
- ObjcConfiguration configuration) {
- return addDependencies(dependencies, configuration, /*doPropagate=*/false);
+ public Builder addNonPropagatedDependencies(Iterable<XcodeProvider> dependencies) {
+ return addDependencies(dependencies, /*doPropagate=*/false);
}
- private Builder addDependencies(Iterable<XcodeProvider> dependencies,
- ObjcConfiguration configuration, boolean doPropagate) {
- String architecture = configuration.getDependencySingleArchitecture();
+ 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
// how to depend on it rather than require this method to choose based on the dependency's
@@ -171,7 +169,7 @@ public final class XcodeProvider implements TransitiveInfoProvider {
if (dependency.productType == XcodeProductType.EXTENSION) {
this.extensions.add(dependency);
this.inputsToXcodegen.addTransitive(dependency.inputsToXcodegen);
- } else if (dependency.architecture.equals(architecture)) {
+ } else {
if (doPropagate) {
this.propagatedDependencies.add(dependency);
this.propagatedDependencies.addTransitive(dependency.propagatedDependencies);
@@ -354,7 +352,21 @@ public final class XcodeProvider implements TransitiveInfoProvider {
}
ImmutableList.Builder<TargetControl> controls = new ImmutableList.Builder<>();
+ Map<Label, XcodeProvider> labelToProvider = new HashMap<>();
for (XcodeProvider provider : providerSet) {
+ XcodeProvider oldProvider = labelToProvider.put(provider.label, provider);
+ if (oldProvider != null) {
+ if (!oldProvider.architecture.equals(provider.architecture)) {
+ // Do not include duplicate dependencies whose architecture does not match this
+ // project's. This check avoids having multiple conflicting Xcode targets for the same
+ // BUILD target that are only distinguished by this field (which Xcode does not care
+ // about).
+ continue;
+ }
+
+ throw new IllegalStateException("Depending on multiple versions of the same xcode target "
+ + "is not allowed but occurred for: " + provider.label);
+ }
controls.addAll(provider.targetControls());
}
return controls.build();
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 e2d057d990..366cf99448 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
@@ -93,9 +93,27 @@ public final class XcodeSupport {
*/
XcodeSupport addXcodeSettings(XcodeProvider.Builder xcodeProviderBuilder,
ObjcProvider objcProvider, XcodeProductType productType) {
+ return addXcodeSettings(xcodeProviderBuilder, objcProvider, productType,
+ ObjcRuleClasses.objcConfiguration(ruleContext).getIosCpu());
+ }
+
+ /**
+ * Adds common xcode settings to the given provider builder, explicitly specifying architecture
+ * to use.
+ *
+ * @param objcProvider provider containing all dependencies' information as well as some of this
+ * rule's
+ * @param productType type of this rule's Xcode target
+ * @param architecture architecture to filter all dependencies with (only matching ones will be
+ * included in the final targets generated)
+ *
+ * @return this xcode support
+ */
+ XcodeSupport addXcodeSettings(Builder xcodeProviderBuilder,
+ ObjcProvider objcProvider, XcodeProductType productType, String architecture) {
xcodeProviderBuilder
.setLabel(ruleContext.getLabel())
- .setArchitecture(ObjcRuleClasses.objcConfiguration(ruleContext).getIosCpu())
+ .setArchitecture(architecture)
.setObjcProvider(objcProvider)
.setProductType(productType);
return this;
@@ -109,8 +127,7 @@ public final class XcodeSupport {
XcodeSupport addDependencies(Builder xcodeProviderBuilder, Attribute attribute) {
xcodeProviderBuilder.addPropagatedDependencies(
ruleContext.getPrerequisites(
- attribute.getName(), attribute.getAccessMode(), XcodeProvider.class),
- ObjcRuleClasses.objcConfiguration(ruleContext));
+ attribute.getName(), attribute.getAccessMode(), XcodeProvider.class));
return this;
}
@@ -125,8 +142,7 @@ public final class XcodeSupport {
XcodeSupport addNonPropagatedDependencies(Builder xcodeProviderBuilder, Attribute attribute) {
xcodeProviderBuilder.addNonPropagatedDependencies(
ruleContext.getPrerequisites(
- attribute.getName(), attribute.getAccessMode(), XcodeProvider.class),
- ObjcRuleClasses.objcConfiguration(ruleContext));
+ attribute.getName(), attribute.getAccessMode(), XcodeProvider.class));
return this;
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/objc/XibFiles.java b/src/main/java/com/google/devtools/build/lib/rules/objc/XibFiles.java
deleted file mode 100644
index 9be1d06a01..0000000000
--- a/src/main/java/com/google/devtools/build/lib/rules/objc/XibFiles.java
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright 2014 Google Inc. All rights reserved.
-//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
-//
-// http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
-
-package com.google.devtools.build.lib.rules.objc;
-
-
-import com.google.common.collect.ImmutableList;
-import com.google.devtools.build.lib.actions.Artifact;
-
-/**
- * A sequence of xib source files. Each {@code .xib} file can be compiled to a {@code .nib} file or
- * directory. Because it might be a directory, we always use zip files to store the output and use
- * the {@code actooloribtoolzip} utility to run ibtool and zip the output.
- */
-public final class XibFiles extends IterableWrapper<Artifact> {
- public XibFiles(Iterable<Artifact> artifacts) {
- super(artifacts);
- }
-
- /**
- * Returns a sequence where each element of this sequence is converted to the file which contains
- * the compiled contents of the xib.
- */
- public ImmutableList<Artifact> compiledZips(IntermediateArtifacts intermediateArtifacts) {
- ImmutableList.Builder<Artifact> zips = new ImmutableList.Builder<>();
- for (Artifact xib : this) {
- zips.add(intermediateArtifacts.compiledXibFileZip(xib));
- }
- return zips.build();
- }
-}