@@ -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
@@ -152,14 +155,16 @@ public final class JobExecutor {
152
155
argsResolver: ArgsResolver ,
153
156
env: [ String : String ] ,
154
157
fileSystem: FileSystem ,
155
- producerMap: [ VirtualPath : Job ] ,
158
+ producerMap: [ VirtualPath : Int ] ,
159
+ jobs: [ Job ] ,
156
160
executorDelegate: JobExecutorDelegate ,
157
161
jobQueue: OperationQueue ,
158
162
processSet: ProcessSet ? ,
159
163
forceResponseFiles: Bool ,
160
164
recordedInputModificationDates: [ TypedVirtualPath : Date ]
161
165
) {
162
166
self . producerMap = producerMap
167
+ self . jobs = jobs
163
168
self . argsResolver = argsResolver
164
169
self . env = env
165
170
self . fileSystem = fileSystem
@@ -217,7 +222,7 @@ public final class JobExecutor {
217
222
let delegate = JobExecutorBuildDelegate ( context)
218
223
let engine = LLBuildEngine ( delegate: delegate)
219
224
220
- let result = try engine. build ( key: ExecuteAllJobsRule . RuleKey ( jobs : jobs ) )
225
+ let result = try engine. build ( key: ExecuteAllJobsRule . RuleKey ( ) )
221
226
222
227
// Throw the stub error the build didn't finish successfully.
223
228
if !result. success {
@@ -227,11 +232,11 @@ public final class JobExecutor {
227
232
228
233
/// Create the context required during the execution.
229
234
func createContext( _ jobs: [ Job ] , env: [ String : String ] , fileSystem: FileSystem ) -> Context {
230
- var producerMap : [ VirtualPath : Job ] = [ : ]
231
- for job in jobs {
235
+ var producerMap : [ VirtualPath : Int ] = [ : ]
236
+ for (index , job) in jobs. enumerated ( ) {
232
237
for output in job. outputs {
233
238
assert ( !producerMap. keys. contains ( output. file) , " multiple producers for output \( output) : \( job) \( producerMap [ output. file] !) " )
234
- producerMap [ output. file] = job
239
+ producerMap [ output. file] = index
235
240
}
236
241
}
237
242
@@ -244,6 +249,7 @@ public final class JobExecutor {
244
249
env: env,
245
250
fileSystem: fileSystem,
246
251
producerMap: producerMap,
252
+ jobs: jobs,
247
253
executorDelegate: executorDelegate,
248
254
jobQueue: jobQueue,
249
255
processSet: processSet,
@@ -264,7 +270,7 @@ struct JobExecutorBuildDelegate: LLBuildEngineDelegate {
264
270
func lookupRule( rule: String , key: Key ) -> Rule {
265
271
switch rule {
266
272
case ExecuteAllJobsRule . ruleName:
267
- return ExecuteAllJobsRule ( key, fileSystem: context. fileSystem)
273
+ return ExecuteAllJobsRule ( key, jobs : context . jobs , fileSystem: context. fileSystem)
268
274
case ExecuteJobRule . ruleName:
269
275
return ExecuteJobRule ( key, context: context)
270
276
default :
@@ -294,26 +300,26 @@ class ExecuteAllJobsRule: LLBuildRule {
294
300
struct RuleKey : LLBuildKey {
295
301
typealias BuildValue = DriverBuildValue
296
302
typealias BuildRule = ExecuteAllJobsRule
297
-
298
- let jobs : [ Job ]
299
303
}
300
304
301
305
override class var ruleName : String { " \( ExecuteAllJobsRule . self) " }
302
306
303
307
private let key : RuleKey
308
+ private let jobs : [ Job ]
304
309
305
310
/// True if any of the inputs had any error.
306
311
private var allInputsSucceeded : Bool = true
307
312
308
- init ( _ key: Key , fileSystem: FileSystem ) {
313
+ init ( _ key: Key , jobs : [ Job ] , fileSystem: FileSystem ) {
309
314
self . key = RuleKey ( key)
315
+ self . jobs = jobs
310
316
super. init ( fileSystem: fileSystem)
311
317
}
312
318
313
319
override func start( _ engine: LLTaskBuildEngine ) {
314
- for (idx , job ) in key . jobs. enumerated ( ) {
315
- let key = ExecuteJobRule . RuleKey ( job : job )
316
- engine. taskNeedsInput ( key, inputID: idx )
320
+ for index in jobs. indices {
321
+ let key = ExecuteJobRule . RuleKey ( index : index )
322
+ engine. taskNeedsInput ( key, inputID: index )
317
323
}
318
324
}
319
325
@@ -340,7 +346,7 @@ class ExecuteJobRule: LLBuildRule {
340
346
typealias BuildValue = DriverBuildValue
341
347
typealias BuildRule = ExecuteJobRule
342
348
343
- let job : Job
349
+ let index : Int
344
350
}
345
351
346
352
override class var ruleName : String { " \( ExecuteJobRule . self) " }
@@ -358,9 +364,9 @@ class ExecuteJobRule: LLBuildRule {
358
364
}
359
365
360
366
override func start( _ engine: LLTaskBuildEngine ) {
361
- for (idx, input) in key. job . inputs. enumerated ( ) {
362
- if let producingJob = context. producerMap [ input. file] {
363
- let key = ExecuteJobRule . RuleKey ( job : producingJob )
367
+ for (idx, input) in context . jobs [ key. index ] . inputs. enumerated ( ) {
368
+ if let producingJobIndex = context. producerMap [ input. file] {
369
+ let key = ExecuteJobRule . RuleKey ( index : producingJobIndex )
364
370
engine. taskNeedsInput ( key, inputID: idx)
365
371
}
366
372
}
@@ -393,7 +399,7 @@ class ExecuteJobRule: LLBuildRule {
393
399
private func executeJob( _ engine: LLTaskBuildEngine ) {
394
400
let context = self . context
395
401
let resolver = context. argsResolver
396
- let job = key. job
402
+ let job = context . jobs [ key. index ]
397
403
let env = context. env. merging ( job. extraEnvironment, uniquingKeysWith: { $1 } )
398
404
399
405
let value : DriverBuildValue
0 commit comments