Skip to content

Commit 3f23cee

Browse files
authored
Merge pull request #788 from artemcm/PCMDependencyHashPath
[Explicit Module Builds] Include source modulemap path into PCM filename hash.
2 parents 2d2a8e3 + 0c73ed8 commit 3f23cee

File tree

2 files changed

+55
-31
lines changed

2 files changed

+55
-31
lines changed

Sources/SwiftDriver/ExplicitModuleBuilds/ExplicitDependencyBuildPlanner.swift

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,18 +219,20 @@ public typealias ExternalTargetModuleDetailsMap = [ModuleDependencyId: ExternalT
219219
inputs: &inputs,
220220
commandLine: &commandLine)
221221

222+
let moduleMapPath = moduleDetails.moduleMapPath.path
222223
// Encode the target triple pcm args into the output `.pcm` filename
223224
let targetEncodedModulePath =
224225
try targetEncodedClangModuleFilePath(for: moduleInfo,
225-
hashParts: getPCMHashParts(pcmArgs: pcmArgs))
226+
hashParts: getPCMHashParts(pcmArgs: pcmArgs,
227+
moduleMapPath: moduleMapPath.description))
226228
outputs.append(TypedVirtualPath(file: targetEncodedModulePath, type: .pcm))
227229
commandLine.appendFlags("-emit-pcm", "-module-name", moduleId.moduleName,
228230
"-o", targetEncodedModulePath.description)
229231

230232
// The only required input is the .modulemap for this module.
231233
// Command line options in the dependency scanner output will include the
232234
// required modulemap, so here we must only add it to the list of inputs.
233-
inputs.append(TypedVirtualPath(file: moduleDetails.moduleMapPath.path,
235+
inputs.append(TypedVirtualPath(file: moduleMapPath,
234236
type: .clangModuleMap))
235237

236238
jobs.append(Job(
@@ -322,9 +324,11 @@ public typealias ExternalTargetModuleDetailsMap = [ModuleDependencyId: ExternalT
322324
let dependencyInfo = try dependencyGraph.moduleInfo(of: dependencyId)
323325
let dependencyClangModuleDetails =
324326
try dependencyGraph.clangModuleDetails(of: dependencyId)
327+
let moduleMapPath = dependencyClangModuleDetails.moduleMapPath.path
325328
let clangModulePath =
326329
try targetEncodedClangModuleFilePath(for: dependencyInfo,
327-
hashParts: getPCMHashParts(pcmArgs: pcmArgs))
330+
hashParts: getPCMHashParts(pcmArgs: pcmArgs,
331+
moduleMapPath: moduleMapPath.description))
328332
// Accumulate the requried information about this dependency
329333
clangDependencyArtifacts.append(
330334
ClangModuleArtifactInfo(name: dependencyId.moduleName,
@@ -389,11 +393,14 @@ public typealias ExternalTargetModuleDetailsMap = [ModuleDependencyId: ExternalT
389393
return VirtualPath.createUniqueTemporaryFileWithKnownContents(.init("\(moduleId.moduleName)-dependencies.json"), contents)
390394
}
391395

392-
private func getPCMHashParts(pcmArgs: [String]) -> [String] {
396+
private func getPCMHashParts(pcmArgs: [String], moduleMapPath: String) -> [String] {
397+
var results: [String] = []
398+
results.append(moduleMapPath)
399+
results.append(contentsOf: pcmArgs)
393400
if integratedDriver {
394-
return pcmArgs
401+
return results
395402
}
396-
var results = pcmArgs
403+
397404
// We need this to enable explict modules in the driver-as-executable mode. For instance,
398405
// we have two Swift targets A and B, where A depends on X.pcm which in turn depends on Y.pcm,
399406
// and B only depends on Y.pcm. In the driver-as-executable mode, the build system isn't aware
@@ -445,7 +452,7 @@ extension ExplicitDependencyBuildPlanner {
445452
#else
446453
hashedArguments = SHA256().hash(hashInput).hexadecimalRepresentation
447454
#endif
448-
let resultingName = moduleName + hashedArguments
455+
let resultingName = moduleName + "-" + hashedArguments
449456
hashedModuleNameCache[cacheQuery] = resultingName
450457
return resultingName
451458
}

Tests/SwiftDriverTests/ExplicitModuleBuildTests.swift

Lines changed: 41 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -174,14 +174,8 @@ final class ExplicitModuleBuildTests: XCTestCase {
174174
for job in modulePrebuildJobs {
175175
XCTAssertEqual(job.outputs.count, 1)
176176
XCTAssertFalse(driver.isExplicitMainModuleJob(job: job))
177-
let pcmFileEncoder = { (moduleInfo: ModuleInfo, hashParts: [String]) -> VirtualPath.Handle in
178-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleFilePath(for: moduleInfo,
179-
hashParts: hashParts)
180-
}
181-
let pcmModuleNameEncoder = { (moduleName: String, hashParts: [String]) -> String in
182-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleName(for: moduleName,
183-
hashParts: hashParts)
184-
}
177+
178+
let (pcmFileEncoder, pcmModuleNameEncoder) = pcmEncoderProducer(dependencyGraph: moduleDependencyGraph, driver: driver)
185179
switch (job.outputs[0].file) {
186180
case .relative(pcmArgsEncodedRelativeModulePath(for: "SwiftShims", with: pcmArgs,
187181
pcmModuleNameEncoder: pcmModuleNameEncoder)):
@@ -268,6 +262,39 @@ final class ExplicitModuleBuildTests: XCTestCase {
268262
path.extension! == FileType.swiftModule.rawValue
269263
}
270264

265+
private func pcmEncoderProducer(dependencyGraph: InterModuleDependencyGraph,
266+
driver: Driver)
267+
-> ((ModuleInfo, [String]) -> VirtualPath.Handle, (String, [String]) -> String) {
268+
var driverCopy = driver
269+
let moduleMapIncludedHashParts = { (_ moduleName: String, _ hashParts: [String]) -> [String] in
270+
let moduleDetails = try? dependencyGraph.clangModuleDetails(of: .clang(moduleName))
271+
let lookupHashParts: [String]
272+
if let details = moduleDetails {
273+
let moduleMapPath = details.moduleMapPath.path.description
274+
lookupHashParts = [moduleMapPath] + hashParts
275+
} else {
276+
// No such module found, no modulemap
277+
lookupHashParts = hashParts
278+
}
279+
return lookupHashParts
280+
}
281+
282+
let pcmFileEncoder = { (moduleInfo: ModuleInfo, hashParts: [String]) -> VirtualPath.Handle in
283+
let plainModulePath = VirtualPath.lookup(moduleInfo.modulePath.path)
284+
let moduleName = plainModulePath.basenameWithoutExt
285+
let lookupHashParts = moduleMapIncludedHashParts(moduleName, hashParts)
286+
return try! driverCopy.explicitDependencyBuildPlanner!.targetEncodedClangModuleFilePath(for: moduleInfo,
287+
hashParts: lookupHashParts)
288+
}
289+
290+
let pcmModuleNameEncoder = { (moduleName: String, hashParts: [String]) -> String in
291+
let lookupHashParts = moduleMapIncludedHashParts(moduleName, hashParts)
292+
return try! driverCopy.explicitDependencyBuildPlanner!.targetEncodedClangModuleName(for: moduleName,
293+
hashParts: lookupHashParts)
294+
}
295+
return (pcmFileEncoder, pcmModuleNameEncoder)
296+
}
297+
271298
/// Test generation of explicit module build jobs for dependency modules when the driver
272299
/// is invoked with -experimental-explicit-module-build
273300
func testExplicitModuleBuildJobs() throws {
@@ -308,14 +335,8 @@ final class ExplicitModuleBuildTests: XCTestCase {
308335
pcmArgs9.append(contentsOf: ["-Xcc", "-fapinotes-swift-version=5"])
309336
pcmArgs15.append(contentsOf: ["-Xcc", "-fapinotes-swift-version=5"])
310337
}
311-
let pcmFileEncoder = { (moduleInfo: ModuleInfo, hashParts: [String]) -> VirtualPath.Handle in
312-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleFilePath(for: moduleInfo,
313-
hashParts: hashParts)
314-
}
315-
let pcmModuleNameEncoder = { (moduleName: String, hashParts: [String]) -> String in
316-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleName(for: moduleName,
317-
hashParts: hashParts)
318-
}
338+
339+
let (pcmFileEncoder, pcmModuleNameEncoder) = pcmEncoderProducer(dependencyGraph: dependencyGraph, driver: driver)
319340

320341
for job in jobs {
321342
XCTAssertEqual(job.outputs.count, 1)
@@ -352,6 +373,7 @@ final class ExplicitModuleBuildTests: XCTestCase {
352373
// Clang Dependencies
353374
} else if outputFilePath.extension != nil,
354375
outputFilePath.extension! == FileType.pcm.rawValue {
376+
355377
switch (outputFilePath) {
356378
case .relative(pcmArgsEncodedRelativeModulePath(for: "A", with: pcmArgsCurrent,
357379
pcmModuleNameEncoder: pcmModuleNameEncoder)):
@@ -470,14 +492,9 @@ final class ExplicitModuleBuildTests: XCTestCase {
470492
pcmArgs9.append(contentsOf: ["-Xcc", "-fapinotes-swift-version=5"])
471493
pcmArgs15.append(contentsOf: ["-Xcc", "-fapinotes-swift-version=5"])
472494
}
473-
let pcmFileEncoder = { (moduleInfo: ModuleInfo, hashParts: [String]) -> VirtualPath.Handle in
474-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleFilePath(for: moduleInfo,
475-
hashParts: hashParts)
476-
}
477-
let pcmModuleNameEncoder = { (moduleName: String, hashParts: [String]) -> String in
478-
try! driver.explicitDependencyBuildPlanner!.targetEncodedClangModuleName(for: moduleName,
479-
hashParts: hashParts)
480-
}
495+
496+
let (pcmFileEncoder, pcmModuleNameEncoder) = pcmEncoderProducer(dependencyGraph: dependencyGraph, driver: driver)
497+
481498
for job in jobs {
482499
guard job.kind != .interpret else { continue }
483500
XCTAssertEqual(job.outputs.count, 1)

0 commit comments

Comments
 (0)