@@ -312,8 +312,11 @@ extension LLBuildManifestBuilder {
312
312
}
313
313
let allPackageDependencies = try ! topologicalSort ( nodes, successors: { $0. dependencies } )
314
314
315
- // Collect all targets' dependency graphs
316
- var targetDepGraphMap : [ ResolvedTarget : InterModuleDependencyGraph ] = [ : ]
315
+ // All modules discovered so far as a part of this package manifest.
316
+ // This includes modules that correspond to the package's own targets, package dependency
317
+ // targets, and modules that are discovered as dependencies of the above in individual
318
+ // dependency scanning actions
319
+ var discoveredModulesMap : SwiftDriver . ModuleInfoMap = [ : ]
317
320
318
321
// Create commands for all target descriptions in the plan.
319
322
for dependency in allPackageDependencies. reversed ( ) {
@@ -341,7 +344,7 @@ extension LLBuildManifestBuilder {
341
344
switch description {
342
345
case . swift( let desc) :
343
346
try createExplicitSwiftTargetCompileCommand ( description: desc,
344
- targetDepGraphMap : & targetDepGraphMap )
347
+ discoveredModulesMap : & discoveredModulesMap )
345
348
case . clang( let desc) :
346
349
createClangCompileCommand ( desc)
347
350
}
@@ -350,7 +353,7 @@ extension LLBuildManifestBuilder {
350
353
351
354
private func createExplicitSwiftTargetCompileCommand(
352
355
description: SwiftTargetBuildDescription ,
353
- targetDepGraphMap : inout [ ResolvedTarget : InterModuleDependencyGraph ]
356
+ discoveredModulesMap : inout SwiftDriver . ModuleInfoMap
354
357
) throws {
355
358
// Inputs.
356
359
let inputs = computeSwiftCompileCmdInputs ( description)
@@ -362,92 +365,110 @@ extension LLBuildManifestBuilder {
362
365
363
366
// Commands.
364
367
try addExplicitBuildSwiftCmds ( description, inputs: inputs,
365
- targetDepGraphMap : & targetDepGraphMap )
368
+ discoveredModulesMap : & discoveredModulesMap )
366
369
367
370
addTargetCmd ( description, cmdOutputs: cmdOutputs)
368
371
addModuleWrapCmd ( description)
369
372
}
370
373
371
374
private func addExplicitBuildSwiftCmds(
372
375
_ targetDescription: SwiftTargetBuildDescription ,
373
- inputs: [ Node ] , targetDepGraphMap: inout [ ResolvedTarget : InterModuleDependencyGraph ]
376
+ inputs: [ Node ] ,
377
+ discoveredModulesMap: inout SwiftDriver . ModuleInfoMap
374
378
) throws {
375
379
// Pass the driver its external dependencies (target dependencies)
376
- var targetDependencyMap : SwiftDriver . ExternalDependencyArtifactMap = [ : ]
377
- collectTargetDependencyInfos ( for: targetDescription . target,
378
- targetDepGraphMap : targetDepGraphMap ,
379
- dependencyArtifactMap : & targetDependencyMap )
380
+ var dependencyModulePathMap : SwiftDriver . ExternalTargetModulePathMap = [ : ]
381
+ // Collect paths for target dependencies of this target (direct and transitive)
382
+ collectTargetDependencyModulePaths ( for : targetDescription . target ,
383
+ dependencyModulePathMap : & dependencyModulePathMap )
380
384
381
385
// Compute the set of frontend
382
386
// jobs needed to build this Swift target.
383
387
var commandLine = targetDescription. emitCommandLine ( ) ;
384
388
commandLine. append ( " -driver-use-frontend-path " )
385
389
commandLine. append ( buildParameters. toolchain. swiftCompiler. pathString)
386
390
commandLine. append ( " -experimental-explicit-module-build " )
387
- // FIXME: At some point SwiftPM should provide its own executor for
388
- // running jobs/launching processes during planning
389
391
let resolver = try ArgsResolver ( fileSystem: targetDescription. fs)
390
392
let executor = SPMSwiftDriverExecutor ( resolver: resolver,
391
393
fileSystem: targetDescription. fs,
392
394
env: ProcessEnv . vars)
393
395
var driver = try Driver ( args: commandLine, fileSystem: targetDescription. fs,
394
396
executor: executor,
395
- externalModuleDependencies : targetDependencyMap )
397
+ externalBuildArtifacts : ( dependencyModulePathMap , discoveredModulesMap ) )
396
398
397
399
let jobs = try driver. planBuild ( )
398
400
401
+ // Save the path to the target's module to be used by its dependents
399
402
// Save the dependency graph of this target to be used by its dependents
400
403
guard let dependencyGraph = driver. interModuleDependencyGraph else {
401
404
fatalError ( " Expected module dependency graph for target: \( targetDescription) " )
402
405
}
403
- targetDepGraphMap [ targetDescription. target] = dependencyGraph
406
+ try accumulateDiscoveredModules ( from: dependencyGraph,
407
+ discoveredModules: & discoveredModulesMap)
408
+
404
409
try addSwiftDriverJobs ( for: targetDescription, jobs: jobs, inputs: inputs, resolver: resolver,
405
410
isMainModule: { driver. isExplicitMainModuleJob ( job: $0) } )
406
411
}
407
412
413
+ private func accumulateDiscoveredModules(
414
+ from dependencyGraph: InterModuleDependencyGraph ,
415
+ discoveredModules: inout SwiftDriver . ModuleInfoMap
416
+ ) throws {
417
+ for (moduleId, moduleInfo) in dependencyGraph. modules {
418
+ switch moduleId {
419
+ case . swift:
420
+ discoveredModules [ moduleId] = moduleInfo
421
+ case . clang:
422
+ guard let existingModuleInfo = discoveredModules [ moduleId] else {
423
+ discoveredModules [ moduleId] = moduleInfo
424
+ break
425
+ }
426
+ // If this module *has* been seen before, merge the module infos to capture
427
+ // the super-set of so-far discovered dependencies of this module at various
428
+ // PCMArg scanning actions.
429
+ let combinedDependenciesInfo =
430
+ InterModuleDependencyGraph . mergeClangModuleInfoDependencies ( moduleInfo,
431
+ existingModuleInfo)
432
+ discoveredModules [ moduleId] = combinedDependenciesInfo
433
+ case . swiftPlaceholder:
434
+ fatalError ( " Unresolved placeholder dependencies at manifest build stage: \( moduleId) " )
435
+ }
436
+ }
437
+ }
438
+
408
439
/// Collect a map from all target dependencies of the specified target to the build planning artifacts for said dependency,
409
440
/// in the form of a path to a .swiftmodule file and the dependency's InterModuleDependencyGraph.
410
- private func collectTargetDependencyInfos( for target: ResolvedTarget ,
411
- targetDepGraphMap: [ ResolvedTarget : InterModuleDependencyGraph ] ,
412
- dependencyArtifactMap: inout SwiftDriver . ExternalDependencyArtifactMap
413
- ) {
441
+ private func collectTargetDependencyModulePaths(
442
+ for target: ResolvedTarget ,
443
+ dependencyModulePathMap: inout SwiftDriver . ExternalTargetModulePathMap ) {
414
444
for dependency in target. dependencies {
415
445
switch dependency {
416
446
case . product:
417
447
// Product dependencies are broken down into the targets that make them up.
418
448
let dependencyProduct = dependency. product!
419
449
for dependencyProductTarget in dependencyProduct. targets {
420
450
addTargetDependencyInfo ( for: dependencyProductTarget,
421
- targetDepGraphMap: targetDepGraphMap,
422
- dependencyArtifactMap: & dependencyArtifactMap)
451
+ dependencyModulePathMap: & dependencyModulePathMap)
423
452
424
453
}
425
454
case . target:
426
455
// Product dependencies are broken down into the targets that make them up.
427
456
let dependencyTarget = dependency. target!
428
457
addTargetDependencyInfo ( for: dependencyTarget,
429
- targetDepGraphMap: targetDepGraphMap,
430
- dependencyArtifactMap: & dependencyArtifactMap)
458
+ dependencyModulePathMap: & dependencyModulePathMap)
431
459
}
432
460
}
433
461
}
434
462
435
463
private func addTargetDependencyInfo( for target: ResolvedTarget ,
436
- targetDepGraphMap: [ ResolvedTarget : InterModuleDependencyGraph ] ,
437
- dependencyArtifactMap: inout SwiftDriver . ExternalDependencyArtifactMap ) {
464
+ dependencyModulePathMap: inout SwiftDriver . ExternalTargetModulePathMap ) {
438
465
guard case . swift( let dependencySwiftTargetDescription) = plan. targetMap [ target] else {
439
466
return
440
467
}
441
- guard let dependencyGraph = targetDepGraphMap [ target] else {
442
- fatalError ( " Expected dependency graph for target: \( target. description) " )
443
- }
444
- let dependencyModulePath = dependencySwiftTargetDescription. moduleOutputPath
445
- dependencyArtifactMap [ ModuleDependencyId . swiftPlaceholder ( target. c99name) ] =
446
- ( dependencyModulePath, dependencyGraph)
447
-
448
- collectTargetDependencyInfos ( for: target,
449
- targetDepGraphMap: targetDepGraphMap,
450
- dependencyArtifactMap: & dependencyArtifactMap)
468
+ dependencyModulePathMap [ ModuleDependencyId . swiftPlaceholder ( target. c99name) ] =
469
+ dependencySwiftTargetDescription. moduleOutputPath
470
+ collectTargetDependencyModulePaths ( for: target,
471
+ dependencyModulePathMap: & dependencyModulePathMap)
451
472
}
452
473
453
474
private func addSwiftCmdsEmitSwiftModuleSeparately(
0 commit comments