@@ -25,7 +25,7 @@ import var TSCBasic.stdoutStream
25
25
26
26
import enum SwiftBuild. ProjectModel
27
27
28
- public func memoize< T> ( to cache: inout T ? , build: ( ) async throws -> T ) async rethrows -> T {
28
+ fileprivate func memoize< T> ( to cache: inout T ? , build: ( ) async throws -> T ) async rethrows -> T {
29
29
if let value = cache {
30
30
return value
31
31
} else {
@@ -36,7 +36,7 @@ public func memoize<T>(to cache: inout T?, build: () async throws -> T) async re
36
36
}
37
37
38
38
extension ModulesGraph {
39
- public static func computePluginGeneratedFiles(
39
+ fileprivate static func computePluginGeneratedFiles(
40
40
target: ResolvedModule ,
41
41
toolsVersion: ToolsVersion ,
42
42
additionalFileRules: [ FileRuleDescription ] ,
@@ -73,7 +73,7 @@ extension ModulesGraph {
73
73
observabilityScope: observabilityScope
74
74
)
75
75
let pluginDerivedResources = derivedResources
76
- derivedSources . forEach { absPath in
76
+ for absPath in derivedSources {
77
77
let relPath = absPath. relative ( to: pluginDerivedSources. root)
78
78
pluginDerivedSources. relativePaths. append ( relPath)
79
79
}
@@ -106,6 +106,18 @@ struct PIFBuilderParameters {
106
106
107
107
/// The Swift language versions supported by the SwiftBuild being used for the build.
108
108
let supportedSwiftVersions : [ SwiftLanguageVersion ]
109
+
110
+ /// The plugin script runner that will compile and run plugins.
111
+ let pluginScriptRunner : PluginScriptRunner
112
+
113
+ /// Disable the sandbox for the custom tasks
114
+ let disableSandbox : Bool
115
+
116
+ /// The working directory where the plugins should produce their results
117
+ let pluginWorkingDirectory : AbsolutePath
118
+
119
+ /// Additional rules for including a source or resource file in a target
120
+ let additionalFileRules : [ FileRuleDescription ]
109
121
}
110
122
111
123
/// PIF object builder for a package graph.
@@ -128,14 +140,6 @@ public final class PIFBuilder {
128
140
/// The file system to read from.
129
141
let fileSystem : FileSystem
130
142
131
- let pluginScriptRunner : PluginScriptRunner
132
-
133
- let pluginWorkingDirectory : AbsolutePath
134
-
135
- let pkgConfigDirectories : [ Basics . AbsolutePath ]
136
-
137
- let additionalFileRules : [ FileRuleDescription ]
138
-
139
143
/// Creates a `PIFBuilder` instance.
140
144
/// - Parameters:
141
145
/// - graph: The package graph to build from.
@@ -147,19 +151,11 @@ public final class PIFBuilder {
147
151
parameters: PIFBuilderParameters ,
148
152
fileSystem: FileSystem ,
149
153
observabilityScope: ObservabilityScope ,
150
- pluginScriptRunner: PluginScriptRunner ,
151
- pluginWorkingDirectory: AbsolutePath ,
152
- pkgConfigDirectories: [ Basics . AbsolutePath ] ,
153
- additionalFileRules: [ FileRuleDescription ]
154
154
) {
155
155
self . graph = graph
156
156
self . parameters = parameters
157
157
self . fileSystem = fileSystem
158
158
self . observabilityScope = observabilityScope. makeChildScope ( description: " PIF Builder " )
159
- self . pluginScriptRunner = pluginScriptRunner
160
- self . pluginWorkingDirectory = pluginWorkingDirectory
161
- self . pkgConfigDirectories = pkgConfigDirectories
162
- self . additionalFileRules = additionalFileRules
163
159
}
164
160
165
161
/// Generates the PIF representation.
@@ -232,8 +228,8 @@ public final class PIFBuilder {
232
228
233
229
/// Constructs a `PIF.TopLevelObject` representing the package graph.
234
230
private func constructPIF( buildParameters: BuildParameters ) async throws -> PIF . TopLevelObject {
235
- let pluginScriptRunner = self . pluginScriptRunner
236
- let outputDir = self . pluginWorkingDirectory. appending ( " outputs " )
231
+ let pluginScriptRunner = self . parameters . pluginScriptRunner
232
+ let outputDir = self . parameters . pluginWorkingDirectory. appending ( " outputs " )
237
233
238
234
let pluginsPerModule = graph. pluginsPerModule (
239
235
satisfying: buildParameters. buildEnvironment // .buildEnvironment(for: .host)
@@ -261,7 +257,7 @@ public final class PIFBuilder {
261
257
var packagesAndProjects : [ ( ResolvedPackage , ProjectModel . Project ) ] = [ ]
262
258
263
259
for package in sortedPackages {
264
- var buildtoolPluginResults : [ String : PackagePIFBuilder . BuildToolPluginInvocationResult ] = [ : ]
260
+ var buildToolPluginResultsByTargetName : [ String : PackagePIFBuilder . BuildToolPluginInvocationResult ] = [ : ]
265
261
266
262
for module in package . modules {
267
263
// Apply each build tool plugin used by the target in order,
@@ -308,7 +304,7 @@ public final class PIFBuilder {
308
304
( pluginDerivedSources, pluginDerivedResources) = try ModulesGraph . computePluginGeneratedFiles (
309
305
target: module,
310
306
toolsVersion: package . manifest. toolsVersion,
311
- additionalFileRules: self . additionalFileRules,
307
+ additionalFileRules: self . parameters . additionalFileRules,
312
308
buildParameters: buildParameters,
313
309
buildToolPluginInvocationResults: buildToolPluginResults,
314
310
prebuildCommandResults: [ ] ,
@@ -336,7 +332,7 @@ public final class PIFBuilder {
336
332
writableDirectories: writableDirectories,
337
333
readOnlyDirectories: readOnlyDirectories,
338
334
allowNetworkConnections: [ ] ,
339
- pkgConfigDirectories: self . pkgConfigDirectories,
335
+ pkgConfigDirectories: self . parameters . pkgConfigDirectories,
340
336
sdkRootPath: buildParameters. toolchain. sdkRootPath,
341
337
fileSystem: fileSystem,
342
338
modulesGraph: self . graph,
@@ -366,22 +362,33 @@ public final class PIFBuilder {
366
362
env [ key. rawValue] = value
367
363
}
368
364
365
+ let workingDir = buildCommand. configuration. workingDirectory
366
+
367
+ let writableDirectories : [ AbsolutePath ] = buildCommand. outputFiles
368
+
369
369
return PackagePIFBuilder . CustomBuildCommand (
370
370
displayName: buildCommand. configuration. displayName,
371
371
executable: buildCommand. configuration. executable. pathString,
372
372
arguments: buildCommand. configuration. arguments,
373
373
environment: env,
374
- workingDir: buildCommand . configuration . workingDirectory ,
374
+ workingDir: workingDir ,
375
375
inputPaths: buildCommand. inputFiles,
376
376
outputPaths: buildCommand. outputFiles. map ( \. pathString) ,
377
- sandboxProfile: nil
377
+ sandboxProfile:
378
+ self . parameters. disableSandbox ?
379
+ nil :
380
+ . init(
381
+ strictness: . default,
382
+ writableDirectories: writableDirectories,
383
+ readOnlyDirectories: buildCommand. inputFiles
384
+ )
378
385
)
379
386
} )
380
387
)
381
388
382
389
// Add a BuildToolPluginInvocationResult to the mapping.
383
390
buildToolPluginResults. append ( result2)
384
- buildtoolPluginResults [ module. name] = result2
391
+ buildToolPluginResultsByTargetName [ module. name] = result2
385
392
}
386
393
}
387
394
@@ -393,7 +400,7 @@ public final class PIFBuilder {
393
400
resolvedPackage: package ,
394
401
packageManifest: package . manifest,
395
402
delegate: packagePIFBuilderDelegate,
396
- buildToolPluginResultsByTargetName: buildtoolPluginResults ,
403
+ buildToolPluginResultsByTargetName: buildToolPluginResultsByTargetName ,
397
404
createDylibForDynamicProducts: self . parameters. shouldCreateDylibForDynamicProducts,
398
405
packageDisplayVersion: package . manifest. displayName,
399
406
fileSystem: self . fileSystem,
@@ -433,20 +440,24 @@ public final class PIFBuilder {
433
440
observabilityScope: ObservabilityScope ,
434
441
preservePIFModelStructure: Bool ,
435
442
pluginScriptRunner: PluginScriptRunner ,
443
+ disableSandbox: Bool ,
436
444
pluginWorkingDirectory: AbsolutePath ,
437
445
pkgConfigDirectories: [ Basics . AbsolutePath ] ,
438
446
additionalFileRules: [ FileRuleDescription ]
439
447
) async throws -> String {
440
- let parameters = PIFBuilderParameters ( buildParameters, supportedSwiftVersions: [ ] )
448
+ let parameters = PIFBuilderParameters (
449
+ buildParameters,
450
+ supportedSwiftVersions: [ ] ,
451
+ pluginScriptRunner: pluginScriptRunner,
452
+ disableSandbox: disableSandbox,
453
+ pluginWorkingDirectory: pluginWorkingDirectory,
454
+ additionalFileRules: additionalFileRules,
455
+ )
441
456
let builder = Self (
442
457
graph: packageGraph,
443
458
parameters: parameters,
444
459
fileSystem: fileSystem,
445
- observabilityScope: observabilityScope,
446
- pluginScriptRunner: pluginScriptRunner,
447
- pluginWorkingDirectory: pluginWorkingDirectory,
448
- pkgConfigDirectories: pkgConfigDirectories,
449
- additionalFileRules: additionalFileRules
460
+ observabilityScope: observabilityScope
450
461
)
451
462
return try await builder. generatePIF ( preservePIFModelStructure: preservePIFModelStructure, buildParameters: buildParameters)
452
463
}
@@ -696,7 +707,14 @@ extension PIFGenerationError: CustomStringConvertible {
696
707
// MARK: - Helpers
697
708
698
709
extension PIFBuilderParameters {
699
- init ( _ buildParameters: BuildParameters , supportedSwiftVersions: [ SwiftLanguageVersion ] ) {
710
+ init (
711
+ _ buildParameters: BuildParameters ,
712
+ supportedSwiftVersions: [ SwiftLanguageVersion ] ,
713
+ pluginScriptRunner: PluginScriptRunner ,
714
+ disableSandbox: Bool ,
715
+ pluginWorkingDirectory: AbsolutePath ,
716
+ additionalFileRules: [ FileRuleDescription ]
717
+ ) {
700
718
self . init (
701
719
triple: buildParameters. triple,
702
720
isPackageAccessModifierSupported: buildParameters. driverParameters. isPackageAccessModifierSupported,
@@ -705,7 +723,11 @@ extension PIFBuilderParameters {
705
723
toolchainLibDir: ( try ? buildParameters. toolchain. toolchainLibDir) ?? . root,
706
724
pkgConfigDirectories: buildParameters. pkgConfigDirectories,
707
725
sdkRootPath: buildParameters. toolchain. sdkRootPath,
708
- supportedSwiftVersions: supportedSwiftVersions
726
+ supportedSwiftVersions: supportedSwiftVersions,
727
+ pluginScriptRunner: pluginScriptRunner,
728
+ disableSandbox: disableSandbox,
729
+ pluginWorkingDirectory: pluginWorkingDirectory,
730
+ additionalFileRules: additionalFileRules,
709
731
)
710
732
}
711
733
}
0 commit comments