From 3beb98e07d6710166f295122396284add1c158e5 Mon Sep 17 00:00:00 2001 From: ousttrue Date: Wed, 11 Dec 2024 16:24:12 +0900 Subject: [PATCH] luajit build for windows --- build/luajit.zig | 35 ++++++++++++++++++++++++++-- build/replace_backslash.zig | 46 +++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 2 deletions(-) create mode 100644 build/replace_backslash.zig diff --git a/build/luajit.zig b/build/luajit.zig index 3e2cabb..3002a45 100644 --- a/build/luajit.zig +++ b/build/luajit.zig @@ -31,7 +31,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin. // Generate the buildvm_arch.h file using minilua const dynasm_run = b.addRunArtifact(minilua); - dynasm_run.addFileArg(upstream.path("dynasm/dynasm.lua")); + dynasm_run.addFileArg(getDynasmLua(b, upstream)); // TODO: Many more flags to figure out if (target.result.cpu.arch.endian() == .little) { @@ -145,7 +145,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin. buildvm_ljvm.addArg("-o"); if (target.result.os.tag == .windows) { - const ljvm_ob = buildvm_ljvm.addOutputFileArg("lj_vm. o"); + const ljvm_ob = buildvm_ljvm.addOutputFileArg("lj_vm.o"); lib.addObjectFile(ljvm_ob); } else { const ljvm_asm = buildvm_ljvm.addOutputFileArg("lj_vm.S"); @@ -268,3 +268,34 @@ const luajit_vm = luajit_lib ++ [_][]const u8{ "src/lib_aux.c", "src/lib_init.c", }; + +fn getDynasmLua(b: *std.Build, upstream: *std.Build.Dependency) std.Build.LazyPath { + if (b.host.result.os.tag == .windows) { + // https://ziglang.org/learn/build-system/#mutating-source + + // make modified dynasm.lua + const escape = b.addExecutable(.{ + .target = b.host, + .name = "replace_backslash", + .root_source_file = b.path("build/replace_backslash.zig"), + }); + const run = b.addRunArtifact(escape); + run.addFileArg(upstream.path("dynasm/dynasm.lua")); + const generated_dynasm_lua = run.addOutputFileArg("dynasm.lua"); + + // wf + // + dynasm/ + // + dynasm.lua: replace backslash to slash + // + dasm_x64.lua + // + dasm_x86.lua + const wf = b.addWriteFiles(); + _ = wf.addCopyFile(generated_dynasm_lua, "dynasm/dynasm.lua"); + _ = wf.addCopyFile(upstream.path("dynasm/dasm_x64.lua"), "dynasm/dasm_x64.lua"); + _ = wf.addCopyFile(upstream.path("dynasm/dasm_x86.lua"), "dynasm/dasm_x86.lua"); + + // return modified version + return wf.getDirectory().path(b, "dynasm/dynasm.lua"); + } else { + return upstream.path("dynasm/dynasm.lua"); + } +} diff --git a/build/replace_backslash.zig b/build/replace_backslash.zig new file mode 100644 index 0000000..ba27151 --- /dev/null +++ b/build/replace_backslash.zig @@ -0,0 +1,46 @@ +const std = @import("std"); + +pub fn main() !void { + var arena_state = std.heap.ArenaAllocator.init(std.heap.page_allocator); + defer arena_state.deinit(); + const arena = arena_state.allocator(); + + const args = try std.process.argsAlloc(arena); + + if (args.len != 3) fatal("wrong number of arguments", .{}); + + const input_file_path = args[1]; + var input_file = std.fs.cwd().openFile(input_file_path, .{}) catch |err| { + fatal("unable to open '{s}': {s}", .{ input_file_path, @errorName(err) }); + }; + defer input_file.close(); + + const output_file_path = args[2]; + var output_file = std.fs.cwd().createFile(output_file_path, .{}) catch |err| { + fatal("unable to open '{s}': {s}", .{ output_file_path, @errorName(err) }); + }; + defer output_file.close(); + std.debug.print("{s}\n", .{output_file_path}); + + var buf_reader = std.io.bufferedReader(input_file.reader()); + var in_stream = buf_reader.reader(); + var buf: [1024]u8 = undefined; + while (try in_stream.readUntilDelimiterOrEof(&buf, '\n')) |line| { + if (std.mem.indexOf(u8, line, "\"#line \"")) |_| { + // replace backslash to slash + _ = output_file.write( + \\ wline("#line "..g_lineno..' "'..g_fname:gsub("\\", "/")..'"') + ) catch @panic("write"); + } else { + _ = output_file.write(line) catch @panic("write"); + _ = output_file.write("\n") catch @panic("write"); + } + } + + return std.process.cleanExit(); +} + +fn fatal(comptime format: []const u8, args: anytype) noreturn { + std.debug.print(format, args); + std.process.exit(1); +}