Skip to content

Commit defa4fc

Browse files
committed
[Explicit Module Builds] Refactor clang module dependency commandLine/input gathering to match swift
1 parent 326217d commit defa4fc

File tree

3 files changed

+60
-29
lines changed

3 files changed

+60
-29
lines changed

Sources/SwiftDriver/CMakeLists.txt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ add_library(SwiftDriver
1111
"Explicit Module Builds/ExplicitModuleBuildHandler.swift"
1212
"Explicit Module Builds/InterModuleDependencyGraph.swift"
1313
"Explicit Module Builds/ModuleDependencyScanning.swift"
14-
"Explicit Module Builds/SwiftModuleArtifacts.swift"
14+
"Explicit Module Builds/ModuleArtifacts.swift"
1515

1616
Driver/CompilerMode.swift
1717
Driver/DebugInfo.swift

Sources/SwiftDriver/Explicit Module Builds/ExplicitModuleBuildHandler.swift

Lines changed: 40 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -236,43 +236,61 @@ public struct ExplicitModuleBuildHandler {
236236
commandLine.appendFlags("-disable-implicit-swift-modules", "-Xcc", "-Xclang", "-Xcc",
237237
"-fno-implicit-modules")
238238
var swiftDependencyArtifacts: [SwiftModuleArtifactInfo] = []
239-
try addModuleDependencies(moduleId: moduleId, pcmArgs: pcmArgs, inputs: &inputs,
240-
commandLine: &commandLine,
239+
var clangDependencyArtifacts: [ClangModuleArtifactInfo] = []
240+
try addModuleDependencies(moduleId: moduleId, pcmArgs: pcmArgs,
241+
clangDependencyArtifacts: &clangDependencyArtifacts,
241242
swiftDependencyArtifacts: &swiftDependencyArtifacts)
242243

244+
// Swift Module dependencies are passed encoded in a JSON file as described by
245+
// SwiftModuleArtifactInfo
243246
if !swiftDependencyArtifacts.isEmpty {
244-
let dependencyFile = try serializeModuleDependencies(for: moduleId,
245-
dependencyArtifacts: swiftDependencyArtifacts)
247+
let dependencyFile =
248+
try serializeModuleDependencies(for: moduleId, dependencyArtifacts: swiftDependencyArtifacts)
246249
commandLine.appendFlag("-explicit-swift-module-map-file")
247250
commandLine.appendPath(dependencyFile)
248251
inputs.append(TypedVirtualPath(file: try VirtualPath(path: dependencyFile.pathString),
249252
type: .jsonSwiftArtifacts))
250-
// Each individual moduel binary is still an "input" to ensure the build system gets the
253+
// Each individual module binary is still an "input" to ensure the build system gets the
251254
// order correctly.
252255
for dependencyModule in swiftDependencyArtifacts {
253256
inputs.append(TypedVirtualPath(file: try VirtualPath(path: dependencyModule.modulePath),
254257
type: .swiftModule))
255258
}
256259
}
260+
// Clang module depenencies are specified on the command line eplicitly
261+
for moduleArtifactInfo in clangDependencyArtifacts {
262+
let clangModulePath =
263+
TypedVirtualPath(file: try VirtualPath(path: moduleArtifactInfo.modulePath),
264+
type: .pcm)
265+
let clangModuleMapPath =
266+
TypedVirtualPath(file: try VirtualPath(path: moduleArtifactInfo.moduleMapPath),
267+
type: .clangModuleMap)
268+
commandLine.appendFlags("-Xcc", "-Xclang", "-Xcc",
269+
"-fmodule-file=\(clangModulePath.file.description)")
270+
commandLine.appendFlags("-Xcc", "-Xclang", "-Xcc",
271+
"-fmodule-map-file=\(clangModuleMapPath.file.description)")
272+
inputs.append(clangModulePath)
273+
inputs.append(clangModuleMapPath)
274+
}
257275
}
258276

259277
/// Add a specific module dependency as an input and a corresponding command
260278
/// line flag. Dispatches to clang and swift-specific variants.
261-
mutating private func addModuleDependencies(moduleId: ModuleDependencyId,
262-
pcmArgs: [String],
263-
inputs: inout [TypedVirtualPath],
264-
commandLine: inout [Job.ArgTemplate],
279+
mutating private func addModuleDependencies(moduleId: ModuleDependencyId, pcmArgs: [String],
280+
clangDependencyArtifacts: inout [ClangModuleArtifactInfo],
265281
swiftDependencyArtifacts: inout [SwiftModuleArtifactInfo]
266282
) throws {
267283
for dependencyId in try dependencyGraph.moduleInfo(of: moduleId).directDependencies {
268284
switch dependencyId {
269285
case .swift:
270286
try addSwiftModuleDependency(moduleId: moduleId, dependencyId: dependencyId,
271-
pcmArgs: pcmArgs, inputs: &inputs, commandLine: &commandLine,
287+
pcmArgs: pcmArgs,
288+
clangDependencyArtifacts: &clangDependencyArtifacts,
272289
swiftDependencyArtifacts: &swiftDependencyArtifacts)
273290
case .clang:
274291
try addClangModuleDependency(moduleId: moduleId, dependencyId: dependencyId,
275-
pcmArgs: pcmArgs, inputs: &inputs, commandLine: &commandLine,
292+
pcmArgs: pcmArgs,
293+
clangDependencyArtifacts: &clangDependencyArtifacts,
276294
swiftDependencyArtifacts: &swiftDependencyArtifacts)
277295
}
278296
}
@@ -285,8 +303,7 @@ public struct ExplicitModuleBuildHandler {
285303
mutating private func addSwiftModuleDependency(moduleId: ModuleDependencyId,
286304
dependencyId: ModuleDependencyId,
287305
pcmArgs: [String],
288-
inputs: inout [TypedVirtualPath],
289-
commandLine: inout [Job.ArgTemplate],
306+
clangDependencyArtifacts: inout [ClangModuleArtifactInfo],
290307
swiftDependencyArtifacts: inout [SwiftModuleArtifactInfo]
291308
) throws {
292309
// Generate a build job for the dependency module, if not already generated
@@ -308,7 +325,7 @@ public struct ExplicitModuleBuildHandler {
308325

309326
// Process all transitive dependencies as direct
310327
try addModuleDependencies(moduleId: dependencyId, pcmArgs: pcmArgs,
311-
inputs: &inputs, commandLine: &commandLine,
328+
clangDependencyArtifacts: &clangDependencyArtifacts,
312329
swiftDependencyArtifacts: &swiftDependencyArtifacts)
313330
}
314331

@@ -319,8 +336,7 @@ public struct ExplicitModuleBuildHandler {
319336
mutating private func addClangModuleDependency(moduleId: ModuleDependencyId,
320337
dependencyId: ModuleDependencyId,
321338
pcmArgs: [String],
322-
inputs: inout [TypedVirtualPath],
323-
commandLine: inout [Job.ArgTemplate],
339+
clangDependencyArtifacts: inout [ClangModuleArtifactInfo],
324340
swiftDependencyArtifacts: inout [SwiftModuleArtifactInfo]
325341
) throws {
326342
// Generate a build job for the dependency module at the given target, if not already generated
@@ -333,21 +349,17 @@ public struct ExplicitModuleBuildHandler {
333349
let dependencyInfo = try dependencyGraph.moduleInfo(of: dependencyId)
334350
let dependencyClangModuleDetails = try dependencyGraph.clangModuleDetails(of: dependencyId)
335351
let clangModulePath =
336-
TypedVirtualPath(file: try ExplicitModuleBuildHandler.targetEncodedClangModuleFilePath(
337-
for: dependencyInfo, pcmArgs: pcmArgs), type: .pcm)
338-
let clangModuleMapPath =
339-
TypedVirtualPath(file: try VirtualPath(path: dependencyClangModuleDetails.moduleMapPath),
340-
type: .clangModuleMap)
341-
commandLine.appendFlags("-Xcc", "-Xclang", "-Xcc",
342-
"-fmodule-map-file=\(clangModuleMapPath.file.description)")
343-
commandLine.appendFlags("-Xcc", "-Xclang", "-Xcc",
344-
"-fmodule-file=\(clangModulePath.file.description)")
345-
inputs.append(clangModulePath)
346-
inputs.append(clangModuleMapPath)
352+
try ExplicitModuleBuildHandler.targetEncodedClangModuleFilePath(for: dependencyInfo,
353+
pcmArgs: pcmArgs)
354+
355+
// Collect the requried information about this module
356+
clangDependencyArtifacts.append(
357+
ClangModuleArtifactInfo(name: dependencyId.moduleName, modulePath: clangModulePath.description,
358+
moduleMapPath: dependencyClangModuleDetails.moduleMapPath))
347359

348360
// Process all transitive dependencies as direct
349361
try addModuleDependencies(moduleId: dependencyId, pcmArgs: pcmArgs,
350-
inputs: &inputs, commandLine: &commandLine,
362+
clangDependencyArtifacts: &clangDependencyArtifacts,
351363
swiftDependencyArtifacts: &swiftDependencyArtifacts)
352364
}
353365
}

Sources/SwiftDriver/Explicit Module Builds/SwiftModuleArtifacts.swift renamed to Sources/SwiftDriver/Explicit Module Builds/ModuleArtifacts.swift

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,3 +33,22 @@ public struct SwiftModuleArtifactInfo: Codable {
3333
self.sourceInfoPath = sourceInfoPath
3434
}
3535
}
36+
37+
/// Describes a given Clang module's pre-built module artifacts:
38+
/// - Clang Module (name)
39+
/// - Clang Module (PCM) Path
40+
/// - Clang Module Map Path
41+
public struct ClangModuleArtifactInfo {
42+
/// The module's name
43+
public let moduleName: String
44+
/// The path for the module's .pcm file
45+
public let modulePath: String
46+
/// The path for this module's .modulemap file
47+
public let moduleMapPath: String
48+
49+
init(name: String, modulePath: String, moduleMapPath: String) {
50+
self.moduleName = name
51+
self.modulePath = modulePath
52+
self.moduleMapPath = moduleMapPath
53+
}
54+
}

0 commit comments

Comments
 (0)