diff --git a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift index 8d68de1e..a68941ff 100644 --- a/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift +++ b/Sources/BuildSystemIntegration/SwiftPMBuildSystem.swift @@ -226,25 +226,23 @@ package actor SwiftPMBuildSystem { let hostSDK = try SwiftSDK.hostSwiftSDK(AbsolutePath(destinationToolchainBinDir)) let hostSwiftPMToolchain = try UserToolchain(swiftSDK: hostSDK) - var destinationSDK: SwiftSDK - if let swiftSDK = options.swiftPM.swiftSDK { - let bundleStore = try SwiftSDKBundleStore( + let destinationSDK = try SwiftSDK.deriveTargetSwiftSDK( + hostSwiftSDK: hostSDK, + hostTriple: hostSwiftPMToolchain.targetTriple, + customCompileTriple: options.swiftPM.triple.map { try Triple($0) }, + swiftSDKSelector: options.swiftPM.swiftSDK, + store: SwiftSDKBundleStore( swiftSDKsDirectory: fileSystem.getSharedSwiftSDKsDirectory( explicitDirectory: options.swiftPM.swiftSDKsDirectory.map { try AbsolutePath(validating: $0) } ), fileSystem: fileSystem, observabilityScope: observabilitySystem.topScope, outputHandler: { _ in } - ) - destinationSDK = try bundleStore.selectBundle(matching: swiftSDK, hostTriple: hostSwiftPMToolchain.targetTriple) - } else { - destinationSDK = hostSDK - } + ), + observabilityScope: observabilitySystem.topScope, + fileSystem: fileSystem + ) - if let triple = options.swiftPM.triple { - destinationSDK = hostSDK - destinationSDK.targetTriple = try Triple(triple) - } let destinationSwiftPMToolchain = try UserToolchain(swiftSDK: destinationSDK) var location = try Workspace.Location( diff --git a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift index 437f230f..190c7a0e 100644 --- a/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift +++ b/Tests/BuildSystemIntegrationTests/SwiftPMBuildSystemTests.swift @@ -288,6 +288,46 @@ final class SwiftPMBuildSystemTests: XCTestCase { } } + func testDefaultSDKs() async throws { + let fs = localFileSystem + try await withTestScratchDir { tempDir in + try fs.createFiles( + root: tempDir, + files: [ + "pkg/Sources/lib/a.swift": "", + "pkg/Package.swift": """ + // swift-tools-version:6.0 + import PackageDescription + let package = Package( + name: "a", + targets: [.target(name: "lib")] + ) + """, + ] + ) + let tr = ToolchainRegistry.forTesting + + let options = SourceKitLSPOptions.SwiftPMOptions( + swiftSDKsDirectory: "/tmp/non_existent_sdks_dir", + triple: "wasm32-unknown-wasi" + ) + + let swiftpmBuildSystem = try await SwiftPMBuildSystem( + workspacePath: tempDir.appending(component: "pkg"), + toolchainRegistry: tr, + fileSystem: fs, + options: SourceKitLSPOptions(swiftPM: options), + testHooks: SwiftPMTestHooks() + ) + let path = await swiftpmBuildSystem.destinationBuildParameters.toolchain.sdkRootPath + XCTAssertEqual( + path?.components.suffix(3), + ["usr", "share", "wasi-sysroot"], + "SwiftPMBuildSystem should share default SDK derivation logic with libSwiftPM" + ) + } + } + func testManifestArgs() async throws { let fs = localFileSystem try await withTestScratchDir { tempDir in