summaryrefslogtreecommitdiffstats
path: root/b.c
diff options
context:
space:
mode:
Diffstat (limited to 'b.c')
-rw-r--r--b.c148
1 files changed, 106 insertions, 42 deletions
diff --git a/b.c b/b.c
index db24cdd..ec037ed 100644
--- a/b.c
+++ b/b.c
@@ -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