Skip to content

Commit fffd6f9

Browse files
committed
[Merge Modules] Omit merge-modules job when only one input is given.
And said input matches the expected output path.
1 parent f31c86a commit fffd6f9

File tree

2 files changed

+25
-3
lines changed

2 files changed

+25
-3
lines changed

Sources/SwiftDriver/Jobs/Planning.swift

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -392,6 +392,16 @@ extension Driver {
392392
!(moduleInputs.isEmpty && moduleInputsFromJobOutputs.isEmpty),
393393
compilerMode.usesPrimaryFileInputs
394394
else { return nil }
395+
396+
// If there is only 1 module input to this job and its path matches that which we intend
397+
// to produce with this merge-modules job, skip it
398+
let mergeOutput = moduleOutputInfo.output!.outputPath
399+
if moduleInputs.count + moduleInputsFromJobOutputs.count == 1,
400+
let soleInput = moduleInputs.first == nil ? moduleInputsFromJobOutputs.first : moduleInputs.first,
401+
soleInput.fileHandle == mergeOutput {
402+
return nil
403+
}
404+
395405
return try mergeModuleJob(inputs: moduleInputs, inputsFromOutputs: moduleInputsFromJobOutputs)
396406
}
397407

Tests/SwiftDriverTests/SwiftDriverTests.swift

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,18 @@ final class SwiftDriverTests: XCTestCase {
19731973
XCTAssertEqual(plannedJobs[1].inputs[0].file, .temporary(RelativePath("input.swiftmodule")))
19741974
XCTAssertEqual(plannedJobs[1].outputs[0].file, .absolute(AbsolutePath("/tmp/test.swiftmodule")))
19751975
}
1976+
1977+
do {
1978+
// -g is specified
1979+
// (partial and final product module are saved to temporary directory so merge-modules is omitted)
1980+
var driver = try Driver(args: ["swiftc", "-g", "input.swift"])
1981+
let plannedJobs = try driver.planBuild()
1982+
print(plannedJobs)
1983+
XCTAssertEqual(plannedJobs.count, 3)
1984+
// No .mergeModule
1985+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .link, .generateDSYM])
1986+
XCTAssertTrue(plannedJobs[0].outputs.contains(TypedVirtualPath(file: VirtualPath.temporary(RelativePath("input.swiftmodule")).intern(), type: .swiftModule)))
1987+
}
19761988
}
19771989

19781990
func testEmitModuleSeparately() throws {
@@ -2046,11 +2058,11 @@ final class SwiftDriverTests: XCTestCase {
20462058
// dsymutil won't be found on other platforms
20472059
#if os(macOS)
20482060
do {
2049-
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift"])
2061+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift", "bar.swift"])
20502062
let plannedJobs = try driver.planBuild()
2051-
XCTAssertEqual(plannedJobs.count, 4)
2063+
XCTAssertEqual(plannedJobs.count, 5)
20522064
// No module wrapping with Mach-O.
2053-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link, .generateDSYM])
2065+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .compile, .mergeModule, .link, .generateDSYM])
20542066
}
20552067
#endif
20562068
}

0 commit comments

Comments
 (0)