Files
aboba/build.c
2025-06-27 20:11:42 +02:00

176 lines
6.6 KiB
C

#include <libgen.h>
#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;
}