summaryrefslogtreecommitdiffstats
path: root/b.c
diff options
context:
space:
mode:
Diffstat (limited to 'b.c')
-rw-r--r--b.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/b.c b/b.c
new file mode 100644
index 0000000..8eae71f
--- /dev/null
+++ b/b.c
@@ -0,0 +1,185 @@
+#define B_IMPLEMENTATION
+#include "src/b.h"
+#include <libgen.h>
+
+#define BUILD_DIR "build/"
+
+int debug_level = 5;
+
+void
+debug_or_release(B_Cmd* cmd)
+{
+ if (debug_level == 0)
+ b_cmd_append(cmd, "-O3", "-s", "-DNDEBUG");
+ 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", "-pg");
+ b_cmd_append(cmd, "-O0", "-ggdb", "-DVKDEBUG");
+ b_cmd_append(cmd, "-fsanitize=address");
+ }
+}
+
+void
+inlcude_dirs(B_Cmd* cmd)
+{
+ b_cmd_append(cmd, "-I./src/");
+}
+
+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");
+ b_cmd_append(cmd, "-lportaudio", "-lrt", "-lm", "-lasound", "-lraylib", "-lportmidi", "-ljack", "-lfftw3f", "-lsndfile", "-lconfig", "-lmicrohttpd", "-lpthread", "-lwebsockets");
+
+ 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 = 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;
+
+ 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;
+}
+
+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 *synth_deps[] = {
+ "src/adsr.h",
+ "src/b.h",
+ "src/control.h",
+ "src/filter.h",
+ "src/generator.h",
+ "src/gen.h",
+ "src/lowpass.h",
+ "src/midi.h",
+ "src/notes.h",
+ "src/osc.h",
+ "src/pa_memorybarrier.h",
+ "src/pa_ringbuffer.h",
+ "src/raygui.h",
+ "src/sound.h",
+ "src/stats.h",
+ "src/synth_common.h",
+ "src/synth_engine.h",
+ "src/synth_gui.h",
+ "src/synth_math.h",
+ "src/types.h",
+ "src/web.h",
+ };
+
+ const char* synth_paths[] = {
+ "src/adsr.c",
+ "src/control.c",
+ "src/filter.c",
+// "src/generator.c",
+// "src/gtk.c",
+ "src/lowpass.c",
+ "src/midi.c",
+ "src/osc.c",
+ "src/osc_digisaw.c",
+ "src/osc_saw.c",
+ "src/osc_sin.c",
+ "src/osc_sound.c",
+ "src/osc_sqr.c",
+ "src/osc_tri.c",
+ "src/osc_weird.c",
+ "src/pa_ringbuffer.c",
+ "src/sound.c",
+ "src/synth.c",
+ "src/synth_engine_v2.c",
+ "src/synth_gui.c",
+ "src/web.c",
+ };
+
+ B_Cmd cmd = {0};
+
+ b_mkdir_if_not_exists(BUILD_DIR);
+
+ if (!build_c(force, &cmd, synth_paths, B_ARRAY_LEN(synth_paths), synth_deps,
+ B_ARRAY_LEN(synth_deps), BUILD_DIR "synth"))
+ return 1;
+
+ return 0;
+}