From ae261e0e9598e76f10b69cf661fcbab286f04bc5 Mon Sep 17 00:00:00 2001 From: Chris McGee Date: Thu, 4 Dec 2025 09:09:53 -0500 Subject: [PATCH] Use new Swift Build run destination API for SDK's When using an SDK with the `--swift-sdk` build parameter this information is provided to Swift Build as part of the build request so that it can use it instead of the host SDK. --- .swift-version | 2 +- Sources/PackageModel/SwiftSDKs/SwiftSDK.swift | 18 +++- Sources/PackageModel/Toolchain.swift | 2 + .../SwiftBuildSupport/SwiftBuildSystem.swift | 89 ++++++++++++------- 4 files changed, 72 insertions(+), 39 deletions(-) diff --git a/.swift-version b/.swift-version index 4ac4fded49f..0df17dd0f6a 100644 --- a/.swift-version +++ b/.swift-version @@ -1 +1 @@ -6.2.0 \ No newline at end of file +6.2.1 \ No newline at end of file diff --git a/Sources/PackageModel/SwiftSDKs/SwiftSDK.swift b/Sources/PackageModel/SwiftSDKs/SwiftSDK.swift index bef655063af..2f96d74f0c1 100644 --- a/Sources/PackageModel/SwiftSDKs/SwiftSDK.swift +++ b/Sources/PackageModel/SwiftSDKs/SwiftSDK.swift @@ -265,6 +265,8 @@ public struct SwiftSDK: Equatable { /// deserialization. public private(set) var toolset: Toolset + public private(set) var swiftSDKManifest: Basics.AbsolutePath? + /// The paths associated with a Swift SDK. The Path type can be a `String` /// to encapsulate the arguments for the `SwiftSDKConfigurationStore.configure` /// function, or can be a fully-realized `AbsolutePath` when deserialized from a configuration. @@ -499,12 +501,14 @@ public struct SwiftSDK: Equatable { hostTriple: Triple? = nil, targetTriple: Triple? = nil, toolset: Toolset, + swiftSDKManifest: Basics.AbsolutePath? = nil, pathsConfiguration: PathsConfiguration, xctestSupport: XCTestSupport = .supported ) { self.hostTriple = hostTriple self.targetTriple = targetTriple self.toolset = toolset + self.swiftSDKManifest = swiftSDKManifest self.pathsConfiguration = pathsConfiguration self.xctestSupport = xctestSupport } @@ -927,7 +931,8 @@ extension SwiftSDK { targetTriple: triple, properties: properties, toolset: toolset, - swiftSDKDirectory: swiftSDKDirectory + swiftSDKDirectory: swiftSDKDirectory, + swiftSDKManifest: path, ) } @@ -958,7 +963,8 @@ extension SwiftSDK { targetTriple: triple, properties: properties, toolset: toolset, - swiftSDKDirectory: swiftSDKDirectory + swiftSDKDirectory: swiftSDKDirectory, + swiftSDKManifest: path, ) } default: @@ -976,11 +982,13 @@ extension SwiftSDK { targetTriple: Triple, properties: SwiftSDKMetadataV4.TripleProperties, toolset: Toolset = .init(), - swiftSDKDirectory: Basics.AbsolutePath? = nil + swiftSDKDirectory: Basics.AbsolutePath? = nil, + swiftSDKManifest: Basics.AbsolutePath? = nil, ) throws { self.init( targetTriple: targetTriple, toolset: toolset, + swiftSDKManifest: swiftSDKManifest, pathsConfiguration: try .init(properties, swiftSDKDirectory: swiftSDKDirectory) ) } @@ -995,11 +1003,13 @@ extension SwiftSDK { targetTriple: Triple, properties: SerializedDestinationV3.TripleProperties, toolset: Toolset = .init(), - swiftSDKDirectory: Basics.AbsolutePath? = nil + swiftSDKDirectory: Basics.AbsolutePath? = nil, + swiftSDKManifest: Basics.AbsolutePath? = nil, ) throws { self.init( targetTriple: targetTriple, toolset: toolset, + swiftSDKManifest: swiftSDKManifest, pathsConfiguration: try .init(properties, swiftSDKDirectory: swiftSDKDirectory) ) } diff --git a/Sources/PackageModel/Toolchain.swift b/Sources/PackageModel/Toolchain.swift index fb2fbce9f17..7cc9c3a0ea6 100644 --- a/Sources/PackageModel/Toolchain.swift +++ b/Sources/PackageModel/Toolchain.swift @@ -69,6 +69,8 @@ public protocol Toolchain { /// Additional flags to be passed to the C++ compiler. @available(*, deprecated, message: "use extraFlags.cxxCompilerFlags instead") var extraCPPFlags: [String] { get } + + var swiftSDK: SwiftSDK { get } } extension Toolchain { diff --git a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift index bf0e98161cf..adb2b89b612 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -828,36 +828,50 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { } private func makeRunDestination() -> SwiftBuild.SWBRunDestinationInfo { - let platformName: String - let sdkName: String - if self.buildParameters.triple.isAndroid() { - // Android triples are identified by the environment part of the triple - platformName = "android" - sdkName = platformName - } else if self.buildParameters.triple.isWasm { - // Swift Build uses webassembly instead of wasi as the platform name - platformName = "webassembly" - sdkName = platformName + if let sdkManifestPath = self.buildParameters.toolchain.swiftSDK.swiftSDKManifest { + return SwiftBuild.SWBRunDestinationInfo( + buildTarget: .swiftSDK(sdkManifestPath: sdkManifestPath.pathString, triple: self.buildParameters.triple.tripleString), + targetArchitecture: buildParameters.triple.archName, + supportedArchitectures: [], + disableOnlyActiveArch: (buildParameters.architectures?.count ?? 1) > 1, + ) } else { - platformName = self.buildParameters.triple.darwinPlatform?.platformName ?? self.buildParameters.triple.osNameUnversioned - sdkName = platformName - } + let platformName: String + let sdkName: String + + if self.buildParameters.triple.isAndroid() { + // Android triples are identified by the environment part of the triple + platformName = "android" + sdkName = platformName + // FIXME remove this case + } else if self.buildParameters.triple.isWasm { + // Swift Build uses webassembly instead of wasi as the platform name + platformName = "webassembly" + sdkName = platformName + } else { + platformName = self.buildParameters.triple.darwinPlatform?.platformName ?? self.buildParameters.triple.osNameUnversioned + sdkName = platformName + } - let sdkVariant: String? - if self.buildParameters.triple.environment == .macabi { - sdkVariant = "iosmac" - } else { - sdkVariant = nil - } + let sdkVariant: String? + if self.buildParameters.triple.environment == .macabi { + sdkVariant = "iosmac" + } else { + sdkVariant = nil + } - return SwiftBuild.SWBRunDestinationInfo( - platform: platformName, - sdk: sdkName, - sdkVariant: sdkVariant, - targetArchitecture: buildParameters.triple.archName, - supportedArchitectures: [], - disableOnlyActiveArch: (buildParameters.architectures?.count ?? 1) > 1 - ) + return SwiftBuild.SWBRunDestinationInfo( + buildTarget: .toolchainSDK( + platform: platformName, + sdk: sdkName, + sdkVariant: sdkVariant + ), + targetArchitecture: buildParameters.triple.archName, + supportedArchitectures: [], + disableOnlyActiveArch: (buildParameters.architectures?.count ?? 1) > 1, + hostTargetedPlatform: nil + ) + } } private func makeBuildParameters(session: SWBBuildServiceSession, symbolGraphOptions: BuildOutput.SymbolGraphOptions?) async throws -> SwiftBuild.SWBBuildParameters { @@ -874,7 +888,7 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { // If the SwiftPM toolchain corresponds to a toolchain registered with the lower level build system, add it to the toolchain stack. // Otherwise, apply overrides for each component of the SwiftPM toolchain. - if let toolchainID = try await session.lookupToolchain(at: buildParameters.toolchain.toolchainDir.pathString) { + if let toolchainID = try await session.lookupToolchain(at: "/Users/cmcgee/Library/Developer/Toolchains/swift-6.2.1-RELEASE.xctoolchain") { settings["TOOLCHAINS"] = "\(toolchainID.rawValue) $(inherited)" } else { // FIXME: This list of overrides is incomplete. @@ -968,12 +982,19 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem { + buildParameters.flags.swiftCompilerFlags.map { $0.shellEscaped() } ).joined(separator: " ") - settings["OTHER_LDFLAGS"] = ( - verboseFlag + // clang will be invoked to link so the verbose flag is valid for it - ["$(inherited)"] - + buildParameters.toolchain.extraFlags.linkerFlags.asSwiftcLinkerFlags().map { $0.shellEscaped() } - + buildParameters.flags.linkerFlags.asSwiftcLinkerFlags().map { $0.shellEscaped() } - ).joined(separator: " ") + let inherited = ["$(inherited)"] + + let buildParametersLinkFlags = + buildParameters.toolchain.extraFlags.linkerFlags.asSwiftcLinkerFlags().map { $0.shellEscaped() } + + buildParameters.flags.linkerFlags.asSwiftcLinkerFlags().map { $0.shellEscaped() } + + var otherLdFlags = + verboseFlag // clang will be invoked to link so the verbose flag is valid for it + + inherited + + otherLdFlags += buildParametersLinkFlags + + settings["OTHER_LDFLAGS"] = otherLdFlags.joined(separator: " ") // Optionally also set the list of architectures to build for. if let architectures = buildParameters.architectures, !architectures.isEmpty {