@@ -206,6 +206,7 @@ extension LLBuildManifestBuilder {
206
206
if buildParameters. useExplicitModuleBuild {
207
207
commandLine. append ( " -experimental-explicit-module-build " )
208
208
}
209
+
209
210
var driver = try Driver ( args: commandLine, fileSystem: target. fs)
210
211
let jobs = try driver. planBuild ( )
211
212
let resolver = try ArgsResolver ( fileSystem: target. fs)
@@ -218,22 +219,36 @@ extension LLBuildManifestBuilder {
218
219
let jobInputs = job. inputs. map { $0. resolveToNode ( ) }
219
220
let jobOutputs = job. outputs. map { $0. resolveToNode ( ) }
220
221
222
+ // Add target dependencies as inputs to the main module build command.
223
+ //
224
+ // Jobs for a target's intermediate build artifacts, such as PCMs or
225
+ // modules built from a .swiftinterface, do not have a
226
+ // dependency on cross-target build products. If multiple targets share
227
+ // common intermediate dependency modules, such dependencies can lead
228
+ // to cycles in the resulting manifest.
229
+ var manifestNodeInputs : [ Node ] = [ ]
230
+ if buildParameters. useExplicitModuleBuild && !driver. isExplicitMainModuleJob ( job: job) {
231
+ manifestNodeInputs = jobInputs
232
+ } else {
233
+ manifestNodeInputs = ( inputs + jobInputs) . uniqued ( )
234
+ }
235
+
221
236
let moduleName = target. target. c99name
222
237
let description = job. description
223
238
if job. kind. isSwiftFrontend {
224
239
manifest. addSwiftFrontendCmd (
225
240
name: jobOutputs. first!. name,
226
241
moduleName: moduleName,
227
242
description: description,
228
- inputs: ( inputs + jobInputs ) . uniqued ( ) ,
243
+ inputs: manifestNodeInputs ,
229
244
outputs: jobOutputs,
230
245
args: arguments
231
246
)
232
247
} else {
233
248
manifest. addShellCmd (
234
249
name: jobOutputs. first!. name,
235
250
description: description,
236
- inputs: ( inputs + jobInputs ) . uniqued ( ) ,
251
+ inputs: manifestNodeInputs ,
237
252
outputs: jobOutputs,
238
253
args: arguments
239
254
)
0 commit comments