From 80f635a1bcd86ab08c14d5af4b2f56185d4825f1 Mon Sep 17 00:00:00 2001 From: Dmitry Shevchenko Date: Thu, 28 Jul 2016 16:16:54 +0000 Subject: Roll forward of commit 05c0bd286b3802ad3d7faf48bc19e86929a9cf6d: 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 --- .../devtools/build/lib/rules/objc/Bundling.java | 16 ++++++-- .../lib/rules/objc/IntermediateArtifacts.java | 8 ++++ .../lib/rules/objc/ReleaseBundlingSupport.java | 47 +++++++++++++++++----- 3 files changed, 57 insertions(+), 14 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib') 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 rootMergeZips() { + NestedSetBuilder rootMergeZipsBuilder = + NestedSetBuilder.stableOrder().addTransitive(objcProvider.get(ROOT_MERGE_ZIP)); + + if (objcProvider.is(USES_SWIFT)) { + rootMergeZipsBuilder.add(intermediateArtifacts.swiftSupportZip()); + } + + return rootMergeZipsBuilder.build(); + } + private NestedSet bundleInfoplistInputs() { if (objcProvider.hasAssetCatalogs()) { infoplistInputs.add(intermediateArtifacts.actoolPartialInfoplist()); @@ -328,9 +338,7 @@ final class Bundling { NestedSet binaryStringsFiles = binaryStringsFiles(); NestedSet dynamicFrameworks = dynamicFrameworkFiles(); NestedSet mergeZips = mergeZips(actoolzipOutput); - NestedSet rootMergeZips = - NestedSetBuilder.stableOrder() - .addTransitive(objcProvider.get(ROOT_MERGE_ZIP)).build(); + NestedSet 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 @@ -319,6 +319,14 @@ public final class IntermediateArtifacts { return appendExtension(".swiftstdlib.zip"); } + /** + * 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. */ 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()); } -- cgit v1.2.3