From f51395065b45bce6c37f41598fafb30a29fda106 Mon Sep 17 00:00:00 2001 From: Rob Amos Date: Thu, 4 Nov 2021 11:47:32 +1100 Subject: [PATCH 1/2] Added the `--stack-evolution` option --- Sources/CreateXCFramework/Command+Options.swift | 3 +++ Sources/CreateXCFramework/Command.swift | 4 +++- Sources/CreateXCFramework/PackageInfo.swift | 6 +++++- Sources/CreateXCFramework/ProjectGenerator.swift | 12 ++++-------- Sources/CreateXCFramework/XcodeBuilder.swift | 7 ++++++- Sources/CreateXCFramework/Zipper.swift | 2 +- 6 files changed, 22 insertions(+), 12 deletions(-) diff --git a/Sources/CreateXCFramework/Command+Options.swift b/Sources/CreateXCFramework/Command+Options.swift index 4cf1fc8..238e46c 100644 --- a/Sources/CreateXCFramework/Command+Options.swift +++ b/Sources/CreateXCFramework/Command+Options.swift @@ -37,6 +37,9 @@ extension Command { @Option(help: "The path to a .xcconfig file that can be used to override Xcode build settings. Relative to the package path.") var xcconfig: String? + @Flag(help: "Enables Library Evolution for the whole build stack. Normally we apply it only to the targets listed to be built to work around issues with projects that don't support it.") + var stackEvolution: Bool = false + @Option(help: ArgumentHelp("Arbitrary Xcode build settings that are passed directly to the `xcodebuild` invocation. Can be specified multiple times.", valueName: "NAME=VALUE")) var xcSetting: [BuildSetting] = [] diff --git a/Sources/CreateXCFramework/Command.swift b/Sources/CreateXCFramework/Command.swift index 299f04e..6411036 100644 --- a/Sources/CreateXCFramework/Command.swift +++ b/Sources/CreateXCFramework/Command.swift @@ -77,7 +77,9 @@ struct Command: ParsableCommand { // we've applied the xcconfig to everything, but some dependencies (*cough* swift-nio) // have build errors, so we remove it from targets we're not building - try project.enableDistribution(targets: productNames, xcconfig: AbsolutePath(package.distributionBuildXcconfig.path).relative(to: AbsolutePath(package.rootDirectory.path))) + if self.options.stackEvolution == false { + try project.enableDistribution(targets: productNames, xcconfig: AbsolutePath(package.distributionBuildXcconfig.path).relative(to: AbsolutePath(package.rootDirectory.path))) + } // save the project try project.save(to: generator.projectPath) diff --git a/Sources/CreateXCFramework/PackageInfo.swift b/Sources/CreateXCFramework/PackageInfo.swift index 1547e69..7d55539 100644 --- a/Sources/CreateXCFramework/PackageInfo.swift +++ b/Sources/CreateXCFramework/PackageInfo.swift @@ -27,6 +27,10 @@ struct PackageInfo { .absoluteURL } + var hasDistributionBuildXcconfig: Bool { + self.overridesXcconfig != nil || self.options.stackEvolution == false + } + var distributionBuildXcconfig: Foundation.URL { return self.projectBuildDirectory .appendingPathComponent("Distribution.xcconfig") @@ -232,7 +236,7 @@ enum SupportedPlatforms { case packageValid (plan: [SupportedPlatform]) } -extension SupportedPlatform: Equatable, Comparable { +extension SupportedPlatform: Comparable { public static func == (lhs: SupportedPlatform, rhs: SupportedPlatform) -> Bool { return lhs.platform == rhs.platform && lhs.version == rhs.version } diff --git a/Sources/CreateXCFramework/ProjectGenerator.swift b/Sources/CreateXCFramework/ProjectGenerator.swift index e4b404e..b936e36 100644 --- a/Sources/CreateXCFramework/ProjectGenerator.swift +++ b/Sources/CreateXCFramework/ProjectGenerator.swift @@ -38,6 +38,10 @@ struct ProjectGenerator { /// Writes out the Xcconfig file func writeDistributionXcconfig () throws { + guard self.package.hasDistributionBuildXcconfig else { + return + } + try makeDirectories(self.projectPath) let path = AbsolutePath(self.package.distributionBuildXcconfig.path) @@ -56,14 +60,6 @@ struct ProjectGenerator { BUILD_LIBRARY_FOR_DISTRIBUTION=YES """ ) - - if package.options.platform.contains(.maccatalyst) { - stream ( - """ - SUPPORTS_MACCATALYST=YES - """ - ) - } } } diff --git a/Sources/CreateXCFramework/XcodeBuilder.swift b/Sources/CreateXCFramework/XcodeBuilder.swift index 6f6180d..a48b1e9 100644 --- a/Sources/CreateXCFramework/XcodeBuilder.swift +++ b/Sources/CreateXCFramework/XcodeBuilder.swift @@ -122,8 +122,13 @@ struct XcodeBuilder { } } + // enable evolution for the whole stack + if self.options.stackEvolution { + command.append("BUILD_LIBRARY_FOR_DISTRIBUTION=YES") + } + // add build settings provided in the invocation - options.xcSetting.forEach { setting in + self.options.xcSetting.forEach { setting in command.append("\(setting.name)=\(setting.value)") } diff --git a/Sources/CreateXCFramework/Zipper.swift b/Sources/CreateXCFramework/Zipper.swift index 81fe0f9..46b3b6d 100644 --- a/Sources/CreateXCFramework/Zipper.swift +++ b/Sources/CreateXCFramework/Zipper.swift @@ -74,7 +74,7 @@ struct Zipper { guard let packageRef = self.package.graph.packages.first(where: { $0.targets.contains(where: { $0.name == target }) }) else { return nil } guard - let dependency = self.package.workspace.state.dependencies[forNameOrIdentity: packageRef.name], + let dependency = self.package.workspace.state.dependencies[forNameOrIdentity: packageRef.manifestName], case let .checkout(checkout) = dependency.state, let version = checkout.version else { From 4785977c2807478e0b3538a1d5b867a56104374b Mon Sep 17 00:00:00 2001 From: Rob Amos Date: Thu, 4 Nov 2021 20:14:42 +1100 Subject: [PATCH 2/2] Fixed backwards compatibility on manifestName change --- Sources/CreateXCFramework/Zipper.swift | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/Sources/CreateXCFramework/Zipper.swift b/Sources/CreateXCFramework/Zipper.swift index 46b3b6d..a588f7b 100644 --- a/Sources/CreateXCFramework/Zipper.swift +++ b/Sources/CreateXCFramework/Zipper.swift @@ -74,7 +74,7 @@ struct Zipper { guard let packageRef = self.package.graph.packages.first(where: { $0.targets.contains(where: { $0.name == target }) }) else { return nil } guard - let dependency = self.package.workspace.state.dependencies[forNameOrIdentity: packageRef.manifestName], + let dependency = self.package.workspace.state.dependencies[forNameOrIdentity: packageRef.packageName], case let .checkout(checkout) = dependency.state, let version = checkout.version else { @@ -91,3 +91,17 @@ struct Zipper { try FileManager.default.removeItem(at: file) } } + +#if swift(>=5.5) +private extension ResolvedPackage { + var packageName: String { + self.manifestName + } +} +#else +private extension ResolvedPackage { + var packageName: String { + self.name + } +} +#endif