Skip to content

Commit 244f99c

Browse files
authored
Use correct FileSystem in the PIF builder for Swift Build (#8574)
### Motivation: Ensure the PIF builder follows the same FileSystem as the remaining code in the SwiftBuildSupport target. ### Modifications: Keep around a file system reference in PackagePIFBuilder and use that across the PIF builder.
1 parent 02436ea commit 244f99c

File tree

6 files changed

+30
-19
lines changed

6 files changed

+30
-19
lines changed

Sources/SwiftBuildSupport/PIFBuilder.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ public final class PIFBuilder {
110110
encoder.userInfo[.encodeForSwiftBuild] = true
111111
}
112112

113-
let topLevelObject = try self.construct(buildParameters: buildParameters)
113+
let topLevelObject = try self.constructPIF(buildParameters: buildParameters)
114114

115115
// Sign the PIF objects before encoding it for Swift Build.
116116
try PIF.sign(workspace: topLevelObject.workspace)
@@ -139,7 +139,7 @@ public final class PIFBuilder {
139139
private var cachedPIF: PIF.TopLevelObject?
140140

141141
/// Constructs a `PIF.TopLevelObject` representing the package graph.
142-
private func construct(buildParameters: BuildParameters) throws -> PIF.TopLevelObject {
142+
private func constructPIF(buildParameters: BuildParameters) throws -> PIF.TopLevelObject {
143143
try memoize(to: &self.cachedPIF) {
144144
guard let rootPackage = self.graph.rootPackages.only else {
145145
if self.graph.rootPackages.isEmpty {
@@ -164,6 +164,7 @@ public final class PIFBuilder {
164164
buildToolPluginResultsByTargetName: [:],
165165
createDylibForDynamicProducts: self.parameters.shouldCreateDylibForDynamicProducts,
166166
packageDisplayVersion: package.manifest.displayName,
167+
fileSystem: self.fileSystem,
167168
observabilityScope: self.observabilityScope
168169
)
169170

Sources/SwiftBuildSupport/PackagePIFBuilder+Helpers.swift

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,16 +12,16 @@
1212

1313
import Foundation
1414

15+
import protocol TSCBasic.FileSystem
1516
import struct TSCUtility.Version
1617

1718
import struct Basics.AbsolutePath
1819
import struct Basics.Diagnostic
19-
import let Basics.localFileSystem
2020
import struct Basics.ObservabilityMetadata
21-
import class Basics.ObservabilityScope
22-
import class Basics.ObservabilitySystem
2321
import struct Basics.RelativePath
2422
import struct Basics.SourceControlURL
23+
import class Basics.ObservabilityScope
24+
import class Basics.ObservabilitySystem
2525
import class Basics.ThreadSafeArrayStore
2626

2727
import enum PackageModel.BuildConfiguration
@@ -440,13 +440,13 @@ extension PackageGraph.ResolvedModule {
440440
}
441441

442442
/// Relative path of the module-map file, if any (*only* applies to C-language modules).
443-
var moduleMapFileRelativePath: RelativePath? {
443+
func moduleMapFileRelativePath(fileSystem: FileSystem) -> RelativePath? {
444444
guard let clangModule = self.underlying as? ClangModule else { return nil }
445445
let moduleMapFileAbsolutePath = clangModule.moduleMapPath
446446

447447
// Check whether there is actually a modulemap at the specified path.
448448
// FIXME: Feels wrong to do file system access at this level —— instead, libSwiftPM's TargetBuilder should do that?
449-
guard localFileSystem.isFile(moduleMapFileAbsolutePath) else { return nil }
449+
guard fileSystem.isFile(moduleMapFileAbsolutePath) else { return nil }
450450

451451
let moduleMapFileRelativePath = moduleMapFileAbsolutePath.relative(to: clangModule.sources.root)
452452
return try! RelativePath(validating: moduleMapFileRelativePath.pathString)
@@ -612,6 +612,7 @@ extension SystemLibraryModule {
612612
/// Returns pkgConfig result for a system library target.
613613
func pkgConfig(
614614
package: PackageGraph.ResolvedPackage,
615+
fileSystem: FileSystem,
615616
observabilityScope: ObservabilityScope
616617
) throws -> (cFlags: [String], libs: [String]) {
617618
let diagnostics = ThreadSafeArrayStore<Basics.Diagnostic>()
@@ -651,7 +652,7 @@ extension SystemLibraryModule {
651652
for: self,
652653
pkgConfigDirectories: [],
653654
brewPrefix: brewPrefix,
654-
fileSystem: localFileSystem,
655+
fileSystem: fileSystem,
655656
observabilityScope: pkgConfigParsingScope
656657
)
657658
guard let pkgConfigResult else { return emptyPkgConfig }

Sources/SwiftBuildSupport/PackagePIFBuilder+Plugins.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,10 @@
1212

1313
import Foundation
1414

15-
import struct Basics.AbsolutePath
16-
import let Basics.localFileSystem
15+
import protocol TSCBasic.FileSystem
16+
1717
import enum Basics.Sandbox
18+
import struct Basics.AbsolutePath
1819
import struct Basics.SourceControlURL
1920

2021
#if canImport(SwiftBuild)
@@ -123,10 +124,10 @@ extension PackagePIFBuilder {
123124
}
124125

125126
/// Applies the sandbox profile to the given command line, and return the modified command line.
126-
public func apply(to command: [String]) throws -> [String] {
127+
public func apply(to command: [String], fileSystem: FileSystem) throws -> [String] {
127128
try Sandbox.apply(
128129
command: command,
129-
fileSystem: localFileSystem,
130+
fileSystem: fileSystem,
130131
strictness: self.strictness,
131132
writableDirectories: self.writableDirectories,
132133
readOnlyDirectories: self.readOnlyDirectories

Sources/SwiftBuildSupport/PackagePIFBuilder.swift

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,20 +12,22 @@
1212

1313
import Foundation
1414

15+
import protocol TSCBasic.FileSystem
16+
1517
import struct Basics.AbsolutePath
1618
import struct Basics.SourceControlURL
19+
import struct Basics.Diagnostic
20+
import struct Basics.ObservabilityMetadata
21+
import class Basics.ObservabilityScope
1722

1823
import class PackageModel.Manifest
1924
import class PackageModel.Package
25+
import class PackageModel.Product
2026
import struct PackageModel.Platform
2127
import struct PackageModel.PlatformVersion
22-
import class PackageModel.Product
23-
import enum PackageModel.ProductType
2428
import struct PackageModel.Resource
29+
import enum PackageModel.ProductType
2530

26-
import struct Basics.Diagnostic
27-
import struct Basics.ObservabilityMetadata
28-
import class Basics.ObservabilityScope
2931
import struct PackageGraph.ModulesGraph
3032
import struct PackageGraph.ResolvedModule
3133
import struct PackageGraph.ResolvedPackage
@@ -169,6 +171,9 @@ public final class PackagePIFBuilder {
169171
/// Package display version, if any (i.e., it can be a version, branch or a git ref).
170172
let packageDisplayVersion: String?
171173

174+
/// The file system to read from.
175+
let fileSystem: FileSystem
176+
172177
/// Whether to suppress warnings from compilers, linkers, and other build tools for package dependencies.
173178
private var suppressWarningsForPackageDependencies: Bool {
174179
UserDefaults.standard.bool(forKey: "SuppressWarningsForPackageDependencies", defaultValue: true)
@@ -191,6 +196,7 @@ public final class PackagePIFBuilder {
191196
buildToolPluginResultsByTargetName: [String: BuildToolPluginInvocationResult],
192197
createDylibForDynamicProducts: Bool = false,
193198
packageDisplayVersion: String?,
199+
fileSystem: FileSystem,
194200
observabilityScope: ObservabilityScope
195201
) {
196202
self.package = resolvedPackage
@@ -200,6 +206,7 @@ public final class PackagePIFBuilder {
200206
self.buildToolPluginResultsByTargetName = buildToolPluginResultsByTargetName
201207
self.createDylibForDynamicProducts = createDylibForDynamicProducts
202208
self.packageDisplayVersion = packageDisplayVersion
209+
self.fileSystem = fileSystem
203210
self.observabilityScope = observabilityScope
204211
}
205212

Sources/SwiftBuildSupport/PackagePIFProjectBuilder+Modules.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -377,7 +377,7 @@ extension PackagePIFProjectBuilder {
377377

378378
// We only need to impart this to C clients.
379379
impartedSettings[.OTHER_CFLAGS] = ["-fmodule-map-file=\(moduleMapFile)", "$(inherited)"]
380-
} else if sourceModule.moduleMapFileRelativePath == nil {
380+
} else if sourceModule.moduleMapFileRelativePath(fileSystem: self.pifBuilder.fileSystem) == nil {
381381
// Otherwise, this is a C library module and we generate a modulemap if one is already not provided.
382382
if case .umbrellaHeader(let path) = sourceModule.moduleMapType {
383383
log(.debug, "\(package.name).\(sourceModule.name) generated umbrella header")
@@ -824,6 +824,7 @@ extension PackagePIFProjectBuilder {
824824
let settings: ProjectModel.BuildSettings = self.package.underlying.packageBaseBuildSettings
825825
let pkgConfig = try systemLibrary.pkgConfig(
826826
package: self.package,
827+
fileSystem: self.pifBuilder.fileSystem,
827828
observabilityScope: pifBuilder.observabilityScope
828829
)
829830

Sources/SwiftBuildSupport/PackagePIFProjectBuilder.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -460,7 +460,7 @@ struct PackagePIFProjectBuilder {
460460
) {
461461
var commandLine = [command.executable] + command.arguments
462462
if let sandbox = command.sandboxProfile, !pifBuilder.delegate.isPluginExecutionSandboxingDisabled {
463-
commandLine = try! sandbox.apply(to: commandLine)
463+
commandLine = try! sandbox.apply(to: commandLine, fileSystem: self.pifBuilder.fileSystem)
464464
}
465465

466466
self.project[keyPath: targetKeyPath].customTasks.append(

0 commit comments

Comments
 (0)