1010//
1111//===----------------------------------------------------------------------===//
1212
13- import SwiftDriver
1413import Basics
1514import PackageModel
15+ import SwiftDriver
16+ import protocol TSCBasic. FileSystem
1617import class TSCBasic. Process
1718import enum TSCBasic. ProcessEnv
1819import struct TSCBasic. ProcessResult
19- import protocol TSCBasic. FileSystem
2020
2121public 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