diff --git a/Sources/Basics/Triple+Basics.swift b/Sources/Basics/Triple+Basics.swift index 7da68ca29ac..115b502a0f2 100644 --- a/Sources/Basics/Triple+Basics.swift +++ b/Sources/Basics/Triple+Basics.swift @@ -183,6 +183,19 @@ extension Triple { return ".resources" } } + + public func isRuntimeCompatible(with triple: Triple) -> Bool { + if + self.arch == triple.arch && + self.vendor == triple.vendor && + self.os == triple.os && + self.environment == triple.environment + { + return self.osVersion >= triple.osVersion + } else { + return false + } + } } extension Triple: CustomStringConvertible { diff --git a/Sources/PackageModel/SwiftSDKBundle.swift b/Sources/PackageModel/SwiftSDKBundle.swift index 1aa3c237240..33bdee7f8ee 100644 --- a/Sources/PackageModel/SwiftSDKBundle.swift +++ b/Sources/PackageModel/SwiftSDKBundle.swift @@ -428,7 +428,9 @@ extension [SwiftSDKBundle] { for bundle in self { for (artifactID, variants) in bundle.artifacts { for variant in variants { - guard variant.metadata.supportedTriples.contains(hostTriple) else { + guard variant.metadata.supportedTriples.contains(where: { variantTriple in + hostTriple.isRuntimeCompatible(with: variantTriple) + }) else { continue } diff --git a/Tests/BasicsTests/TripleTests.swift b/Tests/BasicsTests/TripleTests.swift index aa392c0c5ee..b7909a6a2c3 100644 --- a/Tests/BasicsTests/TripleTests.swift +++ b/Tests/BasicsTests/TripleTests.swift @@ -165,4 +165,11 @@ final class TripleTests: XCTestCase { XCTAssertTriple("x86_64-unknown-windows-msvc", matches: (.x86_64, nil, nil, .win32, .msvc, .coff)) XCTAssertTriple("wasm32-unknown-wasi", matches: (.wasm32, nil, nil, .wasi, nil, .wasm)) } + + func testIsRuntimeCompatibleWith() throws { + try XCTAssertTrue(Triple("x86_64-apple-macosx").isRuntimeCompatible(with: Triple("x86_64-apple-macosx"))) + try XCTAssertTrue(Triple("x86_64-unknown-linux").isRuntimeCompatible(with: Triple("x86_64-unknown-linux"))) + try XCTAssertFalse(Triple("x86_64-apple-macosx").isRuntimeCompatible(with: Triple("x86_64-apple-linux"))) + try XCTAssertTrue(Triple("x86_64-apple-macosx14.0").isRuntimeCompatible(with: Triple("x86_64-apple-macosx13.0"))) + } }