diff --git a/Sources/Basics/CMakeLists.txt b/Sources/Basics/CMakeLists.txt index 1ee88ac29d8..c1e018b7c76 100644 --- a/Sources/Basics/CMakeLists.txt +++ b/Sources/Basics/CMakeLists.txt @@ -60,6 +60,7 @@ add_library(Basics Netrc.swift Observability.swift OSSignpost.swift + Process.swift ProgressAnimation/NinjaProgressAnimation.swift ProgressAnimation/PercentProgressAnimation.swift ProgressAnimation/ProgressAnimationProtocol.swift diff --git a/Sources/_InternalTestSupport/Process.swift b/Sources/Basics/Process.swift similarity index 71% rename from Sources/_InternalTestSupport/Process.swift rename to Sources/Basics/Process.swift index 72c501aedc4..0d59706e7d6 100644 --- a/Sources/_InternalTestSupport/Process.swift +++ b/Sources/Basics/Process.swift @@ -15,19 +15,24 @@ public enum OperatingSystem: Hashable, Sendable { case windows case linux case android + case freebsd case unknown } extension ProcessInfo { - #if os(macOS) - public static let hostOperatingSystem = OperatingSystem.macOS - #elseif os(Linux) - public static let hostOperatingSystem = OperatingSystem.linux - #elseif os(Windows) - public static let hostOperatingSystem = OperatingSystem.windows - #else - public static let hostOperatingSystem = OperatingSystem.unknown - #endif + public static var hostOperatingSystem: OperatingSystem { + #if os(macOS) + .macOS + #elseif os(Linux) + .linux + #elseif os(Windows) + .windows + #elseif os(FreeBSD) + .freebsd + #else + .unknown + #endif + } #if os(Windows) public static let EOL = "\r\n" diff --git a/Sources/PackageModel/Toolchain.swift b/Sources/PackageModel/Toolchain.swift index 0d50f3e8426..3e3b8ef433f 100644 --- a/Sources/PackageModel/Toolchain.swift +++ b/Sources/PackageModel/Toolchain.swift @@ -11,6 +11,7 @@ //===----------------------------------------------------------------------===// import Basics +import Foundation public protocol Toolchain { /// Path of the librarian. @@ -88,12 +89,33 @@ extension Toolchain { } } + /// Base toolchain path that's given to Swift Build to initialize its core. public var toolchainDir: AbsolutePath { get throws { - try resolveSymlinks(swiftCompilerPath) - .parentDirectory // bin - .parentDirectory // usr - .parentDirectory // + let compilerPath = try resolveSymlinks(swiftCompilerPath) + let os = ProcessInfo.hostOperatingSystem + switch os { + case .windows: + return compilerPath + .parentDirectory // bin + .parentDirectory // usr + .parentDirectory // + .parentDirectory // Toolchains + .parentDirectory // + case .macOS, .linux, .android: + return compilerPath + .parentDirectory // bin + .parentDirectory // usr + .parentDirectory // + case .freebsd: + return compilerPath + .parentDirectory // bin + .parentDirectory // local + .parentDirectory // usr + .parentDirectory // + case .unknown: + throw UnknownToolchainLayout(os: os) + } } } @@ -128,3 +150,10 @@ extension Toolchain { try AbsolutePath(validating: "../../lib", relativeTo: resolveSymlinks(swiftCompilerPath)) } } + +struct UnknownToolchainLayout: Error, CustomStringConvertible { + let os: OperatingSystem + var description: String { + "Unknown toolchain layout for host operating system: \(os)" + } +} diff --git a/Sources/_InternalTestSupport/SkippedTestSupport.swift b/Sources/_InternalTestSupport/SkippedTestSupport.swift index b73727d1c64..e2e815e1420 100644 --- a/Sources/_InternalTestSupport/SkippedTestSupport.swift +++ b/Sources/_InternalTestSupport/SkippedTestSupport.swift @@ -11,6 +11,7 @@ import class Foundation.FileManager import class Foundation.ProcessInfo +import Basics import Testing extension Trait where Self == Testing.ConditionTrait {