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 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, }), }); 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 gcc_test = b.addSystemCommand(&.{"gcc"}); gcc_test.addFileArg(b.path("tests/c/hello-world.c")); gcc_test.addArg("-o"); const gcc_hello_file = gcc_test.addOutputFileArg("hello-world"); const runner = b.addRunArtifact(shock); runner.addFileArg(gcc_hello_file); runner.addFileArg(gcc_hello_file); 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 test_step = b.step("test", "Run unit tests"); const run_elfo_step = b.step("elfo", "See the pretty elfo!"); const run_shock_step = b.step("shock", "SHOCK something!"); const run_gloves_step = b.step("gloves", "See the pretty gloves!"); 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 }{ .{ test_step, unit_tests }, .{ run_elfo_step, elfo }, .{ run_gloves_step, gloves }, .{ run_shock_step, 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); } } }