Skip to content

Commit f7c5749

Browse files
Merge pull request #1568 from cachemeifyoucan/eng/PR-always-apply-working-directory
Always apply working-directory in the swift-driver
2 parents 14ddb78 + a9f35bc commit f7c5749

File tree

9 files changed

+268
-237
lines changed

9 files changed

+268
-237
lines changed

Sources/SwiftDriver/Driver/Driver.swift

+5-6
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,7 @@ public struct Driver {
325325
case .absolute(let path):
326326
return path
327327
case .relative(let path):
328-
let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory
329-
return cwd.map { AbsolutePath($0, path) }
328+
return workingDirectory.map { AbsolutePath($0, path) }
330329
case .standardInput, .standardOutput, .temporary, .temporaryWithKnownContents, .fileList:
331330
fatalError("Frontend target information will never include a path of this type.")
332331
}
@@ -650,10 +649,10 @@ public struct Driver {
650649
compilerMode: compilerMode)
651650

652651
// Compute the working directory.
652+
let cwd = fileSystem.currentWorkingDirectory
653653
workingDirectory = try parsedOptions.getLastArgument(.workingDirectory).map { workingDirectoryArg in
654-
let cwd = fileSystem.currentWorkingDirectory
655654
return try cwd.map{ try AbsolutePath(validating: workingDirectoryArg.asSingle, relativeTo: $0) } ?? AbsolutePath(validating: workingDirectoryArg.asSingle)
656-
}
655+
} ?? cwd
657656

658657
// Apply the working directory to the parsed options.
659658
if let workingDirectory = self.workingDirectory {
@@ -798,7 +797,7 @@ public struct Driver {
798797
self.buildRecordInfo = BuildRecordInfo(
799798
actualSwiftVersion: self.frontendTargetInfo.compilerVersion,
800799
compilerOutputType: compilerOutputType,
801-
workingDirectory: self.workingDirectory ?? fileSystem.currentWorkingDirectory,
800+
workingDirectory: self.workingDirectory,
802801
diagnosticEngine: diagnosticEngine,
803802
fileSystem: fileSystem,
804803
moduleOutputInfo: moduleOutputInfo,
@@ -3010,7 +3009,7 @@ extension Driver {
30103009
}
30113010

30123011
if let profileArgs = parsedOptions.getLastArgument(.profileUse)?.asMultiple,
3013-
let workingDirectory = workingDirectory ?? fileSystem.currentWorkingDirectory {
3012+
let workingDirectory = workingDirectory {
30143013
for profilingData in profileArgs {
30153014
if let path = try? AbsolutePath(validating: profilingData,
30163015
relativeTo: workingDirectory) {

Sources/SwiftDriver/ExplicitModuleBuilds/ModuleDependencyScanning.swift

+9-3
Original file line numberDiff line numberDiff line change
@@ -202,7 +202,9 @@ public extension Driver {
202202
let isSwiftScanLibAvailable = !(try initSwiftScanLib())
203203
if isSwiftScanLibAvailable {
204204
var scanDiagnostics: [ScannerDiagnosticPayload] = []
205-
let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory!
205+
guard let cwd = workingDirectory else {
206+
throw DependencyScanningError.dependencyScanFailed("cannot determine working directory")
207+
}
206208
var command = try Self.itemizedJobCommand(of: preScanJob,
207209
useResponseFiles: .disabled,
208210
using: executor.resolver)
@@ -272,7 +274,9 @@ public extension Driver {
272274
let isSwiftScanLibAvailable = !(try initSwiftScanLib())
273275
if isSwiftScanLibAvailable {
274276
var scanDiagnostics: [ScannerDiagnosticPayload] = []
275-
let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory!
277+
guard let cwd = workingDirectory else {
278+
throw DependencyScanningError.dependencyScanFailed("cannot determine working directory")
279+
}
276280
var command = try Self.itemizedJobCommand(of: scannerJob,
277281
useResponseFiles: .disabled,
278282
using: executor.resolver)
@@ -309,7 +313,9 @@ public extension Driver {
309313
let isSwiftScanLibAvailable = !(try initSwiftScanLib())
310314
if isSwiftScanLibAvailable {
311315
var scanDiagnostics: [ScannerDiagnosticPayload] = []
312-
let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory!
316+
guard let cwd = workingDirectory else {
317+
throw DependencyScanningError.dependencyScanFailed("cannot determine working directory")
318+
}
313319
var command = try Self.itemizedJobCommand(of: batchScanningJob,
314320
useResponseFiles: .disabled,
315321
using: executor.resolver)

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ extension Driver {
388388
if let compilationDir = parsedOptions.getLastArgument(.fileCompilationDir)?.asSingle {
389389
let compDirPath = try VirtualPath.intern(path: compilationDir)
390390
try addPathArgument(VirtualPath.lookup(compDirPath), to:&commandLine, remap: jobNeedPathRemap)
391-
} else if let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory {
391+
} else if let cwd = workingDirectory {
392392
let compDirPath = VirtualPath.absolute(cwd)
393393
try addPathArgument(compDirPath, to:&commandLine, remap: jobNeedPathRemap)
394394
}
@@ -788,7 +788,7 @@ extension Driver {
788788

789789
extension Driver {
790790
private func getAbsolutePathFromVirtualPath(_ path: VirtualPath) -> AbsolutePath? {
791-
guard let cwd = workingDirectory ?? fileSystem.currentWorkingDirectory else {
791+
guard let cwd = workingDirectory else {
792792
return nil
793793
}
794794
return path.resolvedRelativePath(base: cwd).absolutePath

Sources/SwiftDriver/Jobs/PrintTargetInfoJob.swift

+1-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ extension Driver {
190190
fileSystem.exists(swiftScanLibPath) {
191191
let libSwiftScanInstance = try SwiftScan(dylib: swiftScanLibPath)
192192
if libSwiftScanInstance.canQueryTargetInfo() {
193-
let cwd = try workingDirectory ?? fileSystem.currentWorkingDirectory ?? fileSystem.tempDirectory
193+
let cwd = try workingDirectory ?? fileSystem.tempDirectory
194194
let compilerExecutablePath = try toolchain.resolvedTool(.swiftCompiler).path
195195
let targetInfoData =
196196
try libSwiftScanInstance.queryTargetInfoJSON(workingDirectory: cwd,

Sources/SwiftOptions/Options.swift

+2-2
Original file line numberDiff line numberDiff line change
@@ -822,7 +822,7 @@ extension Option {
822822
public static let vfsoverlayEQ: Option = Option("-vfsoverlay=", .joined, alias: Option.vfsoverlay)
823823
public static let vfsoverlay: Option = Option("-vfsoverlay", .joinedOrSeparate, attributes: [.frontend, .argumentIsPath], helpText: "Add directory to VFS overlay file")
824824
public static let visualcToolsRoot: Option = Option("-visualc-tools-root", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<root>", helpText: "VisualC++ Tools Root")
825-
public static let visualcToolsVersion: Option = Option("-visualc-tools-version", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<version>", helpText: "VisualC++ ToolSet Version")
825+
public static let visualcToolsVersion: Option = Option("-visualc-tools-version", .separate, attributes: [.frontend,], metaVar: "<version>", helpText: "VisualC++ ToolSet Version")
826826
public static let v: Option = Option("-v", .flag, attributes: [.doesNotAffectIncrementalBuild], helpText: "Show commands to run and use verbose output")
827827
public static let warnConcurrency: Option = Option("-warn-concurrency", .flag, attributes: [.frontend, .doesNotAffectIncrementalBuild], helpText: "Warn about code that is unsafe according to the Swift Concurrency model and will become ill-formed in a future language version")
828828
public static let warnImplicitOverrides: Option = Option("-warn-implicit-overrides", .flag, attributes: [.frontend, .doesNotAffectIncrementalBuild], helpText: "Warn about implicit overrides of protocol members")
@@ -839,7 +839,7 @@ extension Option {
839839
public static let weakLinkAtTarget: Option = Option("-weak-link-at-target", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Weakly link symbols for declarations that were introduced at the deployment target. Symbols introduced before the deployment target are still strongly linked.")
840840
public static let wholeModuleOptimization: Option = Option("-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Optimize input files together instead of individually")
841841
public static let windowsSdkRoot: Option = Option("-windows-sdk-root", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<root>", helpText: "Windows SDK Root")
842-
public static let windowsSdkVersion: Option = Option("-windows-sdk-version", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<version>", helpText: "Windows SDK Version")
842+
public static let windowsSdkVersion: Option = Option("-windows-sdk-version", .separate, attributes: [.frontend], metaVar: "<version>", helpText: "Windows SDK Version")
843843
public static let wmo: Option = Option("-wmo", .flag, alias: Option.wholeModuleOptimization, attributes: [.helpHidden, .frontend, .noInteractive])
844844
public static let workingDirectoryEQ: Option = Option("-working-directory=", .joined, alias: Option.workingDirectory)
845845
public static let workingDirectory: Option = Option("-working-directory", .separate, metaVar: "<path>", helpText: "Resolve file paths relative to the specified directory")

Tests/SwiftDriverTests/APIDigesterTests.swift

+14-14
Original file line numberDiff line numberDiff line change
@@ -48,22 +48,22 @@ class APIDigesterTests: XCTestCase {
4848
do {
4949
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-emit-digester-baseline"])
5050
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline })
51-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.api.json")))]))
51+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("foo.api.json")]))
5252
}
5353
do {
5454
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module","-emit-module-interface", "-enable-library-evolution", "-emit-digester-baseline", "-digester-mode", "abi"])
5555
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline })
56-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.abi.json")))]))
56+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("foo.abi.json")]))
5757
}
5858
do {
5959
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module", "-emit-digester-baseline-path", "bar.api.json"])
6060
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline })
61-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "bar.api.json")))]))
61+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("bar.api.json")]))
6262
}
6363
do {
6464
var driver = try Driver(args: ["swiftc", "foo.swift", "-emit-module","-emit-module-interface", "-enable-library-evolution", "-digester-mode", "abi", "-emit-digester-baseline-path", "bar.abi.json"])
6565
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline })
66-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "bar.abi.json")))]))
66+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("bar.abi.json")]))
6767
}
6868
do {
6969
try withTemporaryDirectory { path in
@@ -148,11 +148,11 @@ class APIDigesterTests: XCTestCase {
148148
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateAPIBaseline })
149149
XCTAssertTrue(digesterJob.commandLine.contains("-dump-sdk"))
150150
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"]))
151-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))]))
151+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", try toPathOption(".")]))
152152
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))]))
153153
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))]))
154-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))]))
155-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.api.json")))]))
154+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", try toPathOption("framework/path")]))
155+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("foo.api.json")]))
156156

157157
XCTAssertFalse(digesterJob.commandLine.contains("-abi"))
158158
}
@@ -164,11 +164,11 @@ class APIDigesterTests: XCTestCase {
164164
let digesterJob = try XCTUnwrap(driver.planBuild().first { $0.kind == .generateABIBaseline })
165165
XCTAssertTrue(digesterJob.commandLine.contains("-dump-sdk"))
166166
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"]))
167-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))]))
167+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", try toPathOption(".")]))
168168
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))]))
169169
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))]))
170-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))]))
171-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", .path(.relative(try .init(validating: "foo.abi.json")))]))
170+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", try toPathOption("framework/path")]))
171+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-o", try toPathOption("foo.abi.json")]))
172172

173173
XCTAssertTrue(digesterJob.commandLine.contains("-abi"))
174174
}
@@ -239,12 +239,12 @@ class APIDigesterTests: XCTestCase {
239239
XCTAssertTrue(digesterJob.commandLine.contains("-diagnose-sdk"))
240240
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-module", "foo"]))
241241
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-baseline-path", .path(.absolute(try .init(validating: "/baseline/path")))]))
242-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.relative(try .init(validating: ".")))]))
242+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", try toPathOption(".")]))
243243
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-sdk", .path(.absolute(try .init(validating: "/path/to/sdk")))]))
244244
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-I", .path(.absolute(try .init(validating: "/some/path")))]))
245-
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", .path(.relative(try .init(validating: "framework/path")))]))
245+
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-F", try toPathOption("framework/path")]))
246246
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-breakage-allowlist-path",
247-
.path(.relative(try .init(validating: "allowlist/path")))]))
247+
try toPathOption("allowlist/path")]))
248248

249249
XCTAssertFalse(digesterJob.commandLine.contains("-abi"))
250250
}
@@ -259,7 +259,7 @@ class APIDigesterTests: XCTestCase {
259259
XCTAssertTrue(digesterJob.commandLine.contains("-diagnose-sdk"))
260260
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-input-paths", .path(.absolute(try .init(validating: "/baseline/path")))]))
261261
XCTAssertTrue(digesterJob.commandLine.contains(subsequence: ["-breakage-allowlist-path",
262-
.path(.relative(try .init(validating: "allowlist/path")))]))
262+
try toPathOption("allowlist/path")]))
263263
XCTAssertTrue(digesterJob.commandLine.contains("-abi"))
264264
XCTAssertTrue(digesterJob.commandLine.contains("-serialize-diagnostics-path"))
265265
}

Tests/SwiftDriverTests/CachingBuildTests.swift

+6
Original file line numberDiff line numberDiff line change
@@ -320,6 +320,9 @@ final class CachingBuildTests: XCTestCase {
320320
case .relative(try RelativePath(validating: "testCachingBuildJobs")):
321321
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
322322
XCTAssertEqual(job.kind, .link)
323+
case .absolute(let path):
324+
XCTAssertEqual(path.basename, "testCachingBuildJobs")
325+
XCTAssertEqual(job.kind, .link)
323326
case .temporary(_):
324327
let baseName = "testCachingBuildJobs"
325328
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||
@@ -454,6 +457,9 @@ final class CachingBuildTests: XCTestCase {
454457
case .relative(try RelativePath(validating: "testExplicitModuleVerifyInterfaceJobs")):
455458
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
456459
XCTAssertEqual(job.kind, .link)
460+
case .absolute(let path):
461+
XCTAssertEqual(path.basename, "testExplicitModuleVerifyInterfaceJobs")
462+
XCTAssertEqual(job.kind, .link)
457463
case .temporary(_):
458464
let baseName = "testExplicitModuleVerifyInterfaceJobs"
459465
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||

Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift

+12
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,9 @@ final class ExplicitModuleBuildTests: XCTestCase {
382382
case .relative(try .init(validating: "testExplicitModuleBuildJobs")):
383383
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
384384
XCTAssertEqual(job.kind, .link)
385+
case .absolute(let path):
386+
XCTAssertEqual(path.basename, "testExplicitModuleBuildJobs")
387+
XCTAssertEqual(job.kind, .link)
385388
case .temporary(_):
386389
let baseName = "testExplicitModuleBuildJobs"
387390
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||
@@ -512,6 +515,9 @@ final class ExplicitModuleBuildTests: XCTestCase {
512515
case .relative(try .init(validating: "testExplicitModuleVerifyInterfaceJobs")):
513516
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
514517
XCTAssertEqual(job.kind, .link)
518+
case .absolute(let path):
519+
XCTAssertEqual(path.basename, "testExplicitModuleVerifyInterfaceJobs")
520+
XCTAssertEqual(job.kind, .link)
515521
case .temporary(_):
516522
let baseName = "testExplicitModuleVerifyInterfaceJobs"
517523
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||
@@ -646,6 +652,9 @@ final class ExplicitModuleBuildTests: XCTestCase {
646652
case .relative(try .init(validating: "testExplicitModuleBuildPCHOutputJobs")):
647653
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
648654
XCTAssertEqual(job.kind, .link)
655+
case .absolute(let path):
656+
XCTAssertEqual(path.basename, "testExplicitModuleBuildPCHOutputJobs")
657+
XCTAssertEqual(job.kind, .link)
649658
case .temporary(_):
650659
let baseName = "testExplicitModuleBuildPCHOutputJobs"
651660
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||
@@ -750,6 +759,9 @@ final class ExplicitModuleBuildTests: XCTestCase {
750759
case .relative(try .init(validating: "testExplicitModuleBuildJobs")):
751760
XCTAssertTrue(driver.isExplicitMainModuleJob(job: job))
752761
XCTAssertEqual(job.kind, .link)
762+
case .absolute(let path):
763+
XCTAssertEqual(path.basename, "testExplicitModuleBuildJobs")
764+
XCTAssertEqual(job.kind, .link)
753765
case .temporary(_):
754766
let baseName = "testExplicitModuleBuildJobs"
755767
XCTAssertTrue(matchTemporary(outputFilePath, basename: baseName, fileExtension: "o") ||

0 commit comments

Comments
 (0)