diff --git a/Sources/SwiftDriver/Jobs/EmitModuleJob.swift b/Sources/SwiftDriver/Jobs/EmitModuleJob.swift index 1afafd78d..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) } @@ -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 fc63d9ca4..f8be84497 100644 --- a/Tests/SwiftDriverTests/SwiftDriverTests.swift +++ b/Tests/SwiftDriverTests/SwiftDriverTests.swift @@ -3096,7 +3096,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) @@ -3504,6 +3504,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 {