#include #define NOB_IMPLEMENTATION #define NOB_STRIP_PREFIX #include "nob.h" #define BUILD_FOLDER "build/" #define SRC_FOLDER "src/" #define RES_FOLDER "res/" #define len NOB_ARRAY_LEN const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client", "-lxkbcommon", "-lvulkan", "-lglfw"}; const char *blacklist[] = {"parser.c", "paw_shh_gen.c"}; const char *comp = "cc"; const char *scomp = "glslc"; Nob_File_Paths src_cpaths = {0}; Procs procs = {0}; Cmd cmd = {0}; bool process_res(char *res_base) { printf("reading %s\n", res_base); Nob_File_Paths res_paths = {0}; if (!read_entire_dir(res_base, &res_paths)) { return false; } for (int i = 0; i < res_paths.count; i++) { if (*res_paths.items[i] == '.') { continue; } char *path = (char *)res_paths.items[i]; switch (get_file_type(temp_sprintf("%s%s", res_base, path))) { case NOB_FILE_REGULAR:; bool blacklisted = false; for (int i = 0; i < len(blacklist); i++) { if (strcmp(path, blacklist[i]) == 0) { printf("skipping %s\n", path); blacklisted = true; } } if (!blacklisted) { char *tmp = path; while (*tmp != '.') { tmp++; } if (memcmp(tmp + 1, "vert", strlen("vert")) == 0 || memcmp(tmp + 1, "frag", strlen("frag")) == 0) { *tmp = 0x0; char *output = temp_sprintf("%s%s%s", res_base, path, ".spv"); char *input = temp_sprintf("%s%s.%s", res_base, path, tmp + 1); if (nob_needs_rebuild(output, (const char **)&input, 1)) { // path now looks like meooow 0x0 glsl cmd_append(&cmd, scomp, "-c"); cmd_append(&cmd, "-o", input, output); da_append(&procs, cmd_run_async_and_reset(&cmd)); } else { printf("skipping %s, already up to date\n", input); } } } break; case NOB_FILE_DIRECTORY:; char *folder_path = temp_sprintf("%s%s", res_base, res_paths.items[i]); if (!process_res( temp_sprintf("%s%s%c", res_base, res_paths.items[i], '/'))) { return false; } break; case NOB_FILE_SYMLINK: nob_log(ERROR, "symlink"); return false; case NOB_FILE_OTHER: nob_log(ERROR, "other"); return false; } } return true; } // base is assumed to be .mew/meooow/nyaa/ or something, note the slashes bool discover_build(char *src_base, char *build_base) { Nob_File_Paths src_paths = {0}; if (!read_entire_dir(src_base, &src_paths)) { return false; } for (int i = 0; i < src_paths.count; i++) { if (*src_paths.items[i] == '.') { continue; } char *path = (char *)src_paths.items[i]; switch (get_file_type(temp_sprintf("%s%s", src_base, path))) { case NOB_FILE_REGULAR:; bool blacklisted = false; for (int i = 0; i < len(blacklist); i++) { if (strcmp(path, blacklist[i]) == 0) { printf("skipping %s\n", path); blacklisted = true; } } if (!blacklisted) { char *tmp = path; while (*tmp != '.') { tmp++; } if (*(tmp + 1) == 'c') { *tmp = 0x0; char *output = temp_sprintf("%s%s%s", build_base, path, ".o"); char *input = temp_sprintf("%s%s%s", src_base, path, ".c"); if (nob_needs_rebuild(output, (const char **)&input, 1)) { // path now looks like meooow 0x0 c cmd_append(&cmd, comp, "-c"); for (int j = 0; j < len(cflags); j++) { cmd_append(&cmd, cflags[j]); } cmd_append(&cmd, "-o", output, temp_sprintf("%s%s%s", src_base, path, ".c")); da_append(&procs, cmd_run_async_and_reset(&cmd)); } else { printf("skipping %s, already up to date\n", input); } da_append(&src_cpaths, temp_sprintf("%s%s%s", build_base, path, ".o")); } } break; case NOB_FILE_DIRECTORY:; char *folder_path = temp_sprintf("%s%s", build_base, src_paths.items[i]); if (!mkdir_if_not_exists(folder_path)) { return false; } if (!discover_build( temp_sprintf("%s%s%c", src_base, src_paths.items[i], '/'), temp_sprintf("%s%s%c", build_base, src_paths.items[i], '/'))) { return false; } break; case NOB_FILE_SYMLINK: nob_log(ERROR, "symlink"); return false; case NOB_FILE_OTHER: nob_log(ERROR, "other"); return false; } } return true; } int main(int argc, char **argv) { NOB_GO_REBUILD_URSELF(argc, argv); if (!mkdir_if_not_exists(BUILD_FOLDER)) { return 1; } if (!discover_build(SRC_FOLDER, BUILD_FOLDER)) { return 1; } if (!process_res(RES_FOLDER)) { return 1; } if (!procs_wait_and_reset(&procs)) { return 1; } cmd_append(&cmd, comp); for (int j = 0; j < len(cflags); j++) { cmd_append(&cmd, cflags[j]); } cmd_append(&cmd, "-o", "main", "main.c"); for (int i = 0; i < src_cpaths.count; i++) { cmd_append(&cmd, src_cpaths.items[i]); } cmd_run_sync_and_reset(&cmd); cmd_append(&cmd, comp); for (int j = 0; j < len(cflags); j++) { cmd_append(&cmd, cflags[j]); } cmd_append(&cmd, "-o", "test", "./src/test/paw_shh_gen.c"); for (int i = 0; i < src_cpaths.count; i++) { cmd_append(&cmd, src_cpaths.items[i]); } cmd_run_sync_and_reset(&cmd); return 0; }