Skip to content

Commit 8c621d7

Browse files
authored
Merge pull request #2094 from aemino/master
Bring PkgConfig parsing to greater parity with pkg-config
2 parents dd8be64 + 9f62f61 commit 8c621d7

File tree

2 files changed

+44
-14
lines changed

2 files changed

+44
-14
lines changed

Sources/TSCUtility/PkgConfig.swift

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -143,26 +143,31 @@ public struct PkgConfig {
143143
var parser = PkgConfigParser(pcFile: pcFile, fileSystem: fileSystem)
144144
try parser.parse()
145145

146-
var cFlags = parser.cFlags
147-
var libs = parser.libs
148-
149-
// If parser found dependencies in pc file, get their flags too.
150-
if !parser.dependencies.isEmpty {
151-
for dep in parser.dependencies {
146+
func getFlags(from dependencies: [String]) throws -> (cFlags: [String], libs: [String]) {
147+
var cFlags = [String]()
148+
var libs = [String]()
149+
150+
for dep in dependencies {
152151
// FIXME: This is wasteful, we should be caching the PkgConfig result.
153152
let pkg = try PkgConfig(
154153
name: dep,
155154
additionalSearchPaths: additionalSearchPaths,
156-
diagnostics: self.diagnostics,
155+
diagnostics: diagnostics,
157156
brewPrefix: brewPrefix
158157
)
158+
159159
cFlags += pkg.cFlags
160160
libs += pkg.libs
161161
}
162+
163+
return (cFlags: cFlags, libs: libs)
162164
}
163165

164-
self.cFlags = cFlags
165-
self.libs = libs
166+
let dependencyFlags = try getFlags(from: parser.dependencies)
167+
let privateDependencyFlags = try getFlags(from: parser.privateDependencies)
168+
169+
self.cFlags = parser.cFlags + dependencyFlags.cFlags + privateDependencyFlags.cFlags
170+
self.libs = parser.libs + dependencyFlags.libs
166171
}
167172

168173
private static var envSearchPaths: [AbsolutePath] {
@@ -183,6 +188,7 @@ struct PkgConfigParser {
183188
private let fileSystem: FileSystem
184189
private(set) var variables = [String: String]()
185190
var dependencies = [String]()
191+
var privateDependencies = [String]()
186192
var cFlags = [String]()
187193
var libs = [String]()
188194

@@ -200,9 +206,12 @@ struct PkgConfigParser {
200206
return line
201207
}
202208

203-
// Add pcfiledir variable. This is path to the directory containing the pc file.
209+
// Add pcfiledir variable. This is the path of the directory containing this pc file.
204210
variables["pcfiledir"] = pcFile.parentDirectory.pathString
205211

212+
// Add pc_sysrootdir variable. This is the path of the sysroot directory for pc files.
213+
variables["pc_sysrootdir"] = Process.env["PKG_CONFIG_SYSROOT_DIR"] ?? "/"
214+
206215
let fileContents = try fileSystem.readFileContents(pcFile)
207216
// FIXME: Should we error out instead if content is not UTF8 representable?
208217
for line in fileContents.validDescription?.components(separatedBy: "\n") ?? [] {
@@ -233,6 +242,8 @@ struct PkgConfigParser {
233242
switch key {
234243
case "Requires":
235244
dependencies = try parseDependencies(value)
245+
case "Requires.private":
246+
privateDependencies = try parseDependencies(value)
236247
case "Libs":
237248
libs = try splitEscapingSpace(value)
238249
case "Cflags":

Tests/TSCUtilityTests/PkgConfigParserTests.swift

Lines changed: 23 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,24 @@ final class PkgConfigParserTests: XCTestCase {
2626
"gtk_binary_version": "3.0.0",
2727
"exec_prefix": "/usr/local/Cellar/gtk+3/3.18.9",
2828
"targets": "quartz",
29-
"pcfiledir": parser.pcFile.parentDirectory.pathString
29+
"pcfiledir": parser.pcFile.parentDirectory.pathString,
30+
"pc_sysrootdir": "/"
3031
])
3132
XCTAssertEqual(parser.dependencies, ["gdk-3.0", "atk", "cairo", "cairo-gobject", "gdk-pixbuf-2.0", "gio-2.0"])
33+
XCTAssertEqual(parser.privateDependencies, ["atk", "epoxy", "gio-unix-2.0"])
3234
XCTAssertEqual(parser.cFlags, ["-I/usr/local/Cellar/gtk+3/3.18.9/include/gtk-3.0"])
3335
XCTAssertEqual(parser.libs, ["-L/usr/local/Cellar/gtk+3/3.18.9/lib", "-lgtk-3"])
3436
}
3537
}
3638

3739
func testEmptyCFlags() {
3840
try! loadPCFile("empty_cflags.pc") { parser in
39-
XCTAssertEqual(parser.variables, ["prefix": "/usr/local/bin", "exec_prefix": "/usr/local/bin", "pcfiledir": parser.pcFile.parentDirectory.pathString])
41+
XCTAssertEqual(parser.variables, [
42+
"prefix": "/usr/local/bin",
43+
"exec_prefix": "/usr/local/bin",
44+
"pcfiledir": parser.pcFile.parentDirectory.pathString,
45+
"pc_sysrootdir": "/"
46+
])
4047
XCTAssertEqual(parser.dependencies, ["gdk-3.0", "atk"])
4148
XCTAssertEqual(parser.cFlags, [])
4249
XCTAssertEqual(parser.libs, ["-L/usr/local/bin", "-lgtk-3"])
@@ -45,7 +52,13 @@ final class PkgConfigParserTests: XCTestCase {
4552

4653
func testVariableinDependency() {
4754
try! loadPCFile("deps_variable.pc") { parser in
48-
XCTAssertEqual(parser.variables, ["prefix": "/usr/local/bin", "exec_prefix": "/usr/local/bin", "my_dep": "atk", "pcfiledir": parser.pcFile.parentDirectory.pathString])
55+
XCTAssertEqual(parser.variables, [
56+
"prefix": "/usr/local/bin",
57+
"exec_prefix": "/usr/local/bin",
58+
"my_dep": "atk",
59+
"pcfiledir": parser.pcFile.parentDirectory.pathString,
60+
"pc_sysrootdir": "/"
61+
])
4962
XCTAssertEqual(parser.dependencies, ["gdk-3.0", "atk"])
5063
XCTAssertEqual(parser.cFlags, ["-I"])
5164
XCTAssertEqual(parser.libs, ["-L/usr/local/bin", "-lgtk-3"])
@@ -63,7 +76,13 @@ final class PkgConfigParserTests: XCTestCase {
6376

6477
func testEscapedSpaces() {
6578
try! loadPCFile("escaped_spaces.pc") { parser in
66-
XCTAssertEqual(parser.variables, ["prefix": "/usr/local/bin", "exec_prefix": "/usr/local/bin", "my_dep": "atk", "pcfiledir": parser.pcFile.parentDirectory.pathString])
79+
XCTAssertEqual(parser.variables, [
80+
"prefix": "/usr/local/bin",
81+
"exec_prefix": "/usr/local/bin",
82+
"my_dep": "atk",
83+
"pcfiledir": parser.pcFile.parentDirectory.pathString,
84+
"pc_sysrootdir": "/"
85+
])
6786
XCTAssertEqual(parser.dependencies, ["gdk-3.0", "atk"])
6887
XCTAssertEqual(parser.cFlags, ["-I/usr/local/Wine Cellar/gtk+3/3.18.9/include/gtk-3.0", "-I/after/extra/spaces"])
6988
XCTAssertEqual(parser.libs, ["-L/usr/local/bin", "-lgtk 3", "-wantareal\\here", "-one\\", "-two"])

0 commit comments

Comments
 (0)