in Sources/SwiftDriver/Toolchains/Toolchain.swift [161:203]
func lookup(executable: String) throws -> AbsolutePath {
if let overrideString = envVar(forExecutable: executableName(executable)) {
return try AbsolutePath(validating: overrideString)
} else if let toolDir = toolDirectory,
let path = lookupExecutablePath(filename: executableName(executable), searchPaths: [toolDir]) {
// Looking for tools from the tools directory.
return path
} else if let path = lookupExecutablePath(filename: executableName(executable), searchPaths: [executableDir]) {
return path
} else if let path = try? xcrunFind(executable: executableName(executable)) {
return path
} else if !["swift-frontend", "swift", "swift-frontend.exe", "swift.exe"].contains(executable),
let parentDirectory = try? getToolPath(.swiftCompiler).parentDirectory,
parentDirectory != executableDir,
let path = lookupExecutablePath(filename: executableName(executable), searchPaths: [parentDirectory]) {
// If the driver library's client and the frontend are in different directories,
// try looking for tools next to the frontend.
return path
} else if let path = lookupExecutablePath(filename: executableName(executable), searchPaths: searchPaths) {
return path
} else if executable == executableName("swift-frontend") {
// Temporary shim: fall back to looking for "swift" before failing.
return try lookup(executable: executableName("swift"))
} else if fallbackToExecutableDefaultPath {
if self is WindowsToolchain {
if let DEVELOPER_DIR = env["DEVELOPER_DIR"] {
return AbsolutePath(DEVELOPER_DIR)
.appending(component: "Toolchains")
.appending(component: "unknown-Asserts-development.xctoolchain")
.appending(component: "usr")
.appending(component: "bin")
.appending(component: executableName(executable))
}
return try getToolPath(.swiftCompiler)
.parentDirectory
.appending(component: executable)
} else {
return AbsolutePath("/usr/bin/" + executable)
}
} else {
throw ToolchainError.unableToFind(tool: executable)
}
}