Skip to content

Commit 1a3b735

Browse files
authored
Add DriverKit as a supported platform (#3293)
This adds DriverKit as a support platform, so that a minimum deployment target can be specified and conditional build settings can be configured. rdar://66656200
1 parent de3e01f commit 1a3b735

File tree

12 files changed

+77
-2
lines changed

12 files changed

+77
-2
lines changed

Sources/PackageCollections/Providers/JSONPackageCollectionProvider.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,8 @@ extension PackageModel.Platform {
386386
self = PackageModel.Platform.tvOS
387387
case let name where name.contains("watchos"):
388388
self = PackageModel.Platform.watchOS
389+
case let name where name.contains("driverkit"):
390+
self = PackageModel.Platform.driverKit
389391
case let name where name.contains("linux"):
390392
self = PackageModel.Platform.linux
391393
case let name where name.contains("android"):

Sources/PackageDescription/SupportedPlatforms.swift

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@ public struct Platform: Encodable, Equatable {
3131
/// The watchOS platform.
3232
public static let watchOS: Platform = Platform(name: "watchos")
3333

34+
/// The DriverKit platform
35+
public static let driverKit: Platform = Platform(name: "driverkit")
36+
3437
/// The Linux platform.
3538
public static let linux: Platform = Platform(name: "linux")
3639

@@ -161,6 +164,25 @@ public struct SupportedPlatform: Encodable, Equatable {
161164
public static func watchOS(_ versionString: String) -> SupportedPlatform {
162165
return SupportedPlatform(platform: .watchOS, version: SupportedPlatform.WatchOSVersion(string: versionString).version)
163166
}
167+
168+
/// Configures the minimum deployment target version for the DriverKit platform.
169+
///
170+
/// - Parameter version: The minimum deployment target that the package supports.
171+
@available(_PackageDescription, introduced: 999.0)
172+
public static func driverKit(_ version: SupportedPlatform.DriverKitVersion) -> SupportedPlatform {
173+
return SupportedPlatform(platform: .driverKit, version: version.version)
174+
}
175+
176+
/// Configures the minimum deployment target version for the DriverKit platform
177+
/// using a custom version string.
178+
///
179+
/// The version string must be a series of two or three dot-separated integers, such as `19.0` or `19.0.1`.
180+
///
181+
/// - Parameter versionString: The minimum deployment target as a string representation of two or three dot-separated integers, such as `19.0.1`.
182+
@available(_PackageDescription, introduced: 999.0)
183+
public static func driverKit(_ versionString: String) -> SupportedPlatform {
184+
return SupportedPlatform(platform: .driverKit, version: SupportedPlatform.DriverKitVersion(string: versionString).version)
185+
}
164186
}
165187

166188
/// An extension to the SupportedPlatform struct that defines major platform versions.
@@ -362,6 +384,27 @@ extension SupportedPlatform {
362384
@available(_PackageDescription, introduced: 5.3)
363385
public static let v7: WatchOSVersion = .init(string: "7.0")
364386
}
387+
388+
/// The supported DriverKit version.
389+
public struct DriverKitVersion: Encodable, AppleOSVersion {
390+
fileprivate static let name = "DriverKit"
391+
fileprivate static let minimumMajorVersion = 19
392+
393+
/// The underlying version representation.
394+
let version: String
395+
396+
fileprivate init(uncheckedVersion version: String) {
397+
self.version = version
398+
}
399+
400+
/// The value that represents DriverKit 19.0.
401+
@available(_PackageDescription, introduced: 999.0)
402+
public static let v19: DriverKitVersion = .init(string: "19.0")
403+
404+
/// The value that represents DriverKit 20.0.
405+
@available(_PackageDescription, introduced: 999.0)
406+
public static let v20: DriverKitVersion = .init(string: "20.0")
407+
}
365408
}
366409

367410
fileprivate protocol AppleOSVersion {

Sources/PackageLoading/MinimumDeploymentTarget.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,8 @@ private extension PackageModel.Platform {
6868
return "appletvos"
6969
case .watchOS:
7070
return "watchos"
71+
case .driverKit:
72+
return nil // DriverKit does not support XCTest.
7173
default:
7274
return nil
7375
}

Sources/PackageLoading/PlatformRegistry.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,6 @@ public final class PlatformRegistry {
3131

3232
/// The static list of known platforms.
3333
private static var _knownPlatforms: [Platform] {
34-
return [.macOS, .iOS, .tvOS, .watchOS, .linux, .windows, .android, .wasi]
34+
return [.macOS, .iOS, .tvOS, .watchOS, .linux, .windows, .android, .wasi, .driverKit]
3535
}
3636
}

Sources/PackageModel/ManifestSourceGeneration.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ fileprivate extension SourceCodeFragment {
109109
self.init(enum: "tvOS", string: platform.version)
110110
case "watchos":
111111
self.init(enum: "watchOS", string: platform.version)
112+
case "driverkit":
113+
self.init(enum: "DriverKit", string: platform.version)
112114
default:
113115
self.init(enum: platform.platformName, string: platform.version)
114116
}
@@ -296,6 +298,7 @@ fileprivate extension SourceCodeFragment {
296298
case "ios": return SourceCodeFragment(enum: "iOS")
297299
case "tvos": return SourceCodeFragment(enum: "tvOS")
298300
case "watchos": return SourceCodeFragment(enum: "watchOS")
301+
case "driverkit": return SourceCodeFragment(enum: "DriverKit")
299302
default: return SourceCodeFragment(enum: platformName)
300303
}
301304
}

Sources/PackageModel/Platform.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ public struct Platform: Equatable, Hashable, Codable {
2929
public static let iOS: Platform = Platform(name: "ios", oldestSupportedVersion: "9.0")
3030
public static let tvOS: Platform = Platform(name: "tvos", oldestSupportedVersion: "9.0")
3131
public static let watchOS: Platform = Platform(name: "watchos", oldestSupportedVersion: "2.0")
32+
public static let driverKit: Platform = Platform(name: "driverkit", oldestSupportedVersion: "19.0")
3233
public static let linux: Platform = Platform(name: "linux", oldestSupportedVersion: .unknown)
3334
public static let android: Platform = Platform(name: "android", oldestSupportedVersion: .unknown)
3435
public static let windows: Platform = Platform(name: "windows", oldestSupportedVersion: .unknown)

Sources/Workspace/InitPackage.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -457,6 +457,8 @@ extension PackageModel.Platform {
457457
return "tvOS"
458458
case .watchOS:
459459
return "watchOS"
460+
case .driverKit:
461+
return "DriverKit"
460462
default:
461463
fatalError("unexpected manifest name call for platform \(self)")
462464
}
@@ -469,7 +471,7 @@ extension SupportedPlatform {
469471
guard self.version.patch == 0 else {
470472
return false
471473
}
472-
} else if [Platform.macOS, .iOS, .watchOS, .tvOS].contains(platform) {
474+
} else if [Platform.macOS, .iOS, .watchOS, .tvOS, .driverKit].contains(platform) {
473475
guard self.version.minor == 0, self.version.patch == 0 else {
474476
return false
475477
}
@@ -488,6 +490,8 @@ extension SupportedPlatform {
488490
return (9...14).contains(version.major)
489491
case .watchOS:
490492
return (2...7).contains(version.major)
493+
case .driverKit:
494+
return (19...20).contains(version.major)
491495

492496
default:
493497
return false

Sources/XCBuildSupport/PIF.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,6 +885,7 @@ public enum PIF {
885885
case COPY_PHASE_STRIP
886886
case DEBUG_INFORMATION_FORMAT
887887
case DEFINES_MODULE
888+
case DRIVERKIT_DEPLOYMENT_TARGET
888889
case DYLIB_INSTALL_NAME_BASE
889890
case EMBEDDED_CONTENT_CONTAINS_SWIFT
890891
case ENABLE_NS_ASSERTIONS
@@ -959,6 +960,7 @@ public enum PIF {
959960
case iOS = "ios"
960961
case tvOS = "tvos"
961962
case watchOS = "watchos"
963+
case driverKit = "driverkit"
962964
case linux
963965

964966
public var conditions: [String] {
@@ -967,6 +969,7 @@ public enum PIF {
967969
case .iOS: return ["sdk=iphonesimulator*", "sdk=iphoneos*"]
968970
case .tvOS: return ["sdk=appletvsimulator*", "sdk=appletvos*"]
969971
case .watchOS: return ["sdk=watchsimulator*", "sdk=watchos*"]
972+
case .driverKit: return ["sdk=driverkit*"]
970973
case .linux: return ["sdk=linux*"]
971974
}
972975
}

Sources/XCBuildSupport/PIFBuilder.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -258,6 +258,7 @@ final class PackagePIFProjectBuilder: PIFProjectBuilder {
258258
settings[.IPHONEOS_DEPLOYMENT_TARGET] = firstTarget?.deploymentTarget(for: .iOS)
259259
settings[.TVOS_DEPLOYMENT_TARGET] = firstTarget?.deploymentTarget(for: .tvOS)
260260
settings[.WATCHOS_DEPLOYMENT_TARGET] = firstTarget?.deploymentTarget(for: .watchOS)
261+
settings[.DRIVERKIT_DEPLOYMENT_TARGET] = firstTarget?.deploymentTarget(for: .driverKit)
261262
settings[.DYLIB_INSTALL_NAME_BASE] = "@rpath"
262263
settings[.USE_HEADERMAP] = "NO"
263264
settings[.SWIFT_ACTIVE_COMPILATION_CONDITIONS] = ["$(inherited)", "SWIFT_PACKAGE"]
@@ -1483,6 +1484,9 @@ extension Array where Element == PackageConditionProtocol {
14831484
case .windows:
14841485
result += PIF.PlatformFilter.windowsFilters
14851486

1487+
case .driverKit:
1488+
result += PIF.PlatformFilter.driverKitFilters
1489+
14861490
default:
14871491
assertionFailure("Unhandled platform condition: \(condition)")
14881492
break
@@ -1515,6 +1519,11 @@ extension PIF.PlatformFilter {
15151519
.init(platform: "watchos", environment: "simulator")
15161520
]
15171521

1522+
/// DriverKit platform filters.
1523+
public static let driverKitFilters: [PIF.PlatformFilter] = [
1524+
.init(platform: "driverkit"),
1525+
]
1526+
15181527
/// Windows platform filters.
15191528
public static let windowsFilters: [PIF.PlatformFilter] = [
15201529
.init(platform: "windows", environment: "msvc"),
@@ -1543,6 +1552,7 @@ private extension PIF.BuildSettings.Platform {
15431552
case .macOS: return .macOS
15441553
case .tvOS: return .tvOS
15451554
case .watchOS: return .watchOS
1555+
case .driverKit: return .driverKit
15461556
default: return nil
15471557
}
15481558
}

Sources/Xcodeproj/XcodeProjectModel.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,6 +373,7 @@ public struct Xcode {
373373
public var IPHONEOS_DEPLOYMENT_TARGET: String?
374374
public var TVOS_DEPLOYMENT_TARGET: String?
375375
public var WATCHOS_DEPLOYMENT_TARGET: String?
376+
public var DRIVERKIT_DEPLOYMENT_TARGET: String?
376377
public var MODULEMAP_FILE: String?
377378
public var ONLY_ACTIVE_ARCH: String?
378379
public var OTHER_CFLAGS: [String]?
@@ -421,6 +422,7 @@ public struct Xcode {
421422
IPHONEOS_DEPLOYMENT_TARGET: String? = nil,
422423
TVOS_DEPLOYMENT_TARGET: String? = nil,
423424
WATCHOS_DEPLOYMENT_TARGET: String? = nil,
425+
DRIVERKIT_DEPLOYMENT_TARGET: String? = nil,
424426
MODULEMAP_FILE: String? = nil,
425427
ONLY_ACTIVE_ARCH: String? = nil,
426428
OTHER_CFLAGS: [String]? = nil,
@@ -468,6 +470,7 @@ public struct Xcode {
468470
self.IPHONEOS_DEPLOYMENT_TARGET = IPHONEOS_DEPLOYMENT_TARGET
469471
self.TVOS_DEPLOYMENT_TARGET = TVOS_DEPLOYMENT_TARGET
470472
self.WATCHOS_DEPLOYMENT_TARGET = WATCHOS_DEPLOYMENT_TARGET
473+
self.DRIVERKIT_DEPLOYMENT_TARGET = DRIVERKIT_DEPLOYMENT_TARGET
471474
self.MODULEMAP_FILE = MODULEMAP_FILE
472475
self.ONLY_ACTIVE_ARCH = ONLY_ACTIVE_ARCH
473476
self.OTHER_CFLAGS = OTHER_CFLAGS

Sources/Xcodeproj/pbxproj.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -434,6 +434,8 @@ public func xcodeProject(
434434
targetSettings.common.TVOS_DEPLOYMENT_TARGET = version
435435
case .watchOS:
436436
targetSettings.common.WATCHOS_DEPLOYMENT_TARGET = version
437+
case .driverKit:
438+
targetSettings.common.DRIVERKIT_DEPLOYMENT_TARGET = version
437439
default:
438440
break
439441
}

Tests/PackageLoadingTests/PackageBuilderTests.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1682,6 +1682,7 @@ class PackageBuilderTests: XCTestCase {
16821682
"macos": "10.12",
16831683
"ios": "9.0",
16841684
"tvos": "9.0",
1685+
"driverkit": "19.0",
16851686
"watchos": "2.0",
16861687
"android": "0.0",
16871688
"windows": "0.0",
@@ -1739,6 +1740,7 @@ class PackageBuilderTests: XCTestCase {
17391740
"linux": "0.0",
17401741
"ios": "9.0",
17411742
"watchos": "2.0",
1743+
"driverkit": "19.0",
17421744
"android": "0.0",
17431745
"windows": "0.0",
17441746
"wasi": "0.0",

0 commit comments

Comments
 (0)