feature. See also
. The project being documented here (as the example) is the Zig library itself.
Maker.prepare
fn prepare(maker: *Maker, step_names: []const []const u8) !void
File
Code
fn prepare(maker: *Maker, step_names: []const []const u8) !void {
const gpa = maker.gpa;
const graph = maker.graph;
const arena = graph.arena;
const seed: u32 = graph.random_seed;
const step_stack = &maker.step_stack;
const c = &maker.scanned_config.configuration;
for (maker.steps, 0..) |*step, step_index_usize| {
const step_index: Configuration.Step.Index = @fromBackingInt(@intCast(step_index_usize));
step.* = .{ .extended = .init(step_index.ptr(c).flags(c).tag) };
}
if (step_names.len == 0) {
try step_stack.put(gpa, c.default_step, {});
} else {
try step_stack.ensureUnusedCapacity(gpa, step_names.len);
for (0..step_names.len) |i| {
const step_name = step_names[step_names.len - i - 1];
const s = maker.scanned_config.top_level_steps.get(step_name) orelse {
log.info("to list available steps: zig build -l", .{});
fatal("no such step: {s}", .{step_name});
};
step_stack.putAssumeCapacity(s, {});
}
}
const starting_steps = try arena.dupe(Configuration.Step.Index, step_stack.keys());
var rng = std.Random.DefaultPrng.init(seed);
const rand = rng.random();
rand.shuffle(Configuration.Step.Index, starting_steps);
for (starting_steps) |s| {
try constructGraphAndCheckForDependencyLoop(maker, s, &maker.step_stack, rand);
}
{
var any_problems = false;
var max_needed: u64 = 0;
for (step_stack.keys()) |step_index| {
const make_step = maker.stepByIndex(step_index);
const conf_step = step_index.ptr(c);
const max_rss = conf_step.max_rss.toBytes();
if (max_rss == 0) continue;
max_needed = @max(max_needed, max_rss);
if (max_rss > maker.available_rss) {
if (maker.skip_oom_steps) {
make_step.state = .skipped_oom;
for (make_step.dependants.items) |dependant| {
maker.stepByIndex(dependant).pending_deps -= 1;
}
} else {
log.err("{s}{s}: this step declares an upper bound of {d} bytes of memory, exceeding the available {d} bytes of memory", .{
conf_step.owner.depPrefixSlice(c),
conf_step.name.slice(c),
max_rss,
maker.available_rss,
});
any_problems = true;
}
}
}
if (any_problems) {
if (maker.max_rss_is_default) {
log.info("use --maxrss {d} to proceed, risking system memory exhaustion", .{max_needed});
}
return error.InsufficientMemory;
}
}
}