Skip to content

Commit baf7033

Browse files
committed
Refactor PkgConfig struct, less mutating more private
1 parent 75242bf commit baf7033

File tree

2 files changed

+30
-36
lines changed

2 files changed

+30
-36
lines changed

Sources/Build/Buildable.swift

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,7 @@ extension SwiftModule {
6767
}
6868

6969
do {
70-
var pkgConfig = try PkgConfig(name: pkgConfigName)
71-
try pkgConfig.load()
70+
let pkgConfig = try PkgConfig(name: pkgConfigName)
7271
return pkgConfig.cFlags.map{["-Xcc", $0]}.flatten() + pkgConfig.libs
7372
}
7473
catch PkgConfigError.CouldNotFindConfigFile {

Sources/Build/PkgConfig.swift

Lines changed: 29 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -16,32 +16,52 @@ enum PkgConfigError: ErrorProtocol {
1616
}
1717

1818
struct PkgConfig {
19-
static let searchPaths = ["/usr/local/lib/pkgconfig",
19+
private static let searchPaths = ["/usr/local/lib/pkgconfig",
2020
"/usr/local/share/pkgconfig",
2121
"/usr/lib/pkgconfig",
2222
"/usr/share/pkgconfig",
2323
]
2424

2525
let name: String
2626
let pcFile: String
27-
var cFlags = [String]()
28-
var libs = [String]()
29-
private var parser: PkgConfigParser
27+
let cFlags: [String]
28+
let libs: [String]
3029

3130
init(name: String) throws {
3231
self.name = name
3332
self.pcFile = try PkgConfig.locatePCFile(name: name)
34-
parser = PkgConfigParser(pcFile: pcFile)
33+
34+
var parser = PkgConfigParser(pcFile: pcFile)
35+
try parser.parse()
36+
37+
var cFlags = [String]()
38+
var libs = [String]()
39+
40+
// FIXME: handle spaces in paths.
41+
cFlags += parser.cFlags.characters.split(separator: " ").map(String.init)
42+
libs += parser.libs.characters.split(separator: " ").map(String.init)
43+
44+
// If parser found dependencies in pc file, get their flags too.
45+
if(!parser.dependencies.isEmpty) {
46+
for dep in parser.dependencies {
47+
let pkg = try PkgConfig(name: dep)
48+
cFlags += pkg.cFlags
49+
libs += pkg.libs
50+
}
51+
}
52+
53+
self.cFlags = cFlags
54+
self.libs = libs
3555
}
3656

37-
static var envSearchPaths: [String] {
57+
private static var envSearchPaths: [String] {
3858
if let configPath = getenv("PKG_CONFIG_PATH") {
3959
return configPath.characters.split(separator: ":").map(String.init)
4060
}
4161
return []
4262
}
4363

44-
static func locatePCFile(name: String) throws -> String {
64+
private static func locatePCFile(name: String) throws -> String {
4565
for path in (searchPaths + envSearchPaths) {
4666
let pcFile = Path.join(path, "\(name).pc")
4767
if pcFile.isFile {
@@ -50,39 +70,14 @@ struct PkgConfig {
5070
}
5171
throw PkgConfigError.CouldNotFindConfigFile
5272
}
53-
54-
mutating func load() throws {
55-
cFlags = [String]()
56-
libs = [String]()
57-
try parser.parse()
58-
if let cFlags = parser.cFlags {
59-
// FIXME: handle spaces in paths.
60-
self.cFlags += cFlags.characters.split(separator: " ").map(String.init)
61-
}
62-
if let libs = parser.libs {
63-
// FIXME: handle spaces in paths.
64-
self.libs += libs.characters.split(separator: " ").map(String.init)
65-
}
66-
67-
if(parser.dependencies.isEmpty) {
68-
return
69-
}
70-
71-
for dep in parser.dependencies {
72-
var pkg = try PkgConfig(name: dep)
73-
try pkg.load()
74-
self.cFlags += pkg.cFlags
75-
self.libs += pkg.libs
76-
}
77-
}
7873
}
7974

8075
private struct PkgConfigParser {
8176
let pcFile: String
8277
var variables = [String: String]()
8378
var dependencies = [String]()
84-
var cFlags: String?
85-
var libs: String?
79+
var cFlags = ""
80+
var libs = ""
8681

8782
init(pcFile: String) {
8883
self.pcFile = pcFile

0 commit comments

Comments
 (0)