Skip to content

Commit 02fe923

Browse files
authored
Use WasmKit by default for Wasm triples in toolsets (#8668)
As [WasmKit](https://github.com/swiftwasm/WasmKit) is included in recent development snapshots of the swift.org toolchain, we should select it as a default debugger and test runner when a Wasm triple is selected. User toolsets can still override it if needed through toolset merging algorithm described in [SE-0387](https://github.com/swiftlang/swift-evolution/blob/main/proposals/0387-cross-compilation-destinations.md). This allows `swift run` and `swift test` to delegate to WasmKit when cross-compiling for any Wasm triple. rdar://150382758
1 parent df28439 commit 02fe923

13 files changed

+106
-12
lines changed

Sources/CoreCommands/SwiftCommandState.swift

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -927,12 +927,6 @@ public final class SwiftCommandState {
927927
private lazy var _targetToolchain: Result<UserToolchain, Swift.Error> = {
928928
let swiftSDK: SwiftSDK
929929
let hostSwiftSDK: SwiftSDK
930-
let store = SwiftSDKBundleStore(
931-
swiftSDKsDirectory: self.sharedSwiftSDKsDirectory,
932-
fileSystem: self.fileSystem,
933-
observabilityScope: self.observabilityScope,
934-
outputHandler: { print($0.description) }
935-
)
936930
do {
937931
let hostToolchain = try _hostToolchain.get()
938932
hostSwiftSDK = hostToolchain.swiftSDK
@@ -942,6 +936,15 @@ public final class SwiftCommandState {
942936
warning: "`--experimental-swift-sdk` is deprecated and will be removed in a future version of SwiftPM. Use `--swift-sdk` instead."
943937
)
944938
}
939+
940+
let store = SwiftSDKBundleStore(
941+
swiftSDKsDirectory: self.sharedSwiftSDKsDirectory,
942+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
943+
fileSystem: self.fileSystem,
944+
observabilityScope: self.observabilityScope,
945+
outputHandler: { print($0.description) }
946+
)
947+
945948
swiftSDK = try SwiftSDK.deriveTargetSwiftSDK(
946949
hostSwiftSDK: hostSwiftSDK,
947950
hostTriple: hostToolchain.targetTriple,

Sources/PackageModel/SwiftSDKs/SwiftSDK.swift

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -730,6 +730,7 @@ public struct SwiftSDK: Equatable {
730730
if let customDestination = customCompileDestination {
731731
let swiftSDKs = try SwiftSDK.decode(
732732
fromFile: customDestination,
733+
hostToolchainBinDir: store.hostToolchainBinDir,
733734
fileSystem: fileSystem,
734735
observabilityScope: observabilityScope
735736
)
@@ -853,6 +854,7 @@ extension SwiftSDK {
853854
/// Load a ``SwiftSDK`` description from a JSON representation from disk.
854855
public static func decode(
855856
fromFile path: Basics.AbsolutePath,
857+
hostToolchainBinDir: Basics.AbsolutePath,
856858
fileSystem: FileSystem,
857859
observabilityScope: ObservabilityScope
858860
) throws -> [SwiftSDK] {
@@ -862,6 +864,7 @@ extension SwiftSDK {
862864
return try Self.decode(
863865
semanticVersion: version,
864866
fromFile: path,
867+
hostToolchainBinDir: hostToolchainBinDir,
865868
fileSystem: fileSystem,
866869
decoder: decoder,
867870
observabilityScope: observabilityScope
@@ -876,10 +879,16 @@ extension SwiftSDK {
876879
private static func decode(
877880
semanticVersion: SemanticVersionInfo,
878881
fromFile path: Basics.AbsolutePath,
882+
hostToolchainBinDir: Basics.AbsolutePath,
879883
fileSystem: FileSystem,
880884
decoder: JSONDecoder,
881885
observabilityScope: ObservabilityScope
882886
) throws -> [SwiftSDK] {
887+
let wasmKitProperties = Toolset.ToolProperties(
888+
path: hostToolchainBinDir.appending("wasmkit"),
889+
extraCLIOptions: ["run"]
890+
)
891+
883892
switch semanticVersion.schemaVersion {
884893
case Version(3, 0, 0):
885894
let swiftSDKs = try decoder.decode(path: path, fileSystem: fileSystem, as: SerializedDestinationV3.self)
@@ -889,7 +898,12 @@ extension SwiftSDK {
889898
let triple = try Triple(triple)
890899

891900
let pathStrings = properties.toolsetPaths ?? []
892-
let toolset = try pathStrings.reduce(into: Toolset(knownTools: [:], rootPaths: [])) {
901+
let defaultTools: [Toolset.KnownTool: Toolset.ToolProperties] = if triple.isWasm {
902+
[.debugger: wasmKitProperties, .testRunner: wasmKitProperties]
903+
} else {
904+
[:]
905+
}
906+
let toolset = try pathStrings.reduce(into: Toolset(knownTools: defaultTools, rootPaths: [])) {
893907
try $0.merge(
894908
with: Toolset(
895909
from: .init(validating: $1, relativeTo: swiftSDKDirectory),
@@ -914,8 +928,13 @@ extension SwiftSDK {
914928
return try swiftSDKs.targetTriples.map { triple, properties in
915929
let triple = try Triple(triple)
916930

931+
let defaultTools: [Toolset.KnownTool: Toolset.ToolProperties] = if triple.isWasm {
932+
[.debugger: wasmKitProperties, .testRunner: wasmKitProperties]
933+
} else {
934+
[:]
935+
}
917936
let pathStrings = properties.toolsetPaths ?? []
918-
let toolset = try pathStrings.reduce(into: Toolset(knownTools: [:], rootPaths: [])) {
937+
let toolset = try pathStrings.reduce(into: Toolset(knownTools: defaultTools, rootPaths: [])) {
919938
try $0.merge(
920939
with: Toolset(
921940
from: .init(validating: $1, relativeTo: swiftSDKDirectory),

Sources/PackageModel/SwiftSDKs/SwiftSDKBundleStore.swift

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,9 @@ public final class SwiftSDKBundleStore {
6363
/// Directory in which Swift SDKs bundles are stored.
6464
let swiftSDKsDirectory: AbsolutePath
6565

66+
/// `usr/bin` directory of the "root" toolchain that includes this currently running SwiftPM instance.
67+
let hostToolchainBinDir: AbsolutePath
68+
6669
/// File system instance used for reading from and writing to SDK bundles stored on it.
6770
let fileSystem: any FileSystem
6871

@@ -77,12 +80,14 @@ public final class SwiftSDKBundleStore {
7780

7881
public init(
7982
swiftSDKsDirectory: AbsolutePath,
83+
hostToolchainBinDir: AbsolutePath,
8084
fileSystem: any FileSystem,
8185
observabilityScope: ObservabilityScope,
8286
outputHandler: @escaping (Output) -> Void,
8387
downloadProgressAnimation: ProgressAnimationProtocol? = nil
8488
) {
8589
self.swiftSDKsDirectory = swiftSDKsDirectory
90+
self.hostToolchainBinDir = hostToolchainBinDir
8691
self.fileSystem = fileSystem
8792
self.observabilityScope = observabilityScope
8893
self.outputHandler = outputHandler
@@ -394,7 +399,9 @@ public final class SwiftSDKBundleStore {
394399

395400
do {
396401
let swiftSDKs = try SwiftSDK.decode(
397-
fromFile: variantConfigurationPath, fileSystem: fileSystem,
402+
fromFile: variantConfigurationPath,
403+
hostToolchainBinDir: self.hostToolchainBinDir,
404+
fileSystem: fileSystem,
398405
observabilityScope: observabilityScope
399406
)
400407

Sources/PackageModel/Toolset.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ public struct Toolset: Equatable {
3434
/// Properties of a known tool in a ``Toolset``.
3535
public struct ToolProperties: Equatable {
3636
/// Absolute path to the tool on the filesystem. If absent, implies a default tool is used.
37-
public fileprivate(set) var path: AbsolutePath?
37+
public internal(set) var path: AbsolutePath?
3838

3939
/// Command-line options to be passed to the tool when it's invoked.
4040
public internal(set) var extraCLIOptions: [String]

Sources/SwiftSDKCommand/Configuration/ConfigurationSubcommand.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,13 +45,15 @@ protocol ConfigurationSubcommand: SwiftSDKSubcommand {
4545
extension ConfigurationSubcommand {
4646
func run(
4747
hostTriple: Triple,
48+
hostToolchain: UserToolchain,
4849
_ swiftSDKsDirectory: AbsolutePath,
4950
_ observabilityScope: ObservabilityScope
5051
) throws {
5152
fputs("warning: `swift sdk configuration` command is deprecated and will be removed in a future version of SwiftPM. Use `swift sdk configure` instead.\n", stderr)
5253

5354
let bundleStore = SwiftSDKBundleStore(
5455
swiftSDKsDirectory: swiftSDKsDirectory,
56+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
5557
fileSystem: self.fileSystem,
5658
observabilityScope: observabilityScope,
5759
outputHandler: { print($0) }

Sources/SwiftSDKCommand/ConfigureSwiftSDK.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ struct ConfigureSwiftSDK: AsyncParsableCommand {
123123
do {
124124
let bundleStore = SwiftSDKBundleStore(
125125
swiftSDKsDirectory: swiftSDKsDirectory,
126+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
126127
fileSystem: self.fileSystem,
127128
observabilityScope: observabilityScope,
128129
outputHandler: { print($0) }

Sources/SwiftSDKCommand/InstallSwiftSDK.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ struct InstallSwiftSDK: SwiftSDKSubcommand {
5050

5151
func run(
5252
hostTriple: Triple,
53+
hostToolchain: UserToolchain,
5354
_ swiftSDKsDirectory: AbsolutePath,
5455
_ observabilityScope: ObservabilityScope
5556
) async throws {
@@ -58,6 +59,7 @@ struct InstallSwiftSDK: SwiftSDKSubcommand {
5859

5960
let store = SwiftSDKBundleStore(
6061
swiftSDKsDirectory: swiftSDKsDirectory,
62+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
6163
fileSystem: self.fileSystem,
6264
observabilityScope: observabilityScope,
6365
outputHandler: { print($0.description) },

Sources/SwiftSDKCommand/ListSwiftSDKs.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,13 @@ package struct ListSwiftSDKs: SwiftSDKSubcommand {
3232

3333
func run(
3434
hostTriple: Triple,
35+
hostToolchain: UserToolchain,
3536
_ swiftSDKsDirectory: AbsolutePath,
3637
_ observabilityScope: ObservabilityScope
3738
) throws {
3839
let store = SwiftSDKBundleStore(
3940
swiftSDKsDirectory: swiftSDKsDirectory,
41+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
4042
fileSystem: fileSystem,
4143
observabilityScope: observabilityScope,
4244
outputHandler: { print($0.description) }

Sources/SwiftSDKCommand/RemoveSwiftSDK.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ package struct RemoveSwiftSDK: SwiftSDKSubcommand {
3434

3535
func run(
3636
hostTriple: Triple,
37+
hostToolchain: UserToolchain,
3738
_ swiftSDKsDirectory: Basics.AbsolutePath,
3839
_ observabilityScope: ObservabilityScope
3940
) async throws {
@@ -47,6 +48,7 @@ package struct RemoveSwiftSDK: SwiftSDKSubcommand {
4748
} else {
4849
let bundleStore = SwiftSDKBundleStore(
4950
swiftSDKsDirectory: swiftSDKsDirectory,
51+
hostToolchainBinDir: hostToolchain.swiftCompilerPath.parentDirectory,
5052
fileSystem: self.fileSystem,
5153
observabilityScope: observabilityScope,
5254
outputHandler: { print($0) }

Sources/SwiftSDKCommand/SwiftSDKSubcommand.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ protocol SwiftSDKSubcommand: AsyncParsableCommand {
3030
/// - observabilityScope: observability scope used for logging.
3131
func run(
3232
hostTriple: Triple,
33+
hostToolchain: UserToolchain,
3334
_ swiftSDKsDirectory: AbsolutePath,
3435
_ observabilityScope: ObservabilityScope
3536
) async throws
@@ -71,7 +72,7 @@ extension SwiftSDKSubcommand {
7172

7273
var commandError: Error? = nil
7374
do {
74-
try await self.run(hostTriple: triple, swiftSDKsDirectory, observabilityScope)
75+
try await self.run(hostTriple: triple, hostToolchain: hostToolchain, swiftSDKsDirectory, observabilityScope)
7576
if observabilityScope.errorsReported {
7677
throw ExitCode.failure
7778
}

Tests/PackageModelTests/SwiftSDKBundleTests.swift

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,7 @@ final class SwiftSDKBundleTests: XCTestCase {
186186
var output = [SwiftSDKBundleStore.Output]()
187187
let store = SwiftSDKBundleStore(
188188
swiftSDKsDirectory: tmpDir,
189+
hostToolchainBinDir: tmpDir,
189190
fileSystem: localFileSystem,
190191
observabilityScope: observabilityScope,
191192
outputHandler: {
@@ -227,6 +228,7 @@ final class SwiftSDKBundleTests: XCTestCase {
227228
var output = [SwiftSDKBundleStore.Output]()
228229
let store = SwiftSDKBundleStore(
229230
swiftSDKsDirectory: swiftSDKsDirectory,
231+
hostToolchainBinDir: "/tmp",
230232
fileSystem: fileSystem,
231233
observabilityScope: system.topScope,
232234
outputHandler: {
@@ -319,6 +321,7 @@ final class SwiftSDKBundleTests: XCTestCase {
319321
var output = [SwiftSDKBundleStore.Output]()
320322
let store = SwiftSDKBundleStore(
321323
swiftSDKsDirectory: swiftSDKsDirectory,
324+
hostToolchainBinDir: "/tmp",
322325
fileSystem: fileSystem,
323326
observabilityScope: system.topScope,
324327
outputHandler: {
@@ -359,6 +362,7 @@ final class SwiftSDKBundleTests: XCTestCase {
359362
var output = [SwiftSDKBundleStore.Output]()
360363
let store = SwiftSDKBundleStore(
361364
swiftSDKsDirectory: swiftSDKsDirectory,
365+
hostToolchainBinDir: "/tmp",
362366
fileSystem: fileSystem,
363367
observabilityScope: system.topScope,
364368
outputHandler: {
@@ -400,9 +404,11 @@ final class SwiftSDKBundleTests: XCTestCase {
400404
let system = ObservabilitySystem.makeForTesting()
401405
let hostSwiftSDK = try SwiftSDK.hostSwiftSDK(environment: [:])
402406
let hostTriple = try! Triple("arm64-apple-macosx14.0")
407+
let hostToolchainBinDir = AbsolutePath("/tmp")
403408
let archiver = MockArchiver()
404409
let store = SwiftSDKBundleStore(
405410
swiftSDKsDirectory: swiftSDKsDirectory,
411+
hostToolchainBinDir: hostToolchainBinDir,
406412
fileSystem: fileSystem,
407413
observabilityScope: system.topScope,
408414
outputHandler: { _ in }
@@ -518,6 +524,7 @@ final class SwiftSDKBundleTests: XCTestCase {
518524
var output = [SwiftSDKBundleStore.Output]()
519525
let store = SwiftSDKBundleStore(
520526
swiftSDKsDirectory: swiftSDKsDirectory,
527+
hostToolchainBinDir: "/tmp",
521528
fileSystem: fileSystem,
522529
observabilityScope: system.topScope,
523530
outputHandler: { output.append($0) }

0 commit comments

Comments
 (0)