diff --git a/Sources/Basics/Vendor/Triple+Platforms.swift b/Sources/Basics/Vendor/Triple+Platforms.swift index d26931b0ca7..4bf85088d3d 100644 --- a/Sources/Basics/Vendor/Triple+Platforms.swift +++ b/Sources/Basics/Vendor/Triple+Platforms.swift @@ -43,6 +43,12 @@ public enum DarwinPlatform: Hashable { /// watchOS, corresponding to the `watchos` OS name. case watchOS(EnvironmentWithoutCatalyst) + /// visionOS, corresponding to the `xros` and `visionos` OS names. + case visionOS(EnvironmentWithoutCatalyst) + + /// DriverKit, corresponding to the `driverkit` OS name. + case driverKit + /// The most general form of environment information attached to a /// `DarwinPlatform`. /// @@ -87,6 +93,11 @@ public enum DarwinPlatform: Hashable { case .watchOS: guard let withoutCatalyst = environment.withoutCatalyst else { return nil } return .watchOS(withoutCatalyst) + case .visionOS: + guard let withoutCatalyst = environment.withoutCatalyst else { return nil } + return .visionOS(withoutCatalyst) + case .driverKit: + return .driverKit } } @@ -108,6 +119,12 @@ public enum DarwinPlatform: Hashable { return "watchOS" case .watchOS(.simulator): return "watchOS Simulator" + case .visionOS(.device): + return "visionOS" + case .visionOS(.simulator): + return "visionOS Simulator" + case .driverKit: + return "DriverKit" } } @@ -131,6 +148,12 @@ public enum DarwinPlatform: Hashable { return "watchos" case .watchOS(.simulator): return "watchsimulator" + case .visionOS(.device): + return "xros" + case .visionOS(.simulator): + return "xrsimulator" + case .driverKit: + return "driverkit" } } @@ -153,6 +176,12 @@ public enum DarwinPlatform: Hashable { return "watchos" case .watchOS(.simulator): return "watchos-simulator" + case .visionOS(.device): + return "visionos" + case .visionOS(.simulator): + return "visionos-simulator" + case .driverKit: + return "driverkit" } } @@ -176,6 +205,12 @@ public enum DarwinPlatform: Hashable { return "watchos" case .watchOS(.simulator): return "watchossim" + case .visionOS(.device): + return "xros" + case .visionOS(.simulator): + return "xrossim" + case .driverKit: + return "driverkit" } } } @@ -208,6 +243,10 @@ extension Triple { return _iOSVersion case .watchOS: return _watchOSVersion + case .visionOS: + return _visionOSVersion + case .driverKit: + return _driverKitOSVersion } } @@ -234,6 +273,10 @@ extension Triple { return .watchOS(makeEnvironment()) case .tvos: return .tvOS(makeEnvironment()) + case .visionos: + return .visionOS(makeEnvironment()) + case .driverkit: + return .driverKit default: return nil } @@ -282,6 +325,13 @@ extension Triple { return Version(7, 0, 0) } + return osVersion + case .visionOS(_): + return osVersion + case .driverKit: + if osVersion.major < 19 { + return Version(19, 0, 0) + } return osVersion } } @@ -296,12 +346,13 @@ extension Triple { switch os { case nil: fatalError("unknown OS") - case .darwin, .macosx, .ios, .tvos, .watchos: + case .darwin, .macosx, .ios, .tvos, .watchos, .visionos: guard let darwinPlatform = darwinPlatform else { fatalError("unsupported darwin platform kind?") } return conflatingDarwin ? "darwin" : darwinPlatform.platformName - + case .driverkit: + return "driverkit" case .linux: return environment == .android ? "android" : "linux" case .freebsd: @@ -362,6 +413,8 @@ public struct FeatureAvailability: Sendable { public let iOS: Availability public let tvOS: Availability public let watchOS: Availability + public let visionOS: Availability + public let driverKit: Availability // TODO: We should have linux, windows, etc. public let nonDarwin: Bool @@ -373,12 +426,16 @@ public struct FeatureAvailability: Sendable { iOS: Availability, tvOS: Availability, watchOS: Availability, + visionOS: Availability, + driverKit: Availability, nonDarwin: Bool = false ) { self.macOS = macOS self.iOS = iOS self.tvOS = tvOS self.watchOS = watchOS + self.visionOS = visionOS + self.driverKit = driverKit self.nonDarwin = nonDarwin } @@ -394,6 +451,10 @@ public struct FeatureAvailability: Sendable { return tvOS case .watchOS: return watchOS + case .visionOS: + return visionOS + case .driverKit: + return driverKit } } } @@ -429,7 +490,9 @@ extension Triple.FeatureAvailability { macOS: .available(since: Triple.Version(10, 11, 0)), iOS: .available(since: Triple.Version(9, 0, 0)), tvOS: .available(since: Triple.Version(9, 0, 0)), - watchOS: .availableInAllVersions + watchOS: .availableInAllVersions, + visionOS: .availableInAllVersions, + driverKit: .availableInAllVersions // no Objective-C in DriverKit, but ARClite shouldn't be linked ) // When updating the versions listed here, please record the most recent // feature being depended on and when it was introduced: diff --git a/Sources/Basics/Vendor/Triple.swift b/Sources/Basics/Vendor/Triple.swift index 441962f43ea..10b4da781eb 100644 --- a/Sources/Basics/Vendor/Triple.swift +++ b/Sources/Basics/Vendor/Triple.swift @@ -1089,6 +1089,7 @@ extension Triple { case cloudABI = "cloudabi" case darwin case dragonFly = "dragonfly" + case driverkit case freebsd = "freebsd" case fuchsia case ios @@ -1113,6 +1114,7 @@ extension Triple { case elfiamcu case tvos case watchos + case visionos = "xros" case mesa3d case contiki case amdpal @@ -1136,6 +1138,8 @@ extension Triple { return .darwin case _ where os.hasPrefix("dragonfly"): return .dragonFly + case _ where os.hasPrefix("driverkit"): + return .driverkit case _ where os.hasPrefix("freebsd"): return .freebsd case _ where os.hasPrefix("fuchsia"): @@ -1186,6 +1190,8 @@ extension Triple { return .tvos case _ where os.hasPrefix("watchos"): return .watchos + case _ where os.hasPrefix("xros") || os.hasPrefix("visionos"): + return .visionos case _ where os.hasPrefix("mesa3d"): return .mesa3d case _ where os.hasPrefix("contiki"): @@ -1479,6 +1485,7 @@ extension Triple.OS { /// changes, i.e., if the two operating systems diverge or their version /// numbers get out of sync, that will need to be changed. /// watchOS has completely different version numbers so it is not included. + @available(*, unavailable, message: "Do not use - this confusingly named property indicates either iOS or tvOS due to LLVM history. Compare directly with .ios or .tvos as needed.") public var isiOS: Bool { self == .ios || isTvOS } @@ -1493,9 +1500,9 @@ extension Triple.OS { self == .watchos } - /// isOSDarwin - Is this a "Darwin" OS (OS X, iOS, or watchOS). + /// isOSDarwin - Is this a "Darwin" OS (macOS, iOS, tvOS, watchOS, visionOS, or DriverKit). public var isDarwin: Bool { - isMacOSX || isiOS || isWatchOS + [.darwin, .macosx, .ios, .tvos, .watchos, .visionos, .driverkit].contains(self) } } @@ -1605,7 +1612,7 @@ extension Triple { return nil } - case .ios, .tvos, .watchos: + case .ios, .tvos, .watchos, .visionos, .driverkit: // Ignore the version from the triple. This is only handled because the // the clang driver combines OS X and IOS support into a common Darwin // toolchain that wants to know the OS X version number even when targeting @@ -1638,7 +1645,7 @@ extension Triple { version.major = arch == .aarch64 ? 7 : 5 } return version - case .watchos: + case .watchos, .visionos, .driverkit: fatalError("conflicting triple info") default: fatalError("unexpected OS for Darwin triple") @@ -1670,13 +1677,53 @@ extension Triple { fatalError("unexpected OS for Darwin triple") } } + + /// Parse the version number as with getOSVersion. This should only be + /// called with visionOS or generic triples. + /// + /// This accessor is semi-private; it's typically better to use `version(for:)` or + /// `Triple.FeatureAvailability`. + public var _visionOSVersion: Version { + switch os { + case .visionos: + var version = self.osVersion + if version.major == 0 { + version.major = 1 + } + return version + case .darwin, .macosx, .ios, .tvos, .watchos: + fatalError("conflicting triple info") + default: + fatalError("unexpected OS for Darwin triple") + } + } + + /// Parse the version number as with getOSVersion. This should only be + /// called with DriverKit or generic triples. + /// + /// This accessor is semi-private; it's typically better to use `version(for:)` or + /// `Triple.FeatureAvailability`. + public var _driverKitOSVersion: Version { + switch os { + case .driverkit: + var version = self.osVersion + if version.major == 0 { + version.major = 1 + } + return version + case .darwin, .macosx, .ios, .tvos, .watchos, .visionos: + fatalError("conflicting triple info") + default: + fatalError("unexpected OS for Darwin triple") + } + } } // MARK: - Catalyst extension Triple { @_spi(Testing) public var isMacCatalyst: Bool { - return self.isiOS && !self.isTvOS && environment == .macabi + return os == .ios && environment == .macabi } func isValidForZipperingWithTriple(_ variant: Triple) -> Bool { diff --git a/Sources/SPMBuildCore/BinaryTarget+Extensions.swift b/Sources/SPMBuildCore/BinaryTarget+Extensions.swift index 902e51089c0..9bacddcc0c0 100644 --- a/Sources/SPMBuildCore/BinaryTarget+Extensions.swift +++ b/Sources/SPMBuildCore/BinaryTarget+Extensions.swift @@ -133,6 +133,10 @@ extension Triple.OS { return "tvos" case .watchos: return "watchos" + case .visionos: + return "xros" + case .driverkit: + return "driverkit" default: return nil // XCFrameworks do not support any of these platforms today. } diff --git a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift index 6bd5b8804c1..396751eda88 100644 --- a/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift +++ b/Sources/SPMBuildCore/BuildParameters/BuildParameters.swift @@ -97,6 +97,8 @@ public struct BuildParameters: Encodable { var currentPlatform: PackageModel.Platform { if self.triple.isDarwin() { switch self.triple.darwinPlatform { + case .driverKit: + return .driverKit case .iOS(.catalyst): return .macCatalyst case .iOS(.device), .iOS(.simulator): @@ -105,6 +107,8 @@ public struct BuildParameters: Encodable { return .tvOS case .watchOS: return .watchOS + case .visionOS: + return .visionOS case .macOS, nil: return .macOS } @@ -118,8 +122,10 @@ public struct BuildParameters: Encodable { return .openbsd } else if self.triple.isFreeBSD() { return .freebsd - } else { + } else if self.triple.isLinux() { return .linux + } else { + return .custom(name: "unknown", oldestSupportedVersion: .unknown) } } diff --git a/Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift b/Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift index 13b02f49c03..63a3c24bcac 100644 --- a/Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift +++ b/Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift @@ -128,9 +128,9 @@ struct PackagePIFProjectBuilder { .iOS: moduleDeploymentTargets?[.iOS], .tvOS: moduleDeploymentTargets?[.tvOS], .watchOS: moduleDeploymentTargets?[.watchOS], + .visionOS: moduleDeploymentTargets?[.visionOS], .driverKit: moduleDeploymentTargets?[.driverKit], ] - deploymentTargets[.visionOS] = moduleDeploymentTargets?[.visionOS] let declaredPlatforms = firstModule?.declaredPlatforms // Compute the names of all explicitly dynamic library products, we need to avoid diff --git a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift index aa36f988fd6..85316e3be99 100644 --- a/Sources/SwiftBuildSupport/SwiftBuildSystem.swift +++ b/Sources/SwiftBuildSupport/SwiftBuildSystem.swift @@ -869,6 +869,10 @@ fileprivate extension Triple { return "TVOS_DEPLOYMENT_TARGET" case (.watchos, _): return "WATCHOS_DEPLOYMENT_TARGET" + case (.visionos, _): + return "XROS_DEPLOYMENT_TARGET" + case (.driverkit, _): + return "DRIVERKIT_DEPLOYMENT_TARGET" case (_, .android): return "ANDROID_DEPLOYMENT_TARGET" default: diff --git a/Sources/XCBuildSupport/PIF.swift b/Sources/XCBuildSupport/PIF.swift index d418da1f15c..ee2d2cc912f 100644 --- a/Sources/XCBuildSupport/PIF.swift +++ b/Sources/XCBuildSupport/PIF.swift @@ -985,6 +985,7 @@ public enum PIF { case iOS = "ios" case tvOS = "tvos" case watchOS = "watchos" + case visionOS = "visionos" case driverKit = "driverkit" case linux @@ -995,6 +996,7 @@ public enum PIF { case .iOS: return .iOS case .tvOS: return .tvOS case .watchOS: return .watchOS + case .visionOS: return .visionOS case .driverKit: return .driverKit case .linux: return .linux } diff --git a/Sources/XCBuildSupport/PIFBuilder.swift b/Sources/XCBuildSupport/PIFBuilder.swift index 1b231f68592..c618403dc4c 100644 --- a/Sources/XCBuildSupport/PIFBuilder.swift +++ b/Sources/XCBuildSupport/PIFBuilder.swift @@ -319,7 +319,7 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder { settings[.ENABLE_TESTING_SEARCH_PATHS] = "YES" // XCTest search paths should only be specified for certain platforms (watchOS doesn't have XCTest). - for platform: PIF.BuildSettings.Platform in [.macOS, .iOS, .tvOS] { + for platform: PIF.BuildSettings.Platform in [.macOS, .iOS, .tvOS, .visionOS] { settings[.FRAMEWORK_SEARCH_PATHS, for: platform, default: ["$(inherited)"]] .append("$(PLATFORM_DIR)/Developer/Library/Frameworks") } @@ -1949,6 +1949,7 @@ extension PIF.BuildSettings.Platform { case .macOS: .macOS case .tvOS: .tvOS case .watchOS: .watchOS + case .visionOS: .visionOS case .driverKit: .driverKit default: nil } diff --git a/Tests/BasicsTests/TripleTests.swift b/Tests/BasicsTests/TripleTests.swift index 6eb2a1b48e2..b17ef26da94 100644 --- a/Tests/BasicsTests/TripleTests.swift +++ b/Tests/BasicsTests/TripleTests.swift @@ -43,6 +43,8 @@ struct TripleTests { (tripleName: "x86_64-apple-macosx", isApple: true, isDarwin: true), (tripleName: "x86_64-apple-macosx10.15", isApple: true, isDarwin: true), (tripleName: "x86_64h-apple-darwin", isApple: true, isDarwin: true), + (tripleName: "x86_64-apple-driverkit", isApple: true, isDarwin: true), + (tripleName: "arm64-apple-driverkit", isApple: true, isDarwin: true), (tripleName: "i686-pc-windows-msvc", isApple: false, isDarwin: false), (tripleName: "i686-pc-windows-gnu", isApple: false, isDarwin: false), (tripleName: "i686-pc-windows-cygnus", isApple: false, isDarwin: false), @@ -246,6 +248,15 @@ struct TripleTests { expectedOs: .wasi, expectedEnvironment: nil, expectedObjectFormat: .wasm + ), + DataKnownTripleParsing( + tripleName: "arm64-apple-driverkit19.0", + expectedArch: .aarch64, + expectedSubArch: nil, + expectedVendor: .apple, + expectedOs: .driverkit, + expectedEnvironment: nil, + expectedObjectFormat: .macho ) ] )