@@ -20,38 +20,25 @@ fileprivate func envVarName(forExecutable toolName: String) -> String {
20
20
/// FIXME: This class is not thread-safe.
21
21
public final class DarwinToolchain : Toolchain {
22
22
public let env : [ String : String ]
23
-
24
- func xcrunFind( exec: String ) throws -> AbsolutePath {
25
- if let overrideString = env [ envVarName ( forExecutable: exec) ] {
26
- return try AbsolutePath ( validating: overrideString)
27
- }
28
-
29
- #if os(macOS)
30
- let path = try Process . checkNonZeroExit (
31
- arguments: [ " xcrun " , " -sdk " , " macosx " , " --find " , exec] ,
32
- environment: env
33
- ) . spm_chomp ( )
34
- return AbsolutePath ( path)
35
- #else
36
- // This is a hack so our tests work on linux. We need a better way for looking up tools in general.
37
- return AbsolutePath ( " /usr/bin/ " + exec)
38
- #endif
23
+
24
+ public init ( env: [ String : String ] ) {
25
+ self . env = env
39
26
}
40
-
27
+
41
28
/// Retrieve the absolute path for a given tool.
42
29
public func getToolPath( _ tool: Tool ) throws -> AbsolutePath {
43
30
switch tool {
44
31
case . swiftCompiler:
45
- return try xcrunFind ( exec: " swift " )
32
+ return try lookup ( exec: " swift " )
46
33
47
34
case . dynamicLinker:
48
- return try xcrunFind ( exec: " ld " )
35
+ return try lookup ( exec: " ld " )
49
36
50
37
case . staticLinker:
51
- return try xcrunFind ( exec: " libtool " )
38
+ return try lookup ( exec: " libtool " )
52
39
53
40
case . dsymutil:
54
- return try xcrunFind ( exec: " dsymutil " )
41
+ return try lookup ( exec: " dsymutil " )
55
42
56
43
case . clang:
57
44
let result = try Process . checkNonZeroExit (
@@ -60,13 +47,13 @@ public final class DarwinToolchain: Toolchain {
60
47
) . spm_chomp ( )
61
48
return AbsolutePath ( result)
62
49
case . swiftAutolinkExtract:
63
- return try xcrunFind ( exec: " swift-autolink-extract " )
50
+ return try lookup ( exec: " swift-autolink-extract " )
64
51
}
65
52
}
66
53
67
54
/// Swift compiler path.
68
55
public lazy var swiftCompiler : Result < AbsolutePath , Swift . Error > = Result {
69
- try xcrunFind ( exec: " swift " )
56
+ try lookup ( exec: " swift " )
70
57
}
71
58
72
59
/// SDK path.
@@ -88,11 +75,6 @@ public final class DarwinToolchain: Toolchain {
88
75
return swiftCompiler. map { $0. appending ( RelativePath ( " ../../lib/swift/macosx " ) ) }
89
76
}
90
77
91
-
92
- public init ( env: [ String : String ] ) {
93
- self . env = env
94
- }
95
-
96
78
public func makeLinkerOutputFilename( moduleName: String , type: LinkOutputType ) -> String {
97
79
switch type {
98
80
case . executable: return moduleName
@@ -137,4 +119,29 @@ public final class DarwinToolchain: Toolchain {
137
119
\( isShared ? " _dynamic.dylib " : " .a " )
138
120
"""
139
121
}
122
+
123
+ /// Looks for the executable in the `SWIFT_DRIVER_TOOLNAME_EXEC` enviroment variable, if found nothing,
124
+ /// looks in the executable path; finally, fallback to xcrunFind.
125
+ /// - Parameter exec: executable to look for [i.e. `swift`].
126
+ func lookup( exec: String ) throws -> AbsolutePath {
127
+ if let overrideString = env [ envVarName ( forExecutable: exec) ] {
128
+ return try AbsolutePath ( validating: overrideString)
129
+ } else if let path = lookupExecutablePath ( filename: exec, searchPaths: [ executableDir] ) {
130
+ return path
131
+ }
132
+ return try xcrunFind ( exec: exec)
133
+ }
134
+
135
+ private func xcrunFind( exec: String ) throws -> AbsolutePath {
136
+ #if os(macOS)
137
+ let path = try Process . checkNonZeroExit (
138
+ arguments: [ " xcrun " , " -sdk " , " macosx " , " --find " , exec] ,
139
+ environment: env
140
+ ) . spm_chomp ( )
141
+ return AbsolutePath ( path)
142
+ #else
143
+ // This is a hack so our tests work on linux. We need a better way for looking up tools in general.
144
+ return AbsolutePath ( " /usr/bin/ " + exec)
145
+ #endif
146
+ }
140
147
}
0 commit comments