@@ -118,8 +118,11 @@ public final class JobExecutor {
118
118
/// The context required during job execution.
119
119
struct Context {
120
120
121
- /// This contains mapping from an output to the job that produces that output.
122
- let producerMap : [ VirtualPath : Job ]
121
+ /// This contains mapping from an output to the index(in the jobs array) of the job that produces that output.
122
+ let producerMap : [ VirtualPath : Int ]
123
+
124
+ /// All the jobs being executed.
125
+ let jobs : [ Job ]
123
126
124
127
/// The resolver for argument template.
125
128
let argsResolver : ArgsResolver
@@ -155,7 +158,8 @@ public final class JobExecutor {
155
158
argsResolver: ArgsResolver ,
156
159
env: [ String : String ] ,
157
160
fileSystem: FileSystem ,
158
- producerMap: [ VirtualPath : Job ] ,
161
+ producerMap: [ VirtualPath : Int ] ,
162
+ jobs: [ Job ] ,
159
163
executorDelegate: JobExecutorDelegate ,
160
164
jobQueue: OperationQueue ,
161
165
processSet: ProcessSet ? ,
@@ -164,6 +168,7 @@ public final class JobExecutor {
164
168
diagnosticsEngine: DiagnosticsEngine
165
169
) {
166
170
self . producerMap = producerMap
171
+ self . jobs = jobs
167
172
self . argsResolver = argsResolver
168
173
self . env = env
169
174
self . fileSystem = fileSystem
@@ -227,7 +232,7 @@ public final class JobExecutor {
227
232
let delegate = JobExecutorBuildDelegate ( context)
228
233
let engine = LLBuildEngine ( delegate: delegate)
229
234
230
- let result = try engine. build ( key: ExecuteAllJobsRule . RuleKey ( jobs : jobs ) )
235
+ let result = try engine. build ( key: ExecuteAllJobsRule . RuleKey ( ) )
231
236
232
237
// Throw the stub error the build didn't finish successfully.
233
238
if !result. success {
@@ -237,11 +242,11 @@ public final class JobExecutor {
237
242
238
243
/// Create the context required during the execution.
239
244
func createContext( _ jobs: [ Job ] , env: [ String : String ] , fileSystem: FileSystem ) -> Context {
240
- var producerMap : [ VirtualPath : Job ] = [ : ]
241
- for job in jobs {
245
+ var producerMap : [ VirtualPath : Int ] = [ : ]
246
+ for (index , job) in jobs. enumerated ( ) {
242
247
for output in job. outputs {
243
248
assert ( !producerMap. keys. contains ( output. file) , " multiple producers for output \( output) : \( job) \( producerMap [ output. file] !) " )
244
- producerMap [ output. file] = job
249
+ producerMap [ output. file] = index
245
250
}
246
251
}
247
252
@@ -254,6 +259,7 @@ public final class JobExecutor {
254
259
env: env,
255
260
fileSystem: fileSystem,
256
261
producerMap: producerMap,
262
+ jobs: jobs,
257
263
executorDelegate: executorDelegate,
258
264
jobQueue: jobQueue,
259
265
processSet: processSet,
@@ -275,7 +281,7 @@ struct JobExecutorBuildDelegate: LLBuildEngineDelegate {
275
281
func lookupRule( rule: String , key: Key ) -> Rule {
276
282
switch rule {
277
283
case ExecuteAllJobsRule . ruleName:
278
- return ExecuteAllJobsRule ( key, fileSystem: context. fileSystem)
284
+ return ExecuteAllJobsRule ( key, jobs : context . jobs , fileSystem: context. fileSystem)
279
285
case ExecuteJobRule . ruleName:
280
286
return ExecuteJobRule ( key, context: context)
281
287
default :
@@ -305,26 +311,26 @@ class ExecuteAllJobsRule: LLBuildRule {
305
311
struct RuleKey : LLBuildKey {
306
312
typealias BuildValue = DriverBuildValue
307
313
typealias BuildRule = ExecuteAllJobsRule
308
-
309
- let jobs : [ Job ]
310
314
}
311
315
312
316
override class var ruleName : String { " \( ExecuteAllJobsRule . self) " }
313
317
314
318
private let key : RuleKey
319
+ private let jobs : [ Job ]
315
320
316
321
/// True if any of the inputs had any error.
317
322
private var allInputsSucceeded : Bool = true
318
323
319
- init ( _ key: Key , fileSystem: FileSystem ) {
324
+ init ( _ key: Key , jobs : [ Job ] , fileSystem: FileSystem ) {
320
325
self . key = RuleKey ( key)
326
+ self . jobs = jobs
321
327
super. init ( fileSystem: fileSystem)
322
328
}
323
329
324
330
override func start( _ engine: LLTaskBuildEngine ) {
325
- for (idx , job ) in key . jobs. enumerated ( ) {
326
- let key = ExecuteJobRule . RuleKey ( job : job )
327
- engine. taskNeedsInput ( key, inputID: idx )
331
+ for index in jobs. indices {
332
+ let key = ExecuteJobRule . RuleKey ( index : index )
333
+ engine. taskNeedsInput ( key, inputID: index )
328
334
}
329
335
}
330
336
@@ -351,7 +357,7 @@ class ExecuteJobRule: LLBuildRule {
351
357
typealias BuildValue = DriverBuildValue
352
358
typealias BuildRule = ExecuteJobRule
353
359
354
- let job : Job
360
+ let index : Int
355
361
}
356
362
357
363
override class var ruleName : String { " \( ExecuteJobRule . self) " }
@@ -369,9 +375,9 @@ class ExecuteJobRule: LLBuildRule {
369
375
}
370
376
371
377
override func start( _ engine: LLTaskBuildEngine ) {
372
- for (idx, input) in key. job . inputs. enumerated ( ) {
373
- if let producingJob = context. producerMap [ input. file] {
374
- let key = ExecuteJobRule . RuleKey ( job : producingJob )
378
+ for (idx, input) in context . jobs [ key. index ] . inputs. enumerated ( ) {
379
+ if let producingJobIndex = context. producerMap [ input. file] {
380
+ let key = ExecuteJobRule . RuleKey ( index : producingJobIndex )
375
381
engine. taskNeedsInput ( key, inputID: idx)
376
382
}
377
383
}
@@ -404,7 +410,7 @@ class ExecuteJobRule: LLBuildRule {
404
410
private func executeJob( _ engine: LLTaskBuildEngine ) {
405
411
let context = self . context
406
412
let resolver = context. argsResolver
407
- let job = key. job
413
+ let job = context . jobs [ key. index ]
408
414
let env = context. env. merging ( job. extraEnvironment, uniquingKeysWith: { $1 } )
409
415
410
416
let value : DriverBuildValue
0 commit comments