Skip to content

Commit ff18f35

Browse files
authored
Merge pull request #604 from nkcsgexi/foundation-fail
PrebuiltModuleGen: consider failures of Foundation and anything below critical
2 parents bad19ac + b37003c commit ff18f35

File tree

2 files changed

+17
-14
lines changed

2 files changed

+17
-14
lines changed

Sources/SwiftDriver/Jobs/PrebuiltModulesJob.swift

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,29 +12,28 @@
1212
import TSCBasic
1313
import SwiftOptions
1414

15-
func isIosMac(_ path: TypedVirtualPath) -> Bool {
15+
func isIosMac(_ path: VirtualPath) -> Bool {
1616
// Infer macabi interfaces by the file name.
1717
// FIXME: more robust way to do this.
18-
return path.file.basenameWithoutExt.contains("macabi")
18+
return path.basenameWithoutExt.contains("macabi")
1919
}
2020

2121
public class PrebuitModuleGenerationDelegate: JobExecutionDelegate {
2222
var failingModules = Set<String>()
23-
var succeededJobs: [Job] = []
2423
var commandMap: [Int: String] = [:]
2524
let diagnosticsEngine: DiagnosticsEngine
2625
let verbose: Bool
27-
public init(_ diagnosticsEngine: DiagnosticsEngine, _ verbose: Bool) {
26+
var failingCriticalOutputs: Set<VirtualPath>
27+
public init(_ jobs: [Job], _ diagnosticsEngine: DiagnosticsEngine, _ verbose: Bool) {
2828
self.diagnosticsEngine = diagnosticsEngine
2929
self.verbose = verbose
30+
self.failingCriticalOutputs = Set<VirtualPath>(jobs.compactMap(PrebuitModuleGenerationDelegate.getCriticalOutput))
3031
}
3132

3233
/// Dangling jobs are macabi-only modules. We should run those jobs if foundation
3334
/// is built successfully for macabi.
3435
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)
3837
}
3938
func printJobInfo(_ job: Job, _ start: Bool) {
4039
guard verbose else {
@@ -54,21 +53,25 @@ public class PrebuitModuleGenerationDelegate: JobExecutionDelegate {
5453
}
5554
}
5655

56+
static func getCriticalOutput(_ job: Job) -> VirtualPath? {
57+
return job.moduleName == "Foundation" ? job.outputs[0].file : nil
58+
}
59+
5760
public func jobStarted(job: Job, arguments: [String], pid: Int) {
5861
commandMap[pid] = arguments.reduce("") { return $0 + " " + $1 }
5962
printJobInfo(job, true)
6063
}
6164

62-
public var hasStdlibFailure: Bool {
63-
return failingModules.contains("Swift") || failingModules.contains("_Concurrency")
65+
public var hasCriticalFailure: Bool {
66+
return !failingCriticalOutputs.isEmpty
6467
}
6568

6669
public func jobFinished(job: Job, result: ProcessResult, pid: Int) {
6770
switch result.exitStatus {
6871
case .terminated(code: let code):
6972
if code == 0 {
7073
printJobInfo(job, false)
71-
succeededJobs.append(job)
74+
failingCriticalOutputs.remove(job.outputs[0].file)
7275
} else {
7376
failingModules.insert(job.moduleName)
7477
let result: String = try! result.utf8stderrOutput()
@@ -254,7 +257,7 @@ extension Driver {
254257
commandLine.appendFlag(.parseStdlib)
255258
}
256259
// Add macabi-specific search path.
257-
if isIosMac(inputPath.path) {
260+
if isIosMac(inputPath.path.file) {
258261
commandLine.appendFlag(.Fsystem)
259262
commandLine.append(.path(iosMacFrameworksSearchPath))
260263
}

Sources/swift-build-sdk-interfaces/main.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -107,13 +107,13 @@ do {
107107
executor: executor,
108108
compilerExecutableDir: swiftcPath.parentDirectory)
109109
let (jobs, danglingJobs) = try driver.generatePrebuitModuleGenerationJobs(with: inputMap, into: outputDir, exhaustive: !coreMode)
110-
let delegate = PrebuitModuleGenerationDelegate(diagnosticsEngine, verbose)
110+
let delegate = PrebuitModuleGenerationDelegate(jobs, diagnosticsEngine, verbose)
111111
do {
112112
try executor.execute(workload: DriverExecutorWorkload.init(jobs, nil, continueBuildingAfterErrors: true),
113113
delegate: delegate, numParallelJobs: 128)
114114
} catch {
115-
// Only fail the process if stdlib failed
116-
if delegate.hasStdlibFailure {
115+
// Only fail when critical failures happened.
116+
if delegate.hasCriticalFailure {
117117
exit(1)
118118
}
119119
}

0 commit comments

Comments
 (0)