pawengine/nob.c
2025-04-19 13:36:13 +02:00

178 lines
5.1 KiB
C

#include <stdio.h>
#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"};
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_layer", "main_layer.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;
}