diff --git a/Sources/Basics/Triple+Basics.swift b/Sources/Basics/Triple+Basics.swift index 5b552b5111a..a7664bd39b9 100644 --- a/Sources/Basics/Triple+Basics.swift +++ b/Sources/Basics/Triple+Basics.swift @@ -186,6 +186,10 @@ extension Triple { /// Returns `true` if code compiled for `triple` can run on `self` value of ``Triple``. public func isRuntimeCompatible(with triple: Triple) -> Bool { + guard self != triple else { + return true + } + if self.arch == triple.arch && self.vendor == triple.vendor && @@ -204,7 +208,11 @@ extension Triple: CustomStringConvertible { } extension Triple: Equatable { - public static func == (lhs: Self, rhs: Self) -> Bool { - lhs.triple == rhs.triple + public static func ==(lhs: Triple, rhs: Triple) -> Bool { + lhs.arch == rhs.arch + && lhs.vendor == rhs.vendor + && lhs.os == rhs.os + && lhs.environment == rhs.environment + && lhs.osVersion == rhs.osVersion } } diff --git a/Tests/BasicsTests/TripleTests.swift b/Tests/BasicsTests/TripleTests.swift index b7909a6a2c3..011d6247b05 100644 --- a/Tests/BasicsTests/TripleTests.swift +++ b/Tests/BasicsTests/TripleTests.swift @@ -164,6 +164,54 @@ final class TripleTests: XCTestCase { XCTAssertTriple("aarch64-unknown-linux-android", matches: (.aarch64, nil, nil, .linux, .android, .elf)) 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 testTriple() { + let linux = try? Triple("x86_64-unknown-linux-gnu") + XCTAssertNotNil(linux) + XCTAssertEqual(linux!.os, .linux) + XCTAssertEqual(linux!.osVersion, Triple.Version.zero) + XCTAssertEqual(linux!.environment, .gnu) + + let macos = try? Triple("x86_64-apple-macosx10.15") + XCTAssertNotNil(macos!) + XCTAssertEqual(macos!.osVersion, .init(parse: "10.15")) + let newVersion = "10.12" + let tripleString = macos!.tripleString(forPlatformVersion: newVersion) + XCTAssertEqual(tripleString, "x86_64-apple-macosx10.12") + let macosNoX = try? Triple("x86_64-apple-macos12.2") + XCTAssertNotNil(macosNoX!) + XCTAssertEqual(macosNoX!.os, .macosx) + XCTAssertEqual(macosNoX!.osVersion, .init(parse: "12.2")) + + let android = try? Triple("aarch64-unknown-linux-android24") + XCTAssertNotNil(android) + XCTAssertEqual(android!.os, .linux) + XCTAssertEqual(android!.environment, .android) + + let linuxWithABIVersion = try? Triple("x86_64-unknown-linux-gnu42") + XCTAssertEqual(linuxWithABIVersion!.environment, .gnu) + } + + func testEquality() throws { + let macOSTriple = try Triple("arm64-apple-macos") + let macOSXTriple = try Triple("arm64-apple-macosx") + XCTAssertEqual(macOSTriple, macOSXTriple) + + let intelMacOSTriple = try Triple("x86_64-apple-macos") + XCTAssertNotEqual(macOSTriple, intelMacOSTriple) + + let linuxWithoutGNUABI = try Triple("x86_64-unknown-linux") + let linuxWithGNUABI = try Triple("x86_64-unknown-linux-gnu") + XCTAssertNotEqual(linuxWithoutGNUABI, linuxWithGNUABI) + } + + func testWASI() throws { + let wasi = try Triple("wasm32-unknown-wasi") + + // WASI dynamic libraries are only experimental, + // but SwiftPM requires this property not to crash. + _ = wasi.dynamicLibraryExtension } func testIsRuntimeCompatibleWith() throws {