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 5e5b95908cf..7c001e453ad 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 } @@ -942,7 +946,8 @@ extension SwiftSDK { targetTriple: triple, properties: properties, toolset: toolset, - swiftSDKDirectory: swiftSDKDirectory + swiftSDKDirectory: swiftSDKDirectory, + swiftSDKManifest: path, ) } @@ -973,7 +978,8 @@ extension SwiftSDK { targetTriple: triple, properties: properties, toolset: toolset, - swiftSDKDirectory: swiftSDKDirectory + swiftSDKDirectory: swiftSDKDirectory, + swiftSDKManifest: path, ) } default: @@ -991,11 +997,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) ) } @@ -1010,11 +1018,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 b6d5a3f478e..d70a22ed21a 100644 --- a/Sources/PackageModel/Toolchain.swift +++ b/Sources/PackageModel/Toolchain.swift @@ -75,6 +75,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 e5f4204aebd..3326e399649 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -702,36 +702,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 + ) + } } internal func makeBuildParameters( @@ -866,12 +880,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 {