2025-04-07 23:24:42 +02:00
|
|
|
#include <stdio.h>
|
|
|
|
#define NOB_IMPLEMENTATION
|
|
|
|
#define NOB_STRIP_PREFIX
|
|
|
|
#include "nob.h"
|
|
|
|
|
|
|
|
#define BUILD_FOLDER "build/"
|
|
|
|
#define SRC_FOLDER "src/"
|
2025-04-11 16:50:08 +02:00
|
|
|
#define RES_FOLDER "res/"
|
2025-04-07 23:24:42 +02:00
|
|
|
|
|
|
|
#define len NOB_ARRAY_LEN
|
|
|
|
|
|
|
|
const char *cflags[] = {"-g", "-rdynamic", "-lm", "-lwayland-client",
|
|
|
|
"-lxkbcommon", "-lvulkan", "-lglfw"};
|
2025-04-21 14:28:27 +02:00
|
|
|
const char *blacklist[] = {"parser.c", "paw_shh_gen.c"};
|
2025-04-11 16:50:08 +02:00
|
|
|
const char *comp = "cc";
|
|
|
|
const char *scomp = "glslc";
|
2025-04-07 23:24:42 +02:00
|
|
|
|
2025-04-11 16:50:08 +02:00
|
|
|
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;
|
2025-04-19 13:36:13 +02:00
|
|
|
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);
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
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) {
|
2025-04-07 23:24:42 +02:00
|
|
|
Nob_File_Paths src_paths = {0};
|
2025-04-11 16:50:08 +02:00
|
|
|
if (!read_entire_dir(src_base, &src_paths)) {
|
|
|
|
return false;
|
2025-04-07 23:24:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = 0; i < src_paths.count; i++) {
|
|
|
|
if (*src_paths.items[i] == '.') {
|
|
|
|
continue;
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
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;
|
2025-04-19 13:36:13 +02:00
|
|
|
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);
|
2025-04-11 16:50:08 +02:00
|
|
|
}
|
|
|
|
da_append(&src_cpaths,
|
|
|
|
temp_sprintf("%s%s%s", build_base, path, ".o"));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2025-04-07 23:24:42 +02:00
|
|
|
break;
|
|
|
|
case NOB_FILE_DIRECTORY:;
|
2025-04-11 16:50:08 +02:00
|
|
|
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;
|
2025-04-07 23:24:42 +02:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case NOB_FILE_SYMLINK:
|
|
|
|
nob_log(ERROR, "symlink");
|
2025-04-11 16:50:08 +02:00
|
|
|
return false;
|
2025-04-07 23:24:42 +02:00
|
|
|
case NOB_FILE_OTHER:
|
|
|
|
nob_log(ERROR, "other");
|
2025-04-11 16:50:08 +02:00
|
|
|
return false;
|
2025-04-07 23:24:42 +02:00
|
|
|
}
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
return true;
|
2025-04-07 23:24:42 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
int main(int argc, char **argv) {
|
|
|
|
NOB_GO_REBUILD_URSELF(argc, argv);
|
|
|
|
|
|
|
|
if (!mkdir_if_not_exists(BUILD_FOLDER)) {
|
|
|
|
return 1;
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
if (!discover_build(SRC_FOLDER, BUILD_FOLDER)) {
|
2025-04-07 23:24:42 +02:00
|
|
|
return 1;
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
if (!process_res(RES_FOLDER)) {
|
2025-04-07 23:24:42 +02:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
if (!procs_wait_and_reset(&procs)) {
|
|
|
|
return 1;
|
|
|
|
}
|
2025-04-11 16:50:08 +02:00
|
|
|
cmd_append(&cmd, comp);
|
2025-04-07 23:24:42 +02:00
|
|
|
for (int j = 0; j < len(cflags); j++) {
|
|
|
|
cmd_append(&cmd, cflags[j]);
|
|
|
|
}
|
2025-04-21 14:28:27 +02:00
|
|
|
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");
|
2025-04-11 16:50:08 +02:00
|
|
|
for (int i = 0; i < src_cpaths.count; i++) {
|
|
|
|
cmd_append(&cmd, src_cpaths.items[i]);
|
2025-04-07 23:24:42 +02:00
|
|
|
}
|
|
|
|
cmd_run_sync_and_reset(&cmd);
|
|
|
|
return 0;
|
|
|
|
}
|