From 7a91ba471ed1828aac35d44cc8efc0134209a714 Mon Sep 17 00:00:00 2001 From: Reuben Dunnington Date: Mon, 25 Sep 2023 21:55:45 -0400 Subject: [PATCH] zig-sample: fix build.zig to use correct cpu feature set --- samples/zig-sample/build.bat | 22 ------- samples/zig-sample/build.zig | 119 ++++++++++++++++++----------------- 2 files changed, 62 insertions(+), 79 deletions(-) delete mode 100644 samples/zig-sample/build.bat diff --git a/samples/zig-sample/build.bat b/samples/zig-sample/build.bat deleted file mode 100644 index fb08934..0000000 --- a/samples/zig-sample/build.bat +++ /dev/null @@ -1,22 +0,0 @@ -@echo off - -:: compile wasm module -set ORCA_DIR=..\.. -set STDLIB_DIR=%ORCA_DIR%\src\libc-shim - -set wasmFlags=--target=wasm32^ - --no-standard-libraries ^ - -mbulk-memory ^ - -g -O2 ^ - -D__ORCA__ ^ - -Wl,--no-entry ^ - -Wl,--export-dynamic ^ - -Wl,--relocatable ^ - -isystem %STDLIB_DIR%\include ^ - -I%ORCA_DIR%\src ^ - -I%ORCA_DIR%\src\ext - -clang %wasmFlags% -o .\liborca.a ..\..\src\orca.c ..\..\src\libc-shim\src\*.c -IF %ERRORLEVEL% NEQ 0 EXIT /B %ERRORLEVEL% - -zig build bundle diff --git a/samples/zig-sample/build.zig b/samples/zig-sample/build.zig index 1ee8cd3..b346daa 100644 --- a/samples/zig-sample/build.zig +++ b/samples/zig-sample/build.zig @@ -1,4 +1,5 @@ const std = @import("std"); +const builtin = @import("builtin"); fn addSourceString(str: []const u8, strings: *std.ArrayList(u8), sources: *std.ArrayList([]const u8)) !void { var begin = strings.items.len; @@ -9,67 +10,63 @@ fn addSourceString(str: []const u8, strings: *std.ArrayList(u8), sources: *std.A pub fn build(b: *std.Build) !void { const optimize = b.standardOptimizeOption(.{}); - const wasm_target = std.zig.CrossTarget{ + var wasm_target = std.zig.CrossTarget{ .cpu_arch = .wasm32, .os_tag = .freestanding, }; + wasm_target.cpu_features_add.addFeature(@intFromEnum(std.Target.wasm.Feature.bulk_memory)); - //NOTE(reuben) - Ideally we would build the orca wasm lib and link it all within build.zig, but there - // seems to be a bug where the -mbulk-memory flag is ignored and memory.copy and - // memory.fill instructions aren't generated, leading the memcpy and memset instructions - // to become infinitely recursive, crashing the program. So for now we build the orca - // wasm lib with clang and link it in here. + var orca_source_strings = try std.ArrayList(u8).initCapacity(b.allocator, 1024 * 4); + var orca_sources = try std.ArrayList([]const u8).initCapacity(b.allocator, 128); + defer orca_source_strings.deinit(); + defer orca_sources.deinit(); - // var orca_source_strings = try std.ArrayList(u8).initCapacity(b.allocator, 1024 * 4); - // var orca_sources = try std.ArrayList([]const u8).initCapacity(b.allocator, 128); - // defer orca_source_strings.deinit(); - // defer orca_sources.deinit(); + { + try addSourceString("../../src/orca.c", &orca_source_strings, &orca_sources); - // { - // try addSourceString("../../src/orca.c", &orca_source_strings, &orca_sources); + var libc_shim_dir = try std.fs.cwd().openIterableDir("../../src/libc-shim/src", .{}); + var walker = try libc_shim_dir.walk(b.allocator); + defer walker.deinit(); - // var libc_shim_dir = try std.fs.cwd().openIterableDir("../../src/libc-shim/src", .{}); - // var walker = try libc_shim_dir.walk(b.allocator); - // defer walker.deinit(); + while (try walker.next()) |entry| { + const extension = std.fs.path.extension(entry.path); + if (std.mem.eql(u8, extension, ".c")) { + var path_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; + var abs_path = try libc_shim_dir.dir.realpath(entry.path, &path_buffer); + try addSourceString(abs_path, &orca_source_strings, &orca_sources); + } + } + } - // while (try walker.next()) |entry| { - // const extension = std.fs.path.extension(entry.path); - // if (std.mem.eql(u8, extension, ".c")) { - // var path_buffer: [std.fs.MAX_PATH_BYTES]u8 = undefined; - // var abs_path = try libc_shim_dir.dir.realpath(entry.path, &path_buffer); - // try addSourceString(abs_path, &orca_source_strings, &orca_sources); - // // std.debug.print("adding libc shim source: {s}\n", .{abs_path}); - // } - // } - // } + const orca_compile_opts = [_][]const u8{ + "-D__ORCA__", + "--no-standard-libraries", + "-fno-builtin", + "-g", + "-O2", + "-mexec-model=reactor", + "-fno-sanitize=undefined", + "-isystem ../../src/libc-shim/include", + "-I../../src", + "-I../../src/ext", + "-Wl,--export-dynamic", + }; - // const orca_compile_opts = [_][]const u8{ - // "-D__ORCA__", - // "--no-standard-libraries", - // "-fno-builtin", - // "-isystem ../../src/libc-shim/include", - // "-I../../src", - // "-I../../ext", - // "-O2", - // "-mbulk-memory", - // "-Wl,--no-entry", - // "-Wl,--export-all", - // "-g", - // }; - - // var orca_lib = b.addStaticLibrary(.{ - // .name = "orca", - // .target = wasm_target, - // .optimize = optimize, - // }); - // orca_lib.rdynamic = true; - // orca_lib.addIncludePath(.{ .path = "../../src" }); - // orca_lib.addIncludePath(.{ .path = "../../src/libc-shim/include" }); - // orca_lib.addIncludePath(.{ .path = "../../ext" }); - // orca_lib.addCSourceFiles(orca_sources.items, &orca_compile_opts); - // b.installArtifact(orca_lib); + var orca_lib = b.addStaticLibrary(.{ + .name = "orca", + .target = wasm_target, + .optimize = optimize, + }); + orca_lib.rdynamic = true; + orca_lib.addIncludePath(.{ .path = "../../src" }); + orca_lib.addIncludePath(.{ .path = "../../src/libc-shim/include" }); + orca_lib.addIncludePath(.{ .path = "../../src/ext" }); + orca_lib.addCSourceFiles(orca_sources.items, &orca_compile_opts); // builds the wasm module out of the orca C sources and main.zig + const orca_module: *std.Build.Module = b.createModule(.{ + .source_file = .{ .path = "../../src/orca.zig" }, + }); const wasm_lib = b.addSharedLibrary(.{ .name = "module", .root_source_file = .{ .path = "src/main.zig" }, @@ -77,17 +74,11 @@ pub fn build(b: *std.Build) !void { .optimize = optimize, }); wasm_lib.rdynamic = true; - - const orca_module: *std.Build.Module = b.createModule(.{ - .source_file = .{ .path = "../../src/orca.zig" }, - }); wasm_lib.addIncludePath(.{ .path = "../../src" }); wasm_lib.addIncludePath(.{ .path = "../../src/libc-shim/include" }); wasm_lib.addIncludePath(.{ .path = "../../ext" }); wasm_lib.addModule("orca", orca_module); - // wasm_lib.linkLibrary(orca_lib); - wasm_lib.addLibraryPath(.{ .path = "." }); - wasm_lib.linkSystemLibrary("orca"); + wasm_lib.linkLibrary(orca_lib); // copies the wasm module into zig-out/wasm_lib b.installArtifact(wasm_lib); @@ -99,4 +90,18 @@ pub fn build(b: *std.Build) !void { const bundle_step = b.step("bundle", "Runs the orca toolchain to bundle the wasm module into an orca app."); bundle_step.dependOn(&bundle_cmd.step); + + // Runs the app + const run_cmd_windows = [_][]const u8{"Sample/bin/Sample.exe"}; + const run_cmd_macos = [_][]const u8{ "open", "Sample.app" }; + const run_cmd_str: []const []const u8 = switch (builtin.os.tag) { + .windows => &run_cmd_windows, + .macos => &run_cmd_macos, + else => @compileError("unsupported platform"), + }; + var run_cmd = b.addSystemCommand(run_cmd_str); + run_cmd.step.dependOn(&bundle_cmd.step); + + const run_step = b.step("run", "Runs the bundled app using the Orca runtime."); + run_step.dependOn(&run_cmd.step); }