@@ -3,6 +3,8 @@ const std = @import("std");
3
3
const Build = std .Build ;
4
4
const Step = std .Build .Step ;
5
5
6
+ const applyPatchToFile = @import ("utils.zig" ).applyPatchToFile ;
7
+
6
8
pub fn configure (b : * Build , target : Build.ResolvedTarget , optimize : std.builtin.OptimizeMode , upstream : * Build.Dependency , shared : bool ) * Step.Compile {
7
9
// TODO: extract this to the main build function because it is shared between all specialized build functions
8
10
@@ -24,7 +26,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
24
26
// Compile minilua interpreter used at build time to generate files
25
27
const minilua = b .addExecutable (.{
26
28
.name = "minilua" ,
27
- .target = target , // TODO ensure this is the host
29
+ .target = b . graph . host , // Use host target for cross build
28
30
.optimize = .ReleaseSafe ,
29
31
});
30
32
minilua .linkLibC ();
@@ -39,7 +41,28 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
39
41
40
42
// Generate the buildvm_arch.h file using minilua
41
43
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
+ }
43
66
44
67
// TODO: Many more flags to figure out
45
68
if (target .result .cpu .arch .endian () == .little ) {
@@ -55,6 +78,10 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
55
78
dynasm_run .addArgs (&.{ "-D" , "FPU" , "-D" , "HFABI" });
56
79
}
57
80
81
+ if (target .result .cpu .arch == .aarch64 or target .result .cpu .arch == .aarch64_be ) {
82
+ dynasm_run .addArgs (&.{ "-D" , "DUALNUM" });
83
+ }
84
+
58
85
if (target .result .os .tag == .windows ) dynasm_run .addArgs (&.{ "-D" , "WIN" });
59
86
60
87
dynasm_run .addArg ("-o" );
@@ -81,7 +108,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
81
108
// Compile the buildvm executable used to generate other files
82
109
const buildvm = b .addExecutable (.{
83
110
.name = "buildvm" ,
84
- .target = target , // TODO ensure this is the host
111
+ .target = b . graph . host , // Use host target for cross build
85
112
.optimize = .ReleaseSafe ,
86
113
});
87
114
buildvm .linkLibC ();
@@ -96,12 +123,18 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
96
123
buildvm .step .dependOn (& dynasm_run .step );
97
124
buildvm .step .dependOn (& genversion_run .step );
98
125
126
+ const buildvm_c_flags = switch (target .result .cpu .arch ) {
127
+ .aarch64 , .aarch64_be = > &[_ ][]const u8 { "-DLUAJIT_TARGET=LUAJIT_ARCH_arm64" , "-DLJ_ARCH_HASFPU=1" , "-DLJ_ABI_SOFTFP=0" },
128
+ else = > &[_ ][]const u8 {},
129
+ };
130
+
99
131
buildvm .addCSourceFiles (.{
100
132
.root = .{ .dependency = .{
101
133
.dependency = upstream ,
102
134
.sub_path = "" ,
103
135
} },
104
136
.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 ,
105
138
});
106
139
107
140
buildvm .addIncludePath (upstream .path ("src" ));
@@ -156,7 +189,7 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
156
189
157
190
buildvm_ljvm .addArg ("-o" );
158
191
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" );
160
193
lib .addObjectFile (ljvm_ob );
161
194
} else {
162
195
const ljvm_asm = buildvm_ljvm .addOutputFileArg ("lj_vm.S" );
@@ -210,6 +243,11 @@ pub fn configure(b: *Build, target: Build.ResolvedTarget, optimize: std.builtin.
210
243
return lib ;
211
244
}
212
245
246
+ fn getPath (lazy_path : Build.LazyPath , src_builder : * Build , asking_step : ? * Step ) []const u8 {
247
+ const p = lazy_path .getPath3 (src_builder , asking_step );
248
+ return src_builder .pathResolve (&.{ p .root_dir .path orelse "." , p .sub_path });
249
+ }
250
+
213
251
const luajit_lib = [_ ][]const u8 {
214
252
"src/lib_base.c" ,
215
253
"src/lib_math.c" ,
0 commit comments