Преглед изворни кода

Merge pull request #114 from tsoding/nob-configured

Factor out src_build/nob_configured.c
Alexey Kutepov пре 1 година
родитељ
комит
84dc2c99e6
2 измењених фајлова са 237 додато и 240 уклоњено
  1. 1 240
      nob.c
  2. 236 0
      src_build/nob_configured.c

+ 1 - 240
nob.c

@@ -11,243 +11,6 @@
 
 #define CONFIG_PATH "./build/config.h"
 
-#ifdef CONFIGURED
-
-#include "./src_build/targets.h"
-#include CONFIG_PATH
-
-#define RAYLIB_VERSION "5.0"
-
-#define TARGET_LINUX 0
-#define TARGET_WIN64_MINGW 1
-#define TARGET_WIN64_MSVC 2
-#define TARGET_MACOS 3
-#define TARGET_OPENBSD 4
-
-
-static const char *raylib_modules[] = {
-    "rcore",
-    "raudio",
-    "rglfw",
-    "rmodels",
-    "rshapes",
-    "rtext",
-    "rtextures",
-    "utils",
-};
-
-#if MUSIALIZER_TARGET == TARGET_LINUX
-#include "src_build/nob_linux.c"
-#elif MUSIALIZER_TARGET == TARGET_MACOS
-#include "src_build/nob_macos.c"
-#elif MUSIALIZER_TARGET == TARGET_WIN64_MINGW
-#include "src_build/nob_win64_mingw.c"
-#elif MUSIALIZER_TARGET == TARGET_WIN64_MSVC
-#include "src_build/nob_win64_msvc.c"
-#elif MUSIALIZER_TARGET == TARGET_OPENBSD
-#include "src_build/nob_openbsd.c"
-#endif // MUSIALIZER_TARGET
-
-void log_available_subcommands(const char *program, Nob_Log_Level level)
-{
-    nob_log(level, "Usage: %s [subcommand]", program);
-    nob_log(level, "Subcommands:");
-    nob_log(level, "    build (default)");
-    nob_log(level, "    dist");
-    nob_log(level, "    svg");
-    nob_log(level, "    help");
-}
-
-void log_config(Nob_Log_Level level)
-{
-    nob_log(level, "Target: %s", MUSIALIZER_TARGET_NAME);
-#ifdef MUSIALIZER_HOTRELOAD
-    nob_log(level, "Hotreload: ENABLED");
-#else
-    nob_log(level, "Hotreload: DISABLED");
-#endif // MUSIALIZER_HOTRELOAD
-#ifdef MUSIALIZER_MICROPHONE
-    nob_log(level, "Microphone: ENABLED");
-#else
-    nob_log(level, "Microphone: DISABLED");
-#endif // MUSIALIZER_MICROPHONE
-#ifdef MUSIALIZER_UNBUNDLE
-    nob_log(level, "Unbundle: ENABLED");
-#else
-    nob_log(level, "Unbundle: DISABLED");
-#endif // MUSIALIZER_UNBUNDLE
-#ifdef MUSIALIZER_ACT_ON_PRESS
-    nob_log(level, "Act on Press: ENABLED");
-#else
-    nob_log(level, "Act on Press: DISABLED");
-#endif // MUSIALIZER_ACT_ON_PRESS
-}
-
-#define genf(out, ...) \
-    do { \
-        fprintf((out), __VA_ARGS__); \
-        fprintf((out), " // %s:%d\n", __FILE__, __LINE__); \
-    } while(0)
-
-typedef struct {
-    const char *file_path;
-    size_t offset;
-    size_t size;
-} Resource;
-
-Resource resources[] = {
-    { .file_path = "./resources/logo/logo-256.png" },
-    { .file_path = "./resources/shaders/glsl330/circle.fs" },
-    { .file_path = "./resources/shaders/glsl120/circle.fs" },
-    { .file_path = "./resources/icons/volume.png" },
-    { .file_path = "./resources/icons/play.png" },
-    { .file_path = "./resources/icons/render.png" },
-    { .file_path = "./resources/icons/fullscreen.png" },
-    { .file_path = "./resources/icons/microphone.png" },
-    { .file_path = "./resources/fonts/Alegreya-Regular.ttf" },
-};
-
-bool generate_resource_bundle(void)
-{
-    bool result = true;
-    Nob_String_Builder bundle = {0};
-    Nob_String_Builder content = {0};
-    FILE *out = NULL;
-
-    // bundle  = [aaaaaaaaabbbbb]
-    //            ^        ^
-    // content = []
-    // 0, 9
-
-    for (size_t i = 0; i < NOB_ARRAY_LEN(resources); ++i) {
-        content.count = 0;
-        if (!nob_read_entire_file(resources[i].file_path, &content)) nob_return_defer(false);
-        resources[i].offset = bundle.count;
-        resources[i].size = content.count;
-        nob_da_append_many(&bundle, content.items, content.count);
-        nob_da_append(&bundle, 0);
-    }
-
-    const char *bundle_h_path = "./build/bundle.h";
-    out = fopen(bundle_h_path, "wb");
-    if (out == NULL) {
-        nob_log(NOB_ERROR, "Could not open file %s for writing: %s", bundle_h_path, strerror(errno));
-        nob_return_defer(false);
-    }
-
-    genf(out, "#ifndef BUNDLE_H_");
-    genf(out, "#define BUNDLE_H_");
-    genf(out, "typedef struct {");
-    genf(out, "    const char *file_path;");
-    genf(out, "    size_t offset;");
-    genf(out, "    size_t size;");
-    genf(out, "} Resource;");
-    genf(out, "size_t resources_count = %zu;", NOB_ARRAY_LEN(resources));
-    genf(out, "Resource resources[] = {");
-    for (size_t i = 0; i < NOB_ARRAY_LEN(resources); ++i) {
-        genf(out, "    {.file_path = \"%s\", .offset = %zu, .size = %zu},",
-             resources[i].file_path, resources[i].offset, resources[i].size);
-    }
-    genf(out, "};");
-
-    genf(out, "unsigned char bundle[] = {");
-    size_t row_size = 20;
-    for (size_t i = 0; i < bundle.count; ) {
-        fprintf(out, "     ");
-        for (size_t col = 0; col < row_size && i < bundle.count; ++col, ++i) {
-            fprintf(out, "0x%02X, ", (unsigned char)bundle.items[i]);
-        }
-        genf(out, "");
-    }
-    genf(out, "};");
-    genf(out, "#endif // BUNDLE_H_");
-
-    nob_log(NOB_INFO, "Generated %s", bundle_h_path);
-
-defer:
-    if (out) fclose(out);
-    free(content.items);
-    free(bundle.items);
-    return result;
-}
-
-int main(int argc, char **argv)
-{
-    nob_log(NOB_INFO, "--- STAGE 2 ---");
-    log_config(NOB_INFO);
-    nob_log(NOB_INFO, "---");
-
-    const char *program = nob_shift_args(&argc, &argv);
-
-    const char *subcommand = NULL;
-    if (argc <= 0) {
-        subcommand = "build";
-    } else {
-        subcommand = nob_shift_args(&argc, &argv);
-    }
-
-    if (strcmp(subcommand, "build") == 0) {
-        if (!build_raylib()) return 1;
-#ifndef MUSIALIZER_UNBUNDLE
-        if (!generate_resource_bundle()) return 1;
-#endif // MUSIALIZER_UNBUNDLE
-        if (!build_musializer()) return 1;
-    } else if (strcmp(subcommand, "dist") == 0) {
-        if (!build_dist()) return 1;
-    } else if (strcmp(subcommand, "config") == 0) {
-        nob_log(NOB_ERROR, "The `config` command does not exist anymore!");
-        nob_log(NOB_ERROR, "Edit %s to configure the build!", CONFIG_PATH);
-        return 1;
-    } else if (strcmp(subcommand, "svg") == 0) {
-        Nob_Procs procs = {0};
-
-        Nob_Cmd cmd = {0};
-
-        typedef struct {
-            const char *in_path;
-            const char *out_path;
-            int resize;
-        } Svg;
-
-        Svg svgs[] = {
-            {.out_path = "./resources/logo/logo-256.ico",    .in_path = "./resources/logo/logo.svg", .resize = 256, },
-            {.out_path = "./resources/logo/logo-256.png",    .in_path = "./resources/logo/logo.svg", .resize = 256, },
-            {.out_path = "./resources/icons/fullscreen.png", .in_path = "./resources/icons/fullscreen.svg"          },
-            {.out_path = "./resources/icons/volume.png",     .in_path = "./resources/icons/volume.svg"              },
-            {.out_path = "./resources/icons/play.png",       .in_path = "./resources/icons/play.svg"                },
-            {.out_path = "./resources/icons/render.png",     .in_path = "./resources/icons/render.svg"              },
-            {.out_path = "./resources/icons/microphone.png", .in_path = "./resources/icons/microphone.svg"          },
-        };
-
-        for (size_t i = 0; i < NOB_ARRAY_LEN(svgs); ++i) {
-            if (nob_needs_rebuild1(svgs[i].out_path, svgs[i].in_path)) {
-                cmd.count = 0;
-                nob_cmd_append(&cmd, "convert");
-                nob_cmd_append(&cmd, "-background", "None");
-                nob_cmd_append(&cmd, svgs[i].in_path);
-                if (svgs[i].resize) {
-                    nob_cmd_append(&cmd, "-resize", nob_temp_sprintf("%d", svgs[i].resize));
-                }
-                nob_cmd_append(&cmd, svgs[i].out_path);
-                nob_da_append(&procs, nob_cmd_run_async(cmd));
-            } else {
-                nob_log(NOB_INFO, "%s is up to date", svgs[i].out_path);
-            }
-        }
-
-        if (!nob_procs_wait(procs)) return 1;
-    } else if (strcmp(subcommand, "help") == 0) {
-        log_available_subcommands(program, NOB_INFO);
-    } else {
-        nob_log(NOB_ERROR, "Unknown subcommand %s", subcommand);
-        log_available_subcommands(program, NOB_ERROR);
-    }
-    // TODO: it would be nice to check for situations like building TARGET_WIN64_MSVC on Linux and report that it's not possible.
-    return 0;
-}
-
-#else
-
 void generate_default_config(Nob_String_Builder *content)
 {
     nob_sb_append_cstr(content, "//// Build target. Pick only one!\n");
@@ -336,7 +99,7 @@ int main(int argc, char **argv)
 
     Nob_Cmd cmd = {0};
     const char *configured_binary = "build/nob.configured";
-    nob_cmd_append(&cmd, NOB_REBUILD_URSELF(configured_binary, "nob.c"), "-DCONFIGURED");
+    nob_cmd_append(&cmd, NOB_REBUILD_URSELF(configured_binary, "./src_build/nob_configured.c"));
     if (!nob_cmd_run_sync(cmd)) return 1;
 
     cmd.count = 0;
@@ -346,5 +109,3 @@ int main(int argc, char **argv)
 
     return 0;
 }
-
-#endif // CONFIGURED

+ 236 - 0
src_build/nob_configured.c

@@ -0,0 +1,236 @@
+#include <stdbool.h>
+
+#define NOB_IMPLEMENTATION
+#include "../nob.h"
+#include "../build/config.h"
+#include "targets.h"
+
+#define RAYLIB_VERSION "5.0"
+#define CONFIG_PATH "./build/config.h"
+
+#define TARGET_LINUX 0
+#define TARGET_WIN64_MINGW 1
+#define TARGET_WIN64_MSVC 2
+#define TARGET_MACOS 3
+#define TARGET_OPENBSD 4
+
+static const char *raylib_modules[] = {
+    "rcore",
+    "raudio",
+    "rglfw",
+    "rmodels",
+    "rshapes",
+    "rtext",
+    "rtextures",
+    "utils",
+};
+
+#if MUSIALIZER_TARGET == TARGET_LINUX
+#include "nob_linux.c"
+#elif MUSIALIZER_TARGET == TARGET_MACOS
+#include "nob_macos.c"
+#elif MUSIALIZER_TARGET == TARGET_WIN64_MINGW
+#include "nob_win64_mingw.c"
+#elif MUSIALIZER_TARGET == TARGET_WIN64_MSVC
+#include "nob_win64_msvc.c"
+#elif MUSIALIZER_TARGET == TARGET_OPENBSD
+#include "nob_openbsd.c"
+#endif // MUSIALIZER_TARGET
+
+void log_available_subcommands(const char *program, Nob_Log_Level level)
+{
+    nob_log(level, "Usage: %s [subcommand]", program);
+    nob_log(level, "Subcommands:");
+    nob_log(level, "    build (default)");
+    nob_log(level, "    dist");
+    nob_log(level, "    svg");
+    nob_log(level, "    help");
+}
+
+void log_config(Nob_Log_Level level)
+{
+    nob_log(level, "Target: %s", MUSIALIZER_TARGET_NAME);
+#ifdef MUSIALIZER_HOTRELOAD
+    nob_log(level, "Hotreload: ENABLED");
+#else
+    nob_log(level, "Hotreload: DISABLED");
+#endif // MUSIALIZER_HOTRELOAD
+#ifdef MUSIALIZER_MICROPHONE
+    nob_log(level, "Microphone: ENABLED");
+#else
+    nob_log(level, "Microphone: DISABLED");
+#endif // MUSIALIZER_MICROPHONE
+#ifdef MUSIALIZER_UNBUNDLE
+    nob_log(level, "Unbundle: ENABLED");
+#else
+    nob_log(level, "Unbundle: DISABLED");
+#endif // MUSIALIZER_UNBUNDLE
+#ifdef MUSIALIZER_ACT_ON_PRESS
+    nob_log(level, "Act on Press: ENABLED");
+#else
+    nob_log(level, "Act on Press: DISABLED");
+#endif // MUSIALIZER_ACT_ON_PRESS
+}
+
+#define genf(out, ...) \
+    do { \
+        fprintf((out), __VA_ARGS__); \
+        fprintf((out), " // %s:%d\n", __FILE__, __LINE__); \
+    } while(0)
+
+typedef struct {
+    const char *file_path;
+    size_t offset;
+    size_t size;
+} Resource;
+
+Resource resources[] = {
+    { .file_path = "./resources/logo/logo-256.png" },
+    { .file_path = "./resources/shaders/glsl330/circle.fs" },
+    { .file_path = "./resources/shaders/glsl120/circle.fs" },
+    { .file_path = "./resources/icons/volume.png" },
+    { .file_path = "./resources/icons/play.png" },
+    { .file_path = "./resources/icons/render.png" },
+    { .file_path = "./resources/icons/fullscreen.png" },
+    { .file_path = "./resources/icons/microphone.png" },
+    { .file_path = "./resources/fonts/Alegreya-Regular.ttf" },
+};
+
+bool generate_resource_bundle(void)
+{
+    bool result = true;
+    Nob_String_Builder bundle = {0};
+    Nob_String_Builder content = {0};
+    FILE *out = NULL;
+
+    // bundle  = [aaaaaaaaabbbbb]
+    //            ^        ^
+    // content = []
+    // 0, 9
+
+    for (size_t i = 0; i < NOB_ARRAY_LEN(resources); ++i) {
+        content.count = 0;
+        if (!nob_read_entire_file(resources[i].file_path, &content)) nob_return_defer(false);
+        resources[i].offset = bundle.count;
+        resources[i].size = content.count;
+        nob_da_append_many(&bundle, content.items, content.count);
+        nob_da_append(&bundle, 0);
+    }
+
+    const char *bundle_h_path = "./build/bundle.h";
+    out = fopen(bundle_h_path, "wb");
+    if (out == NULL) {
+        nob_log(NOB_ERROR, "Could not open file %s for writing: %s", bundle_h_path, strerror(errno));
+        nob_return_defer(false);
+    }
+
+    genf(out, "#ifndef BUNDLE_H_");
+    genf(out, "#define BUNDLE_H_");
+    genf(out, "typedef struct {");
+    genf(out, "    const char *file_path;");
+    genf(out, "    size_t offset;");
+    genf(out, "    size_t size;");
+    genf(out, "} Resource;");
+    genf(out, "size_t resources_count = %zu;", NOB_ARRAY_LEN(resources));
+    genf(out, "Resource resources[] = {");
+    for (size_t i = 0; i < NOB_ARRAY_LEN(resources); ++i) {
+        genf(out, "    {.file_path = \"%s\", .offset = %zu, .size = %zu},",
+             resources[i].file_path, resources[i].offset, resources[i].size);
+    }
+    genf(out, "};");
+
+    genf(out, "unsigned char bundle[] = {");
+    size_t row_size = 20;
+    for (size_t i = 0; i < bundle.count; ) {
+        fprintf(out, "     ");
+        for (size_t col = 0; col < row_size && i < bundle.count; ++col, ++i) {
+            fprintf(out, "0x%02X, ", (unsigned char)bundle.items[i]);
+        }
+        genf(out, "");
+    }
+    genf(out, "};");
+    genf(out, "#endif // BUNDLE_H_");
+
+    nob_log(NOB_INFO, "Generated %s", bundle_h_path);
+
+defer:
+    if (out) fclose(out);
+    free(content.items);
+    free(bundle.items);
+    return result;
+}
+
+int main(int argc, char **argv)
+{
+    nob_log(NOB_INFO, "--- STAGE 2 ---");
+    log_config(NOB_INFO);
+    nob_log(NOB_INFO, "---");
+
+    const char *program = nob_shift_args(&argc, &argv);
+
+    const char *subcommand = NULL;
+    if (argc <= 0) {
+        subcommand = "build";
+    } else {
+        subcommand = nob_shift_args(&argc, &argv);
+    }
+
+    if (strcmp(subcommand, "build") == 0) {
+        if (!build_raylib()) return 1;
+#ifndef MUSIALIZER_UNBUNDLE
+        if (!generate_resource_bundle()) return 1;
+#endif // MUSIALIZER_UNBUNDLE
+        if (!build_musializer()) return 1;
+    } else if (strcmp(subcommand, "dist") == 0) {
+        if (!build_dist()) return 1;
+    } else if (strcmp(subcommand, "config") == 0) {
+        nob_log(NOB_ERROR, "The `config` command does not exist anymore!");
+        nob_log(NOB_ERROR, "Edit %s to configure the build!", CONFIG_PATH);
+        return 1;
+    } else if (strcmp(subcommand, "svg") == 0) {
+        Nob_Procs procs = {0};
+
+        Nob_Cmd cmd = {0};
+
+        typedef struct {
+            const char *in_path;
+            const char *out_path;
+            int resize;
+        } Svg;
+
+        Svg svgs[] = {
+            {.out_path = "./resources/logo/logo-256.ico",    .in_path = "./resources/logo/logo.svg", .resize = 256, },
+            {.out_path = "./resources/logo/logo-256.png",    .in_path = "./resources/logo/logo.svg", .resize = 256, },
+            {.out_path = "./resources/icons/fullscreen.png", .in_path = "./resources/icons/fullscreen.svg"          },
+            {.out_path = "./resources/icons/volume.png",     .in_path = "./resources/icons/volume.svg"              },
+            {.out_path = "./resources/icons/play.png",       .in_path = "./resources/icons/play.svg"                },
+            {.out_path = "./resources/icons/render.png",     .in_path = "./resources/icons/render.svg"              },
+            {.out_path = "./resources/icons/microphone.png", .in_path = "./resources/icons/microphone.svg"          },
+        };
+
+        for (size_t i = 0; i < NOB_ARRAY_LEN(svgs); ++i) {
+            if (nob_needs_rebuild1(svgs[i].out_path, svgs[i].in_path)) {
+                cmd.count = 0;
+                nob_cmd_append(&cmd, "convert");
+                nob_cmd_append(&cmd, "-background", "None");
+                nob_cmd_append(&cmd, svgs[i].in_path);
+                if (svgs[i].resize) {
+                    nob_cmd_append(&cmd, "-resize", nob_temp_sprintf("%d", svgs[i].resize));
+                }
+                nob_cmd_append(&cmd, svgs[i].out_path);
+                nob_da_append(&procs, nob_cmd_run_async(cmd));
+            } else {
+                nob_log(NOB_INFO, "%s is up to date", svgs[i].out_path);
+            }
+        }
+
+        if (!nob_procs_wait(procs)) return 1;
+    } else if (strcmp(subcommand, "help") == 0) {
+        log_available_subcommands(program, NOB_INFO);
+    } else {
+        nob_log(NOB_ERROR, "Unknown subcommand %s", subcommand);
+        log_available_subcommands(program, NOB_ERROR);
+    }
+    // TODO: it would be nice to check for situations like building TARGET_WIN64_MSVC on Linux and report that it's not possible.
+    return 0;
+}