From 0f5052cea078d7c98a866098b73793ef889f31a6 Mon Sep 17 00:00:00 2001 From: Iskandar Safarov Date: Wed, 15 Jun 2022 09:50:26 +1000 Subject: [PATCH 1/4] Fixed issue with missing(url) on latest XCodes (#63) a8376e --- Package.resolved | 24 +++++----- Package.swift | 23 ++++++++-- Sources/CreateXCFramework/PackageInfo.swift | 45 ++++++++++++++++--- .../CreateXCFramework/ProjectGenerator.swift | 21 ++++++++- Sources/CreateXCFramework/Zipper.swift | 18 +++++++- 5 files changed, 107 insertions(+), 24 deletions(-) diff --git a/Package.resolved b/Package.resolved index 6e60d66..7563169 100644 --- a/Package.resolved +++ b/Package.resolved @@ -6,8 +6,8 @@ "repositoryURL": "https://github.com/apple/swift-argument-parser.git", "state": { "branch": null, - "revision": "83b23d940471b313427da226196661856f6ba3e0", - "version": "0.4.4" + "revision": "e394bf350e38cb100b6bc4172834770ede1b7232", + "version": "1.0.3" } }, { @@ -15,16 +15,16 @@ "repositoryURL": "https://github.com/apple/swift-crypto.git", "state": { "branch": null, - "revision": "3bea268b223651c4ab7b7b9ad62ef9b2d4143eb6", - "version": "1.1.6" + "revision": "ddb07e896a2a8af79512543b1c7eb9797f8898a5", + "version": "1.1.7" } }, { "package": "swift-driver", "repositoryURL": "https://github.com/apple/swift-driver.git", "state": { - "branch": "release/5.5", - "revision": "ba0ab62cfc3999fb47fcfa33f046677008d9b145", + "branch": "release/5.6", + "revision": "9982f32f96a2e0e597d1b4a0af4a7e997dc471be", "version": null } }, @@ -32,8 +32,8 @@ "package": "llbuild", "repositoryURL": "https://github.com/apple/swift-llbuild.git", "state": { - "branch": "release/5.5", - "revision": "b5d9b4a9995c05688ae5f3b87a0d7ac0dc45c6c6", + "branch": "release/5.6", + "revision": "acd686530e56122d916acd49a166beb9198e9b87", "version": null } }, @@ -41,8 +41,8 @@ "package": "SwiftPM", "repositoryURL": "https://github.com/apple/swift-package-manager.git", "state": { - "branch": "release/5.5", - "revision": "96c347b1419e513291f07c988f3e995363d400ed", + "branch": "release/5.6", + "revision": "286f6dc58e7211d925c3c8ef28593b45f8bfdd85", "version": null } }, @@ -50,8 +50,8 @@ "package": "swift-tools-support-core", "repositoryURL": "https://github.com/apple/swift-tools-support-core.git", "state": { - "branch": "release/5.5", - "revision": "1b21e2ce36891ed4f458421a83b5d9e886acd4cd", + "branch": "release/5.6", + "revision": "f6c8048a76e280d0f14cc378b8b5c3cfb77c61fb", "version": null } }, diff --git a/Package.swift b/Package.swift index a1439af..61325d0 100644 --- a/Package.swift +++ b/Package.swift @@ -4,7 +4,13 @@ import PackageDescription let dependencies: [Package.Dependency] -#if swift(>=5.5) +#if swift(>=5.6) +dependencies = [ + .package(url: "https://github.com/apple/swift-argument-parser.git", .exact("1.0.3")), + .package(name: "SwiftPM", url: "https://github.com/apple/swift-package-manager.git", .branch("release/5.6")), + .package(url: "https://github.com/apple/swift-tools-support-core.git", .exact("0.2.5")) +] +#elseif swift(>=5.5) dependencies = [ .package(url: "https://github.com/apple/swift-argument-parser.git", .exact("0.4.4")), .package(name: "SwiftPM", url: "https://github.com/apple/swift-package-manager.git", .branch("release/5.5")), @@ -18,13 +24,22 @@ dependencies = [ ] #endif +let platforms: [SupportedPlatform] +#if swift(>=5.6) +platforms = [ + .macOS(.v11), +] +#else +platforms = [ + .macOS(.v10_15), +] +#endif + let package = Package( name: "swift-create-xcframework", // TODO: Add Linux / Windows support - platforms: [ - .macOS(.v10_15), - ], + platforms: platforms, products: [ .executable(name: "swift-create-xcframework", targets: [ "CreateXCFramework" ]), diff --git a/Sources/CreateXCFramework/PackageInfo.swift b/Sources/CreateXCFramework/PackageInfo.swift index 7d55539..35fefbf 100644 --- a/Sources/CreateXCFramework/PackageInfo.swift +++ b/Sources/CreateXCFramework/PackageInfo.swift @@ -6,11 +6,14 @@ // import ArgumentParser +import Basics import Build import Foundation +import PackageGraph import PackageLoading import PackageModel import SPMBuildCore +import TSCBasic import Workspace import Xcodeproj @@ -53,13 +56,18 @@ struct PackageInfo { } // TODO: Map diagnostics to swift-log +#if swift(>=5.6) + let observabilitySystem = ObservabilitySystem { scope, diagnostics in + print("\(diagnostics.severity): \(diagnostics.message)") + } +#else let diagnostics = DiagnosticsEngine() +#endif let options: Command.Options -// let package: Package let graph: PackageGraph let manifest: Manifest - let toolchain: Toolchain + let toolchain: UserToolchain let workspace: Workspace @@ -74,6 +82,11 @@ struct PackageInfo { self.toolchain = try UserToolchain(destination: try .hostDestination()) + #if swift(>=5.6) + let resources = ToolchainConfiguration(swiftCompilerPath: self.toolchain.swiftCompilerPath) + let loader = ManifestLoader(toolchain: resources) + self.workspace = try Workspace(forRootPackage: root, customManifestLoader: loader) + #else #if swift(>=5.5) let resources = try UserManifestResources(swiftCompiler: self.toolchain.swiftCompiler, swiftCompilerFlags: []) #else @@ -81,8 +94,20 @@ struct PackageInfo { #endif let loader = ManifestLoader(manifestResources: resources) self.workspace = Workspace.create(forRootPackage: root, manifestLoader: loader) - - #if swift(>=5.5) + #endif + + #if swift(>=5.6) + self.graph = try workspace.loadPackageGraph(rootPath: root, observabilityScope: self.observabilitySystem.topScope) + let workspace = self.workspace + let scope = observabilitySystem.topScope + self.manifest = try tsc_await { + workspace.loadRootManifest( + at: root, + observabilityScope: scope, + completion: $0 + ) + } + #elseif swift(>=5.5) self.graph = try self.workspace.loadPackageGraph(rootPath: root, diagnostics: self.diagnostics) let swiftCompiler = toolchain.swiftCompiler self.manifest = try tsc_await { @@ -165,7 +190,7 @@ struct PackageInfo { Invalid product/target name(s): \(invalidProducts.joined(separator: "\n ")) - Available \(self.manifest.name) products: + Available \(self.manifest.displayName) products: \(allLibraryProductNames.sorted().joined(separator: "\n ")) Additional available targets: @@ -184,7 +209,7 @@ struct PackageInfo { print ( """ - \nAvailable \(self.manifest.name) products: + \nAvailable \(self.manifest.displayName) products: \(allLibraryProductNames.sorted().joined(separator: "\n ")) Additional available targets: @@ -280,3 +305,11 @@ enum PackageValidationError: LocalizedError { } } } + +#if swift(<5.6) +extension Manifest { + var displayName: String { + name + } +} +#endif diff --git a/Sources/CreateXCFramework/ProjectGenerator.swift b/Sources/CreateXCFramework/ProjectGenerator.swift index b936e36..22caf23 100644 --- a/Sources/CreateXCFramework/ProjectGenerator.swift +++ b/Sources/CreateXCFramework/ProjectGenerator.swift @@ -23,7 +23,7 @@ struct ProjectGenerator { var projectPath: AbsolutePath { let dir = AbsolutePath(self.package.projectBuildDirectory.path) - return buildXcodeprojPath(outputDir: dir, projectName: self.package.manifest.name) + return buildXcodeprojPath(outputDir: dir, projectName: self.package.manifest.displayName) } @@ -72,6 +72,20 @@ struct ProjectGenerator { try makeDirectories(path) // Generate the contents of project.xcodeproj (inside the .xcodeproj). +#if swift(>=5.6) + let project = try pbxproj ( + xcodeprojPath: path, + graph: self.package.graph, + extraDirs: [], + extraFiles: [], + options: XcodeprojOptions ( + xcconfigOverrides: (self.package.overridesXcconfig?.path).flatMap { AbsolutePath($0) }, + useLegacySchemeGenerator: true + ), + fileSystem: localFileSystem, + observabilityScope: self.package.observabilitySystem.topScope + ) +#else let project = try pbxproj ( xcodeprojPath: path, graph: self.package.graph, @@ -83,6 +97,7 @@ struct ProjectGenerator { ), diagnostics: self.package.diagnostics ) +#endif return project } @@ -122,7 +137,11 @@ extension Xcode.Project { try open(path.appending(component: "project.pbxproj")) { stream in // Serialize the project model we created to a plist, and return // its string description. +#if swift(>=5.6) + let str = try "// !$*UTF8*$!\n" + self.generatePlist().description +#else let str = "// !$*UTF8*$!\n" + self.generatePlist().description +#endif stream(str) } diff --git a/Sources/CreateXCFramework/Zipper.swift b/Sources/CreateXCFramework/Zipper.swift index a588f7b..f5f1f56 100644 --- a/Sources/CreateXCFramework/Zipper.swift +++ b/Sources/CreateXCFramework/Zipper.swift @@ -6,6 +6,7 @@ // import Foundation +import PackageGraph import PackageModel import TSCBasic import Workspace @@ -51,7 +52,11 @@ struct Zipper { } func checksum (file: Foundation.URL) throws -> Foundation.URL { +#if swift(>=5.6) + let sum = try self.package.workspace.checksum(forBinaryArtifactAt: AbsolutePath(file.path)) +#else let sum = self.package.workspace.checksum(forBinaryArtifactAt: AbsolutePath(file.path), diagnostics: self.package.diagnostics) +#endif let checksumFile = file.deletingPathExtension().appendingPathExtension("sha256") try Data(sum.utf8).write(to: checksumFile) return checksumFile @@ -73,6 +78,14 @@ struct Zipper { // find the package that contains our target guard let packageRef = self.package.graph.packages.first(where: { $0.targets.contains(where: { $0.name == target }) }) else { return nil } +#if swift(>=5.6) + guard + let dependency = self.package.workspace.state.dependencies[packageRef.identity], + case let .custom(version, _) = dependency.state + else { + return fallback.flatMap { "-" + $0 } + } +#else guard let dependency = self.package.workspace.state.dependencies[forNameOrIdentity: packageRef.packageName], case let .checkout(checkout) = dependency.state, @@ -80,6 +93,7 @@ struct Zipper { else { return fallback.flatMap { "-" + $0 } } +#endif return "-" + version.description } @@ -92,7 +106,9 @@ struct Zipper { } } -#if swift(>=5.5) +#if swift(>=5.6) +// Intentionally left blank +#elseif swift(>=5.5) private extension ResolvedPackage { var packageName: String { self.manifestName From 02477571ecadbaa3b8210396c84b1026e9d4f609 Mon Sep 17 00:00:00 2001 From: Iskandar Safarov Date: Wed, 15 Jun 2022 17:37:17 +1000 Subject: [PATCH 2/4] ifdef'ed newly imported modules --- Sources/CreateXCFramework/PackageInfo.swift | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Sources/CreateXCFramework/PackageInfo.swift b/Sources/CreateXCFramework/PackageInfo.swift index 35fefbf..6dc3357 100644 --- a/Sources/CreateXCFramework/PackageInfo.swift +++ b/Sources/CreateXCFramework/PackageInfo.swift @@ -6,14 +6,20 @@ // import ArgumentParser +#if swift(>=5.6) import Basics +#endif import Build import Foundation +#if swift(>=5.6) import PackageGraph +#endif import PackageLoading import PackageModel import SPMBuildCore +#if swift(>=5.6) import TSCBasic +#endif import Workspace import Xcodeproj From 9169ecfab6ead1040bb9ff82ec7426f12a29bf9f Mon Sep 17 00:00:00 2001 From: Iskandar Safarov Date: Wed, 15 Jun 2022 17:41:30 +1000 Subject: [PATCH 3/4] Another ifdef --- Sources/CreateXCFramework/Zipper.swift | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Sources/CreateXCFramework/Zipper.swift b/Sources/CreateXCFramework/Zipper.swift index f5f1f56..6f41b1a 100644 --- a/Sources/CreateXCFramework/Zipper.swift +++ b/Sources/CreateXCFramework/Zipper.swift @@ -6,7 +6,9 @@ // import Foundation +#if swift(>=5.6) import PackageGraph +#endif import PackageModel import TSCBasic import Workspace From eb0b2558cbab8d5ce38a036954ad2d82ece9b775 Mon Sep 17 00:00:00 2001 From: Iskandar Safarov Date: Wed, 15 Jun 2022 19:43:41 +1000 Subject: [PATCH 4/4] Fixed swiftlint warnings --- Sources/CreateXCFramework/PackageInfo.swift | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Sources/CreateXCFramework/PackageInfo.swift b/Sources/CreateXCFramework/PackageInfo.swift index 6dc3357..ac37094 100644 --- a/Sources/CreateXCFramework/PackageInfo.swift +++ b/Sources/CreateXCFramework/PackageInfo.swift @@ -63,7 +63,7 @@ struct PackageInfo { // TODO: Map diagnostics to swift-log #if swift(>=5.6) - let observabilitySystem = ObservabilitySystem { scope, diagnostics in + let observabilitySystem = ObservabilitySystem { _, diagnostics in print("\(diagnostics.severity): \(diagnostics.message)") } #else @@ -79,7 +79,7 @@ struct PackageInfo { // MARK: - Initialisation - init (options: Command.Options) throws { + init (options: Command.Options) throws { // swiftlint:disable:this function_body_length self.options = options self.rootDirectory = Foundation.URL(fileURLWithPath: options.packagePath, isDirectory: true).absoluteURL self.buildDirectory = self.rootDirectory.appendingPathComponent(options.buildPath, isDirectory: true).absoluteURL