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 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 gdb_opt = b.option(bool, "gdb", "Run executable under gdb") orelse false; const comp_opts = b.addOptions(); comp_opts.addOption(bool, "gdb", gdb_opt); const unit_tests = b.addTest(.{ .root_module = b.createModule(.{ .optimize = optimize, .target = target, .root_source_file = b.path("tests/test.zig"), }), }); const test_step = b.step("test", "Test the library"); const run_elfo_step = b.step("elfo", "See the pretty elfo!"); const run_gloves_step = b.step("gloves", "See the pretty gloves!"); const run_steps = [_]struct { *std.Build.Step, *std.Build.Step.Compile }{ .{ test_step, unit_tests }, .{ run_elfo_step, elfo }, .{ run_gloves_step, gloves }, }; const gdbscript = b.addWriteFile("gdbscript", \\r ); for (run_steps) |run| { run.@"1".root_module.addOptions("meta", comp_opts); if (gdb_opt) { 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); } } }