Skip to content

Commit 1c57379

Browse files
committed
Fallback toolchain: locate in /usr/local prefixes in addition to /usr
It's common for some platforms (like FreeBSD, and possibly some Linux distributions) to place non-system content at a "local" subdirectory of "usr". Allow finding the host toolchain there as well. This code path currently only applies to Linux.
1 parent d3cfa59 commit 1c57379

File tree

1 file changed

+17
-4
lines changed

1 file changed

+17
-4
lines changed

Sources/SWBCore/ToolchainRegistry.swift

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -440,10 +440,23 @@ public final class ToolchainRegistry: @unchecked Sendable {
440440
return
441441
}
442442

443-
if let swift = StackedSearchPath(environment: ProcessInfo.processInfo.cleanEnvironment, fs: fs).lookup(Path("swift")), fs.exists(swift) && swift.normalize().str.hasSuffix("/usr/bin/swift") {
444-
let path = swift.dirname.dirname.dirname
445-
let llvmDirectories = try fs.listdir(Path("/usr/lib")).filter { $0.hasPrefix("llvm-") }.sorted().reversed()
446-
try register(Toolchain(Self.defaultToolchainIdentifier, "Default", Version(), [], path, [], llvmDirectories.map { "/usr/lib/\($0)/lib" } + ["/usr/lib64"], [:], [:], [:], executableSearchPaths: [path.join("usr").join("bin"), path.join("usr").join("local").join("bin"), path.join("usr").join("libexec")], fs: fs))
443+
if let swift = StackedSearchPath(environment: ProcessInfo.processInfo.cleanEnvironment, fs: fs).lookup(Path("swift")), fs.exists(swift) {
444+
let hasUsrBin = swift.normalize().str.hasSuffix("/usr/bin/swift")
445+
let hasUsrLocalBin = swift.normalize().str.hasSuffix("/usr/local/bin/swift")
446+
let path: Path
447+
switch (hasUsrBin, hasUsrLocalBin) {
448+
case (true, false):
449+
path = swift.dirname.dirname.dirname
450+
case (false, true):
451+
path = swift.dirname.dirname.dirname.dirname
452+
case (false, false):
453+
return
454+
case (true, true):
455+
preconditionFailure()
456+
}
457+
let llvmDirectories = try Array(fs.listdir(Path("/usr/lib")).filter { $0.hasPrefix("llvm-") }.sorted().reversed())
458+
let llvmDirectoriesLocal = try Array(fs.listdir(Path("/usr/local")).filter { $0.hasPrefix("llvm") }.sorted().reversed())
459+
try register(Toolchain(Self.defaultToolchainIdentifier, "Default", Version(), [], path, [], llvmDirectories.map { "/usr/lib/\($0)/lib" } + llvmDirectoriesLocal.map { "/usr/local/\($0)/lib" } + ["/usr/lib64"], [:], [:], [:], executableSearchPaths: [path.join("usr").join("bin"), path.join("usr").join("local").join("bin"), path.join("usr").join("libexec")], fs: fs))
447460
}
448461
}
449462

0 commit comments

Comments
 (0)