#include #define GEBS_NO_PREFIX #define GEBS_IMPLEMENTATION #include "gebs/gebs.h" #include "./zip/src/zip.c" char *prog = NULL; int main(int argc, char ** argv) { #if MY_DEBUG rebuild_self(argc, argv, "cc", "-DMY_DEBUG=1", "-o", "build", "build.c"); #else rebuild_self(argc, argv, "cc", "-DMY_DEBUG=0", "-o", "build", "build.c"); #endif prog = SHIFT(&argc, &argv); char *cmd = SHIFT(&argc, &argv); if (strcmp(cmd, "make") == 0) { #define BUNDLED_FILES \ "./gpp1", \ "./tmpls/home.html", \ "./tmpls/page-missing.html", \ "./tmpls/template-blog.html", \ "./tmpls/blog.html", \ "./etc/hotreload.js", \ "./etc/theme.js", \ "./etc/simple.css", \ "./etc/highlight.js", \ "./etc/hljs-rainbow.css", \ "./etc/marked.js", \ "./etc/favicon.ico", \ "./etc/me.jpg", \ "./etc/tmoa-engine.jpg", \ "./etc/tmoa-garbage.jpg", \ "./blog/welcome.md", \ "./blog/weird-page.md", \ "./blog/curious-case-of-gebs.md", \ "./blog/the-making-of-aboba.md" RULE("./aboba", "./main.c", "./routes.c", "./routes.h", "./baked.c", "./baked.h", "./clonestr.h", "./commit.h", "./timer.c", "./timer.h", "./CONFIG.h", "./locked.h", "./mongoose.o", "./bundle.zip", BUNDLED_FILES ) { RULE("./mongoose.o", "./mongoose/mongoose.c") { #if MY_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("./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); } } const char *bundle_zip_deps[] = { BUNDLED_FILES }; RULE_ARRAY("./bundle.zip", bundle_zip_deps) { RULE("./gpp1", "./gpp/gpp.c") { CMD("cc", "-DHAVE_STRDUP", "-DHAVE_FNMATCH_H", "-o", "gpp1", "gpp/gpp.c"); } struct zip_t *zip = zip_open("./bundle.zip", ZIP_DEFAULT_COMPRESSION_LEVEL, 'w'); defer { zip_close(zip); } for (size_t i = 0; i < sizeof(bundle_zip_deps)/sizeof(bundle_zip_deps[0]); i++) { char *copy = strdup(bundle_zip_deps[i]); defer { free(copy); } char *name = basename(copy); String_Builder sb = {0}; defer { sb_free(&sb); } sb_read_file(&sb, bundle_zip_deps[i]); zip_entry_open(zip, name); zip_entry_write(zip, sb.items, sb.count); zip_entry_close(zip); } LOGI("Generated bundle.zip\n"); } #define CC "cc" #define TARGET "-o", "aboba" #if MY_DEBUG #define CFLAGS "-fsanitize=address", "-fPIC", "-ggdb" #define DEFINES "-DMY_DEBUG=1", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE" #define EXTRA_SOURCES "./cJSON/cJSON.c", "./zip/src/zip.c", "./md5-c/md5.c" #else #define CFLAGS "-fPIC" #define DEFINES "-DMY_DEBUG=0", "-D_GNU_SOURCE", "-DGEBS_NO_PREFIX", "-DINCBIN_PREFIX=", "-DINCBIN_STYLE=INCBIN_STYLE_SNAKE" #define EXTRA_SOURCES "./cJSON/cJSON.c", "./zip/src/zip.c" #endif #define SOURCES "./main.c", "./routes.c", "./baked.c", "./timer.c" #define OBJECTS "./mongoose.o" #define LINK_FLAGS "-Wl,-z,execstack", "-lpthread" #define INC_FLAGS "-I.", "-I./zip/src" CMD(CC, TARGET, CFLAGS, DEFINES, INC_FLAGS, SOURCES, OBJECTS, EXTRA_SOURCES, LINK_FLAGS); RULE("./compile_flags.txt") { make_compile_flags(TARGET, CFLAGS, DEFINES, INC_FLAGS, SOURCES, OBJECTS, EXTRA_SOURCES, LINK_FLAGS); } #undef CC #undef TARGET #undef CFLAGS #undef DEFINES #undef EXTRA_SOURCES #undef SOURCES #undef OBJECTS #undef LINK_FLAGS #undef INC_FLAGS } } else if (strcmp(cmd, "clean") == 0) { remove1("./build"); remove1("./aboba"); remove1("./mongoose.o"); remove1("./gpp1"); remove1("./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; }