diff --git a/swift-tools-support-core/Sources/TSCUtility/Triple.swift b/swift-tools-support-core/Sources/TSCUtility/Triple.swift
index 449a21f..87e70b5 100644
--- a/swift-tools-support-core/Sources/TSCUtility/Triple.swift
+++ b/swift-tools-support-core/Sources/TSCUtility/Triple.swift
@@ -27,6 +27,8 @@ public struct Triple: Encodable, Equatable {
     public let vendor: Vendor
     public let os: OS
     public let abi: ABI
+    public let osVersion: String?
+    public let abiVersion: String?
 
     public enum Error: Swift.Error {
         case badFormat
@@ -83,13 +85,18 @@ public struct Triple: Encodable, Equatable {
             throw Error.unknownOS
         }
 
+        let osVersion = Triple.parseVersion(components[2])
+
         let abi = components.count > 3 ? Triple.parseABI(components[3]) : nil
+        let abiVersion = components.count > 3 ? Triple.parseVersion(components[3]) : nil
 
         self.tripleString = string
         self.arch = arch
         self.vendor = vendor
         self.os = os
+        self.osVersion = osVersion
         self.abi = abi ?? .unknown
+        self.abiVersion = abiVersion
     }
 
     fileprivate static func parseOS(_ string: String) -> OS? {
@@ -100,6 +107,15 @@ public struct Triple: Encodable, Equatable {
         return nil
     }
 
+    fileprivate static func parseVersion(_ string: String) -> String? {
+        let candidate = String(string.drop(while: { $0.isLetter }))
+        if candidate != string && !candidate.isEmpty {
+            return candidate
+        }
+
+        return nil
+    }
+
     fileprivate static func parseABI(_ string: String) -> ABI? {
         if string.hasPrefix(ABI.android.rawValue) {
             return ABI.android
@@ -132,18 +148,18 @@ public struct Triple: Encodable, Equatable {
     /// This is currently meant for Apple platforms only.
     public func tripleString(forPlatformVersion version: String) -> String {
         precondition(isDarwin())
-        return self.tripleString + version
+        return String(self.tripleString.dropLast(self.osVersion?.count ?? 0)) + version
     }
 
     public static let macOS = try! Triple("x86_64-apple-macosx")
 
-    /// Determine the host triple using the Swift compiler.
+    /// Determine the versioned host triple using the Swift compiler.
     public static func getHostTriple(usingSwiftCompiler swiftCompiler: AbsolutePath) -> Triple {
         do {
             let result = try Process.popen(args: swiftCompiler.pathString, "-print-target-info")
             let output = try result.utf8Output().spm_chomp()
             let targetInfo = try JSON(string: output)
-            let tripleString: String = try targetInfo.get("target").get("unversionedTriple")
+            let tripleString: String = try targetInfo.get("target").get("triple")
             return try Triple(tripleString)
         } catch {
             // FIXME: Remove the macOS special-casing once the latest version of Xcode comes with
diff --git a/swiftpm/Utilities/bootstrap b/swiftpm/Utilities/bootstrap
index 6ae084e9..2f3f99e0 100755
--- a/swiftpm/Utilities/bootstrap
+++ b/swiftpm/Utilities/bootstrap
@@ -289,7 +289,7 @@ def get_build_target(args, cross_compile=False):
         target_info_json = subprocess.check_output(command,
                                stderr=subprocess.PIPE, universal_newlines=True).strip()
         args.target_info = json.loads(target_info_json)
-        return args.target_info["target"]["unversionedTriple"]
+        return args.target_info["target"]["triple"]
     except Exception as e:
         # Temporary fallback for Darwin.
         if platform.system() == 'Darwin':
