@@ -45,12 +45,15 @@ private var testInputsPath: AbsolutePath {
45
45
}
46
46
}
47
47
48
- func toPath( _ path: String , base: AbsolutePath = localFileSystem. currentWorkingDirectory!) throws -> VirtualPath {
49
- return try VirtualPath ( path: path) . resolvedRelativePath ( base: base)
48
+ func toPath( _ path: String , isRelative: Bool = true ) throws -> VirtualPath {
49
+ if isRelative {
50
+ return VirtualPath . relative ( try . init( validating: path) )
51
+ }
52
+ return try VirtualPath ( path: path) . resolvedRelativePath ( base: localFileSystem. currentWorkingDirectory!)
50
53
}
51
54
52
- func toPathOption( _ path: String , base : AbsolutePath = localFileSystem . currentWorkingDirectory! ) throws -> Job . ArgTemplate {
53
- return . path( try toPath ( path, base : base ) )
55
+ func toPathOption( _ path: String , isRelative : Bool = true ) throws -> Job . ArgTemplate {
56
+ return . path( try toPath ( path, isRelative : isRelative ) )
54
57
}
55
58
56
59
final class SwiftDriverTests : XCTestCase {
@@ -351,7 +354,7 @@ final class SwiftDriverTests: XCTestCase {
351
354
] )
352
355
XCTAssertEqual ( driver. recordedInputModificationDates, [
353
356
. init( file: VirtualPath . absolute ( main) . intern ( ) , type: . swift) : mainMDate,
354
- . init( file: VirtualPath . absolute ( util ) . intern ( ) , type: . swift) : utilMDate,
357
+ . init( file: VirtualPath . relative ( utilRelative ) . intern ( ) , type: . swift) : utilMDate,
355
358
] )
356
359
}
357
360
}
@@ -1295,12 +1298,11 @@ final class SwiftDriverTests: XCTestCase {
1295
1298
let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1296
1299
XCTAssertEqual ( plannedJobs. count, 3 )
1297
1300
XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1298
- XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ rebase ( " foo.swift " ) ,
1299
- rebase ( " bar.swift " ) ] ) )
1301
+ XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " foo.swift " , " bar.swift " ] ) )
1300
1302
XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( " -emit-const-values-path " ) )
1301
1303
XCTAssertEqual ( plannedJobs [ 0 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 2 )
1302
1304
XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1303
- XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ rebase ( " baz.swift " ) ] ) )
1305
+ XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " baz.swift " ] ) )
1304
1306
XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1305
1307
XCTAssertEqual ( plannedJobs [ 1 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 1 )
1306
1308
XCTAssertEqual ( plannedJobs [ 2 ] . kind, . link)
@@ -1331,13 +1333,12 @@ final class SwiftDriverTests: XCTestCase {
1331
1333
let plannedJobs = try driver. planBuild ( ) . removingAutolinkExtractJobs ( )
1332
1334
XCTAssertEqual ( plannedJobs. count, 3 )
1333
1335
XCTAssertEqual ( plannedJobs [ 0 ] . kind, . compile)
1334
- XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ rebase ( " foo.swift " ) ,
1335
- rebase ( " bar.swift " ) ] ) )
1336
+ XCTAssertTrue ( plannedJobs [ 0 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " foo.swift " , " bar.swift " ] ) )
1336
1337
XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( try . init( validating: " /tmp/foo.build/foo.swiftconstvalues " ) ) ) ] ) )
1337
1338
XCTAssertTrue ( plannedJobs [ 0 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( try . init( validating: " /tmp/foo.build/bar.swiftconstvalues " ) ) ) ] ) )
1338
1339
XCTAssertEqual ( plannedJobs [ 0 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 2 )
1339
1340
XCTAssertEqual ( plannedJobs [ 1 ] . kind, . compile)
1340
- XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ rebase ( " baz.swift " ) ] ) )
1341
+ XCTAssertTrue ( plannedJobs [ 1 ] . primaryInputs. map { $0. file. description } . elementsEqual ( [ " baz.swift " ] ) )
1341
1342
XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( " -emit-const-values-path " ) )
1342
1343
XCTAssertEqual ( plannedJobs [ 1 ] . outputs. filter ( { $0. type == . swiftConstValues } ) . count, 1 )
1343
1344
XCTAssertTrue ( plannedJobs [ 1 ] . commandLine. contains ( subsequence: [ . flag( " -emit-const-values-path " ) , . path( . absolute( try . init( validating: " /tmp/foo.build/baz.swiftconstvalues " ) ) ) ] ) )
@@ -3060,10 +3061,10 @@ final class SwiftDriverTests: XCTestCase {
3060
3061
XCTAssertEqual ( emitModuleJob. outputs [ 0 ] . file, try toPath ( " Test.swiftmodule " ) )
3061
3062
XCTAssertEqual ( emitModuleJob. outputs [ 1 ] . file, try toPath ( " Test.swiftdoc " ) )
3062
3063
XCTAssertEqual ( emitModuleJob. outputs [ 2 ] . file, try toPath ( " Test.swiftsourceinfo " ) )
3063
- XCTAssertEqual ( emitModuleJob. outputs [ 3 ] . file, try toPath ( " Test.swiftinterface " ) )
3064
+ XCTAssertEqual ( emitModuleJob. outputs [ 3 ] . file, try VirtualPath ( path : " ./ Test.swiftinterface" ) )
3064
3065
XCTAssertEqual ( emitModuleJob. outputs [ 4 ] . file, try toPath ( " Test.private.swiftinterface " ) )
3065
3066
XCTAssertEqual ( emitModuleJob. outputs [ 5 ] . file, try toPath ( " Test-Swift.h " ) )
3066
- XCTAssertEqual ( emitModuleJob. outputs [ 6 ] . file, try toPath ( " Test.tbd " ) )
3067
+ XCTAssertEqual ( emitModuleJob. outputs [ 6 ] . file, try VirtualPath ( path : " ./ Test.tbd" ) )
3067
3068
if driver1. targetTriple. isDarwin {
3068
3069
XCTAssertEqual ( emitModuleJob. outputs [ 7 ] . file, try toPath ( " Test.abi.json " ) )
3069
3070
}
@@ -5209,7 +5210,7 @@ final class SwiftDriverTests: XCTestCase {
5209
5210
// Reset the temporary store to ensure predictable results.
5210
5211
VirtualPath . resetTemporaryFileStore ( )
5211
5212
var driver = try Driver ( args: [
5212
- " swiftc " , " -emit-executable " , " test.swift " , " -emit-module " , " -avoid-emit-module-source-info " , " -experimental-emit-module-separately "
5213
+ " swiftc " , " -emit-executable " , " test.swift " , " -emit-module " , " -avoid-emit-module-source-info " , " -experimental-emit-module-separately " , " -working-directory " , localFileSystem . currentWorkingDirectory! . description
5213
5214
] )
5214
5215
let plannedJobs = try driver. planBuild ( )
5215
5216
@@ -7255,6 +7256,83 @@ final class SwiftDriverTests: XCTestCase {
7255
7256
} )
7256
7257
}
7257
7258
}
7259
+
7260
+ func testRelativeInputs( ) throws {
7261
+ do {
7262
+ // Inputs with relative paths with no -working-directory flag should remain relative
7263
+ var driver = try Driver ( args: [ " swiftc " ,
7264
+ " -target " , " arm64-apple-ios13.1 " ,
7265
+ " foo.swift " ] )
7266
+ let plannedJobs = try driver. planBuild ( )
7267
+ let compileJob = plannedJobs [ 0 ]
7268
+ XCTAssertEqual ( compileJob. kind, . compile)
7269
+ XCTAssertTrue ( compileJob. commandLine. contains ( subsequence: [ " -primary-file " , try toPathOption ( " foo.swift " , isRelative: true ) ] ) )
7270
+ }
7271
+
7272
+ do {
7273
+ // Inputs with relative paths with -working-directory flag should prefix all inputs
7274
+ var driver = try Driver ( args: [ " swiftc " ,
7275
+ " -target " , " arm64-apple-ios13.1 " ,
7276
+ " foo.swift " ,
7277
+ " -working-directory " , " /foo/bar " ] )
7278
+ let plannedJobs = try driver. planBuild ( )
7279
+ let compileJob = plannedJobs [ 0 ]
7280
+ XCTAssertEqual ( compileJob. kind, . compile)
7281
+ XCTAssertTrue ( compileJob. commandLine. contains ( subsequence: [ " -primary-file " , try toPathOption ( " /foo/bar/foo.swift " , isRelative: false ) ] ) )
7282
+ }
7283
+
7284
+ try withTemporaryFile { fileMapFile in
7285
+ let outputMapContents : ByteString = """
7286
+ {
7287
+ " " : {
7288
+ " diagnostics " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.dia " ,
7289
+ " emit-module-diagnostics " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia "
7290
+ },
7291
+ " foo.swift " : {
7292
+ " object " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.o "
7293
+ }
7294
+ }
7295
+ """
7296
+ try localFileSystem. writeFileContents ( fileMapFile. path, bytes: outputMapContents)
7297
+
7298
+ // Inputs with relative paths should be found in output file maps
7299
+ var driver = try Driver ( args: [ " swiftc " ,
7300
+ " -target " , " arm64-apple-ios13.1 " ,
7301
+ " foo.swift " ,
7302
+ " -output-file-map " , fileMapFile. path. description] )
7303
+ let plannedJobs = try driver. planBuild ( )
7304
+ let compileJob = plannedJobs [ 0 ]
7305
+ XCTAssertEqual ( compileJob. kind, . compile)
7306
+ XCTAssertTrue ( compileJob. commandLine. contains ( subsequence: [ " -o " , try toPathOption ( " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.o " , isRelative: false ) ] ) )
7307
+ }
7308
+
7309
+ try withTemporaryFile { fileMapFile in
7310
+ let outputMapContents : ByteString = """
7311
+ {
7312
+ " " : {
7313
+ " diagnostics " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.dia " ,
7314
+ " emit-module-diagnostics " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/master.emit-module.dia "
7315
+ },
7316
+ " /some/workingdir/foo.swift " : {
7317
+ " object " : " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.o "
7318
+ }
7319
+ }
7320
+ """
7321
+ try localFileSystem. writeFileContents ( fileMapFile. path, bytes: outputMapContents)
7322
+
7323
+ // Inputs with relative paths and working-dir should use absolute paths in output file maps
7324
+ var driver = try Driver ( args: [ " swiftc " ,
7325
+ " -target " , " arm64-apple-ios13.1 " ,
7326
+ " foo.swift " ,
7327
+ " -working-directory " , " /some/workingdir " ,
7328
+ " -output-file-map " , fileMapFile. path. description] )
7329
+ let plannedJobs = try driver. planBuild ( )
7330
+ let compileJob = plannedJobs [ 0 ]
7331
+ XCTAssertEqual ( compileJob. kind, . compile)
7332
+ XCTAssertTrue ( compileJob. commandLine. contains ( subsequence: [ " -o " , try toPathOption ( " /tmp/foo/.build/x86_64-apple-macosx/debug/foo.build/foo.o " , isRelative: false ) ] ) )
7333
+ }
7334
+
7335
+ }
7258
7336
7259
7337
func testRelativeResourceDir( ) throws {
7260
7338
do {
@@ -7295,7 +7373,7 @@ final class SwiftDriverTests: XCTestCase {
7295
7373
XCTAssertEqual ( compileJob. kind, . compile)
7296
7374
let linkJob = plannedJobs [ 1 ]
7297
7375
XCTAssertEqual ( linkJob. kind, . link)
7298
- XCTAssertTrue ( linkJob. commandLine. contains ( try toPathOption ( sdkRoot. pathString + " /usr/lib/swift/linux/x86_64/swiftrt.o " ) ) )
7376
+ XCTAssertTrue ( linkJob. commandLine. contains ( try toPathOption ( sdkRoot. pathString + " /usr/lib/swift/linux/x86_64/swiftrt.o " , isRelative : false ) ) )
7299
7377
}
7300
7378
}
7301
7379
0 commit comments