@@ -3,6 +3,8 @@ const std = @import("std");
33const Build = std .Build ;
44const Step = std .Build .Step ;
55
6+ const applyPatchToFile = @import ("utils.zig" ).applyPatchToFile ;
7+
68pub fn configure (b : * Build , target : Build.ResolvedTarget , optimize : std.builtin.OptimizeMode , upstream : * Build.Dependency , shared : bool ) * Step.Compile {
79 // TODO: extract this to the main build function because it is shared between all specialized build functions
810
@@ -24,7 +26,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
2426 // Compile minilua interpreter used at build time to generate files
2527 const minilua = b .addExecutable (.{
2628 .name = "minilua" ,
27- .target = target , // TODO ensure this is the host
29+ .target = b . graph . host , // Use host target for cross build
2830 .optimize = .ReleaseSafe ,
2931 });
3032 minilua .linkLibC ();
@@ -39,7 +41,28 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
3941
4042 // Generate the buildvm_arch.h file using minilua
4143 const dynasm_run = b .addRunArtifact (minilua );
42- dynasm_run .addFileArg (upstream .path ("dynasm/dynasm.lua" ));
44+
45+ if (b .graph .host .result .os .tag == .windows ) {
46+ // Patch windows cross build for LuaJIT
47+ const sourceDynasmFile = upstream .path ("dynasm/dynasm.lua" );
48+ const destDynasmFile = upstream .path ("dynasm/dynasm-patched.lua" );
49+ const patchDynasm = applyPatchToFile (b , b .graph .host , sourceDynasmFile , b .path ("build/luajit.patch" ), "dynasm-patched.lua" );
50+
51+ const copyPatchedDynasm = b .addSystemCommand (&[_ ][]const u8 {
52+ "cmd" ,
53+ });
54+ copyPatchedDynasm .addArgs (&.{ "/q" , "/c" , "copy" });
55+ copyPatchedDynasm .step .dependOn (& patchDynasm .run .step );
56+ copyPatchedDynasm .addFileArg (patchDynasm .output );
57+ copyPatchedDynasm .addFileArg (destDynasmFile );
58+
59+ dynasm_run .step .dependOn (& patchDynasm .run .step );
60+ dynasm_run .step .dependOn (& copyPatchedDynasm .step );
61+
62+ dynasm_run .addFileArg (destDynasmFile );
63+ } else {
64+ dynasm_run .addFileArg (upstream .path ("dynasm/dynasm.lua" ));
65+ }
4366
4467 // TODO: Many more flags to figure out
4568 if (target .result .cpu .arch .endian () == .little ) {
@@ -55,6 +78,10 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
5578 dynasm_run .addArgs (&.{ "-D" , "FPU" , "-D" , "HFABI" });
5679 }
5780
81+ if (target .result .cpu .arch == .aarch64 or target .result .cpu .arch == .aarch64_be ) {
82+ dynasm_run .addArgs (&.{ "-D" , "DUALNUM" });
83+ }
84+
5885 if (target .result .os .tag == .windows ) dynasm_run .addArgs (&.{ "-D" , "WIN" });
5986
6087 dynasm_run .addArg ("-o" );
@@ -81,7 +108,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
81108 // Compile the buildvm executable used to generate other files
82109 const buildvm = b .addExecutable (.{
83110 .name = "buildvm" ,
84- .target = target , // TODO ensure this is the host
111+ .target = b . graph . host , // Use host target for cross build
85112 .optimize = .ReleaseSafe ,
86113 });
87114 buildvm .linkLibC ();
@@ -96,12 +123,18 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
96123 buildvm .step .dependOn (& dynasm_run .step );
97124 buildvm .step .dependOn (& genversion_run .step );
98125
126+ const buildvm_c_flags : []const []const u8 = switch (target .result .cpu .arch ) {
127+ .aarch64 , .aarch64_be = > &.{ "-DLUAJIT_TARGET=LUAJIT_ARCH_arm64" , "-DLJ_ARCH_HASFPU=1" , "-DLJ_ABI_SOFTFP=0" },
128+ else = > &.{},
129+ };
130+
99131 buildvm .addCSourceFiles (.{
100132 .root = .{ .dependency = .{
101133 .dependency = upstream ,
102134 .sub_path = "" ,
103135 } },
104136 .files = &.{ "src/host/buildvm_asm.c" , "src/host/buildvm_fold.c" , "src/host/buildvm_lib.c" , "src/host/buildvm_peobj.c" , "src/host/buildvm.c" },
137+ .flags = buildvm_c_flags ,
105138 });
106139
107140 buildvm .addIncludePath (upstream .path ("src" ));
@@ -156,7 +189,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
156189
157190 buildvm_ljvm .addArg ("-o" );
158191 if (target .result .os .tag == .windows ) {
159- const ljvm_ob = buildvm_ljvm .addOutputFileArg ("lj_vm. o" );
192+ const ljvm_ob = buildvm_ljvm .addOutputFileArg ("lj_vm.o" );
160193 lib .addObjectFile (ljvm_ob );
161194 } else {
162195 const ljvm_asm = buildvm_ljvm .addOutputFileArg ("lj_vm.S" );
0 commit comments