@@ -38,19 +38,16 @@ public struct PkgConfigResult {
38
38
}
39
39
}
40
40
41
- /// Create a successful result with given cflags and libs.
42
- fileprivate init ( pkgConfigName: String , cFlags: [ String ] , libs: [ String ] ) {
43
- self . pkgConfigName = pkgConfigName
41
+ /// Create a result.
42
+ fileprivate init (
43
+ pkgConfigName: String ,
44
+ cFlags: [ String ] = [ ] ,
45
+ libs: [ String ] = [ ] ,
46
+ error: Swift . Error ? = nil ,
47
+ provider: SystemPackageProviderDescription ? = nil
48
+ ) {
44
49
self . cFlags = cFlags
45
50
self . libs = libs
46
- self . error = nil
47
- self . provider = nil
48
- }
49
-
50
- /// Create an error result.
51
- fileprivate init ( pkgConfigName: String , error: Swift . Error , provider: SystemPackageProviderDescription ? ) {
52
- self . cFlags = [ ]
53
- self . libs = [ ]
54
51
self . error = error
55
52
self . provider = provider
56
53
self . pkgConfigName = pkgConfigName
@@ -61,21 +58,38 @@ public struct PkgConfigResult {
61
58
public func pkgConfigArgs( for target: SystemLibraryTarget , diagnostics: DiagnosticsEngine , fileSystem: FileSystem = localFileSystem) -> PkgConfigResult ? {
62
59
// If there is no pkg config name defined, we're done.
63
60
guard let pkgConfigName = target. pkgConfig else { return nil }
61
+
64
62
// Compute additional search paths for the provider, if any.
65
63
let provider = target. providers? . first { $0. isAvailable }
66
64
let additionalSearchPaths = provider? . pkgConfigSearchPath ( ) ?? [ ]
65
+
67
66
// Get the pkg config flags.
68
67
do {
69
68
let pkgConfig = try PkgConfig (
70
69
name: pkgConfigName,
71
70
additionalSearchPaths: additionalSearchPaths,
72
71
diagnostics: diagnostics,
73
72
fileSystem: fileSystem)
73
+
74
74
// Run the whitelist checker.
75
- try whitelist ( pcFile: pkgConfigName, flags: ( pkgConfig. cFlags, pkgConfig. libs) )
75
+ let filtered = whitelist ( pcFile: pkgConfigName, flags: ( pkgConfig. cFlags, pkgConfig. libs) )
76
+
76
77
// Remove any default flags which compiler adds automatically.
77
- let ( cFlags, libs) = removeDefaultFlags ( cFlags: pkgConfig. cFlags, libs: pkgConfig. libs)
78
- return PkgConfigResult ( pkgConfigName: pkgConfigName, cFlags: cFlags, libs: libs)
78
+ let ( cFlags, libs) = removeDefaultFlags ( cFlags: filtered. cFlags, libs: filtered. libs)
79
+
80
+ // Set the error if there are any unallowed flags.
81
+ var error : Swift . Error ?
82
+ if !filtered. unallowed. isEmpty {
83
+ error = PkgConfigError . nonWhitelistedFlags ( filtered. unallowed. joined ( separator: " , " ) )
84
+ }
85
+
86
+ return PkgConfigResult (
87
+ pkgConfigName: pkgConfigName,
88
+ cFlags: cFlags,
89
+ libs: libs,
90
+ error: error,
91
+ provider: provider
92
+ )
79
93
} catch {
80
94
return PkgConfigResult ( pkgConfigName: pkgConfigName, error: error, provider: provider)
81
95
}
@@ -135,20 +149,24 @@ extension SystemPackageProviderDescription {
135
149
/// compiler/linker. List of allowed flags:
136
150
/// cFlags: -I, -F
137
151
/// libs: -L, -l, -F, -framework, -w
138
- func whitelist( pcFile: String , flags: ( cFlags: [ String ] , libs: [ String ] ) ) throws {
139
- // Returns an array of flags which doesn't match any filter.
140
- func filter( flags: [ String ] , filters: [ String ] ) -> [ String ] {
141
- var filtered = [ String] ( )
152
+ func whitelist(
153
+ pcFile: String ,
154
+ flags: ( cFlags: [ String ] , libs: [ String ] )
155
+ ) -> ( cFlags: [ String ] , libs: [ String ] , unallowed: [ String ] ) {
156
+ // Returns a tuple with the array of allowed flag and the array of unallowed flags.
157
+ func filter( flags: [ String ] , filters: [ String ] ) -> ( allowed: [ String ] , unallowed: [ String ] ) {
158
+ var allowed = [ String] ( )
159
+ var unallowed = [ String] ( )
142
160
var it = flags. makeIterator ( )
143
161
while let flag = it. next ( ) {
144
162
guard let filter = filters. filter ( { flag. hasPrefix ( $0) } ) . first else {
145
- filtered += [ flag]
163
+ unallowed += [ flag]
146
164
continue
147
165
}
148
166
149
167
// Warning suppression flag has no arguments and is not suffixed.
150
168
guard !flag. hasPrefix ( " -w " ) || flag == " -w " else {
151
- filtered += [ flag]
169
+ unallowed += [ flag]
152
170
continue
153
171
}
154
172
@@ -158,14 +176,15 @@ func whitelist(pcFile: String, flags: (cFlags: [String], libs: [String])) throws
158
176
fatalError ( " Expected associated value " )
159
177
}
160
178
}
179
+ allowed += [ flag]
161
180
}
162
- return filtered
163
- }
164
- let filtered = filter ( flags: flags. cFlags, filters: [ " -I " , " -F " ] ) +
165
- filter( flags: flags. libs, filters: [ " -L " , " -l " , " -F " , " -framework " , " -w " ] )
166
- guard filtered. isEmpty else {
167
- throw PkgConfigError . nonWhitelistedFlags ( filtered. joined ( separator: " , " ) )
181
+ return ( allowed, unallowed)
168
182
}
183
+
184
+ let filteredCFlags = filter ( flags: flags. cFlags, filters: [ " -I " , " -F " ] )
185
+ let filteredLibs = filter ( flags: flags. libs, filters: [ " -L " , " -l " , " -F " , " -framework " , " -w " ] )
186
+
187
+ return ( filteredCFlags. allowed, filteredLibs. allowed, filteredCFlags. unallowed + filteredLibs. unallowed)
169
188
}
170
189
171
190
/// Remove the default flags which are already added by the compiler.
0 commit comments