#include #include #include #include #include #include #include int status; #define RUN_CMD(...) do { \ if (fork() == 0) { \ char* args[] = __VA_ARGS__; \ print_cmd(args); \ execvp(args[0], args); \ return 0; \ } else { \ wait(&status); \ } \ } while (0); void print_cmd(char** args) { int i = 0; while (args[i] != NULL) { printf("%s ", args[i++]); } printf("\n"); } int clean_mode(); int test_mode(); int server_mode(); int engine_mode(); // 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; } #define ENGINE_O "output/engine.o" #define SERVER_O "output/server.o" #define LOG_O "output/log.o" #define LOGGER_C "src/logger/logger.c" int main(int argc, char** argv) { if (needs_rebuild(argv[0], __FILE__)) { RUN_CMD({"gcc", __FILE__, "-o", argv[0], NULL}); if (status != 0) { // gcc error return 0; } print_cmd(argv); execvp(argv[0], argv); } RUN_CMD({"rm", "/dev/mqueue/logs", NULL}); RUN_CMD({"mkdir", "-p", "output", NULL}); RUN_CMD({"gcc", "src/log.c", "-o", LOG_O, NULL}); if (argc > 1) { if (strcmp(argv[1], "test") == 0) { return test_mode(); } if (strcmp(argv[1], "server") == 0) { return server_mode(); } if (strcmp(argv[1], "clean") == 0) { return clean_mode(); } } return engine_mode(); } int clean_mode() { char* args[] = {"rm", "-r", "output", NULL}; print_cmd(args); execvp(args[0], args); return 0; } int test_mode() { RUN_CMD({"gcc", "generate/find_tests.c", LOGGER_C, "-o", "output/find_tests.o", NULL}); RUN_CMD({"./output/find_tests.o", NULL}); printf("\n"); RUN_CMD({"gcc", "tests/main.c", LOGGER_C, "-o", "output/test.o", NULL}); char* args[] = {LOG_O, "./output/test.o", NULL}; print_cmd(args); execvp(args[0], args); return 0; } int server_mode() { RUN_CMD({"rm", "/dev/mqueue/server_to_engine", "/dev/mqueue/engine_to_server", NULL}); RUN_CMD({"gcc", "src/server.c", LOGGER_C, "-lcrypto", "-o", SERVER_O, NULL}); RUN_CMD({"gcc", "src/engine.c", LOGGER_C, "-o", ENGINE_O, NULL}); char* args[] = {LOG_O, SERVER_O, ENGINE_O, NULL}; print_cmd(args); execvp(args[0], args); return 0; } int engine_mode() { RUN_CMD({"gcc", "src/engine.c", LOGGER_C, "-o", ENGINE_O, NULL}); char* args[] = {LOG_O, ENGINE_O, NULL}; print_cmd(args); execvp(args[0], args); return 0; }