func lookup()

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)
    }
  }