Skip to content

Commit 5f7fceb

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 5f7fceb

File tree

2 files changed

+30
-3
lines changed

2 files changed

+30
-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: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1973,6 +1973,23 @@ 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 job
1985+
#if os(macOS)
1986+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .link, .generateDSYM])
1987+
#endif
1988+
#if os(Linux)
1989+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .autolinkExtract, .link])
1990+
#endif
1991+
XCTAssertTrue(plannedJobs[0].outputs.contains(TypedVirtualPath(file: VirtualPath.temporary(RelativePath("input.swiftmodule")).intern(), type: .swiftModule)))
1992+
}
19761993
}
19771994

19781995
func testEmitModuleSeparately() throws {
@@ -2046,11 +2063,11 @@ final class SwiftDriverTests: XCTestCase {
20462063
// dsymutil won't be found on other platforms
20472064
#if os(macOS)
20482065
do {
2049-
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift"])
2066+
var driver = try Driver(args: ["swiftc", "-target", "x86_64-apple-macosx10.15", "-g", "foo.swift", "bar.swift"])
20502067
let plannedJobs = try driver.planBuild()
2051-
XCTAssertEqual(plannedJobs.count, 4)
2068+
XCTAssertEqual(plannedJobs.count, 5)
20522069
// No module wrapping with Mach-O.
2053-
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .mergeModule, .link, .generateDSYM])
2070+
XCTAssertEqual(plannedJobs.map { $0.kind }, [.compile, .compile, .mergeModule, .link, .generateDSYM])
20542071
}
20552072
#endif
20562073
}

0 commit comments

Comments
 (0)