Skip to content

Commit 7e7db3d

Browse files
authored
Merge pull request #991 from stevapple/disfavor-cwd
Disfavor current working directory when looking up executables
2 parents 2233929 + 22fbe6e commit 7e7db3d

File tree

2 files changed

+57
-4
lines changed

2 files changed

+57
-4
lines changed

Sources/SwiftDriver/Toolchains/Toolchain.swift

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

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6395,6 +6395,58 @@ final class SwiftDriverTests: XCTestCase {
63956395
#endif
63966396
#endif
63976397
}
6398+
6399+
func testToolSearching() throws {
6400+
#if os(Windows)
6401+
let PATH = "Path"
6402+
#else
6403+
let PATH = "PATH"
6404+
#endif
6405+
let SWIFT_FRONTEND_EXEC = "SWIFT_DRIVER_SWIFT_FRONTEND_EXEC"
6406+
6407+
// We need to override SWIFT_DRIVER_SWIFT_FRONTEND_EXEC to prevent it from interfering the tests.
6408+
var driver = try Driver(args: ["swiftc", "-print-target-info"], env: [PATH: ProcessEnv.path!])
6409+
let jobs = try driver.planBuild()
6410+
XCTAssertEqual(jobs.count, 1)
6411+
let defaultSwiftFrontend = jobs.first!.tool.absolutePath!
6412+
6413+
try withTemporaryDirectory { toolsDirectory in
6414+
let customSwiftFrontend = toolsDirectory.appending(component: executableName("swift-frontend"))
6415+
try localFileSystem.createSymbolicLink(customSwiftFrontend, pointingAt: defaultSwiftFrontend, relative: false)
6416+
6417+
try withTemporaryDirectory { tempDirectory in
6418+
try localFileSystem.changeCurrentWorkingDirectory(to: tempDirectory)
6419+
let anotherSwiftFrontend = localFileSystem.currentWorkingDirectory!.appending(component: executableName("swift-frontend"))
6420+
try localFileSystem.createSymbolicLink(anotherSwiftFrontend, pointingAt: defaultSwiftFrontend, relative: false)
6421+
6422+
// test if SWIFT_DRIVER_TOOLNAME_EXEC is respected
6423+
do {
6424+
var driver = try Driver(args: ["swiftc", "-print-target-info"],
6425+
env: [PATH: ProcessEnv.path!, SWIFT_FRONTEND_EXEC: customSwiftFrontend.pathString])
6426+
let jobs = try driver.planBuild()
6427+
XCTAssertEqual(jobs.count, 1)
6428+
XCTAssertEqual(jobs.first!.tool.name, customSwiftFrontend.pathString)
6429+
}
6430+
6431+
// test if tools directory is respected
6432+
do {
6433+
var driver = try Driver(args: ["swiftc", "-print-target-info", "-tools-directory", toolsDirectory.pathString],
6434+
env: [PATH: ProcessEnv.path!])
6435+
let jobs = try driver.planBuild()
6436+
XCTAssertEqual(jobs.count, 1)
6437+
XCTAssertEqual(jobs.first!.tool.name, customSwiftFrontend.pathString)
6438+
}
6439+
6440+
// test if current working directory is searched before PATH
6441+
do {
6442+
var driver = try Driver(args: ["swiftc", "-print-target-info"], env: [PATH: toolsDirectory.pathString])
6443+
let jobs = try driver.planBuild()
6444+
XCTAssertEqual(jobs.count, 1)
6445+
XCTAssertEqual(jobs.first!.tool.name, anotherSwiftFrontend.pathString)
6446+
}
6447+
}
6448+
}
6449+
}
63986450
}
63996451

64006452
func assertString(

0 commit comments

Comments
 (0)