Skip to content

Commit 215ddd6

Browse files
authored
Merge pull request #1178 from stevapple/revert-1077-revert-991-disfavor-cwd
Revert "Revert "Disfavor current working directory when looking up executables""
2 parents 1e07756 + eeb4ee5 commit 215ddd6

File tree

2 files changed

+60
-4
lines changed

2 files changed

+60
-4
lines changed

Sources/SwiftDriver/Toolchains/Toolchain.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -207,13 +207,14 @@ extension Toolchain {
207207
/// looks in the `executableDir`, `xcrunFind` or in the `searchPaths`.
208208
/// - Parameter executable: executable to look for [i.e. `swift`]. Executable suffix (eg. `.exe`) should be omitted.
209209
func lookup(executable: String) throws -> AbsolutePath {
210-
if let overrideString = envVar(forExecutable: executable) {
211-
return try AbsolutePath(validating: overrideString)
210+
if let overrideString = envVar(forExecutable: executable),
211+
let path = try? AbsolutePath(validating: overrideString) {
212+
return path
212213
} else if let toolDir = toolDirectory,
213-
let path = lookupExecutablePath(filename: executableName(executable), searchPaths: [toolDir]) {
214+
let path = lookupExecutablePath(filename: executableName(executable), currentWorkingDirectory: nil, searchPaths: [toolDir]) {
214215
// Looking for tools from the tools directory.
215216
return path
216-
} else if let path = lookupExecutablePath(filename: executableName(executable), searchPaths: [executableDir]) {
217+
} else if let path = lookupExecutablePath(filename: executableName(executable), currentWorkingDirectory: nil, searchPaths: [executableDir]) {
217218
return path
218219
} else if let path = try? xcrunFind(executable: executableName(executable)) {
219220
return path

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6627,6 +6627,61 @@ final class SwiftDriverTests: XCTestCase {
66276627
#endif
66286628
#endif
66296629
}
6630+
6631+
func testToolSearching() throws {
6632+
#if os(Windows)
6633+
let PATH = "Path"
6634+
#else
6635+
let PATH = "PATH"
6636+
#endif
6637+
let SWIFT_FRONTEND_EXEC = "SWIFT_DRIVER_SWIFT_FRONTEND_EXEC"
6638+
6639+
// Reset the environment to ensure tool resolution is exactly run against PATH.
6640+
var driver = try Driver(args: ["swiftc", "-print-target-info"], env: [PATH: ProcessEnv.path!])
6641+
let jobs = try driver.planBuild()
6642+
XCTAssertEqual(jobs.count, 1)
6643+
let defaultSwiftFrontend = jobs.first!.tool.absolutePath!
6644+
let originalWorkingDirectory = localFileSystem.currentWorkingDirectory!
6645+
6646+
try withTemporaryDirectory { toolsDirectory in
6647+
let customSwiftFrontend = toolsDirectory.appending(component: executableName("swift-frontend"))
6648+
try localFileSystem.createSymbolicLink(customSwiftFrontend, pointingAt: defaultSwiftFrontend, relative: false)
6649+
6650+
try withTemporaryDirectory { tempDirectory in
6651+
try localFileSystem.changeCurrentWorkingDirectory(to: tempDirectory)
6652+
defer { try! localFileSystem.changeCurrentWorkingDirectory(to: originalWorkingDirectory) }
6653+
6654+
let anotherSwiftFrontend = localFileSystem.currentWorkingDirectory!.appending(component: executableName("swift-frontend"))
6655+
try localFileSystem.createSymbolicLink(anotherSwiftFrontend, pointingAt: defaultSwiftFrontend, relative: false)
6656+
6657+
// test if SWIFT_DRIVER_TOOLNAME_EXEC is respected
6658+
do {
6659+
var driver = try Driver(args: ["swiftc", "-print-target-info"],
6660+
env: [PATH: ProcessEnv.path!, SWIFT_FRONTEND_EXEC: customSwiftFrontend.pathString])
6661+
let jobs = try driver.planBuild()
6662+
XCTAssertEqual(jobs.count, 1)
6663+
XCTAssertEqual(jobs.first!.tool.name, customSwiftFrontend.pathString)
6664+
}
6665+
6666+
// test if tools directory is respected
6667+
do {
6668+
var driver = try Driver(args: ["swiftc", "-print-target-info", "-tools-directory", toolsDirectory.pathString],
6669+
env: [PATH: ProcessEnv.path!])
6670+
let jobs = try driver.planBuild()
6671+
XCTAssertEqual(jobs.count, 1)
6672+
XCTAssertEqual(jobs.first!.tool.name, customSwiftFrontend.pathString)
6673+
}
6674+
6675+
// test if current working directory is searched before PATH
6676+
do {
6677+
var driver = try Driver(args: ["swiftc", "-print-target-info"], env: [PATH: toolsDirectory.pathString])
6678+
let jobs = try driver.planBuild()
6679+
XCTAssertEqual(jobs.count, 1)
6680+
XCTAssertEqual(jobs.first!.tool.name, anotherSwiftFrontend.pathString)
6681+
}
6682+
}
6683+
}
6684+
}
66306685
}
66316686

66326687
func assertString(

0 commit comments

Comments
 (0)