Skip to content

Commit 968bde4

Browse files
committed
Reproduce the issue with SWIFTPM_CUSTOM_BIN_DIR
1 parent 8112894 commit 968bde4

File tree

4 files changed

+32
-41
lines changed

4 files changed

+32
-41
lines changed

Sources/CoreCommands/SwiftCommandState.swift

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,8 @@ package final class SwiftCommandState {
302302
self.logLevel = options.logging.logLevel
303303
self.observabilityHandler = SwiftCommandObservabilityHandler(outputStream: outputStream, logLevel: self.logLevel)
304304
let observabilitySystem = ObservabilitySystem(self.observabilityHandler)
305-
self.observabilityScope = observabilitySystem.topScope
305+
let observabilityScope = observabilitySystem.topScope
306+
self.observabilityScope = observabilityScope
306307
self.shouldDisableSandbox = options.security.shouldDisableSandbox
307308
self.toolWorkspaceConfiguration = toolWorkspaceConfiguration
308309
self.workspaceDelegateProvider = workspaceDelegateProvider
@@ -355,6 +356,10 @@ package final class SwiftCommandState {
355356
explicitDirectory: options.locations.swiftSDKsDirectory
356357
)
357358

359+
self._hostToolchain = Result(catching: {
360+
try UserToolchain(swiftSDK: SwiftSDK.hostSwiftSDK(fileSystem: fileSystem))
361+
})
362+
358363
// set global process logging handler
359364
Process.loggingHandler = { self.observabilityScope.emit(debug: $0) }
360365
}
@@ -847,17 +852,7 @@ package final class SwiftCommandState {
847852
}()
848853

849854
/// Lazily compute the host toolchain used to compile the package description.
850-
private lazy var _hostToolchain: Result<UserToolchain, Swift.Error> = {
851-
return Result(catching: {
852-
try UserToolchain(
853-
swiftSDK: SwiftSDK.hostSwiftSDK(
854-
originalWorkingDirectory: self.originalWorkingDirectory,
855-
observabilityScope: self.observabilityScope
856-
),
857-
fileSystem: self.fileSystem
858-
)
859-
})
860-
}()
855+
private let _hostToolchain: Result<UserToolchain, Swift.Error>
861856

862857
private lazy var _manifestLoader: Result<ManifestLoader, Swift.Error> = {
863858
return Result(catching: {

Sources/PackageModel/SwiftSDKs/SwiftSDK.swift

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -480,14 +480,10 @@ public struct SwiftSDK: Equatable {
480480
}
481481

482482
/// Returns the bin directory for the host.
483-
///
484-
/// - Parameter originalWorkingDirectory: The working directory when the program was launched.
485483
private static func hostBinDir(
486-
fileSystem: FileSystem,
487-
originalWorkingDirectory: AbsolutePath? = nil
484+
fileSystem: FileSystem
488485
) throws -> AbsolutePath {
489-
let originalWorkingDirectory = originalWorkingDirectory ?? fileSystem.currentWorkingDirectory
490-
guard let cwd = originalWorkingDirectory else {
486+
guard let cwd = fileSystem.currentWorkingDirectory else {
491487
return try AbsolutePath(validating: CommandLine.arguments[0]).parentDirectory
492488
}
493489
return try AbsolutePath(validating: CommandLine.arguments[0], relativeTo: cwd).parentDirectory
@@ -500,27 +496,23 @@ public struct SwiftSDK: Equatable {
500496
originalWorkingDirectory: AbsolutePath? = nil,
501497
environment: [String: String] = ProcessEnv.vars
502498
) throws -> SwiftSDK {
503-
try self.hostSwiftSDK(binDir, originalWorkingDirectory: originalWorkingDirectory, environment: environment)
499+
try self.hostSwiftSDK(binDir, environment: environment)
504500
}
505501

506502
/// The Swift SDK for the host platform.
507503
public static func hostSwiftSDK(
508504
_ binDir: AbsolutePath? = nil,
509-
originalWorkingDirectory: AbsolutePath? = nil,
510505
environment: [String: String] = ProcessEnv.vars,
511-
observabilityScope: ObservabilityScope? = nil
506+
observabilityScope: ObservabilityScope? = nil,
507+
fileSystem: any FileSystem = localFileSystem
512508
) throws -> SwiftSDK {
513-
let originalWorkingDirectory = originalWorkingDirectory ?? localFileSystem.currentWorkingDirectory
514509
// Select the correct binDir.
515510
if ProcessEnv.block["SWIFTPM_CUSTOM_BINDIR"] != nil {
516511
print("SWIFTPM_CUSTOM_BINDIR was deprecated in favor of SWIFTPM_CUSTOM_BIN_DIR")
517512
}
518513
let customBinDir = (ProcessEnv.block["SWIFTPM_CUSTOM_BIN_DIR"] ?? ProcessEnv.block["SWIFTPM_CUSTOM_BINDIR"])
519514
.flatMap { try? AbsolutePath(validating: $0) }
520-
let binDir = try customBinDir ?? binDir ?? SwiftSDK.hostBinDir(
521-
fileSystem: localFileSystem,
522-
originalWorkingDirectory: originalWorkingDirectory
523-
)
515+
let binDir = try customBinDir ?? binDir ?? SwiftSDK.hostBinDir(fileSystem: fileSystem)
524516

525517
let sdkPath: AbsolutePath?
526518
#if os(macOS)

Sources/swift-bootstrap/main.swift

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -222,13 +222,9 @@ struct SwiftBootstrapBuildTool: ParsableCommand {
222222
]
223223

224224
init(fileSystem: FileSystem, observabilityScope: ObservabilityScope, logLevel: Basics.Diagnostic.Severity) throws {
225-
guard let cwd: AbsolutePath = fileSystem.currentWorkingDirectory else {
226-
throw ExitCode.failure
227-
}
228-
229225
self.identityResolver = DefaultIdentityResolver()
230226
self.dependencyMapper = DefaultDependencyMapper(identityResolver: self.identityResolver)
231-
self.hostToolchain = try UserToolchain(swiftSDK: SwiftSDK.hostSwiftSDK(originalWorkingDirectory: cwd))
227+
self.hostToolchain = try UserToolchain(swiftSDK: SwiftSDK.hostSwiftSDK(fileSystem: fileSystem))
232228
self.targetToolchain = hostToolchain // TODO: support cross-compilation?
233229
self.fileSystem = fileSystem
234230
self.observabilityScope = observabilityScope

Tests/CommandsTests/SwiftCommandStateTests.swift

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import CoreCommands
2121
import SPMTestSupport
2222
import XCTest
2323

24+
import enum TSCBasic.ProcessEnv
2425
import class TSCBasic.BufferedOutputByteStream
2526
import protocol TSCBasic.OutputByteStream
2627
import var TSCBasic.stderrStream
@@ -319,19 +320,25 @@ final class SwiftCommandStateTests: CommandsTestCase {
319320
}
320321

321322
func testToolchainArgument() throws {
323+
let hostBinDir = AbsolutePath("/swiftpm/bin")
324+
let hostSwiftcPath = hostBinDir.appending(components: ["swiftc"])
325+
326+
let customTargetToolchain = AbsolutePath("/path/to/toolchain")
327+
let targetSwiftcPath = customTargetToolchain.appending(components: ["usr", "bin" , "swiftc"])
328+
let targetArPath = customTargetToolchain.appending(components: ["usr", "bin", "llvm-ar"])
329+
322330
let fs = InMemoryFileSystem(emptyFiles: [
323331
"/Pkg/Sources/exe/main.swift",
324-
"/path/to/toolchain/usr/bin/swiftc",
325-
"/path/to/toolchain/usr/bin/llvm-ar",
332+
hostSwiftcPath.pathString,
333+
targetSwiftcPath.pathString,
334+
targetArPath.pathString
326335
])
327336

328-
let customTargetToolchain = AbsolutePath("/path/to/toolchain")
329-
try fs.createDirectory(customTargetToolchain, recursive: true)
330-
331-
let swiftcPath = customTargetToolchain.appending(components: ["usr", "bin" , "swiftc"])
332-
let arPath = customTargetToolchain.appending(components: ["usr", "bin", "llvm-ar"])
333-
try fs.updatePermissions(swiftcPath, isExecutable: true)
334-
try fs.updatePermissions(arPath, isExecutable: true)
337+
try ProcessEnv.setVar("SWIFTPM_CUSTOM_BIN_DIR", value: hostBinDir.pathString)
338+
339+
try fs.updatePermissions(hostSwiftcPath, isExecutable: true)
340+
try fs.updatePermissions(targetSwiftcPath, isExecutable: true)
341+
try fs.updatePermissions(targetArPath, isExecutable: true)
335342

336343
let observer = ObservabilitySystem.makeForTesting()
337344
let graph = try loadModulesGraph(
@@ -353,9 +360,10 @@ final class SwiftCommandStateTests: CommandsTestCase {
353360
]
354361
)
355362
let swiftCommandState = try SwiftCommandState.makeMockState(options: options, fileSystem: fs)
363+
XCTAssertEqual(swiftCommandState.originalWorkingDirectory, fs.currentWorkingDirectory)
356364
XCTAssertEqual(
357365
try swiftCommandState.getTargetToolchain().swiftCompilerPath,
358-
swiftcPath
366+
targetSwiftcPath
359367
)
360368
XCTAssertEqual(
361369
try swiftCommandState.getTargetToolchain().swiftSDK.toolset.knownTools[.swiftCompiler]?.path,

0 commit comments

Comments
 (0)