const std = @import("std"); const frida = @import("build/frida-gum.zig"); const capstone = @import("build/capstone.zig").capstone; pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const vaxis_dep = b.dependency("vaxis", .{}); const gloves_module = b.createModule(.{ .root_source_file = b.path("src/gloves.zig"), .target = target, .optimize = optimize, .link_libc = true, }); const elfo = b.addExecutable(.{ .name = "elfo", .root_module = b.createModule(.{ .root_source_file = b.path("src/elfo.zig"), .target = target, .optimize = optimize, .link_libc = true, }), }); const shock = b.addExecutable(.{ .name = "shock", .root_module = b.createModule(.{ .root_source_file = b.path("src/shock.zig"), .target = target, .optimize = optimize, .link_libc = true, }), }); shock.root_module.addImport("vaxis", vaxis_dep.module("vaxis")); const capstone_lib = capstone(b, .{ .optimize = optimize, .target = target, }); const frida_lib = frida.gum_stalker(b, .{ .optimize = optimize, .target = target, }); frida_lib.step.dependOn(&capstone_lib.step); frida_lib.root_module.linkLibrary(capstone_lib); b.installArtifact(capstone_lib); b.installArtifact(frida_lib); elfo.root_module.linkLibrary(capstone_lib); elfo.root_module.addImport("capstone", capstone_lib.root_module); const gloves = b.addExecutable(.{ .name = "gloves", .root_module = gloves_module, }); b.installArtifact(elfo); b.installArtifact(gloves); const opt_gdb = b.option(bool, "gdb", "Run executable under gdb") orelse false; const comp_opts = b.addOptions(); comp_opts.addOption(bool, "gdb", opt_gdb); const unit_tests = b.addTest(.{ .root_module = b.createModule(.{ .optimize = optimize, .target = target, .root_source_file = b.path("tests/test.zig"), }), }); // Looooopy const c_file = b.createModule(.{ .optimize = .ReleaseFast, .target = target, .link_libc = true, }); const c_test_exe = b.addExecutable(.{ .root_module = c_file, .name = "sample_exe", }); c_file.addCSourceFile(.{ .file = b.path("tests/c/hello-world.c") }); const runner = b.addRunArtifact(elfo); runner.addArtifactArg(c_test_exe); const loop_step = b.step("loop", "Interative Programming Loop! you should run it with watch: i.e. zig build loop --watch"); loop_step.dependOn(&runner.step); // --- const zls_check = b.step("check", "Check if the program compiles"); zls_check.dependOn(&elfo.step); zls_check.dependOn(&shock.step); zls_check.dependOn(&unit_tests.step); const run_steps = [_]struct { *std.Build.Step, *std.Build.Step.Compile }{ .{ b.step("test", "Run unit tests"), unit_tests }, .{ b.step("elfo", "See the pretty elfo!"), elfo }, .{ b.step("gloves", "See the pretty gloves!"), gloves }, .{ b.step("shock", "SHOCK something!"), shock }, }; const gdbscript = b.addWriteFile("gdbscript", \\r ); for (run_steps) |run| { run.@"1".root_module.addOptions("meta", comp_opts); if (opt_gdb) { const run_gdb = b.addSystemCommand(&.{"gdb"}); run_gdb.addArg("-x"); run_gdb.addFileArg(gdbscript.getDirectory().path(b, "gdbscript")); run_gdb.addArtifactArg(run.@"1"); run.@"0".dependOn(&run_gdb.step); } else { const run_unit = b.addRunArtifact(run.@"1"); run.@"0".dependOn(&run_unit.step); } } }