#define B_IMPLEMENTATION #include "src/b.h" int debug_level = 1; void debug_or_release(B_Cmd* cmd) { if (debug_level == 0) b_cmd_append(cmd, "-O3", "-s"); else if (debug_level == 1) b_cmd_append(cmd, "-O2", "-ggdb", "-DVKDEBUG"); else if (debug_level == 2) b_cmd_append(cmd, "-O1", "-ggdb", "-DVKDEBUG"); else b_cmd_append(cmd, "-O0", "-ggdb", "-DVKDEBUG"); } void inlcude_dirs(B_Cmd* cmd) { b_cmd_append(cmd, "-I./src/"); b_cmd_append(cmd, "-I./lib"); b_cmd_append(cmd, "-I./lib/imgui-1.90.7"); } void cflags(B_Cmd* cmd) { b_cmd_append(cmd, "-Wall", "-Wextra"); debug_or_release(cmd); b_cmd_append(cmd, "-march=native"); b_cmd_append(cmd, "-fno-math-errno", "-funroll-loops"); b_cmd_append(cmd, "-flto", "-pthread"); inlcude_dirs(cmd); } void cxxflags(B_Cmd *cmd) { b_cmd_append(cmd, "-Wall", "-Wextra"); b_cmd_append(cmd, "-Wno-string-plus-int", "-Wno-nullability-completeness", "-Wno-unused-function", "-Wno-missing-field-initializers", "-Wno-unused-parameter", "-Wno-unused-variable"); debug_or_release(cmd); b_cmd_append(cmd, "-march=native"); b_cmd_append(cmd, "-fno-math-errno", "-funroll-loops"); b_cmd_append(cmd, "-flto", "-pthread"); inlcude_dirs(cmd); //b_cmd_append(cmd, "-O3"); } void cxx(B_Cmd *cmd) { b_cmd_append(cmd, "clang"); cxxflags(cmd); } void cc(B_Cmd *cmd) { b_cmd_append(cmd, "clang"); cflags(cmd); } void libs(B_Cmd *cmd) { b_cmd_append(cmd, "-lSDL2", "-lm", "-lvulkan", "-lshaderc_shared", "-lstdc++"); } bool build_c(bool force, B_Cmd* cmd, const char** input_paths, size_t input_paths_len, const char** dep_paths, size_t dep_paths_len, const char* output_path) { int rebuild_is_needed = b_needs_rebuild(output_path, input_paths, input_paths_len); int dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len); if (rebuild_is_needed < 0 || dep_rebuild < 0) return false; if (force || rebuild_is_needed || dep_rebuild) { cmd->count = 0; cc(cmd); b_cmd_append(cmd, "-o", output_path); b_da_append_many(cmd, input_paths, input_paths_len); libs(cmd); return b_cmd_run_sync(*cmd); } b_log(B_INFO, "%s is up-to-date", output_path); return true; } bool compile_cxx(bool force, B_Cmd* cmd, const char** input_paths, size_t input_paths_len, const char** dep_paths, size_t dep_paths_len, const char* output_path) { int rebuild_is_needed = b_needs_rebuild(output_path, input_paths, input_paths_len); int dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len); if (rebuild_is_needed < 0 || dep_rebuild < 0) return false; if (force || rebuild_is_needed || dep_rebuild) { cmd->count = 0; cxx(cmd); b_cmd_append(cmd, "-c"); //b_cmd_append(cmd, "-o", output_path); b_da_append_many(cmd, input_paths, input_paths_len); //libs(cmd); return b_cmd_run_sync(*cmd); } b_log(B_INFO, "%s is up-to-date", output_path); return true; } int main(int argc, char *argv[]) { B_GO_REBUILD_URSELF(argc, argv); const char *program_name = b_shift_args(&argc, &argv); bool force = false; while (argc > 0) { const char *flag = b_shift_args(&argc, &argv); if (strcmp(flag, "-f") == 0) { force = true; } else { b_log(B_ERROR, "Unknown flag `%s`", flag); return 1; } } const char *cxx_dep_paths[] = { "src/vksetup.h", }; const char* cxx_input_paths[] = { "src/cplusplus.cpp", "lib/imgui-1.90.7/imgui.cpp", "lib/imgui-1.90.7/imgui_demo.cpp", "lib/imgui-1.90.7/imgui_draw.cpp", "lib/imgui-1.90.7/imgui_tables.cpp", "lib/imgui-1.90.7/imgui_widgets.cpp", "lib/imgui-1.90.7/backends/imgui_impl_sdl2.cpp", "lib/imgui-1.90.7/backends/imgui_impl_vulkan.cpp", }; const char *c_dep_paths[] = { "src/state.h", "src/vksetup.h", }; const char* c_input_paths[] = { "src/render.c", "cplusplus.o", "imgui.o", "imgui_demo.o", "imgui_draw.o", "imgui_tables.o", "imgui_widgets.o", "imgui_impl_sdl2.o", "imgui_impl_vulkan.o", }; B_Cmd cmd = {0}; if (!compile_cxx(force, &cmd, cxx_input_paths, B_ARRAY_LEN(cxx_input_paths), cxx_dep_paths, B_ARRAY_LEN(c_dep_paths),"cplusplus.o")) return 1; if (!build_c(force, &cmd, c_input_paths, B_ARRAY_LEN(c_input_paths), c_dep_paths, B_ARRAY_LEN(c_dep_paths),"render")) return 1; return 0; } /* 1. Build list of .cpp (with s) -> into build/cxx//.o 2. Build list of .c (with s) -> into build/c//.o 3. Build .c linking with the objects from 1 & 2 -> into Check for rebuilds: 1. and s 2. and s 3. and all links {cxx,c}/ * / *.o */