Skip to content

Commit bdc42f9

Browse files
committed
[PackageModel] Drop a trailing \ from SDKROOT environment variable
This is a problem on windows because `platform` path is deduced based on `parentDirectory` and `PathCchRemoveFileSpec` function used on Windows handles it as if it was a directory.
1 parent 346b131 commit bdc42f9

File tree

1 file changed

+28
-9
lines changed

1 file changed

+28
-9
lines changed

Sources/PackageModel/UserToolchain.swift

Lines changed: 28 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ public final class UserToolchain: Toolchain {
462462
// Windows uses a variable named SDKROOT to determine the root of
463463
// the SDK. This is not the same value as the SDKROOT parameter
464464
// in Xcode, however, the value represents a similar concept.
465-
if let SDKROOT = environment["SDKROOT"], let sdkroot = try? AbsolutePath(validating: SDKROOT) {
465+
if let sdkroot = getWindowsSDKRootDirectory(from: environment) {
466466
var runtime: [String] = []
467467
var xctest: [String] = []
468468
var swiftTesting: [String] = []
@@ -700,7 +700,7 @@ public final class UserToolchain: Toolchain {
700700
}
701701

702702
if triple.isWindows() {
703-
if let SDKROOT = environment["SDKROOT"], let root = try? AbsolutePath(validating: SDKROOT) {
703+
if let root = Self.getWindowsSDKRootDirectory(from: environment) {
704704
if let settings = WindowsSDKSettings(
705705
reading: root.appending("SDKSettings.plist"),
706706
observabilityScope: nil,
@@ -873,19 +873,28 @@ public final class UserToolchain: Toolchain {
873873
return .none
874874
}
875875

876+
private static func getWindowsSDKRootDirectory(from environment: Environment) -> AbsolutePath? {
877+
if let SDKROOT = environment["SDKROOT"], let sdkDir = try? AbsolutePath(validating: SDKROOT.removingTrailingBackslash) {
878+
return sdkDir
879+
}
880+
return nil
881+
}
882+
876883
private static func getWindowsPlatformInfo(
877884
swiftSDK: SwiftSDK,
878885
environment: Environment,
879886
fileSystem: any FileSystem
880887
) -> (AbsolutePath, WindowsPlatformInfo)? {
881-
let sdkRoot: AbsolutePath
882-
883-
if let sdkDir = swiftSDK.pathsConfiguration.sdkRootPath {
884-
sdkRoot = sdkDir
885-
} else if let SDKROOT = environment["SDKROOT"], let sdkDir = try? AbsolutePath(validating: SDKROOT) {
886-
sdkRoot = sdkDir
888+
let sdkRoot: AbsolutePath? = if let sdkDir = swiftSDK.pathsConfiguration.sdkRootPath {
889+
sdkDir
890+
} else if let sdkDir = getWindowsSDKRootDirectory(from: environment) {
891+
sdkDir
887892
} else {
888-
return .none
893+
nil
894+
}
895+
896+
guard let sdkRoot else {
897+
return nil
889898
}
890899

891900
// The layout of the SDK is as follows:
@@ -1079,3 +1088,13 @@ public final class UserToolchain: Toolchain {
10791088
return `default`
10801089
}
10811090
}
1091+
1092+
extension String {
1093+
fileprivate var removingTrailingBackslash: String {
1094+
if self.hasSuffix("\\") {
1095+
return Self(self.dropLast())
1096+
} else {
1097+
return self
1098+
}
1099+
}
1100+
}

0 commit comments

Comments
 (0)