Parses the output of pkg-config [name] --cflags --libs.
pub fn parse(arena: Allocator, stdout: []const u8) ParseError!Parsed
pub fn parse(arena: Allocator, stdout: []const u8) ParseError!Parsed {
var zig_cflags: std.ArrayList([]const u8) = .empty;
var zig_libs: std.ArrayList([]const u8) = .empty;
var unknown_flags: std.ArrayList([]const u8) = .empty;
var arg_it = mem.tokenizeAny(u8, stdout, " \r\n\t");
var pthread = false;
while (arg_it.next()) |arg| {
if (mem.eql(u8, arg, "-I")) {
const dir = arg_it.next() orelse return error.InvalidPkgConfigOutput;
try zig_cflags.appendSlice(arena, &.{ "-I", dir });
} else if (mem.startsWith(u8, arg, "-I")) {
try zig_cflags.append(arena, arg);
} else if (mem.eql(u8, arg, "-L")) {
const dir = arg_it.next() orelse return error.InvalidPkgConfigOutput;
try zig_libs.appendSlice(arena, &.{ "-L", dir });
} else if (mem.startsWith(u8, arg, "-L")) {
try zig_libs.append(arena, arg);
} else if (mem.eql(u8, arg, "-l")) {
const lib = arg_it.next() orelse return error.InvalidPkgConfigOutput;
try zig_libs.appendSlice(arena, &.{ "-l", lib });
} else if (mem.startsWith(u8, arg, "-l")) {
try zig_libs.append(arena, arg);
} else if (mem.eql(u8, arg, "-D")) {
const macro = arg_it.next() orelse return error.InvalidPkgConfigOutput;
try zig_cflags.appendSlice(arena, &.{ "-D", macro });
} else if (mem.startsWith(u8, arg, "-D")) {
try zig_cflags.append(arena, arg);
} else if (mem.cutPrefix(u8, arg, "-Wl,-rpath,")) |rest| {
try zig_cflags.appendSlice(arena, &.{ "-rpath", rest });
} else if (mem.eql(u8, arg, "-pthread")) {
pthread = true;
} else {
try unknown_flags.append(arena, arg);
}
}
try zig_cflags.shrinkToLen(arena);
try zig_libs.shrinkToLen(arena);
try unknown_flags.shrinkToLen(arena);
return .{
.cflags = zig_cflags.toOwnedSliceAssert(),
.libs = zig_libs.toOwnedSliceAssert(),
.unknown_flags = unknown_flags.toOwnedSliceAssert(),
.pthread = pthread,
};
}