Skip to content
This repository was archived by the owner on Feb 26, 2026. It is now read-only.

Commit d598000

Browse files
authored
feat: add XcodeKit Framework Support (#263)
1 parent 8385875 commit d598000

2 files changed

Lines changed: 52 additions & 2 deletions

File tree

Sources/XcodeMetadata/Providers/SystemFrameworkMetadataProvider.swift

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,16 @@ import XcodeGraph
66

77
public enum SystemFrameworkMetadataProviderError: LocalizedError, Equatable {
88
case unsupportedSDK(name: String)
9+
case unsupportedSDKPlatform(sdk: String, platform: Platform, supported: [Platform])
910

1011
public var errorDescription: String? {
1112
switch self {
1213
case let .unsupportedSDK(sdk):
1314
let supportedTypes = SDKType.supportedTypesDescription
1415
return "The SDK type of \(sdk) is not currently supported - only \(supportedTypes) are supported."
16+
case let .unsupportedSDKPlatform(sdk, platform, supported):
17+
let platforms = supported.map(\.caseValue).joined(separator: ", ")
18+
return "The Platform type of \(platform.caseValue) is not currently supported for \(sdk) - only \(platforms) are supported."
1519
}
1620
}
1721
}
@@ -38,7 +42,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
3842
sdkName: String,
3943
status: LinkingStatus,
4044
platform: Platform,
41-
source: SDKSource
45+
source sdkSource: SDKSource
4246
) throws -> SystemFrameworkMetadata {
4347
let sdkNamePath = try AbsolutePath(validating: "/\(sdkName)")
4448
guard let sdkExtension = sdkNamePath.extension
@@ -58,6 +62,15 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
5862
throw SystemFrameworkMetadataProviderError.unsupportedSDK(name: sdkName)
5963
}
6064

65+
var source = sdkSource
66+
if sdkName == "XcodeKit.framework" {
67+
source = .developer
68+
if platform != .macOS {
69+
throw SystemFrameworkMetadataProviderError
70+
.unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS])
71+
}
72+
}
73+
6174
let path = try sdkPath(name: sdkName, platform: platform, type: sdkType, source: source)
6275
return SystemFrameworkMetadata(
6376
name: sdkName,
@@ -70,7 +83,7 @@ public final class SystemFrameworkMetadataProvider: SystemFrameworkMetadataProvi
7083
private func sdkPath(name: String, platform: Platform, type: SDKType, source: SDKSource) throws -> AbsolutePath {
7184
switch source {
7285
case .developer:
73-
let xcodeDeveloperSdkRootPath = platform.xcodeDeveloperSdkRootPath
86+
let xcodeDeveloperSdkRootPath = name == "XcodeKit.framework" ? "Library" : platform.xcodeDeveloperSdkRootPath
7487
let sdkRootPath = try AbsolutePath(validating: "/\(xcodeDeveloperSdkRootPath)")
7588
return sdkRootPath
7689
.appending(try RelativePath(validating: "Frameworks"))

Tests/XcodeMetadataTests/SystemFrameworkMetadataProviderTests.swift

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,21 @@ struct SystemFrameworkMetadataProviderTests {
8484
}
8585
}
8686

87+
@Test
88+
func loadMetadataUnsupportedPlatform() throws {
89+
// Given
90+
let sdkName = "XcodeKit.framework"
91+
let platform = Platform.iOS
92+
93+
// When / Then
94+
#expect(
95+
throws: SystemFrameworkMetadataProviderError
96+
.unsupportedSDKPlatform(sdk: sdkName, platform: platform, supported: [.macOS])
97+
) {
98+
try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: .system)
99+
}
100+
}
101+
87102
@Test
88103
func loadMetadataDeveloperSourceSupportedPlatform() throws {
89104
// Given
@@ -105,4 +120,26 @@ struct SystemFrameworkMetadataProviderTests {
105120
"Metadata does not match expected value"
106121
)
107122
}
123+
124+
@Test
125+
func loadMetadataXcodeKit() throws {
126+
// Given
127+
let sdkName = "XcodeKit.framework"
128+
let platform = Platform.macOS
129+
let source = SDKSource.system
130+
131+
// When
132+
let metadata = try subject.loadMetadata(sdkName: sdkName, status: .required, platform: platform, source: source)
133+
134+
// Then
135+
#expect(
136+
metadata == SystemFrameworkMetadata(
137+
name: sdkName,
138+
path: "/Library/Frameworks/XcodeKit.framework",
139+
status: .required,
140+
source: .developer
141+
),
142+
"Metadata does not match expected value"
143+
)
144+
}
108145
}

0 commit comments

Comments
 (0)