From fae00bc79b786a180025e09b0c7d6650359cbfbd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Mon, 29 Apr 2024 12:54:05 -0700 Subject: [PATCH 1/4] Schedule an emit-module-separately job even if an input is not compilable The following invocation should schedule an emit-module-separately job for src.swift and include other.dylib in the link job. ``` swiftc -emit-library src.swift other.dylib ``` rdar://127238278 --- Sources/SwiftDriver/Jobs/EmitModuleJob.swift | 2 +- Tests/SwiftDriverTests/SwiftDriverTests.swift | 16 ++++++++++++++++ 2 files changed, 17 insertions(+), 1 deletion(-) diff --git a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift index 1afafd78d..16b982c56 100644 --- a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift +++ b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift @@ -136,7 +136,7 @@ extension Driver { moduleOutputInfo: ModuleOutputInfo, inputFiles: [TypedVirtualPath]) -> Bool { if moduleOutputInfo.output == nil || - !inputFiles.allSatisfy({ $0.type.isPartOfSwiftCompilation }) { + !inputFiles.contains(where: { $0.type.isPartOfSwiftCompilation }) { return false } diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index d8695b6ed..a2122b4ad 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3467,6 +3467,22 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(plannedJobs.count, 4) XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .emitModule, .link])) } + + do { + // Schedule an emit-module separately job even if there are non-compilable inputs. + var driver = try Driver(args: ["swiftc", "foo.swift", "bar.dylib", "-emit-library", "foo.dylib", "-emit-module-path", "foo.swiftmodule"], + env: envVars) + let plannedJobs = try driver.planBuild() + XCTAssertEqual(plannedJobs.count, 3) + XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .emitModule, .link])) + + let emitJob = try plannedJobs.findJob(.emitModule) + XCTAssertTrue(emitJob.commandLine.contains(try toPathOption("foo.swift"))) + XCTAssertFalse(emitJob.commandLine.contains(try toPathOption("bar.dylib"))) + + let linkJob = try plannedJobs.findJob(.link) + XCTAssertTrue(linkJob.commandLine.contains(try toPathOption("bar.dylib"))) + } } func testEmitModuleSeparatelyWMO() throws { From d0f2ddc1e08d9fdab29619913c4f3ab1306cd063 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 30 Apr 2024 14:01:48 -0700 Subject: [PATCH 2/4] Remap input file paths passed to the emit-module-separately job Fixes the failure in testDependencyScanningPathRemap. --- Sources/SwiftDriver/Jobs/EmitModuleJob.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift index 16b982c56..d1e110d9a 100644 --- a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift +++ b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift @@ -90,7 +90,7 @@ extension Driver { // Add the inputs. for input in self.inputFiles where input.type.isPartOfSwiftCompilation { - commandLine.append(.path(input.file)) + try addPathArgument(input.file, to: &commandLine) inputs.append(input) } From b407364cf0ff3c3eceb8042fca23855d2a2458e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Tue, 30 Apr 2024 14:21:05 -0700 Subject: [PATCH 3/4] Disable emit-module-separately in testWMOWithNonSourceInputFirstAndModuleOutput --- Tests/SwiftDriverTests/SwiftDriverTests.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index a2122b4ad..c3c0a3796 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3088,7 +3088,7 @@ final class SwiftDriverTests: XCTestCase { func testWMOWithNonSourceInputFirstAndModuleOutput() throws { var driver1 = try Driver(args: [ "swiftc", "-wmo", "danger.o", "foo.swift", "bar.swift", "wibble.swift", "-module-name", "Test", - "-driver-filelist-threshold=0", "-emit-module", "-emit-library" + "-driver-filelist-threshold=0", "-emit-module", "-emit-library", "-no-emit-module-separately-wmo" ]) let plannedJobs = try driver1.planBuild().removingAutolinkExtractJobs() XCTAssertEqual(plannedJobs.count, 2) From 0cb785cc09cadadbd90922eed90a58fc6e3739c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexis=20Laferrie=CC=80re?= Date: Wed, 1 May 2024 14:29:51 -0700 Subject: [PATCH 4/4] Avoid using toPathOption unavailable on 6.0 --- Tests/SwiftDriverTests/SwiftDriverTests.swift | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Tests/SwiftDriverTests/SwiftDriverTests.swift b/Tests/SwiftDriverTests/SwiftDriverTests.swift index c3c0a3796..0db486213 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3477,11 +3477,11 @@ final class SwiftDriverTests: XCTestCase { XCTAssertEqual(Set(plannedJobs.map { $0.kind }), Set([.compile, .emitModule, .link])) let emitJob = try plannedJobs.findJob(.emitModule) - XCTAssertTrue(emitJob.commandLine.contains(try toPathOption("foo.swift"))) - XCTAssertFalse(emitJob.commandLine.contains(try toPathOption("bar.dylib"))) + XCTAssertTrue(try emitJob.commandLine.contains(where: { $0 == .path(.relative(try .init(validating: "foo.swift")))})) + XCTAssertFalse(try emitJob.commandLine.contains(where: { $0 == .path(.relative(try .init(validating: "bar.dylib")))})) let linkJob = try plannedJobs.findJob(.link) - XCTAssertTrue(linkJob.commandLine.contains(try toPathOption("bar.dylib"))) + XCTAssertTrue(try linkJob.commandLine.contains(where: { $0 == .path(.relative(try .init(validating: "bar.dylib")))})) } }