#include #include #include #include #include #include #include void print_cmd(char** args) { int i = 0; while (args[i] != NULL) { printf("%s ", args[i++]); } printf("\n"); } // https://github.com/tsoding/nob.h/blob/0a08926d8094fc4ae678155c5d73ae21d1f96f3f/nob.h#L2413 int needs_rebuild(char* bin_file, char* source_file) { struct stat statbuf = {0}; if (stat(bin_file, &statbuf) < 0) { if (errno == ENOENT) return 1; return -1; } time_t output_path_time = statbuf.st_mtime; if (stat(source_file, &statbuf) < 0) { fprintf(stderr, "could not stat %s: %s", source_file, strerror(errno)); return -1; } time_t input_path_time = statbuf.st_mtime; return input_path_time > output_path_time; } int main(int argc, char** argv) { if (needs_rebuild(argv[0], __FILE__)) { if (fork() == 0) { char* args[] = {"gcc", __FILE__, "-o", argv[0], NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); print_cmd(argv); execvp(argv[0], argv); } } if (fork() == 0) { char* args[] = {"mkdir", "-p", "output", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } if (argc > 1) { if (strcmp(argv[1], "test") == 0) { printf("Test mode\n"); if (fork() == 0) { char* args[] = {"gcc", "generate/find_tests.c", "-o", "output/find_tests.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } if (fork() == 0) { char* args[] = {"./output/find_tests.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } printf("\n"); if (fork() == 0) { char* args[] = {"gcc", "tests/main.c", "-o", "output/test.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } char* args[] = {"./output/test.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } if (strcmp(argv[1], "server") == 0) { printf("Server mode\n"); if (fork() == 0) { char* args[] = {"gcc", "src/server.c", "-lcrypto", "-o", "output/server.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } char* args[] = {"./output/server.o", "./output/main.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } } if (fork() == 0) { char* args[] = {"gcc", "src/main.c", "-o", "output/main.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } else { wait(NULL); } char* args[] = {"./output/main.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; }