From 7d25ea21bdd26671fdfa065eb3dd662a9e24b534 Mon Sep 17 00:00:00 2001 From: Reuben Dunnington Date: Sat, 1 Nov 2025 15:47:14 -0700 Subject: [PATCH] make wasi support optional --- .github/workflows/ci.yml | 4 ++++ build.zig | 32 ++++++++++++++++++++++---------- run/main.zig | 24 ++++++++++++++++++------ src/core.zig | 2 +- src/definition.zig | 6 ------ 5 files changed, 45 insertions(+), 23 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 37ae35f..51eca00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -47,6 +47,10 @@ jobs: run: | zig build -Dvm_kind=${{ matrix.stack_kind }} + - name: Build (no wasi) + run: | + zig build -Dvm_kind=${{ matrix.stack_kind }} -Dwasi=false + - name: Bench run: | zig build bench -Dvm_kind=${{ matrix.stack_kind }} -Doptimize=ReleaseFast diff --git a/build.zig b/build.zig index b85e183..345f414 100644 --- a/build.zig +++ b/build.zig @@ -41,9 +41,15 @@ pub fn build(b: *Build) void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); - const enable_metering = b.option(bool, "meter", "Enable metering") orelse false; - const enable_debug_trace = b.option(bool, "debug_trace", "Enable debug tracing feature") orelse false; - const enable_debug_trap = b.option(bool, "debug_trap", "Enable debug trap features") orelse false; + const enable_metering = b.option(bool, "meter", "Enable metering (default: false)") orelse false; + const enable_debug_trace = b.option(bool, "debug_trace", "Enable debug tracing feature (default: false)") orelse false; + const enable_debug_trap = b.option(bool, "debug_trap", "Enable debug trap features (default: false)") orelse false; + const enable_wasi = b.option(bool, "wasi", "Enable wasi support (default: true if target has support)") orelse blk: { + if (target.result.cpu.arch.isWasm() and target.result.os.tag != .wasi) { + break :blk false; + } + break :blk true; + }; const vm_kind = b.option( StackVmKind, "vm_kind", @@ -54,6 +60,7 @@ pub fn build(b: *Build) void { options.addOption(bool, "enable_metering", enable_metering); options.addOption(bool, "enable_debug_trace", enable_debug_trace); options.addOption(bool, "enable_debug_trap", enable_debug_trap); + options.addOption(bool, "enable_wasi", enable_wasi); options.addOption(StackVmKind, "vm_kind", vm_kind); const stable_array = b.dependency("zig-stable-array", .{ @@ -150,12 +157,15 @@ pub fn build(b: *Build) void { }); // wasi tests - const wasi_testsuite = b.addSystemCommand(&.{"python3"}); - wasi_testsuite.addArg("test/wasi/run.py"); - wasi_testsuite.step.dependOn(bytebox_exe_step); - - const wasi_testsuite_step = b.step("test-wasi", "Run wasi testsuite"); - wasi_testsuite_step.dependOn(&wasi_testsuite.step); + var maybe_wasi_testsuite_step: ?*Step = null; + if (enable_wasi) { + const wasi_testsuite = b.addSystemCommand(&.{"python3"}); + wasi_testsuite.addArg("test/wasi/run.py"); + wasi_testsuite.step.dependOn(bytebox_exe_step); + + maybe_wasi_testsuite_step = b.step("test-wasi", "Run wasi testsuite"); + maybe_wasi_testsuite_step.?.dependOn(&wasi_testsuite.step); + } // mem64 test const compile_mem64_test: WasmBuild = buildWasmExe(b, "test/mem64/memtest.zig", .wasm64); @@ -197,9 +207,11 @@ pub fn build(b: *Build) void { const all_tests_step = b.step("test", "Run unit, wasm, and wasi tests"); all_tests_step.dependOn(unit_test_step); all_tests_step.dependOn(wasm_testsuite_step); - all_tests_step.dependOn(wasi_testsuite_step); all_tests_step.dependOn(mem64_test_step); all_tests_step.dependOn(cffi_test_step); + if (maybe_wasi_testsuite_step) |wasi_testsuite_step| { + all_tests_step.dependOn(wasi_testsuite_step); + } } fn buildExeWithRunStep(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.OptimizeMode, imports: []const Import, opts: ExeOpts) *Build.Step { diff --git a/run/main.zig b/run/main.zig index f1d8cb7..a59239c 100644 --- a/run/main.zig +++ b/run/main.zig @@ -257,12 +257,24 @@ pub fn main() !void { var module_instance = try bytebox.createModuleInstance(.Stack, module_def, allocator); defer module_instance.destroy(); - var imports_wasi: bytebox.ModuleImportPackage = try wasi.initImports(.{ - .argv = opts.wasm_argv, - .env = opts.wasm_env, - .dirs = opts.wasm_dirs, - }, allocator); - defer wasi.deinitImports(&imports_wasi); + var imports_wasi: bytebox.ModuleImportPackage = blk: { + if (config.enable_wasi) { + break :blk try wasi.initImports(.{ + .argv = opts.wasm_argv, + .env = opts.wasm_env, + .dirs = opts.wasm_dirs, + }, allocator); + } else { + break :blk try bytebox.ModuleImportPackage.init("empty_stub", null, null, allocator); + } + }; + defer { + if (config.enable_wasi) { + wasi.deinitImports(&imports_wasi); + } else { + imports_wasi.deinit(); + } + } const instantiate_opts = bytebox.ModuleInstantiateOpts{ .imports = &[_]bytebox.ModuleImportPackage{imports_wasi}, diff --git a/src/core.zig b/src/core.zig index ffefd74..7cc47fa 100644 --- a/src/core.zig +++ b/src/core.zig @@ -5,7 +5,7 @@ const inst = @import("instance.zig"); const vm_stack = @import("vm_stack.zig"); const vm_register = @import("vm_register.zig"); pub const config = @import("config"); -pub const wasi = @import("wasi.zig"); +pub const wasi = if (config.enable_wasi) @import("wasi.zig") else void; pub const LogLevel = common.LogLevel; pub const Logger = common.Logger; diff --git a/src/definition.zig b/src/definition.zig index a0ac6e2..b271c0b 100644 --- a/src/definition.zig +++ b/src/definition.zig @@ -11,12 +11,6 @@ const opcodes = @import("opcode.zig"); const Opcode = opcodes.Opcode; const WasmOpcode = opcodes.WasmOpcode; -// HACK: just get the code working, will need to resolve anything dependent on this eventually -const inst = @import("instance.zig"); -const ModuleInstance = inst.ModuleInstance; -const Store = inst.Store; -const GlobalInstance = inst.GlobalInstance; - pub const MalformedError = error{ MalformedBytecode, MalformedCustomSection,