12
12
import TSCBasic
13
13
import SwiftOptions
14
14
15
- func isIosMac( _ path: TypedVirtualPath ) -> Bool {
15
+ func isIosMac( _ path: VirtualPath ) -> Bool {
16
16
// Infer macabi interfaces by the file name.
17
17
// FIXME: more robust way to do this.
18
- return path. file . basenameWithoutExt. contains ( " macabi " )
18
+ return path. basenameWithoutExt. contains ( " macabi " )
19
19
}
20
20
21
21
public class PrebuitModuleGenerationDelegate : JobExecutionDelegate {
22
22
var failingModules = Set < String > ( )
23
- var succeededJobs : [ Job ] = [ ]
24
23
var commandMap : [ Int : String ] = [ : ]
25
24
let diagnosticsEngine : DiagnosticsEngine
26
25
let verbose : Bool
27
- public init ( _ diagnosticsEngine: DiagnosticsEngine , _ verbose: Bool ) {
26
+ var failingCriticalOutputs : Set < VirtualPath >
27
+ public init ( _ jobs: [ Job ] , _ diagnosticsEngine: DiagnosticsEngine , _ verbose: Bool ) {
28
28
self . diagnosticsEngine = diagnosticsEngine
29
29
self . verbose = verbose
30
+ self . failingCriticalOutputs = Set < VirtualPath > ( jobs. compactMap ( PrebuitModuleGenerationDelegate . getCriticalOutput) )
30
31
}
31
32
32
33
/// Dangling jobs are macabi-only modules. We should run those jobs if foundation
33
34
/// is built successfully for macabi.
34
35
public var shouldRunDanglingJobs : Bool {
35
- return succeededJobs. contains { job in
36
- return isIosMac ( job. outputs [ 0 ] ) && job. moduleName == " Foundation "
37
- }
36
+ return !failingCriticalOutputs. contains ( where: isIosMac)
38
37
}
39
38
func printJobInfo( _ job: Job , _ start: Bool ) {
40
39
guard verbose else {
@@ -54,21 +53,25 @@ public class PrebuitModuleGenerationDelegate: JobExecutionDelegate {
54
53
}
55
54
}
56
55
56
+ static func getCriticalOutput( _ job: Job ) -> VirtualPath ? {
57
+ return job. moduleName == " Foundation " ? job. outputs [ 0 ] . file : nil
58
+ }
59
+
57
60
public func jobStarted( job: Job , arguments: [ String ] , pid: Int ) {
58
61
commandMap [ pid] = arguments. reduce ( " " ) { return $0 + " " + $1 }
59
62
printJobInfo ( job, true )
60
63
}
61
64
62
- public var hasStdlibFailure : Bool {
63
- return failingModules . contains ( " Swift " ) || failingModules . contains ( " _Concurrency " )
65
+ public var hasCriticalFailure : Bool {
66
+ return !failingCriticalOutputs . isEmpty
64
67
}
65
68
66
69
public func jobFinished( job: Job , result: ProcessResult , pid: Int ) {
67
70
switch result. exitStatus {
68
71
case . terminated( code: let code) :
69
72
if code == 0 {
70
73
printJobInfo ( job, false )
71
- succeededJobs . append ( job)
74
+ failingCriticalOutputs . remove ( job. outputs [ 0 ] . file )
72
75
} else {
73
76
failingModules. insert ( job. moduleName)
74
77
let result : String = try ! result. utf8stderrOutput ( )
@@ -254,7 +257,7 @@ extension Driver {
254
257
commandLine. appendFlag ( . parseStdlib)
255
258
}
256
259
// Add macabi-specific search path.
257
- if isIosMac ( inputPath. path) {
260
+ if isIosMac ( inputPath. path. file ) {
258
261
commandLine. appendFlag ( . Fsystem)
259
262
commandLine. append ( . path( iosMacFrameworksSearchPath) )
260
263
}
0 commit comments