2121const std = @import ("std" );
2222const cpu_util = @import ("src/main/zig/cpuid/cpu_util.zig" );
2323const zanama = @import ("zanama" );
24- const TargetCombination = struct {
25- os : std.Target.Os.Tag ,
26- cpu_arch : std.Target.Cpu.Arch ,
27- baseline_model : * const std.Target.Cpu.Model ,
24+
25+ const base_targets = [_ ]std.Target.Query {
26+ .{ .os_tag = .linux , .cpu_arch = .x86_64 , .abi = .gnu , .cpu_model = .{ .explicit = & std .Target .x86 .cpu .x86_64 } },
27+ .{ .os_tag = .windows , .cpu_arch = .x86_64 , .abi = .gnu , .cpu_model = .{ .explicit = & std .Target .x86 .cpu .x86_64 } },
28+ .{ .os_tag = .linux , .cpu_arch = .aarch64 , .abi = .gnu , .cpu_model = .{ .explicit = & std .Target .aarch64 .cpu .generic } },
29+ .{ .os_tag = .macos , .cpu_arch = .aarch64 , .abi = .none , .cpu_model = .{ .explicit = & std .Target .aarch64 .cpu .generic } },
30+ .{ .os_tag = .windows , .cpu_arch = .aarch64 , .abi = .gnu , .cpu_model = .{ .explicit = & std .Target .aarch64 .cpu .generic } },
2831};
32+
2933pub fn build (b : * std.Build ) void {
30- const zanama_dep = b .dependency ("zanama" , .{});
31- const zb = zanama .Build .init (b , .ReleaseFast , zanama_dep );
34+ const packer = createPackerTask (b );
35+ const targets = getTargets (b );
36+
37+ //JNI stubs
38+ for (targets .baseline ) | target | {
39+ const triple = target .query .zigTriple (b .allocator ) catch @panic ("OOM" );
40+ const jni_dep = b .dependency ("jni" , .{
41+ .target = target ,
42+ .optimize = .ReleaseFast ,
43+ });
44+ const jni_module = jni_dep .module ("JNI" );
45+
46+ const libjni_mod = b .createModule (.{
47+ .root_source_file = b .path ("src/main/zig/libjni.zig" ),
48+ .target = target ,
49+ .optimize = .ReleaseFast ,
50+ .strip = true ,
51+ });
52+ const name = std .mem .concat (b .allocator , u8 , &.{ "jni-" , triple , "-" , target .query .cpu_model .explicit .name }) catch @panic ("OOM" );
53+ libjni_mod .addImport ("jni" , jni_module );
54+ const libjni = b .addLibrary (.{
55+ .linkage = .dynamic ,
56+ .name = name ,
57+ .root_module = libjni_mod ,
58+ });
59+ packer .addArg (name );
60+ packer .addFileArg (libjni .getEmittedBin ());
61+ }
62+
63+ const zanamaBuilder = ZanamaLibBuilder .init (b , packer );
64+
65+ zanamaBuilder .addZanamaLibs (
66+ "cpuid" ,
67+ b .createModule (.{
68+ .root_source_file = b .path ("src/main/zig/cpuid/lib.zig" ),
69+ .optimize = .ReleaseSmall ,
70+ .strip = true ,
71+ }),
72+ targets .baseline ,
73+ );
74+
75+ zanamaBuilder .addZanamaLibs (
76+ "FalseTweaks" ,
77+ b .createModule (.{
78+ .root_source_file = b .path ("src/main/zig/lib.zig" ),
79+ .optimize = .ReleaseFast ,
80+ .strip = true ,
81+ }),
82+ targets .all ,
83+ );
84+ }
3285
86+ fn createPackerTask (b : * std.Build ) * std.Build.Step.Run {
3387 const packer = b .addExecutable (.{
3488 .name = "packer" ,
3589 .root_module = b .addModule ("packer" , .{
@@ -39,98 +93,65 @@ pub fn build(b: *std.Build) void {
3993 });
4094 const run_packer = b .addRunArtifact (packer );
4195 const natives_file = "natives.pak" ;
42- const install_step = b .getInstallStep ();
43- install_step .dependOn (& b .addInstallLibFile (run_packer .addOutputFileArg (natives_file ), natives_file ).step );
44- const target_combos = [_ ]TargetCombination {
45- .{.os = .linux , .cpu_arch = .x86_64 , .baseline_model = & std .Target .x86 .cpu .x86_64 },
46- .{.os = .windows , .cpu_arch = .x86_64 , .baseline_model = & std .Target .x86 .cpu .x86_64 },
47- .{.os = .linux , .cpu_arch = .aarch64 , .baseline_model = & std .Target .aarch64 .cpu .generic }
48- };
49- for (target_combos ) | combo | {
50- const baseline_target = b .resolveTargetQuery (.{
51- .os_tag = combo .os ,
52- .cpu_arch = combo .cpu_arch ,
53- .cpu_model = .{ .explicit = combo .baseline_model },
54- .abi = .gnu ,
55- });
56- const baseline_triple = baseline_target .query .zigTriple (b .allocator ) catch @panic ("OOM" );
57- {
58- const jni_dep = b .dependency ("jni" , .{
59- .target = baseline_target ,
60- .optimize = .ReleaseFast ,
61- });
62- const jni_module = jni_dep .module ("JNI" );
96+ const output_natives_file = run_packer .addOutputFileArg (natives_file );
97+ const install_pack = b .addInstallLibFile (output_natives_file , natives_file );
98+ b .getInstallStep ().dependOn (& install_pack .step );
99+ return run_packer ;
100+ }
63101
64- const libjni_mod = b .createModule (.{
65- .root_source_file = b .path ("src/main/zig/libjni.zig" ),
66- .target = baseline_target ,
67- .optimize = .ReleaseFast ,
68- .strip = true ,
69- });
70- const name = std .mem .concat (b .allocator , u8 , &.{"jni-" , baseline_triple , "-" , baseline_target .query .cpu_model .explicit .name }) catch @panic ("OOM" );
71- libjni_mod .addImport ("jni" , jni_module );
72- const libjni = b .addLibrary (.{
73- .linkage = .dynamic ,
74- .name = name ,
75- .root_module = libjni_mod ,
76- });
77- run_packer .addArg (name );
78- run_packer .addFileArg (libjni .getEmittedBin ());
79- }
80- {
81- const libcpuid_mod = b .createModule (.{
82- .root_source_file = b .path ("src/main/zig/cpuid/lib.zig" ),
83- .target = baseline_target ,
84- .optimize = .ReleaseSmall ,
85- .strip = true ,
86- .imports = &.{
87- .{ .name = "zanama" , .module = zanama_dep .module ("api" ) },
88- }
89- });
90- const libs = zb .createZanamaLibsResolved ("cpuid" , libcpuid_mod , &.{baseline_target });
91- for (libs .artifacts ) | artifact | {
92- run_packer .addArg (artifact .name );
93- run_packer .addFileArg (artifact .getEmittedBin ());
94- }
95- const install_json = b .addInstallFile (libs .json , "cpuid.json" );
96- install_json .step .dependOn (libs .json_step );
97- install_step .dependOn (& install_json .step );
102+ fn getTargets (b : * std.Build ) struct { baseline : []std.Build.ResolvedTarget , all : []std .Build .ResolvedTarget } {
103+ var baseline_targets : [base_targets .len ]std.Build.ResolvedTarget = undefined ;
104+ var targets = std .ArrayList (std .Build .ResolvedTarget ).empty ;
105+ defer targets .deinit (b .allocator );
106+ for (base_targets , 0.. ) | base , combo_index | {
107+ baseline_targets [combo_index ] = b .resolveTargetQuery (base );
108+ const supported_models = switch (base .cpu_arch .? ) {
109+ .aarch64 = > cpu_util .supported_models_aarch64 ,
110+ .x86_64 = > cpu_util .supported_models_x86 ,
111+ else = > @panic (std .mem .concat (b .allocator , u8 , &.{ "Unsupported CPU arch " , @tagName (base .cpu_arch .? ) }) catch @panic ("OOM" )),
112+ };
113+
114+ for (supported_models ) | model | {
115+ var model_query = base ;
116+ model_query .cpu_model = .{ .explicit = model };
117+ targets .append (b .allocator , b .resolveTargetQuery (model_query )) catch @panic ("OOM" );
98118 }
99- {
100- const supported_models = switch (combo .cpu_arch ) {
101- .aarch64 = > cpu_util .supported_models_aarch64 ,
102- .x86_64 = > cpu_util .supported_models_x86 ,
103- else = > @panic (std .mem .concat (b .allocator , u8 , &.{"Unsupported CPU arch " , @tagName (combo .cpu_arch )}) catch @panic ("OOM" )),
104- };
105- const targets = b .allocator .alloc (std .Build .ResolvedTarget , supported_models .len ) catch @panic ("OOM" );
106- defer b .allocator .free (targets );
107-
108- for (supported_models , 0.. ) | model , i | {
109- targets [i ] = b .resolveTargetQuery (.{
110- .os_tag = combo .os ,
111- .cpu_arch = combo .cpu_arch ,
112- .cpu_model = .{ .explicit = model },
113- .abi = .gnu ,
114- });
115- }
116- const lib_mod = b .createModule (.{
117- .root_source_file = b .path ("src/main/zig/lib.zig" ),
118- .optimize = .ReleaseFast ,
119- .strip = true ,
120- .imports = &.{
121- .{ .name = "zanama" , .module = zanama_dep .module ("api" ) },
122- }
123- });
119+ }
120+ return .{
121+ .baseline = b .allocator .dupe (std .Build .ResolvedTarget , & baseline_targets ) catch @panic ("OOM" ),
122+ .all = targets .toOwnedSlice (b .allocator ) catch @panic ("OOM" ),
123+ };
124+ }
125+
126+ const ZanamaLibBuilder = struct {
127+ b : * std.Build ,
128+ packer : * std.Build.Step.Run ,
129+ zanama_dep : * std.Build.Dependency ,
130+ zanama_api : * std.Build.Module ,
131+ zb : zanama.Build ,
124132
125- const libs = zb .createZanamaLibsResolved ("FalseTweaks" , lib_mod , targets );
133+ pub fn init (b : * std.Build , packer : * std.Build.Step.Run ) ZanamaLibBuilder {
134+ const zanama_dep = b .dependency ("zanama" , .{});
135+ const zanama_api = zanama_dep .module ("api" );
136+ const zb = zanama .Build .init (b , .ReleaseFast , zanama_dep );
137+ return .{
138+ .b = b ,
139+ .packer = packer ,
140+ .zanama_dep = zanama_dep ,
141+ .zanama_api = zanama_api ,
142+ .zb = zb ,
143+ };
144+ }
126145
127- for (libs .artifacts ) | artifact | {
128- run_packer .addArg (artifact .name );
129- run_packer .addFileArg (artifact .getEmittedBin ());
130- }
131- const install_json = b .addInstallFile (libs .json , "FalseTweaks.json" );
132- install_json .step .dependOn (libs .json_step );
133- install_step .dependOn (& install_json .step );
146+ fn addZanamaLibs (self : * const ZanamaLibBuilder , name : []const u8 , module : * std.Build.Module , targets : []std.Build.ResolvedTarget ) void {
147+ module .addImport ("zanama" , self .zanama_api );
148+ const libs = self .zb .createZanamaLibsResolved (name , module , targets );
149+ for (libs .artifacts ) | artifact | {
150+ self .packer .addArg (artifact .name );
151+ self .packer .addFileArg (artifact .getEmittedBin ());
134152 }
153+ const install_json = self .b .addInstallFile (libs .json , std .mem .concat (self .b .allocator , u8 , &.{name , ".json" }) catch @panic ("OOM" ));
154+ install_json .step .dependOn (libs .json_step );
155+ self .b .getInstallStep ().dependOn (& install_json .step );
135156 }
136- }
157+ };
0 commit comments