diff options
Diffstat (limited to 'b.c')
-rw-r--r-- | b.c | 148 |
1 files changed, 106 insertions, 42 deletions
@@ -1,5 +1,8 @@ #define B_IMPLEMENTATION #include "src/b.h" +#include <libgen.h> + +#define BUILD_DIR "build/" int debug_level = 1; @@ -77,11 +80,28 @@ build_c(bool force, size_t input_paths_len, const char** dep_paths, size_t dep_paths_len, + const char** objects, + size_t objects_len, const char* output_path) { + size_t size = input_paths_len + objects_len; + const char **new_array = (const char **)malloc((size) * sizeof(const char *)); + + // Copy existing elements to the new array + int i = 0; + for (; i < input_paths_len; ++i) { + new_array[i] = input_paths[i]; + } + for (; i < size; ++i) { + new_array[i] = objects[i - input_paths_len]; + } + 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); + b_needs_rebuild(output_path, new_array, size); + + int dep_rebuild = 0; + if (rebuild_is_needed == 0) + dep_rebuild = b_needs_rebuild(output_path, dep_paths, dep_paths_len); if (rebuild_is_needed < 0 || dep_rebuild < 0) return false; @@ -89,7 +109,7 @@ build_c(bool force, cmd->count = 0; cc(cmd); b_cmd_append(cmd, "-o", output_path); - b_da_append_many(cmd, input_paths, input_paths_len); + b_da_append_many(cmd, new_array, size); libs(cmd); return b_cmd_run_sync(*cmd); } @@ -99,30 +119,81 @@ build_c(bool force, } 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) +build_objects(const char* lang, + const char* object, + const char* deps[], + size_t deps_size, + const char* out[]) // deps_size + 1 { - 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; + char *tmpc, *tmpc2; + char tmp[deps_size + 1][1000]; + char* tmp_obj = strdup(object); + char path[1000] = ""; - 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); + strcpy(path, BUILD_DIR); + //strcat(path, "/"); + strcat(path, basename(tmp_obj)); + path[ strlen(path) - 4 ] = '\0'; + strcat(path, "/"); + + b_mkdir_if_not_exists(path); + + int rebuild = 0; + + for (size_t i = 0; i < deps_size + 1; i++) { + strcpy(tmp[i], path); + if (i == deps_size) { + tmpc = basename(tmp_obj); + strcat(tmp[i], tmpc); + free(tmp_obj); + } else { + tmpc2 = strdup(deps[i]); + tmpc = basename(tmpc2); + strcat(tmp[i], tmpc); + free(tmpc2); + } + + size_t s = strlen(tmp[i]); + tmp[i][s - 4] = '.'; + tmp[i][s - 3] = 'o'; + tmp[i][s - 2] = '\0'; + + out[i] = strdup(tmp[i]); + + int c = b_needs_rebuild1(out[i], i == deps_size ? object : deps[i]); + if (c < 0) return false; + rebuild += c; + + if (c != 0) { + B_Cmd cmd = { 0 }; + + if (!strcmp(lang, "C++")) + cxx(&cmd); + else + cc(&cmd); + b_cmd_append(&cmd, "-c"); + b_cmd_append(&cmd, i == deps_size ? object : deps[i]); + b_cmd_append(&cmd, "-o"); + b_cmd_append(&cmd, out[i]); + bool rc = b_cmd_run_sync(cmd); + if (!rc) return false; + } } + if (rebuild == 0) b_log(B_INFO, "%s* is up-to-date", path); - b_log(B_INFO, "%s is up-to-date", output_path); + /* if (rebuild != 0) { */ + /* if (!strcmp(lang, "C++")) */ + /* cxx(&cmd); */ + /* else */ + /* cc(&cmd); */ + /* b_cmd_append(&cmd, "-c"); */ + /* b_cmd_append(&cmd, object); */ + /* b_da_append_many(&cmd, deps, deps_size); */ + + /* return b_cmd_run_sync(cmd); */ + /* } */ + + //b_log(B_INFO, "%s is up-to-date", out[deps_size]); return true; } @@ -145,11 +216,7 @@ main(int argc, char *argv[]) } } - const char *cxx_dep_paths[] = { - "src/vksetup.h", - }; - const char* cxx_input_paths[] = { - "src/cplusplus.cpp", + const char* cplusplus_deps[] = { "lib/imgui-1.90.7/imgui.cpp", "lib/imgui-1.90.7/imgui_demo.cpp", "lib/imgui-1.90.7/imgui_draw.cpp", @@ -158,30 +225,27 @@ main(int argc, char *argv[]) "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[] = { + + const char *render_deps[] = { "src/state.h", "src/vksetup.h", + "src/cplusplus.h", }; - const char* c_input_paths[] = { + const char* render_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; + const char* objects[B_ARRAY_LEN(cplusplus_deps) + 1]; + + b_mkdir_if_not_exists(BUILD_DIR); + + // TODO: make build_object func to build one by one, and add headers + if (!build_objects("C++", "src/cplusplus.cpp", cplusplus_deps, B_ARRAY_LEN(cplusplus_deps), objects)) return 1; + if (!build_c(force, &cmd, render_paths, B_ARRAY_LEN(render_paths), render_deps, B_ARRAY_LEN(render_deps), objects, B_ARRAY_LEN(objects), BUILD_DIR"render")) return 1; return 0; } - /* 1. Build list of <object>.cpp (with <dep>s) -> into build/cxx/<object>/<dep>.o 2. Build list of <object>.c (with <dep>s) -> into build/c/<object>/<dep>.o |