feature. See also
. The project being documented here (as the example) is the Zig library itself.
Maker.cmdLibC
fn cmdLibC(gpa: Allocator, graph: *Graph, args: []const []const u8) !void
File
Code
fn cmdLibC(gpa: Allocator, graph: *Graph, args: []const []const u8) !void {
const environ_map = &graph.environ_map;
const io = graph.io;
const arena = graph.arena;
const LibCInstallation = std.zig.LibCInstallation;
var input_file: ?[]const u8 = null;
var target_arch_os_abi: []const u8 = "native";
var print_includes: bool = false;
const stdout = initStdoutWriter(io);
{
var i: usize = 0;
while (i < args.len) : (i += 1) {
const arg = args[i];
if (mem.startsWith(u8, arg, "-")) {
if (mem.eql(u8, arg, "-h") or mem.eql(u8, arg, "--help")) {
try stdout.writeAll(usage_libc);
try stdout.flush();
return std.process.cleanExit(io);
} else if (mem.eql(u8, arg, "-target")) {
if (i + 1 >= args.len) fatal("expected parameter after {s}", .{arg});
i += 1;
target_arch_os_abi = args[i];
} else if (mem.eql(u8, arg, "-includes")) {
print_includes = true;
} else {
fatal("unrecognized parameter: '{s}'", .{arg});
}
} else if (input_file != null) {
fatal("unexpected extra parameter: '{s}'", .{arg});
} else {
input_file = arg;
}
}
}
const target_query = std.zig.parseTargetQueryOrReportFatalError(gpa, .{
.arch_os_abi = target_arch_os_abi,
});
const target = std.zig.resolveTargetQueryOrFatal(io, target_query);
if (print_includes) {
const libc_installation: ?*LibCInstallation = libc: {
if (input_file) |libc_file| {
const libc = try arena.create(LibCInstallation);
libc.* = LibCInstallation.parse(arena, io, libc_file, &target) catch |err| {
fatal("unable to parse libc file at path {s}: {t}", .{ libc_file, err });
};
break :libc libc;
} else {
break :libc null;
}
};
const is_native_abi = target_query.isNativeAbi();
const libc_dirs = std.zig.LibCDirs.detect(
arena,
io,
.{ .root_dir = graph.zig_lib_directory },
&target,
is_native_abi,
true,
libc_installation,
environ_map,
) catch |err| {
const zig_target = try target.zigTriple(arena);
fatal("unable to detect libc for target {s}: {t}", .{ zig_target, err });
};
if (libc_dirs.libc_include_dir_list.len == 0) {
const zig_target = try target.zigTriple(arena);
fatal("no include dirs detected for target {s}", .{zig_target});
}
for (libc_dirs.libc_include_dir_list) |include_dir| {
try stdout.writeAll(include_dir);
try stdout.writeByte('\n');
}
try stdout.flush();
return std.process.cleanExit(io);
}
if (input_file) |libc_file| {
var libc = LibCInstallation.parse(gpa, io, libc_file, &target) catch |err| {
fatal("unable to parse libc file at path {s}: {t}", .{ libc_file, err });
};
defer libc.deinit(gpa);
} else {
if (!target_query.canDetectLibC()) {
fatal("unable to detect libc for non-native target", .{});
}
var libc = LibCInstallation.findNative(gpa, io, .{
.verbose = true,
.target = &target,
.environ_map = environ_map,
}) catch |err| {
fatal("unable to detect native libc: {t}", .{err});
};
defer libc.deinit(gpa);
try libc.render(stdout);
try stdout.flush();
}
}