aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com
diff options
context:
space:
mode:
authorGravatar Dmitry Shevchenko <dmishe@google.com>2016-07-28 16:16:54 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2016-07-29 10:09:50 +0000
commit80f635a1bcd86ab08c14d5af4b2f56185d4825f1 (patch)
tree33e4a6e2835eb3e4aef8be0afe796d9d07a71dcf /src/main/java/com
parentee8b7aaff277b913d50f3083768564c1d7124c87 (diff)
Include SwiftSupport directory into the IPA when an app contains Swift. * To pass App Store validation, an app that contains Swift code must have a SwiftSupport directory at the root of the IPA. -- MOS_MIGRATED_REVID=128706028
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/Bundling.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/IntermediateArtifacts.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/rules/objc/ReleaseBundlingSupport.java47
3 files changed, 57 insertions, 14 deletions
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 a5a9a71240..e00d64bf8d 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
@@ -45,7 +45,6 @@ import com.google.devtools.build.lib.rules.apple.AppleConfiguration;
import com.google.devtools.build.lib.rules.apple.DottedVersion;
import com.google.devtools.build.lib.util.Preconditions;
import com.google.devtools.build.lib.vfs.PathFragment;
-
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -221,6 +220,17 @@ final class Bundling {
return mergeZipBuilder.build();
}
+ private NestedSet<Artifact> rootMergeZips() {
+ NestedSetBuilder<Artifact> rootMergeZipsBuilder =
+ NestedSetBuilder.<Artifact>stableOrder().addTransitive(objcProvider.get(ROOT_MERGE_ZIP));
+
+ if (objcProvider.is(USES_SWIFT)) {
+ rootMergeZipsBuilder.add(intermediateArtifacts.swiftSupportZip());
+ }
+
+ return rootMergeZipsBuilder.build();
+ }
+
private NestedSet<Artifact> bundleInfoplistInputs() {
if (objcProvider.hasAssetCatalogs()) {
infoplistInputs.add(intermediateArtifacts.actoolPartialInfoplist());
@@ -328,9 +338,7 @@ final class Bundling {
NestedSet<BundleableFile> binaryStringsFiles = binaryStringsFiles();
NestedSet<BundleableFile> dynamicFrameworks = dynamicFrameworkFiles();
NestedSet<Artifact> mergeZips = mergeZips(actoolzipOutput);
- NestedSet<Artifact> rootMergeZips =
- NestedSetBuilder.<Artifact>stableOrder()
- .addTransitive(objcProvider.get(ROOT_MERGE_ZIP)).build();
+ NestedSet<Artifact> rootMergeZips = rootMergeZips();
bundleFilesBuilder
.addAll(binaryStringsFiles)
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 7efef81544..0ccc9d2752 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
@@ -320,6 +320,14 @@ public final class IntermediateArtifacts {
}
/**
+ * Same as {@link #swiftFrameworksFileZip()} but used to put Swift dylibs at a different location
+ * in SwiftSupport directory at the top of the IPA.
+ */
+ public Artifact swiftSupportZip() {
+ return appendExtension(".swiftsupport.zip");
+ }
+
+ /**
* The temp zipped debug symbol bundle file which contains debug symbols generated by dsymutil.
*/
public Artifact tempDsymBundleZip(DsymOutputType dsymOutputType) {
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 d52dad9ed1..39e6d2ce13 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
@@ -22,6 +22,9 @@ import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.ReleaseBu
import static com.google.devtools.build.lib.rules.objc.ObjcRuleClasses.ReleaseBundlingRule.EXTRA_ENTITLEMENTS_ATTR;
import static com.google.devtools.build.lib.rules.objc.TargetDeviceFamily.UI_DEVICE_FAMILY_VALUES;
+import com.dd.plist.NSArray;
+import com.dd.plist.NSDictionary;
+import com.dd.plist.NSObject;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableList;
@@ -63,14 +66,8 @@ import com.google.devtools.build.lib.rules.objc.BundleSupport.ExtraActoolArgs;
import com.google.devtools.build.lib.rules.objc.Bundling.Builder;
import com.google.devtools.build.lib.shell.ShellUtils;
import com.google.devtools.build.xcode.xcodegen.proto.XcodeGenProtos.XcodeprojBuildSetting;
-
-import com.dd.plist.NSArray;
-import com.dd.plist.NSDictionary;
-import com.dd.plist.NSObject;
-
import java.util.List;
import java.util.Map.Entry;
-
import javax.annotation.Nullable;
/**
@@ -299,6 +296,7 @@ public final class ReleaseBundlingSupport {
registerCopyDsymPlistAction(dsymOutputType);
registerCopyLinkmapFilesAction();
registerSwiftStdlibActionsIfNecessary();
+ registerSwiftSupportActionsIfNecessary();
registerEmbedLabelPlistAction();
registerEnvironmentPlistAction();
@@ -1051,10 +1049,13 @@ public final class ReleaseBundlingSupport {
AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
- CustomCommandLine.Builder commandLine = CustomCommandLine.builder()
- .addPath(intermediateArtifacts.swiftFrameworksFileZip().getExecPath())
- .add("--platform").add(AppleToolchain.swiftPlatform(appleConfiguration))
- .addExecPath("--scan-executable", intermediateArtifacts.combinedArchitectureBinary());
+ CustomCommandLine.Builder commandLine =
+ CustomCommandLine.builder()
+ .addPath(intermediateArtifacts.swiftFrameworksFileZip().getExecPath())
+ .add("Frameworks")
+ .add("--platform")
+ .add(AppleToolchain.swiftPlatform(appleConfiguration))
+ .addExecPath("--scan-executable", intermediateArtifacts.combinedArchitectureBinary());
ruleContext.registerAction(
ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext)
@@ -1066,6 +1067,32 @@ public final class ReleaseBundlingSupport {
.build(ruleContext));
}
+ /** Registers an action to copy Swift standard library dylibs into SwiftSupport root directory. */
+ private void registerSwiftSupportActionsIfNecessary() {
+ if (!objcProvider.is(USES_SWIFT)) {
+ return;
+ }
+
+ AppleConfiguration appleConfiguration = ruleContext.getFragment(AppleConfiguration.class);
+
+ CustomCommandLine.Builder commandLine =
+ CustomCommandLine.builder()
+ .addPath(intermediateArtifacts.swiftSupportZip().getExecPath())
+ .add("SwiftSupport/" + AppleToolchain.swiftPlatform(appleConfiguration))
+ .add("--platform")
+ .add(AppleToolchain.swiftPlatform(appleConfiguration))
+ .addExecPath("--scan-executable", intermediateArtifacts.combinedArchitectureBinary());
+
+ ruleContext.registerAction(
+ ObjcRuleClasses.spawnAppleEnvActionBuilder(ruleContext)
+ .setMnemonic("SwiftCopySwiftSupport")
+ .setExecutable(attributes.swiftStdlibToolWrapper())
+ .setCommandLine(commandLine.build())
+ .addOutput(intermediateArtifacts.swiftSupportZip())
+ .addInput(intermediateArtifacts.combinedArchitectureBinary())
+ .build(ruleContext));
+ }
+
private String extractPlistCommand(Artifact provisioningProfile) {
return "security cms -D -i " + ShellUtils.shellEscape(provisioningProfile.getExecPathString());
}