From e5c28e0cb57ce8659feef93081eb28571a7131cf Mon Sep 17 00:00:00 2001 From: ImagineHaxing Date: Tue, 25 Aug 2026 20:34:56 +0300 Subject: [PATCH] Add (build, clean, run) subcommands for nob --- nob.c | 74 +++++++++++++++++++++++++++++++++++++++++-------------- shell.nix | 1 + 2 files changed, 56 insertions(+), 19 deletions(-) diff --git a/nob.c b/nob.c index 1c3c8c8..edf8ae8 100644 --- a/nob.c +++ b/nob.c @@ -167,37 +167,73 @@ bool build_bootable_image(Nob_Cmd *cmd) { return true; } +bool runQemu(Nob_Cmd *cmd) { + nob_cmd_append(cmd, "qemu-system-i386", "-cdrom", BUILD_FOLDER "kernel.iso"); + if (!nob_cmd_run(cmd)) + return false; + return true; +} + int main(int argc, char **argv) { NOB_GO_REBUILD_URSELF(argc, argv); + const char *program_name = shift(argv, argc); + bool clean = false; + bool run = false; // starts qemu + bool build = false; + while (argc > 0) { + const char *arg = shift(argv, argc); + if (strcmp(arg, "clean") == 0) + clean = true; + if (strcmp(arg, "run") == 0) + run = true; + if (strcmp(arg, "build") == 0) + build = true; + } - if (argc >= 2) { - if (strcmp(argv[1], "clean") == 0) { + if (clean) { + const char *dir_path = BUILD_FOLDER; + + Nob_Dir_Entry dir = {0}; + if (!nob_dir_entry_open(dir_path, &dir)) { + nob_log(NOB_INFO, "No build directory to clean. Skipping..."); + } else { if (!clean_dir(BUILD_FOLDER)) return 1; - } else { - nob_log(NOB_INFO, "Usage: %s (clean)", argv[0]); - return 1; + nob_delete_file(BUILD_FOLDER); } } - if (!nob_mkdir_if_not_exists(BUILD_FOLDER)) - return 1; + if (build) { + if (!nob_mkdir_if_not_exists(BUILD_FOLDER)) + return 1; - Nob_Cmd cmd = {0}; + Nob_Cmd cmd = {0}; - if (!render_clangd_config()) - return 1; + if (!render_clangd_config()) + return 1; - if (!build_assembly(&cmd)) - return 1; - if (!build_c(&cmd)) - return 1; - if (!link_everything(&cmd)) - return 1; - if (!check_kernel(&cmd)) - return 1; - if (!build_bootable_image(&cmd)) + if (!build_assembly(&cmd)) + return 1; + if (!build_c(&cmd)) + return 1; + if (!link_everything(&cmd)) + return 1; + if (!check_kernel(&cmd)) + return 1; + if (!build_bootable_image(&cmd)) + return 1; + } + + if (run) { + Nob_Cmd cmd = {0}; + if (!runQemu(&cmd)) + return 1; + } + + if (!clean && !build && !run) { + nob_log(NOB_INFO, "Usage: %s (build || clean || run)", program_name); return 1; + } return 0; } diff --git a/shell.nix b/shell.nix index 3215af9..bce4969 100644 --- a/shell.nix +++ b/shell.nix @@ -8,6 +8,7 @@ pkgs.mkShell { gdb grub2 xorriso + qemu ]; shellHook = ''