Skip to content

Commit b821567

Browse files
committed
cache DriverSupport capabilities across targets
motivation: DriverSupport capabilities require shelling, which was called for every target, while it can be cached across them motivation: * reuse DriverSupport across targets * plumb DriverSupport from SwiftTool all the way to the build system
1 parent a9cbf5c commit b821567

File tree

9 files changed

+76
-9
lines changed

9 files changed

+76
-9
lines changed

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -518,6 +518,7 @@ let package = Package(
518518
name: "SPMTestSupport",
519519
dependencies: [
520520
"Basics",
521+
"Build",
521522
"PackageFingerprint",
522523
"PackageGraph",
523524
"PackageLoading",

Sources/Build/BuildDescription/SwiftTargetBuildDescription.swift

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public final class SwiftTargetBuildDescription {
5555
/// These are the resource files derived from plugins.
5656
private var pluginDerivedResources: [Resource]
5757

58-
private let driverSupport = DriverSupport()
58+
private let driverSupport: DriverSupport
5959

6060
/// Path to the bundle generated for this module (if any).
6161
var bundlePath: AbsolutePath? {
@@ -249,12 +249,14 @@ public final class SwiftTargetBuildDescription {
249249
requiredMacroProducts: [ResolvedProduct] = [],
250250
testTargetRole: TestTargetRole? = nil,
251251
shouldGenerateTestObservation: Bool = false,
252+
driverSupport: DriverSupport,
252253
fileSystem: FileSystem,
253254
observabilityScope: ObservabilityScope
254255
) throws {
255256
guard target.underlyingTarget is SwiftTarget else {
256257
throw InternalError("underlying target type mismatch \(target)")
257258
}
259+
258260
self.package = package
259261
self.target = target
260262
self.toolsVersion = toolsVersion
@@ -267,13 +269,15 @@ public final class SwiftTargetBuildDescription {
267269
} else {
268270
self.testTargetRole = nil
269271
}
270-
self.fileSystem = fileSystem
272+
271273
self.tempsPath = buildParameters.buildPath.appending(component: target.c99name + ".build")
272274
self.derivedSources = Sources(paths: [], root: self.tempsPath.appending("DerivedSources"))
273275
self.buildToolPluginInvocationResults = buildToolPluginInvocationResults
274276
self.prebuildCommandResults = prebuildCommandResults
275277
self.requiredMacroProducts = requiredMacroProducts
276278
self.shouldGenerateTestObservation = shouldGenerateTestObservation
279+
self.driverSupport = driverSupport
280+
self.fileSystem = fileSystem
277281
self.observabilityScope = observabilityScope
278282

279283
(self.pluginDerivedSources, self.pluginDerivedResources) = SharedTargetBuildDescription.computePluginGeneratedFiles(

Sources/Build/BuildOperation.swift

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
101101
/// Alternative path to search for pkg-config `.pc` files.
102102
private let pkgConfigDirectories: [AbsolutePath]
103103

104-
private let driverSupport = DriverSupport()
104+
private let driverSupport: DriverSupport
105105

106106
public init(
107107
buildParameters: BuildParameters,
@@ -112,6 +112,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
112112
pkgConfigDirectories: [AbsolutePath],
113113
outputStream: OutputByteStream,
114114
logLevel: Basics.Diagnostic.Severity,
115+
driverSupport: DriverSupport,
115116
fileSystem: Basics.FileSystem,
116117
observabilityScope: ObservabilityScope
117118
) {
@@ -127,6 +128,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
127128
self.pkgConfigDirectories = pkgConfigDirectories
128129
self.outputStream = outputStream
129130
self.logLevel = logLevel
131+
self.driverSupport = driverSupport
130132
self.fileSystem = fileSystem
131133
self.observabilityScope = observabilityScope.makeChildScope(description: "Build Operation")
132134
}
@@ -439,6 +441,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
439441
pkgConfigDirectories: self.pkgConfigDirectories,
440442
outputStream: self.outputStream,
441443
logLevel: self.logLevel,
444+
driverSupport: self.driverSupport,
442445
fileSystem: self.fileSystem,
443446
observabilityScope: self.observabilityScope
444447
)
@@ -533,6 +536,7 @@ public final class BuildOperation: PackageStructureDelegate, SPMBuildCore.BuildS
533536
additionalFileRules: additionalFileRules,
534537
buildToolPluginInvocationResults: buildToolPluginInvocationResults,
535538
prebuildCommandResults: prebuildCommandResults,
539+
driverSupport: self.driverSupport,
536540
fileSystem: self.fileSystem,
537541
observabilityScope: self.observabilityScope
538542
)

Sources/Build/BuildPlan/BuildPlan+Test.swift

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,17 @@ import class PackageModel.Target
2424
import struct SPMBuildCore.BuildParameters
2525
import protocol TSCBasic.FileSystem
2626

27+
#if USE_IMPL_ONLY_IMPORTS
28+
@_implementationOnly import DriverSupport
29+
#else
30+
import DriverSupport
31+
#endif
32+
2733
extension BuildPlan {
2834
static func makeDerivedTestTargets(
2935
_ buildParameters: BuildParameters,
3036
_ graph: PackageGraph,
37+
_ driverSupport: DriverSupport,
3138
_ fileSystem: FileSystem,
3239
_ observabilityScope: ObservabilityScope
3340
) throws -> [(product: ResolvedProduct, discoveryTargetBuildDescription: SwiftTargetBuildDescription?, entryPointTargetBuildDescription: SwiftTargetBuildDescription)] {
@@ -95,6 +102,7 @@ extension BuildPlan {
95102
toolsVersion: toolsVersion,
96103
buildParameters: buildParameters,
97104
testTargetRole: .discovery,
105+
driverSupport: driverSupport,
98106
fileSystem: fileSystem,
99107
observabilityScope: observabilityScope
100108
)
@@ -128,6 +136,7 @@ extension BuildPlan {
128136
toolsVersion: toolsVersion,
129137
buildParameters: buildParameters,
130138
testTargetRole: .entryPoint(isSynthesized: true),
139+
driverSupport: driverSupport,
131140
fileSystem: fileSystem,
132141
observabilityScope: observabilityScope
133142
)
@@ -157,6 +166,7 @@ extension BuildPlan {
157166
toolsVersion: toolsVersion,
158167
buildParameters: buildParameters,
159168
testTargetRole: .entryPoint(isSynthesized: false),
169+
driverSupport: driverSupport,
160170
fileSystem: fileSystem,
161171
observabilityScope: observabilityScope
162172
)
@@ -175,6 +185,7 @@ extension BuildPlan {
175185
toolsVersion: toolsVersion,
176186
buildParameters: buildParameters,
177187
testTargetRole: .entryPoint(isSynthesized: false),
188+
driverSupport: driverSupport,
178189
fileSystem: fileSystem,
179190
observabilityScope: observabilityScope
180191
)

Sources/Build/BuildPlan/BuildPlan.swift

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,10 @@ import SPMBuildCore
2121

2222
#if USE_IMPL_ONLY_IMPORTS
2323
@_implementationOnly import SwiftDriver
24+
@_implementationOnly import DriverSupport
2425
#else
2526
import SwiftDriver
27+
import DriverSupport
2628
#endif
2729

2830
import enum TSCBasic.ProcessEnv
@@ -229,6 +231,9 @@ public class BuildPlan: SPMBuildCore.BuildPlan {
229231
/// Cache for tools information.
230232
var externalExecutablesCache = [BinaryTarget: [ExecutableInfo]]()
231233

234+
/// driver support utility
235+
let driverSupport: DriverSupport
236+
232237
/// The filesystem to operate on.
233238
let fileSystem: FileSystem
234239

@@ -239,16 +244,18 @@ public class BuildPlan: SPMBuildCore.BuildPlan {
239244
public init(
240245
buildParameters: BuildParameters,
241246
graph: PackageGraph,
242-
additionalFileRules: [FileRuleDescription] = [],
243-
buildToolPluginInvocationResults: [ResolvedTarget: [BuildToolPluginInvocationResult]] = [:],
244-
prebuildCommandResults: [ResolvedTarget: [PrebuildCommandResult]] = [:],
247+
additionalFileRules: [FileRuleDescription],
248+
buildToolPluginInvocationResults: [ResolvedTarget: [BuildToolPluginInvocationResult]],
249+
prebuildCommandResults: [ResolvedTarget: [PrebuildCommandResult]],
250+
driverSupport: DriverSupport,
245251
fileSystem: FileSystem,
246252
observabilityScope: ObservabilityScope
247253
) throws {
248254
self.buildParameters = buildParameters
249255
self.graph = graph
250256
self.buildToolPluginInvocationResults = buildToolPluginInvocationResults
251257
self.prebuildCommandResults = prebuildCommandResults
258+
self.driverSupport = driverSupport
252259
self.fileSystem = fileSystem
253260
self.observabilityScope = observabilityScope.makeChildScope(description: "Build Plan")
254261

@@ -331,6 +338,7 @@ public class BuildPlan: SPMBuildCore.BuildPlan {
331338
prebuildCommandResults: prebuildCommandResults[target] ?? [],
332339
requiredMacroProducts: requiredMacroProducts,
333340
shouldGenerateTestObservation: generateTestObservation,
341+
driverSupport: driverSupport,
334342
fileSystem: fileSystem,
335343
observabilityScope: observabilityScope)
336344
)
@@ -374,7 +382,13 @@ public class BuildPlan: SPMBuildCore.BuildPlan {
374382

375383
// Plan the derived test targets, if necessary.
376384
if buildParameters.testingParameters.testProductStyle.requiresAdditionalDerivedTestTargets {
377-
let derivedTestTargets = try Self.makeDerivedTestTargets(buildParameters, graph, self.fileSystem, self.observabilityScope)
385+
let derivedTestTargets = try Self.makeDerivedTestTargets(
386+
buildParameters,
387+
graph,
388+
self.driverSupport,
389+
self.fileSystem,
390+
self.observabilityScope
391+
)
378392
for item in derivedTestTargets {
379393
var derivedTestTargets = [item.entryPointTargetBuildDescription.target]
380394

Sources/CoreCommands/BuildSystemSupport.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ private struct NativeBuildSystemFactory: BuildSystemFactory {
4646
pkgConfigDirectories: self.swiftTool.options.locations.pkgConfigDirectories,
4747
outputStream: customOutputStream ?? self.swiftTool.outputStream,
4848
logLevel: customLogLevel ?? self.swiftTool.logLevel,
49+
driverSupport: self.swiftTool.driverSupport,
4950
fileSystem: self.swiftTool.fileSystem,
5051
observabilityScope: customObservabilityScope ?? self.swiftTool.observabilityScope)
5152
}

Sources/CoreCommands/SwiftTool.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ public final class SwiftTool {
240240
// should use sandbox on external subcommands
241241
public var shouldDisableSandbox: Bool
242242

243+
/// The driver support utility
244+
public let driverSupport = DriverSupport()
245+
243246
/// The file system in use
244247
public let fileSystem: FileSystem
245248

@@ -253,8 +256,6 @@ public final class SwiftTool {
253256

254257
fileprivate var buildSystemProvider: BuildSystemProvider?
255258

256-
private let driverSupport = DriverSupport()
257-
258259
/// Create an instance of this tool.
259260
///
260261
/// - parameter options: The command line options to be passed to this tool.

Sources/SPMTestSupport/misc.swift

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
import Basics
14+
import Build
1415
import struct Foundation.URL
1516
#if os(macOS)
1617
import class Foundation.Bundle
@@ -20,6 +21,7 @@ import PackageGraph
2021
import PackageLoading
2122
import PackageModel
2223
import SourceControl
24+
import struct SPMBuildCore.BuildParameters
2325
import TSCTestSupport
2426
import Workspace
2527
import func XCTest.XCTFail
@@ -407,3 +409,23 @@ extension InitPackage {
407409
)
408410
}
409411
}
412+
413+
extension BuildPlan {
414+
public convenience init(
415+
buildParameters: BuildParameters,
416+
graph: PackageGraph,
417+
fileSystem: FileSystem,
418+
observabilityScope: ObservabilityScope
419+
) throws {
420+
try self.init(
421+
buildParameters: buildParameters,
422+
graph: graph,
423+
additionalFileRules: [],
424+
buildToolPluginInvocationResults: [:],
425+
prebuildCommandResults: [:],
426+
driverSupport: .init(),
427+
fileSystem: fileSystem,
428+
observabilityScope: observabilityScope
429+
)
430+
}
431+
}

Sources/swift-bootstrap/main.swift

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,12 @@ import var TSCBasic.stdoutStream
2929
import enum TSCUtility.Diagnostics
3030
import struct TSCUtility.Version
3131

32+
#if USE_IMPL_ONLY_IMPORTS
33+
@_implementationOnly import DriverSupport
34+
#else
35+
import DriverSupport
36+
#endif
37+
3238
SwiftBootstrapBuildTool.main()
3339

3440
struct SwiftBootstrapBuildTool: ParsableCommand {
@@ -205,6 +211,7 @@ struct SwiftBootstrapBuildTool: ParsableCommand {
205211
let dependencyMapper: DependencyMapper
206212
let hostToolchain: UserToolchain
207213
let targetToolchain: UserToolchain
214+
let driverSupport: DriverSupport
208215
let fileSystem: FileSystem
209216
let observabilityScope: ObservabilityScope
210217
let logLevel: Basics.Diagnostic.Severity
@@ -223,6 +230,7 @@ struct SwiftBootstrapBuildTool: ParsableCommand {
223230
self.dependencyMapper = DefaultDependencyMapper(identityResolver: self.identityResolver)
224231
self.hostToolchain = try UserToolchain(swiftSDK: SwiftSDK.hostSwiftSDK(originalWorkingDirectory: cwd))
225232
self.targetToolchain = hostToolchain // TODO: support cross-compilation?
233+
self.driverSupport = DriverSupport()
226234
self.fileSystem = fileSystem
227235
self.observabilityScope = observabilityScope
228236
self.logLevel = logLevel
@@ -315,6 +323,7 @@ struct SwiftBootstrapBuildTool: ParsableCommand {
315323
pkgConfigDirectories: [],
316324
outputStream: TSCBasic.stdoutStream,
317325
logLevel: logLevel,
326+
driverSupport: self.driverSupport,
318327
fileSystem: self.fileSystem,
319328
observabilityScope: self.observabilityScope
320329
)

0 commit comments

Comments
 (0)