From 7837bf7298611637b13e9c867b028410152304ea Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Wed, 21 Sep 2022 12:32:13 +0000 Subject: [PATCH 1/4] Update SwiftPM library version to 5.7 --- Package.resolved | 25 +++++++++++++++++-------- Package.swift | 5 +++-- Sources/CartonCLI/Commands/Bundle.swift | 2 +- Sources/SwiftToolchain/Manifest.swift | 3 ++- 4 files changed, 23 insertions(+), 12 deletions(-) diff --git a/Package.resolved b/Package.resolved index cd4de8fc..3c3447d6 100644 --- a/Package.resolved +++ b/Package.resolved @@ -113,8 +113,8 @@ "package": "swift-driver", "repositoryURL": "https://github.com/apple/swift-driver.git", "state": { - "branch": "release/5.6", - "revision": "9982f32f96a2e0e597d1b4a0af4a7e997dc471be", + "branch": "release/5.7", + "revision": "719426df790661020de657bf38beb2a8b1de5ad3", "version": null } }, @@ -122,8 +122,8 @@ "package": "llbuild", "repositoryURL": "https://github.com/apple/swift-llbuild.git", "state": { - "branch": "release/5.6", - "revision": "acd686530e56122d916acd49a166beb9198e9b87", + "branch": "release/5.7", + "revision": "564424db5fdb62dcb5d863bdf7212500ef03a87b", "version": null } }, @@ -203,17 +203,26 @@ "package": "SwiftPM", "repositoryURL": "https://github.com/apple/swift-package-manager.git", "state": { - "branch": "release/5.6", - "revision": "55c1dc785b151cb51a54314ebc30a96d5cbaddf2", + "branch": "release/5.7", + "revision": "63c14b84dc12c943a9d4c102648b7617d8b92f67", "version": null } }, + { + "package": "swift-system", + "repositoryURL": "https://github.com/apple/swift-system.git", + "state": { + "branch": null, + "revision": "836bc4557b74fe6d2660218d56e3ce96aff76574", + "version": "1.1.1" + } + }, { "package": "swift-tools-support-core", "repositoryURL": "https://github.com/apple/swift-tools-support-core.git", "state": { - "branch": "release/5.6", - "revision": "f6c8048a76e280d0f14cc378b8b5c3cfb77c61fb", + "branch": "release/5.7", + "revision": "184eba382f6abbb362ffc02942d790ff35019ad4", "version": null } }, diff --git a/Package.swift b/Package.swift index 0fc14265..76682602 100644 --- a/Package.swift +++ b/Package.swift @@ -27,11 +27,11 @@ let package = Package( .package( name: "SwiftPM", url: "https://github.com/apple/swift-package-manager.git", - .branch("release/5.6") + .branch("release/5.7") ), .package( url: "https://github.com/apple/swift-tools-support-core.git", - .branch("release/5.6") + .branch("release/5.7") ), .package(url: "https://github.com/vapor/vapor.git", from: "4.57.1"), .package(url: "https://github.com/apple/swift-crypto.git", from: "1.1.0"), @@ -81,6 +81,7 @@ let package = Package( dependencies: [ .product(name: "AsyncHTTPClient", package: "async-http-client"), .product(name: "ArgumentParser", package: "swift-argument-parser"), + .product(name: "SwiftToolsSupport-auto", package: "swift-tools-support-core"), "Splash", "WasmTransformer", ] diff --git a/Sources/CartonCLI/Commands/Bundle.swift b/Sources/CartonCLI/Commands/Bundle.swift index 45d98b2a..98f098df 100644 --- a/Sources/CartonCLI/Commands/Bundle.swift +++ b/Sources/CartonCLI/Commands/Bundle.swift @@ -146,7 +146,7 @@ struct Bundle: AsyncParsableCommand { wasmOutputFilePath: AbsolutePath, buildDirectory: AbsolutePath, bundleDirectory: AbsolutePath, - toolchain: Toolchain, + toolchain: SwiftToolchain.Toolchain, product: ProductDescription ) throws { // Rename the final binary to use a part of its hash to bust browsers and CDN caches. diff --git a/Sources/SwiftToolchain/Manifest.swift b/Sources/SwiftToolchain/Manifest.swift index 63d0af6d..966b1e68 100644 --- a/Sources/SwiftToolchain/Manifest.swift +++ b/Sources/SwiftToolchain/Manifest.swift @@ -22,7 +22,8 @@ import Workspace extension Manifest { static func from(path: AbsolutePath, swiftc: AbsolutePath, fileSystem: FileSystem, terminal: InteractiveWriter) async throws -> Manifest { terminal.write("\nParsing package manifest: ", inColor: .yellow) - let toolchain = ToolchainConfiguration(swiftCompilerPath: swiftc) + let destination = try Destination.hostDestination(swiftc.parentDirectory) + let toolchain = try UserToolchain(destination: destination) let loader = ManifestLoader(toolchain: toolchain) let observability = ObservabilitySystem { _, diagnostic in terminal.write("\n\(diagnostic)") From db7cb5329b6a23349b6f5fccc1e69ad2d07ea99e Mon Sep 17 00:00:00 2001 From: yonihemi Date: Sat, 16 Jul 2022 14:37:18 +0800 Subject: [PATCH 2/4] Build with Reactor exec model for SwiftWasm versions *bigger than* 5.6. --- Sources/SwiftToolchain/Toolchain.swift | 39 +++++++++++++++++++++----- Tests/CartonTests/CartonTests.swift | 21 ++++++++++++-- 2 files changed, 51 insertions(+), 9 deletions(-) diff --git a/Sources/SwiftToolchain/Toolchain.swift b/Sources/SwiftToolchain/Toolchain.swift index 43f23d8c..8771e3cb 100644 --- a/Sources/SwiftToolchain/Toolchain.swift +++ b/Sources/SwiftToolchain/Toolchain.swift @@ -350,31 +350,37 @@ public final class Toolchain { private func basicBuildArguments(flavor: BuildFlavor) -> [String] { var builderArguments = ["--triple", "wasm32-unknown-wasi"] + defer { + builderArguments.append(contentsOf: flavor.swiftCompilerFlags.flatMap { + ["-Xswiftc", $0] + }) + } + guard let wasmVersion = try? Version(swiftWasmVersion: version) else { + return builderArguments + } + // Versions later than 5.3.x have test discovery enabled by default and the explicit flag // deprecated. - if ["wasm-5.3.0-RELEASE", "wasm-5.3.1-RELEASE"].contains(version) { + if wasmVersion.major == 5, wasmVersion.minor == 3 { builderArguments.append("--enable-test-discovery") } // SwiftWasm 5.5 requires explicit linking arguments in certain configurations, // see https://github.com/swiftwasm/swift/issues/3891 - if version.starts(with: "wasm-5.5") { + if wasmVersion.major == 5, wasmVersion.minor == 5 { builderArguments.append(contentsOf: ["-Xlinker", "-licuuc", "-Xlinker", "-licui18n"]) } - // SwiftWasm 5.6 requires reactor model from updated wasi-libc when not building as a command + // SwiftWasm 5.6 and up requires reactor model from updated wasi-libc when not building as a command // see https://github.com/WebAssembly/WASI/issues/13 - if version.starts(with: "wasm-5.6") && flavor.environment != .wasmer { + if wasmVersion >= Version(5, 6, 0) && flavor.environment != .wasmer { builderArguments.append(contentsOf: [ "-Xswiftc", "-Xclang-linker", "-Xswiftc", "-mexec-model=reactor", "-Xlinker", "--export=main", ]) } - builderArguments.append(contentsOf: flavor.swiftCompilerFlags.flatMap { - ["-Xswiftc", $0] - }) return builderArguments } @@ -405,3 +411,22 @@ extension Result where Failure == Error { } } } + +extension Version { + /// Initialize a numeric version from a SwiftWasm Toolchain version string, e.g.: + /// "wasm-5.3.1-RELEASE", "wasm-5.7-SNAPSHOT-2022-07-14-a", + /// **discarding all identifiers**. + /// Note: input toolchain name already has "swift-" prefix stripped. + init(swiftWasmVersion: String) throws { + let prefix = "wasm-" + guard swiftWasmVersion.hasPrefix(prefix) else { + throw ToolchainError.invalidVersion(version: swiftWasmVersion) + } + var swiftWasmVersion = swiftWasmVersion + swiftWasmVersion.removeFirst(prefix.count) + + let version = try Version(versionString: swiftWasmVersion, usesLenientParsing: true) + // Strip prereleaseIdentifiers + self.init(version.major, version.minor, version.patch) + } +} diff --git a/Tests/CartonTests/CartonTests.swift b/Tests/CartonTests/CartonTests.swift index 21cc1eba..ad6b7d37 100644 --- a/Tests/CartonTests/CartonTests.swift +++ b/Tests/CartonTests/CartonTests.swift @@ -15,13 +15,14 @@ import CartonHelpers @testable import CartonKit import class Foundation.Bundle -import SwiftToolchain +@testable import SwiftToolchain import TSCBasic +import TSCUtility import XCTest final class CartonTests: XCTestCase { /// Returns path to the built products directory. - var productsDirectory: URL { + var productsDirectory: Foundation.URL { #if os(macOS) for bundle in Bundle.allBundles where bundle.bundlePath.hasSuffix(".xctest") { return bundle.bundleURL.deletingLastPathComponent() @@ -143,4 +144,20 @@ final class CartonTests: XCTestCase { nil ) } + + func testSwiftWasmVersionParsing() throws { + let v5_6 = try Version(swiftWasmVersion: "wasm-5.6.0-RELEASE") + XCTAssertEqual(v5_6.major, 5) + XCTAssertEqual(v5_6.minor, 6) + XCTAssertEqual(v5_6.patch, 0) + XCTAssert(v5_6.prereleaseIdentifiers.isEmpty) + XCTAssert(v5_6 >= Version(5, 6, 0)) + + let v5_7_snapshot = try Version(swiftWasmVersion: "wasm-5.7-SNAPSHOT-2022-07-14-a") + XCTAssertEqual(v5_7_snapshot.major, 5) + XCTAssertEqual(v5_7_snapshot.minor, 7) + XCTAssertEqual(v5_7_snapshot.patch, 0) + XCTAssert(v5_7_snapshot.prereleaseIdentifiers.isEmpty) + XCTAssert(v5_7_snapshot >= Version(5, 6, 0)) + } } From bddc50545952cbf8e738bb39109339d9b58f20aa Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Fri, 23 Sep 2022 23:09:52 +0900 Subject: [PATCH 3/4] Fix lost extra -Xswiftc arguments Changes applied during defer won't affect to the returned value --- Sources/SwiftToolchain/Toolchain.swift | 48 ++++++++++++-------------- 1 file changed, 23 insertions(+), 25 deletions(-) diff --git a/Sources/SwiftToolchain/Toolchain.swift b/Sources/SwiftToolchain/Toolchain.swift index 8771e3cb..e7f00f06 100644 --- a/Sources/SwiftToolchain/Toolchain.swift +++ b/Sources/SwiftToolchain/Toolchain.swift @@ -350,37 +350,35 @@ public final class Toolchain { private func basicBuildArguments(flavor: BuildFlavor) -> [String] { var builderArguments = ["--triple", "wasm32-unknown-wasi"] - defer { - builderArguments.append(contentsOf: flavor.swiftCompilerFlags.flatMap { - ["-Xswiftc", $0] - }) - } - guard let wasmVersion = try? Version(swiftWasmVersion: version) else { - return builderArguments - } + if let wasmVersion = try? Version(swiftWasmVersion: version) { - // Versions later than 5.3.x have test discovery enabled by default and the explicit flag - // deprecated. - if wasmVersion.major == 5, wasmVersion.minor == 3 { - builderArguments.append("--enable-test-discovery") - } + // Versions later than 5.3.x have test discovery enabled by default and the explicit flag + // deprecated. + if wasmVersion.major == 5, wasmVersion.minor == 3 { + builderArguments.append("--enable-test-discovery") + } - // SwiftWasm 5.5 requires explicit linking arguments in certain configurations, - // see https://github.com/swiftwasm/swift/issues/3891 - if wasmVersion.major == 5, wasmVersion.minor == 5 { - builderArguments.append(contentsOf: ["-Xlinker", "-licuuc", "-Xlinker", "-licui18n"]) - } + // SwiftWasm 5.5 requires explicit linking arguments in certain configurations, + // see https://github.com/swiftwasm/swift/issues/3891 + if wasmVersion.major == 5, wasmVersion.minor == 5 { + builderArguments.append(contentsOf: ["-Xlinker", "-licuuc", "-Xlinker", "-licui18n"]) + } - // SwiftWasm 5.6 and up requires reactor model from updated wasi-libc when not building as a command - // see https://github.com/WebAssembly/WASI/issues/13 - if wasmVersion >= Version(5, 6, 0) && flavor.environment != .wasmer { - builderArguments.append(contentsOf: [ - "-Xswiftc", "-Xclang-linker", "-Xswiftc", "-mexec-model=reactor", - "-Xlinker", "--export=main", - ]) + // SwiftWasm 5.6 and up requires reactor model from updated wasi-libc when not building as a command + // see https://github.com/WebAssembly/WASI/issues/13 + if wasmVersion >= Version(5, 6, 0) && flavor.environment != .wasmer { + builderArguments.append(contentsOf: [ + "-Xswiftc", "-Xclang-linker", "-Xswiftc", "-mexec-model=reactor", + "-Xlinker", "--export=main", + ]) + } } + builderArguments.append(contentsOf: flavor.swiftCompilerFlags.flatMap { + ["-Xswiftc", $0] + }) + return builderArguments } From a9f3b1b4bfdc41e500334763561a56926e1502b3 Mon Sep 17 00:00:00 2001 From: Yuta Saito Date: Fri, 23 Sep 2022 23:10:37 +0900 Subject: [PATCH 4/4] Improve assertion failure log message --- Tests/CartonCommandTests/CommandTestHelper.swift | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Tests/CartonCommandTests/CommandTestHelper.swift b/Tests/CartonCommandTests/CommandTestHelper.swift index 9606c63c..6ab098b2 100644 --- a/Tests/CartonCommandTests/CommandTestHelper.swift +++ b/Tests/CartonCommandTests/CommandTestHelper.swift @@ -325,7 +325,8 @@ public extension XCTest { if expectedContains { XCTAssertTrue( finalString.contains(expected), - "The final string \(finalString) does not contain \(expected)" + "The final string \(finalString) does not contain \(expected)", + file: file, line: line ) } else { AssertEqualStringsIgnoringTrailingWhitespace(