feature. See also
. The project being documented here (as the example) is the Zig library itself.
std-docs.buildWasmBinary
fn buildWasmBinary(
arena: Allocator,
context: *Context,
optimize_mode: std.builtin.OptimizeMode,
) !Cache.Path
File
Code
fn buildWasmBinary(
arena: Allocator,
context: *Context,
optimize_mode: std.builtin.OptimizeMode,
) !Cache.Path {
const gpa = context.gpa;
const io = context.io;
var argv: std.ArrayList([]const u8) = .empty;
try argv.appendSlice(arena, &.{
context.zig_exe_path,
"build-exe",
"-fno-entry",
"-O", @tagName(optimize_mode),
"-target", autodoc_arch_os_abi,
"-mcpu", autodoc_cpu_features,
"--cache-dir", context.global_cache_path,
"--global-cache-dir", context.global_cache_path,
"--name", autodoc_root_name,
"-rdynamic",
"--dep", "Walk",
try std.fmt.allocPrint(
arena,
"-Mroot={s}/docs/wasm/main.zig",
.{context.zig_lib_directory},
),
try std.fmt.allocPrint(
arena,
"-MWalk={s}/docs/wasm/Walk.zig",
.{context.zig_lib_directory},
),
"--listen=-",
});
var child = try std.process.spawn(io, .{
.argv = argv.items,
.stdin = .pipe,
.stdout = .pipe,
.stderr = .pipe,
});
var multi_reader_buffer: Io.File.MultiReader.Buffer(2) = undefined;
var multi_reader: Io.File.MultiReader = undefined;
multi_reader.init(gpa, io, multi_reader_buffer.toStreams(), &.{ child.stdout.?, child.stderr.? });
defer multi_reader.deinit();
try sendMessage(io, child.stdin.?, .update);
try sendMessage(io, child.stdin.?, .exit);
var result: ?Cache.Path = null;
var result_error_bundle = std.zig.ErrorBundle.empty;
const stdout = multi_reader.fileReader(0);
const MessageHeader = std.zig.Server.Message.Header;
var eos_err: error{EndOfStream}!void = {};
while (true) {
const header = stdout.interface.takeStruct(MessageHeader, .little) catch |err| switch (err) {
error.EndOfStream => break,
error.ReadFailed => return stdout.err.?,
};
const body = stdout.interface.take(header.bytes_len) catch |err| switch (err) {
error.EndOfStream => |e| {
eos_err = e;
break;
},
error.ReadFailed => return stdout.err.?,
};
switch (header.tag) {
.zig_version => {
if (!std.mem.eql(u8, builtin.zig_version_string, body)) {
return error.ZigProtocolVersionMismatch;
}
},
.error_bundle => {
result_error_bundle = try std.zig.Server.allocErrorBundle(arena, body);
},
.emit_digest => {
var r: Io.Reader = .fixed(body);
const emit_digest = r.takeStruct(std.zig.Server.Message.EmitDigest, .little) catch unreachable;
if (!emit_digest.flags.cache_hit) {
std.log.info("source changes detected; rebuilt wasm component", .{});
}
const digest = r.takeArray(Cache.bin_digest_len) catch unreachable;
result = .{
.root_dir = Cache.Directory.cwd(),
.sub_path = try std.fs.path.join(arena, &.{
context.global_cache_path, "o" ++ std.fs.path.sep_str ++ Cache.binToHex(digest.*),
}),
};
},
else => {},
}
}
try multi_reader.fillRemaining(.none);
const stderr = multi_reader.reader(1).buffered();
if (stderr.len > 0) {
std.debug.print("{s}", .{stderr});
}
try eos_err;
child.stdin.?.close(io);
child.stdin = null;
const term = try child.wait(io);
if (!term.success()) {
std.log.err("the following command {f}:\n{s}", .{
term, try std.zig.allocPrintCmd(arena, argv.items, .{}),
});
return error.WasmCompilationFailed;
}
if (result_error_bundle.errorMessageCount() > 0) {
try result_error_bundle.renderToStderr(io, .{}, .auto);
std.log.err("the following command failed with {d} compilation errors:\n{s}", .{
result_error_bundle.errorMessageCount(),
try std.zig.allocPrintCmd(arena, argv.items, .{}),
});
return error.WasmCompilationFailed;
}
return result orelse {
std.log.err("child process failed to report result\n{s}", .{
try std.zig.allocPrintCmd(arena, argv.items, .{}),
});
return error.WasmCompilationFailed;
};
}