Skip to content

Commit 4efb328

Browse files
authored
Merge pull request #41 from JhonnyBillM/was-pr-26-worth-it
[Tests] - FIX - several tests to run on linux target.
2 parents abb6015 + 2ba62cf commit 4efb328

File tree

4 files changed

+101
-71
lines changed

4 files changed

+101
-71
lines changed

Sources/SwiftDriver/Jobs/Toolchain+LinkerSupport.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,9 @@ extension Toolchain {
2323
let resourceDirBase: AbsolutePath
2424
if let resourceDir = parsedOptions.getLastArgument(.resourceDir) {
2525
resourceDirBase = try AbsolutePath(validating: resourceDir.asSingle)
26-
} else if let sdk = parsedOptions.getLastArgument(.sdk), !triple.isDarwin {
27-
resourceDirBase = try AbsolutePath(validating: sdk.asSingle)
26+
} else if let sdk = parsedOptions.getLastArgument(.sdk),
27+
let sdkPath = try? AbsolutePath(validating: sdk.asSingle) {
28+
resourceDirBase = sdkPath
2829
.appending(components: "usr", "lib",
2930
isShared ? "swift" : "swift_static")
3031
} else {

Sources/SwiftDriver/Toolchains/Toolchain.swift

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ extension Toolchain {
107107
return "SWIFT_DRIVER_\(toolName.uppercased())_EXEC"
108108
}
109109

110+
/// Use this property only for testing purposes, for example,
111+
/// to enable cross-compiling tests that depends on macOS tooling such as `dsymutil`.
112+
///
113+
/// Returns true if `SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK` is set to `1`.
114+
private var fallbackToExecutableDefaultPath: Bool {
115+
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] == "1"
116+
}
117+
110118
/// Looks for the executable in the `SWIFT_DRIVER_TOOLNAME_EXEC` environment variable, if found nothing,
111119
/// looks in the `executableDir`, `xcrunFind` or in the `searchPaths`.
112120
/// - Parameter executable: executable to look for [i.e. `swift`].
@@ -119,9 +127,10 @@ extension Toolchain {
119127
return path
120128
} else if let path = lookupExecutablePath(filename: executable, searchPaths: searchPaths) {
121129
return path
122-
} else {
123-
// This is a hack so our tests work on linux.
130+
} else if fallbackToExecutableDefaultPath {
124131
return AbsolutePath("/usr/bin/" + executable)
132+
} else {
133+
throw ToolchainError.unableToFind(tool: executable)
125134
}
126135
}
127136

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 68 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -211,13 +211,9 @@ final class SwiftDriverTests: XCTestCase {
211211

212212
XCTAssertNil(try Driver(args: ["swiftc", "-j", "0"]).numParallelJobs)
213213

214-
XCTAssertEqual(
215-
try Driver(
216-
args: ["swiftc", "-j", "4", "-target", "x86_64-apple-macosx10.15"],
217-
env: ["SWIFTC_MAXIMUM_DETERMINISM": "1"]
218-
).numParallelJobs,
219-
1
220-
)
214+
var env = ProcessEnv.vars
215+
env["SWIFTC_MAXIMUM_DETERMINISM"] = "1"
216+
XCTAssertEqual(try Driver(args: ["swiftc", "-j", "4"], env: env).numParallelJobs, 1)
221217
}
222218

223219
func testMultithreadingDiagnostics() throws {
@@ -234,10 +230,9 @@ final class SwiftDriverTests: XCTestCase {
234230
$1.expect(.error("invalid value '0' in '-j'"))
235231
}
236232

237-
try assertDriverDiagnostics(
238-
args: "swiftc", "-j", "8", "-target", "x86_64-apple-macosx10.15",
239-
env: ["SWIFTC_MAXIMUM_DETERMINISM": "1"]
240-
) {
233+
var env = ProcessEnv.vars
234+
env["SWIFTC_MAXIMUM_DETERMINISM"] = "1"
235+
try assertDriverDiagnostics(args: "swiftc", "-j", "8", env: env) {
241236
$1.expect(.remark("SWIFTC_MAXIMUM_DETERMINISM overriding -j"))
242237
}
243238
}
@@ -323,27 +318,27 @@ final class SwiftDriverTests: XCTestCase {
323318
}
324319

325320
func testStandardCompileJobs() throws {
326-
var driver1 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test", "-target", "x86_64-apple-macosx10.15"])
321+
var driver1 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test"])
327322
let plannedJobs = try driver1.planBuild()
328323
XCTAssertEqual(plannedJobs.count, 3)
329324
XCTAssertEqual(plannedJobs[0].outputs.count, 1)
330325
XCTAssertEqual(plannedJobs[0].outputs.first!.file, VirtualPath.temporary(RelativePath("foo.o")))
331326
XCTAssertEqual(plannedJobs[1].outputs.count, 1)
332327
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("bar.o")))
333-
XCTAssertTrue(plannedJobs[2].tool.name.contains("ld"))
328+
XCTAssertTrue(plannedJobs[2].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
334329
XCTAssertEqual(plannedJobs[2].outputs.count, 1)
335330
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
336331

337332
// Forwarding of arguments.
338-
var driver2 = try Driver(args: ["swiftc", "-color-diagnostics", "foo.swift", "bar.swift", "-working-directory", "/tmp", "-api-diff-data-file", "diff.txt", "-Xfrontend", "-HI", "-no-color-diagnostics", "-target", "powerpc-apple-macosx10.4", "-g"])
333+
var driver2 = try Driver(args: ["swiftc", "-color-diagnostics", "foo.swift", "bar.swift", "-working-directory", "/tmp", "-api-diff-data-file", "diff.txt", "-Xfrontend", "-HI", "-no-color-diagnostics", "-g"])
339334
let plannedJobs2 = try driver2.planBuild()
340335
XCTAssert(plannedJobs2[0].commandLine.contains(Job.ArgTemplate.path(.absolute(try AbsolutePath(validating: "/tmp/diff.txt")))))
341336
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-HI")))
342337
XCTAssert(!plannedJobs2[0].commandLine.contains(.flag("-Xfrontend")))
343338
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-no-color-diagnostics")))
344339
XCTAssert(!plannedJobs2[0].commandLine.contains(.flag("-color-diagnostics")))
345340
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-target")))
346-
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("powerpc-apple-macosx10.4")))
341+
XCTAssert(plannedJobs2[0].commandLine.contains(.flag(driver2.targetTriple.triple)))
347342
XCTAssert(plannedJobs2[0].commandLine.contains(.flag("-enable-anonymous-context-mangled-names")))
348343

349344
var driver3 = try Driver(args: ["swiftc", "foo.swift", "bar.swift", "-emit-library", "-module-name", "Test"])
@@ -474,10 +469,13 @@ final class SwiftDriverTests: XCTestCase {
474469
}
475470

476471
func testLinking() throws {
472+
var env = ProcessEnv.vars
473+
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] = "1"
474+
477475
let commonArgs = ["swiftc", "foo.swift", "bar.swift", "-module-name", "Test"]
478476
do {
479477
// macOS target
480-
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15"])
478+
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "x86_64-apple-macosx10.15"], env: env)
481479
let plannedJobs = try driver.planBuild()
482480

483481
XCTAssertEqual(3, plannedJobs.count)
@@ -500,7 +498,7 @@ final class SwiftDriverTests: XCTestCase {
500498

501499
do {
502500
// iOS target
503-
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "arm64-apple-ios10.0"])
501+
var driver = try Driver(args: commonArgs + ["-emit-library", "-target", "arm64-apple-ios10.0"], env: env)
504502
let plannedJobs = try driver.planBuild()
505503

506504
XCTAssertEqual(3, plannedJobs.count)
@@ -523,7 +521,7 @@ final class SwiftDriverTests: XCTestCase {
523521

524522
do {
525523
// Xlinker flags
526-
var driver = try Driver(args: commonArgs + ["-emit-library", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"])
524+
var driver = try Driver(args: commonArgs + ["-emit-library", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"], env: env)
527525
let plannedJobs = try driver.planBuild()
528526

529527
XCTAssertEqual(3, plannedJobs.count)
@@ -545,7 +543,7 @@ final class SwiftDriverTests: XCTestCase {
545543

546544
do {
547545
// static linking
548-
var driver = try Driver(args: commonArgs + ["-emit-library", "-static", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"])
546+
var driver = try Driver(args: commonArgs + ["-emit-library", "-static", "-L", "/tmp", "-Xlinker", "-w", "-target", "x86_64-apple-macosx10.15"], env: env)
549547
let plannedJobs = try driver.planBuild()
550548

551549
XCTAssertEqual(plannedJobs.count, 3)
@@ -573,7 +571,7 @@ final class SwiftDriverTests: XCTestCase {
573571

574572
do {
575573
// executable linking
576-
var driver = try Driver(args: commonArgs + ["-emit-executable", "-target", "x86_64-apple-macosx10.15"])
574+
var driver = try Driver(args: commonArgs + ["-emit-executable", "-target", "x86_64-apple-macosx10.15"], env: env)
577575
let plannedJobs = try driver.planBuild()
578576
XCTAssertEqual(3, plannedJobs.count)
579577
XCTAssertFalse(plannedJobs.contains { $0.kind == .autolinkExtract })
@@ -752,7 +750,7 @@ final class SwiftDriverTests: XCTestCase {
752750
}
753751

754752
func testBatchModeCompiles() throws {
755-
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-target", "x86_64-apple-macosx10.15", "-enable-batch-mode", "-driver-batch-count", "3"])
753+
var driver1 = try Driver(args: ["swiftc", "foo1.swift", "bar1.swift", "foo2.swift", "bar2.swift", "foo3.swift", "bar3.swift", "foo4.swift", "bar4.swift", "foo5.swift", "bar5.swift", "wibble.swift", "-module-name", "Test", "-enable-batch-mode", "-driver-batch-count", "3"])
756754
let plannedJobs = try driver1.planBuild()
757755
XCTAssertEqual(plannedJobs.count, 4)
758756
XCTAssertEqual(plannedJobs[0].outputs.count, 4)
@@ -761,7 +759,7 @@ final class SwiftDriverTests: XCTestCase {
761759
XCTAssertEqual(plannedJobs[1].outputs.first!.file, VirtualPath.temporary(RelativePath("foo3.o")))
762760
XCTAssertEqual(plannedJobs[2].outputs.count, 3)
763761
XCTAssertEqual(plannedJobs[2].outputs.first!.file, VirtualPath.temporary(RelativePath("foo5.o")))
764-
XCTAssertTrue(plannedJobs[3].tool.name.contains("ld"))
762+
XCTAssertTrue(plannedJobs[3].tool.name.contains(driver1.targetTriple.isDarwin ? "ld" : "clang"))
765763
XCTAssertEqual(plannedJobs[3].outputs.count, 1)
766764
XCTAssertEqual(plannedJobs[3].outputs.first!.file, VirtualPath.relative(RelativePath("Test")))
767765
}
@@ -782,8 +780,10 @@ final class SwiftDriverTests: XCTestCase {
782780
}
783781

784782
func testMultiThreadedWholeModuleOptimizationCompiles() throws {
785-
var driver1 = try Driver(args: ["swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
786-
"-num-threads", "4", "-target", "x86_64-apple-macosx10.15"])
783+
var driver1 = try Driver(args: [
784+
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift",
785+
"-module-name", "Test", "-num-threads", "4"
786+
])
787787
let plannedJobs = try driver1.planBuild()
788788
XCTAssertEqual(plannedJobs.count, 2)
789789
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -808,9 +808,10 @@ final class SwiftDriverTests: XCTestCase {
808808
try withTemporaryFile { file in
809809
try assertNoDiagnostics { diags in
810810
try localFileSystem.writeFileContents(file.path) { $0 <<< contents }
811-
var driver1 = try Driver(args: ["swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
812-
"-num-threads", "4", "-target", "x86_64-apple-macosx10.15",
813-
"-output-file-map", file.path.pathString, "-emit-module-interface"])
811+
var driver1 = try Driver(args: [
812+
"swiftc", "-whole-module-optimization", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test",
813+
"-num-threads", "4", "-output-file-map", file.path.pathString, "-emit-module-interface"
814+
])
814815
let plannedJobs = try driver1.planBuild()
815816
XCTAssertEqual(plannedJobs.count, 2)
816817
XCTAssertEqual(plannedJobs[0].kind, .compile)
@@ -899,12 +900,7 @@ final class SwiftDriverTests: XCTestCase {
899900
XCTAssertTrue(job.commandLine.contains(.flag("foo")))
900901

901902
XCTAssertFalse(job.commandLine.contains(.flag("--")))
902-
903-
#if os(macOS)
904-
XCTAssertTrue(job.extraEnvironment.keys.contains("DYLD_LIBRARY_PATH"))
905-
#elseif os(Linux)
906-
XCTAssertTrue(job.extraEnvironment.keys.contains("LD_LIBRARY_PATH"))
907-
#endif
903+
XCTAssertTrue(job.extraEnvironment.keys.contains("\(driver.targetTriple.isDarwin ? "DYLD" : "LD")_LIBRARY_PATH"))
908904
}
909905

910906
do {
@@ -924,7 +920,7 @@ final class SwiftDriverTests: XCTestCase {
924920
XCTAssertTrue(job.commandLine.contains(.flag("args")))
925921
XCTAssertTrue(job.commandLine.contains(.flag("-for=foo")))
926922
}
927-
#if os(macOS)
923+
928924
do {
929925
var driver = try Driver(args: ["swift", "-L/path/to/lib", "-F/path/to/framework", "foo.swift"])
930926
let plannedJobs = try driver.planBuild()
@@ -933,21 +929,13 @@ final class SwiftDriverTests: XCTestCase {
933929
XCTAssertEqual(job.inputs.count, 1)
934930
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
935931
XCTAssertEqual(job.outputs.count, 0)
936-
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_LIBRARY_PATH" && $1.contains("/path/to/lib") })
937-
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_FRAMEWORK_PATH" && $1.contains("/path/to/framework") })
938-
}
939-
#elseif os(Linux)
940-
do {
941-
var driver = try Driver(args: ["swift", "-L/path/to/lib", "foo.swift"])
942-
let plannedJobs = try driver.planBuild()
943-
XCTAssertEqual(plannedJobs.count, 1)
944-
let job = plannedJobs[0]
945-
XCTAssertEqual(job.inputs.count, 1)
946-
XCTAssertEqual(job.inputs[0].file, .relative(RelativePath("foo.swift")))
947-
XCTAssertEqual(job.outputs.count, 0)
948-
XCTAssertTrue(job.extraEnvironment.contains { $0 == "LD_LIBRARY_PATH" && $1.contains("/path/to/lib") })
932+
XCTAssertTrue(job.extraEnvironment.contains {
933+
$0 == "\(driver.targetTriple.isDarwin ? "DYLD" : "LD")_LIBRARY_PATH" && $1.contains("/path/to/lib")
934+
})
935+
if driver.targetTriple.isDarwin {
936+
XCTAssertTrue(job.extraEnvironment.contains { $0 == "DYLD_FRAMEWORK_PATH" && $1.contains("/path/to/framework") })
937+
}
949938
}
950-
#endif
951939
}
952940

953941
func testTargetTriple() throws {
@@ -974,9 +962,8 @@ final class SwiftDriverTests: XCTestCase {
974962

975963
func testDSYMGeneration() throws {
976964
let commonArgs = [
977-
"swiftc", "-target", "x86_64-apple-macosx",
978-
"foo.swift", "bar.swift", "-emit-executable",
979-
"-module-name", "Test"
965+
"swiftc", "foo.swift", "bar.swift",
966+
"-emit-executable", "-module-name", "Test"
980967
]
981968

982969
do {
@@ -1001,29 +988,32 @@ final class SwiftDriverTests: XCTestCase {
1001988
// dSYM generation (-g)
1002989
var driver = try Driver(args: commonArgs + ["-g"])
1003990
let plannedJobs = try driver.planBuild()
1004-
1005-
XCTAssertEqual(plannedJobs.count, 5)
991+
1006992
let generateDSYMJob = plannedJobs.last!
1007-
XCTAssertEqual(generateDSYMJob.kind, .generateDSYM)
1008-
1009-
XCTAssertEqual(generateDSYMJob.outputs.last?.file, try VirtualPath(path: "Test.dSYM"))
1010-
1011993
let cmd = generateDSYMJob.commandLine
994+
995+
if driver.targetTriple.isDarwin {
996+
XCTAssertEqual(plannedJobs.count, 5)
997+
XCTAssertEqual(generateDSYMJob.outputs.last?.file, try VirtualPath(path: "Test.dSYM"))
998+
} else {
999+
XCTAssertEqual(plannedJobs.count, 4)
1000+
}
1001+
10121002
XCTAssertTrue(cmd.contains(.path(try VirtualPath(path: "Test"))))
10131003
}
10141004
}
10151005

10161006
func testDOTFileEmission() throws {
10171007
var driver = try Driver(args: [
1018-
"swiftc", "-emit-executable", "test.swift", "-emit-module",
1019-
"-target", "x86_64-apple-macosx"
1008+
"swiftc", "-emit-executable", "test.swift", "-emit-module"
10201009
])
10211010
let plannedJobs = try driver.planBuild()
10221011

10231012
var serializer = DOTJobGraphSerializer(jobs: plannedJobs)
10241013
var output = ""
10251014
serializer.writeDOT(to: &output)
10261015

1016+
let dynamicLinker = driver.targetTriple.isDarwin ? "ld" : "clang"
10271017
XCTAssertEqual(output,
10281018
"""
10291019
digraph Jobs {
@@ -1040,26 +1030,25 @@ final class SwiftDriverTests: XCTestCase {
10401030
"test.swiftmodule" -> "mergeModule (swift)" [color=blue];
10411031
"mergeModule (swift)" -> "test.swiftmodule" [color=green];
10421032
"mergeModule (swift)" -> "test.swiftdoc" [color=green];
1043-
"link (ld)" [style=bold];
1044-
"test.o" -> "link (ld)" [color=blue];
1033+
"link (\(dynamicLinker))" [style=bold];
1034+
"test.o" -> "link (\(dynamicLinker))" [color=blue];
10451035
"test" [fontsize=12];
1046-
"link (ld)" -> "test" [color=green];
1036+
"link (\(dynamicLinker))" -> "test" [color=green];
10471037
}
10481038
10491039
""")
10501040
}
10511041

10521042
func testRegressions() throws {
1053-
// FIXME: This doesn't work on Linux.
1054-
#if os(macOS)
10551043
var driverWithEmptySDK = try Driver(args: ["swiftc", "-sdk", "", "file.swift"])
10561044
_ = try driverWithEmptySDK.planBuild()
1057-
#endif
10581045
}
10591046

10601047
func testToolchainUtilities() throws {
1061-
let swiftVersion = try DarwinToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
1062-
assertString(swiftVersion, contains: "Swift version ")
1048+
let darwinSwiftVersion = try DarwinToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
1049+
let unixSwiftVersion = try GenericUnixToolchain(env: ProcessEnv.vars).swiftCompilerVersion()
1050+
assertString(darwinSwiftVersion, contains: "Swift version ")
1051+
assertString(unixSwiftVersion, contains: "Swift version ")
10631052
}
10641053

10651054
func testToolchainClangPath() {
@@ -1076,6 +1065,18 @@ final class SwiftDriverTests: XCTestCase {
10761065
try? toolchain.getToolPath(.clang).parentDirectory
10771066
)
10781067
}
1068+
1069+
func testExecutableFallbackPath() throws {
1070+
let driver1 = try Driver(args: ["swift", "main.swift"])
1071+
if !driver1.targetTriple.isDarwin {
1072+
XCTAssertThrowsError(try driver1.toolchain.getToolPath(.dsymutil))
1073+
}
1074+
1075+
var env = ProcessEnv.vars
1076+
env["SWIFT_DRIVER_TESTS_ENABLE_EXEC_PATH_FALLBACK"] = "1"
1077+
let driver2 = try Driver(args: ["swift", "main.swift"], env: env)
1078+
XCTAssertNoThrow(try driver2.toolchain.getToolPath(.dsymutil))
1079+
}
10791080
}
10801081

10811082
func assertString(

0 commit comments

Comments
 (0)