Skip to content

Commit 99b5573

Browse files
committed
FIRST COMMIT: Add SwiftBuild coverage SwiftBuildSupport
Refactor some tests, and 'enable' the code-coverage tests
1 parent ec2a626 commit 99b5573

File tree

6 files changed

+687
-458
lines changed

6 files changed

+687
-458
lines changed

Sources/Commands/SwiftTestCommand.swift

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -619,7 +619,6 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
619619
}
620620
}
621621
args += ["-o", productsBuildParameters.codeCovDataFile.pathString]
622-
623622
try await AsyncProcess.checkNonZeroExit(arguments: args)
624623
}
625624

@@ -659,7 +658,7 @@ public struct SwiftTestCommand: AsyncSwiftCommand {
659658
productsBuildParameters: productsBuildParameters,
660659
toolsBuildParameters: toolsBuildParameters,
661660
testProduct: self.options.sharedOptions.testProduct,
662-
traitConfiguration: .init(traitOptions: self.globalOptions.traits)
661+
traitConfiguration: .init(traitOptions: self.globalOptions.traits),
663662
)
664663
}
665664

@@ -847,7 +846,7 @@ extension SwiftTestCommand {
847846
productsBuildParameters: productsBuildParameters,
848847
toolsBuildParameters: toolsBuildParameters,
849848
testProduct: self.sharedOptions.testProduct,
850-
traitConfiguration: .init(traitOptions: self.globalOptions.traits)
849+
traitConfiguration: .init(traitOptions: self.globalOptions.traits),
851850
)
852851
}
853852
}
@@ -1555,7 +1554,7 @@ private func buildTestsIfNeeded(
15551554
productsBuildParameters: BuildParameters,
15561555
toolsBuildParameters: BuildParameters,
15571556
testProduct: String?,
1558-
traitConfiguration: TraitConfiguration
1557+
traitConfiguration: TraitConfiguration,
15591558
) async throws -> [BuiltTestProduct] {
15601559
let buildSystem = try await swiftCommandState.createBuildSystem(
15611560
productsBuildParameters: productsBuildParameters,
@@ -1567,8 +1566,8 @@ private func buildTestsIfNeeded(
15671566
} else {
15681567
.allIncludingTests
15691568
}
1570-
1571-
try await buildSystem.build(subset: subset, buildOutputs: [])
1569+
let buildOutputs: [BuildOutput] = productsBuildParameters.testingParameters.enableCodeCoverage ? [.coverage] : []
1570+
try await buildSystem.build(subset: subset, buildOutputs: buildOutputs)
15721571

15731572
// Find the test product.
15741573
let testProducts = await buildSystem.builtTestProducts

Sources/SPMBuildCore/BuildSystem/BuildSystem.swift

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ public enum BuildSubset {
4040
/// result for indication that the output was produced.
4141
public enum BuildOutput: Equatable {
4242
public static func == (lhs: BuildOutput, rhs: BuildOutput) -> Bool {
43-
switch lhs {
43+
switch lhs {
4444
case .symbolGraph(let leftOptions):
4545
switch rhs {
4646
case .symbolGraph(let rightOptions):
@@ -62,6 +62,13 @@ public enum BuildOutput: Equatable {
6262
default:
6363
return false
6464
}
65+
case .coverage:
66+
switch rhs {
67+
case .buildPlan:
68+
return true
69+
default:
70+
return false
71+
}
6572
}
6673
}
6774

@@ -93,6 +100,7 @@ public enum BuildOutput: Equatable {
93100
case symbolGraph(SymbolGraphOptions)
94101
case buildPlan
95102
case replArguments
103+
case coverage
96104
}
97105

98106
/// A protocol that represents a build system used by SwiftPM for all build operations. This allows factoring out the

Sources/SwiftBuildSupport/SwiftBuildSystem.swift

Lines changed: 34 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -351,11 +351,14 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
351351

352352
try await writePIF(buildParameters: buildParameters)
353353

354+
var shouldBuildWithCoverage = false
354355
var symbolGraphOptions: BuildOutput.SymbolGraphOptions?
355356
for output in buildOutputs {
356357
switch output {
357358
case .symbolGraph(let options):
358359
symbolGraphOptions = options
360+
case .coverage:
361+
shouldBuildWithCoverage = true
359362
default:
360363
continue
361364
}
@@ -365,13 +368,15 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
365368
pifTargetName: subset.pifTargetName,
366369
symbolGraphOptions: symbolGraphOptions,
367370
generateReplArguments: buildOutputs.contains(.replArguments),
371+
buildWithCoverage: shouldBuildWithCoverage,
368372
)
369373
}
370374

371375
private func startSWBuildOperation(
372376
pifTargetName: String,
373377
symbolGraphOptions: BuildOutput.SymbolGraphOptions?,
374-
generateReplArguments: Bool
378+
generateReplArguments: Bool,
379+
buildWithCoverage: Bool,
375380
) async throws -> BuildResult {
376381
let buildStartTime = ContinuousClock.Instant.now
377382
var replArguments: CLIArguments?
@@ -423,7 +428,13 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
423428
throw error
424429
}
425430

426-
let request = try await self.makeBuildRequest(session: session, configuredTargets: configuredTargets, derivedDataPath: derivedDataPath, symbolGraphOptions: symbolGraphOptions)
431+
let request = try await self.makeBuildRequest(
432+
session: session,
433+
configuredTargets: configuredTargets,
434+
derivedDataPath: derivedDataPath,
435+
symbolGraphOptions: symbolGraphOptions,
436+
buildWithCoverage: buildWithCoverage,
437+
)
427438

428439
struct BuildState {
429440
private var targetsByID: [Int: SwiftBuild.SwiftBuildMessage.TargetStartedInfo] = [:]
@@ -641,7 +652,11 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
641652
)
642653
}
643654

644-
private func makeBuildParameters(session: SWBBuildServiceSession, symbolGraphOptions: BuildOutput.SymbolGraphOptions?) async throws -> SwiftBuild.SWBBuildParameters {
655+
private func makeBuildParameters(
656+
session: SWBBuildServiceSession,
657+
symbolGraphOptions: BuildOutput.SymbolGraphOptions?,
658+
buildWithCoverage: Bool,
659+
) async throws -> SwiftBuild.SWBBuildParameters {
645660
// Generate the run destination parameters.
646661
let runDestination = makeRunDestination()
647662

@@ -666,6 +681,10 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
666681
settings["SWIFT_EXEC"] = buildParameters.toolchain.swiftCompilerPath.pathString
667682
}
668683

684+
if buildWithCoverage {
685+
settings["CLANG_COVERAGE_MAPPING"] = "YES"
686+
}
687+
669688
// FIXME: workaround for old Xcode installations such as what is in CI
670689
settings["LM_SKIP_METADATA_EXTRACTION"] = "YES"
671690
if let symbolGraphOptions {
@@ -781,9 +800,19 @@ public final class SwiftBuildSystem: SPMBuildCore.BuildSystem {
781800
return params
782801
}
783802

784-
public func makeBuildRequest(session: SWBBuildServiceSession, configuredTargets: [SWBTargetGUID], derivedDataPath: Basics.AbsolutePath, symbolGraphOptions: BuildOutput.SymbolGraphOptions?) async throws -> SWBBuildRequest {
803+
public func makeBuildRequest(
804+
session: SWBBuildServiceSession,
805+
configuredTargets: [SWBTargetGUID],
806+
derivedDataPath: Basics.AbsolutePath,
807+
symbolGraphOptions: BuildOutput.SymbolGraphOptions?,
808+
buildWithCoverage: Bool,
809+
) async throws -> SWBBuildRequest {
785810
var request = SWBBuildRequest()
786-
request.parameters = try await makeBuildParameters(session: session, symbolGraphOptions: symbolGraphOptions)
811+
request.parameters = try await makeBuildParameters(
812+
session: session,
813+
symbolGraphOptions: symbolGraphOptions,
814+
buildWithCoverage: buildWithCoverage,
815+
)
787816
request.configuredTargets = configuredTargets.map { SWBConfiguredTarget(guid: $0.rawValue, parameters: request.parameters) }
788817
request.useParallelTargets = true
789818
request.useImplicitDependencies = false

0 commit comments

Comments
 (0)