@@ -90,7 +90,7 @@ final class SwiftPMWorkspaceTests: XCTestCase {
90
90
targets: [.target(name: " lib " , dependencies: [])])
91
91
"""
92
92
] )
93
- let packageRoot = tempDir. path. appending ( component: " pkg " )
93
+ let packageRoot = resolveSymlinks ( tempDir. path. appending ( component: " pkg " ) )
94
94
let tr = ToolchainRegistry . shared
95
95
let ws = try ! SwiftPMWorkspace (
96
96
workspacePath: packageRoot,
@@ -183,7 +183,7 @@ final class SwiftPMWorkspaceTests: XCTestCase {
183
183
fileSystem: fs,
184
184
buildSetup: TestSourceKitServer . buildSetup)
185
185
186
- let source = packageRoot. appending ( component: " Package.swift " )
186
+ let source = resolveSymlinks ( packageRoot. appending ( component: " Package.swift " ) )
187
187
let arguments = ws. settings ( for: source. asURL, . swift) !. compilerArguments
188
188
189
189
check ( " -swift-version " , " 4.2 " , arguments: arguments)
@@ -204,7 +204,7 @@ final class SwiftPMWorkspaceTests: XCTestCase {
204
204
targets: [.target(name: " lib " , dependencies: [])])
205
205
"""
206
206
] )
207
- let packageRoot = tempDir. path. appending ( component: " pkg " )
207
+ let packageRoot = resolveSymlinks ( tempDir. path. appending ( component: " pkg " ) )
208
208
let tr = ToolchainRegistry . shared
209
209
let ws = try ! SwiftPMWorkspace (
210
210
workspacePath: packageRoot,
@@ -243,7 +243,7 @@ final class SwiftPMWorkspaceTests: XCTestCase {
243
243
])
244
244
"""
245
245
] )
246
- let packageRoot = tempDir. path. appending ( component: " pkg " )
246
+ let packageRoot = resolveSymlinks ( tempDir. path. appending ( component: " pkg " ) )
247
247
let tr = ToolchainRegistry . shared
248
248
let ws = try ! SwiftPMWorkspace (
249
249
workspacePath: packageRoot,
@@ -314,7 +314,7 @@ final class SwiftPMWorkspaceTests: XCTestCase {
314
314
cxxLanguageStandard: .cxx14)
315
315
"""
316
316
] )
317
- let packageRoot = tempDir. path. appending ( component: " pkg " )
317
+ let packageRoot = resolveSymlinks ( tempDir. path. appending ( component: " pkg " ) )
318
318
let tr = ToolchainRegistry . shared
319
319
let ws = try ! SwiftPMWorkspace (
320
320
workspacePath: packageRoot,
@@ -393,6 +393,99 @@ final class SwiftPMWorkspaceTests: XCTestCase {
393
393
check ( " -target " , Triple . hostTriple. tripleString, arguments: arguments)
394
394
#endif
395
395
}
396
+
397
+ func testSymlinkInWorkspaceSwift( ) {
398
+ // FIXME: should be possible to use InMemoryFileSystem.
399
+ let fs = localFileSystem
400
+ let tempDir = try ! TemporaryDirectory ( removeTreeOnDeinit: true )
401
+
402
+ try ! fs. createFiles ( root: tempDir. path, files: [
403
+ " pkg_real/Sources/lib/a.swift " : " " ,
404
+ " pkg_real/Package.swift " : """
405
+ // swift-tools-version:4.2
406
+ import PackageDescription
407
+ let package = Package(name: " a " , products: [], dependencies: [],
408
+ targets: [.target(name: " lib " , dependencies: [])])
409
+ """
410
+ ] )
411
+ let packageRoot = tempDir. path. appending ( component: " pkg " )
412
+
413
+ try ! FileManager . default. createSymbolicLink (
414
+ atPath: packageRoot. pathString,
415
+ withDestinationPath: " pkg_real " )
416
+
417
+ let tr = ToolchainRegistry . shared
418
+ let ws = try ! SwiftPMWorkspace (
419
+ workspacePath: packageRoot,
420
+ toolchainRegistry: tr,
421
+ fileSystem: fs,
422
+ buildSetup: TestSourceKitServer . buildSetup)
423
+
424
+ let aswift1 = packageRoot. appending ( components: " Sources " , " lib " , " a.swift " )
425
+ let aswift2 = tempDir. path
426
+ . appending ( component: " pkg_real " )
427
+ . appending ( components: " Sources " , " lib " , " a.swift " )
428
+ let manifest = packageRoot. appending ( components: " Package.swift " )
429
+
430
+ let arguments1 = ws. settings ( for: aswift1. asURL, . swift) ? . compilerArguments
431
+ let arguments2 = ws. settings ( for: aswift2. asURL, . swift) ? . compilerArguments
432
+ XCTAssertNotNil ( arguments1)
433
+ XCTAssertNotNil ( arguments2)
434
+ XCTAssertEqual ( arguments1, arguments2)
435
+
436
+ checkNot ( aswift1. pathString, arguments: arguments1 ?? [ ] )
437
+ check ( resolveSymlinks ( aswift1) . pathString, arguments: arguments1 ?? [ ] )
438
+
439
+ let argsManifest = ws. settings ( for: manifest. asURL, . swift) ? . compilerArguments
440
+ XCTAssertNotNil ( argsManifest)
441
+
442
+ checkNot ( manifest. pathString, arguments: argsManifest ?? [ ] )
443
+ check ( resolveSymlinks ( manifest) . pathString, arguments: argsManifest ?? [ ] )
444
+ }
445
+
446
+ func testSymlinkInWorkspaceCXX( ) {
447
+ // FIXME: should be possible to use InMemoryFileSystem.
448
+ let fs = localFileSystem
449
+ let tempDir = try ! TemporaryDirectory ( removeTreeOnDeinit: true )
450
+ try ! fs. createFiles ( root: tempDir. path, files: [
451
+ " pkg_real/Sources/lib/a.cpp " : " " ,
452
+ " pkg_real/Sources/lib/b.cpp " : " " ,
453
+ " pkg_real/Sources/lib/include/a.h " : " " ,
454
+ " pkg_real/Package.swift " : """
455
+ // swift-tools-version:4.2
456
+ import PackageDescription
457
+ let package = Package(name: " a " , products: [], dependencies: [],
458
+ targets: [.target(name: " lib " , dependencies: [])],
459
+ cxxLanguageStandard: .cxx14)
460
+ """
461
+ ] )
462
+
463
+ let packageRoot = tempDir. path. appending ( component: " pkg " )
464
+
465
+ try ! FileManager . default. createSymbolicLink (
466
+ atPath: packageRoot. pathString,
467
+ withDestinationPath: " pkg_real " )
468
+
469
+ let tr = ToolchainRegistry . shared
470
+ let ws = try ! SwiftPMWorkspace (
471
+ workspacePath: packageRoot,
472
+ toolchainRegistry: tr,
473
+ fileSystem: fs,
474
+ buildSetup: TestSourceKitServer . buildSetup)
475
+
476
+ let acxx = packageRoot. appending ( components: " Sources " , " lib " , " a.cpp " )
477
+ let ah = packageRoot. appending ( components: " Sources " , " lib " , " include " , " a.h " )
478
+
479
+ let argsCxx = ws. settings ( for: acxx. asURL, . cpp) ? . compilerArguments
480
+ XCTAssertNotNil ( argsCxx)
481
+ check ( acxx. pathString, arguments: argsCxx ?? [ ] )
482
+ checkNot ( resolveSymlinks ( acxx) . pathString, arguments: argsCxx ?? [ ] )
483
+
484
+ let argsH = ws. settings ( for: ah. asURL, . cpp) ? . compilerArguments
485
+ XCTAssertNotNil ( argsH)
486
+ checkNot ( ah. pathString, arguments: argsH ?? [ ] )
487
+ check ( resolveSymlinks ( ah) . pathString, arguments: argsH ?? [ ] )
488
+ }
396
489
}
397
490
398
491
private func checkNot(
0 commit comments