Skip to content

Commit 6939221

Browse files
authored
DriverSupport: fix swiftc path in DriverSupportUtils (#6208)
While launching `swiftc` directly may work when compiling for the same platform where SwiftPM itself is running, cross-compiled builds may need to launch a different `swiftc`. Path to this executable can be easily looked up from the `Toolchain` instance passed to relevant functions.
1 parent 22f0fb5 commit 6939221

File tree

1 file changed

+37
-15
lines changed

1 file changed

+37
-15
lines changed

Sources/DriverSupport/DriverSupportUtils.swift

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,30 +10,43 @@
1010
//
1111
//===----------------------------------------------------------------------===//
1212

13-
import SwiftDriver
1413
import Basics
1514
import PackageModel
15+
import SwiftDriver
16+
import protocol TSCBasic.FileSystem
1617
import class TSCBasic.Process
1718
import enum TSCBasic.ProcessEnv
1819
import struct TSCBasic.ProcessResult
19-
import protocol TSCBasic.FileSystem
2020

2121
public class DriverSupport {
2222
private var flagsMap = ThreadSafeBox<[String: Set<String>]>()
2323
public init() {}
2424

2525
// This checks _frontend_ supported flags, which are not necessarily supported in the driver.
26-
public func checkSupportedFrontendFlags(flags: Set<String>, toolchain: PackageModel.Toolchain, fileSystem: FileSystem) -> Bool {
27-
let trimmedFlagSet = Set(flags.map{$0.trimmingCharacters(in: ["-"])})
26+
public func checkSupportedFrontendFlags(
27+
flags: Set<String>,
28+
toolchain: PackageModel.Toolchain,
29+
fileSystem: FileSystem
30+
) -> Bool {
31+
let trimmedFlagSet = Set(flags.map { $0.trimmingCharacters(in: ["-"]) })
32+
let swiftcPathString = toolchain.swiftCompilerPath.pathString
2833

29-
if let entry = flagsMap.get(), let cachedSupportedFlagSet = entry[toolchain.swiftCompilerPath.pathString + "-frontend"] {
34+
if let entry = flagsMap.get(), let cachedSupportedFlagSet = entry[swiftcPathString + "-frontend"] {
3035
return cachedSupportedFlagSet.intersection(trimmedFlagSet) == trimmedFlagSet
3136
}
3237
do {
33-
let executor = try SPMSwiftDriverExecutor(resolver: ArgsResolver(fileSystem: fileSystem), fileSystem: fileSystem, env: [:])
34-
let driver = try Driver(args: ["swiftc"], executor: executor, compilerExecutableDir: toolchain.swiftCompilerPath.parentDirectory)
35-
let supportedFlagSet = Set(driver.supportedFrontendFlags.map{$0.trimmingCharacters(in: ["-"])})
36-
flagsMap.put([toolchain.swiftCompilerPath.pathString + "-frontend" : supportedFlagSet])
38+
let executor = try SPMSwiftDriverExecutor(
39+
resolver: ArgsResolver(fileSystem: fileSystem),
40+
fileSystem: fileSystem,
41+
env: [:]
42+
)
43+
let driver = try Driver(
44+
args: ["swiftc"],
45+
executor: executor,
46+
compilerExecutableDir: toolchain.swiftCompilerPath.parentDirectory
47+
)
48+
let supportedFlagSet = Set(driver.supportedFrontendFlags.map { $0.trimmingCharacters(in: ["-"]) })
49+
flagsMap.put([swiftcPathString + "-frontend": supportedFlagSet])
3750
return supportedFlagSet.intersection(trimmedFlagSet) == trimmedFlagSet
3851
} catch {
3952
return false
@@ -43,21 +56,30 @@ public class DriverSupport {
4356
// This checks if given flags are supported in the built-in toolchain driver. Currently
4457
// there's no good way to get the supported flags from it, so run `swiftc -h` directly
4558
// to get the flags and cache the result.
46-
public func checkToolchainDriverFlags(flags: Set<String>, toolchain: PackageModel.Toolchain, fileSystem: FileSystem) -> Bool {
47-
let trimmedFlagSet = Set(flags.map{$0.trimmingCharacters(in: ["-"])})
48-
if let entry = flagsMap.get(), let cachedSupportedFlagSet = entry[toolchain.swiftCompilerPath.pathString + "-driver"] {
59+
public func checkToolchainDriverFlags(
60+
flags: Set<String>,
61+
toolchain: PackageModel.Toolchain,
62+
fileSystem: FileSystem
63+
) -> Bool {
64+
let trimmedFlagSet = Set(flags.map { $0.trimmingCharacters(in: ["-"]) })
65+
let swiftcPathString = toolchain.swiftCompilerPath.pathString
66+
67+
if let entry = flagsMap.get(), let cachedSupportedFlagSet = entry[swiftcPathString + "-driver"] {
4968
return cachedSupportedFlagSet.intersection(trimmedFlagSet) == trimmedFlagSet
5069
}
5170
do {
52-
let helpJob = try Process.launchProcess(arguments: ["swiftc", "-h"], env: ProcessEnv.vars)
71+
let helpJob = try Process.launchProcess(
72+
arguments: [swiftcPathString, "-h"],
73+
env: ProcessEnv.vars
74+
)
5375
let processResult = try helpJob.waitUntilExit()
5476
guard processResult.exitStatus == .terminated(code: 0) else {
5577
return false
5678
}
5779
let helpOutput = try processResult.utf8Output()
58-
let helpFlags = helpOutput.components(separatedBy: " ").map{$0.trimmingCharacters(in: ["-"])}
80+
let helpFlags = helpOutput.components(separatedBy: " ").map { $0.trimmingCharacters(in: ["-"]) }
5981
let supportedFlagSet = Set(helpFlags)
60-
flagsMap.put([toolchain.swiftCompilerPath.pathString + "-driver" : supportedFlagSet])
82+
flagsMap.put([swiftcPathString + "-driver": supportedFlagSet])
6183
return supportedFlagSet.intersection(trimmedFlagSet) == trimmedFlagSet
6284
} catch {
6385
return false

0 commit comments

Comments
 (0)