#define GEBS_NO_PREFIX #define GEBS_IMPLEMENTATION #include "gebs/gebs.h" char *prog = NULL; #define DEBUG 1 int main(int argc, char ** argv) { rebuild_self(argc, argv, "cc", "-o", "build", "build.c"); prog = SHIFT(&argc, &argv); char *cmd = SHIFT(&argc, &argv); if (strcmp(cmd, "make") == 0) { RULE("./aboba", "./main.c", "./routes.c", "./routes.h", "./baked.c", "./baked.h", "./clonestr.h", "./commit.h", "./timer.c", "./timer.h", "./mongoose.o", "./gpp1", "./tmpls/home.html", "./tmpls/page-missing.html", "./tmpls/template-blog.html", "./tmpls/blog.html", "./etc/hotreload.js", "./etc/simple.min.css", "./blog/welcome.md", "./blog/weird-page.md", "./blog/curious-case-of-gebs.md" ) { RULE("./mongoose.o", "./mongoose/mongoose.c") { #if DEBUG CMD("cc", "-ggdb", "-c", "-fPIC", "-Wl,-z,execstack", "-D_GNU_SOURCE", "-o", "./mongoose.o", "./mongoose/mongoose.c"); #else CMD("cc", "-c", "-fPIC", "-Wl,-z,exectack", "-D_GNU_SOURCE", "-o", "./mongoose.o", "./mongoose/mongoose.c"); #endif } RULE("./gpp1", "./gpp/gpp.c") { CMD("cc", "-DHAVE_STRDUP", "-DHAVE_FNMATCH_H", "-o", "gpp1", "gpp/gpp.c"); } RULE("./commit.h") { String_Builder commit = {0}; defer { sb_free(&commit); } Cmd commit_get_cmd = {0}; defer { cmd_free(&commit_get_cmd); } cmd_append(&commit_get_cmd, "git"); cmd_append(&commit_get_cmd, "rev-parse"); cmd_append(&commit_get_cmd, "HEAD"); cmd_run_collect(&commit_get_cmd, &commit); commit.items[commit.count - 2] = '\0'; // \n -> \0 LOGI("Commit %s\n", commit.items); String_Builder header = {0}; defer { sb_free(&header); } sb_append_nstr(&header, "#ifndef COMMIT_H_\n"); sb_append_nstr(&header, "#define COMMIT_H_\n"); sb_append_nstr(&header, fmt("#define COMMIT_STRING \"%s\"\n", commit.items)); sb_append_nstr(&header, "#endif // COMMIT_H_\n"); FILE *out = fopen("./commit.h", "w"); if (out) { fwrite(header.items, header.count, 1, out); fclose(out); } } #if DEBUG CMD("cc", "-fPIC", "-ggdb", "-I.", "-DDEBUG=1", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE", "-Wl,-z,execstack", "-o", "./aboba", "./main.c", "./routes.c", "./baked.c", "./timer.c", "./mongoose.o", "./cJSON/cJSON.c", "./md5-c/md5.c", "-lpthread"); #else CMD("cc", "-fPIC", "-I.", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE", "-Wl,-z,execstack", "-o", "./aboba", "./main.c", "./routes.c", "./baked.c", "./timer.c", "./mongoose.o", "./cJSON/cJSON.c", "./md5-c/md5.c", "-lpthread"); #endif } } else if (strcmp(cmd, "clean") == 0) { remove1("./build"); remove1("./aboba"); remove("./mongoose.o"); remove("./gpp1"); remove("./watcher"); } else if (strcmp(cmd, "make-watcher") == 0) { CMD("cc", "-o", "watcher", "watcher.c"); } else if (strcmp(cmd, "watch") == 0) { CMD("./watcher", ".", "sh", "-c", "./build make && ./aboba"); } else if (strcmp(cmd, "help") == 0) { LOGI("Help:\n"); printf("%s make Build the application\n", prog); printf("%s clean Clean build atrifacts\n", prog); printf("%s make-watcher Bootstrap source code watcher (hot recompiling)\n", prog); printf("%s watch Watch the source code and recompile+rerun on change\n", prog); } return 0; }