From bb0d7588049dbb74d0d7e18dca37c36ec304e8df Mon Sep 17 00:00:00 2001 From: LainLayer Date: Wed, 14 Feb 2024 15:20:22 +0300 Subject: [PATCH 1/3] Added OpenBSD support - OpenBSD apparently provided -ldl by default, no need to link with it - The X11 library location needed to be explicitly specified --- nob.c | 20 ++++-- src/nob_openbsd.c | 166 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 182 insertions(+), 4 deletions(-) create mode 100644 src/nob_openbsd.c diff --git a/nob.c b/nob.c index 369ff97..6a62ca6 100644 --- a/nob.c +++ b/nob.c @@ -21,6 +21,7 @@ #define TARGET_WIN64_MINGW 1 #define TARGET_WIN64_MSVC 2 #define TARGET_MACOS 3 +#define TARGET_OPENBSD 4 static const char *raylib_modules[] = { "rcore", @@ -41,6 +42,8 @@ static const char *raylib_modules[] = { #include "src/nob_win64_mingw.c" #elif MUSIALIZER_TARGET == TARGET_WIN64_MSVC #include "src/nob_win64_msvc.c" +#elif MUSIALIZER_TARGET == TARGET_OPENBSD +#include "src/nob_openbsd.c" #endif // MUSIALIZER_TARGET void log_available_subcommands(const char *program, Nob_Log_Level level) @@ -188,25 +191,34 @@ void generate_default_config(Nob_String_Builder *content) nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MINGW\n"); nob_sb_append_cstr(content, "#define MUSIALIZER_TARGET TARGET_WIN64_MSVC\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_MACOS\n"); + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_OPENBSD\n"); # else nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_LINUX\n"); nob_sb_append_cstr(content, "#define MUSIALIZER_TARGET TARGET_WIN64_MINGW\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MSVC\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_MACOS\n"); + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_OPENBSD\n"); # endif -#else -# if defined (__APPLE__) || defined (__MACH__) +#elif defined (__APPLE__) || defined (__MACH__) nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_LINUX\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MINGW\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MSVC\n"); nob_sb_append_cstr(content, "#define MUSIALIZER_TARGET TARGET_MACOS\n"); -# else + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_OPENBSD\n"); +#elif defined(__OpenBSD__) + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_LINUX\n"); + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MINGW\n"); + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MSVC\n"); + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_MACOS\n"); + nob_sb_append_cstr(content, "#define MUSIALIZER_TARGET TARGET_OPENBSD\n"); +#else nob_sb_append_cstr(content, "#define MUSIALIZER_TARGET TARGET_LINUX\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MINGW\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_WIN64_MSVC\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_MACOS\n"); -# endif + nob_sb_append_cstr(content, "// #define MUSIALIZER_TARGET TARGET_OPENBSD\n"); #endif + nob_sb_append_cstr(content, "\n"); nob_sb_append_cstr(content, "//// Moves everything in src/plub.c to a separate \"DLL\" so it can be hotreloaded. Works only for Linux right now\n"); nob_sb_append_cstr(content, "// #define MUSIALIZER_HOTRELOAD\n"); diff --git a/src/nob_openbsd.c b/src/nob_openbsd.c new file mode 100644 index 0000000..9ac262a --- /dev/null +++ b/src/nob_openbsd.c @@ -0,0 +1,166 @@ +#define MUSIALIZER_TARGET_NAME "OpenBSD" + +bool build_musializer(void) +{ + bool result = true; + Nob_Cmd cmd = {0}; + Nob_Procs procs = {0}; + +#ifdef MUSIALIZER_HOTRELOAD + procs.count = 0; + cmd.count = 0; + // TODO: add a way to replace `cc` with something else GCC compatible on POSIX + // Like `clang` for instance + nob_cmd_append(&cmd, "cc"); + nob_cmd_append(&cmd, "-Wall", "-Wextra", "-ggdb"); + nob_cmd_append(&cmd, "-I./build/"); + nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/"); + nob_cmd_append(&cmd, "-fPIC", "-shared"); + nob_cmd_append(&cmd, "-o", "./build/libplug.so"); + nob_cmd_append(&cmd, + "./src/plug.c", + "./src/ffmpeg_linux.c"); + nob_cmd_append(&cmd, + nob_temp_sprintf("-L./build/raylib/%s", MUSIALIZER_TARGET_NAME), + "-l:libraylib.so"); + nob_cmd_append(&cmd, "-lm", "-lpthread"); + nob_da_append(&procs, nob_cmd_run_async(cmd)); + + cmd.count = 0; + nob_cmd_append(&cmd, "cc"); + nob_cmd_append(&cmd, "-Wall", "-Wextra", "-ggdb"); + nob_cmd_append(&cmd, "-I./build/"); + nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/"); + nob_cmd_append(&cmd, "-o", "./build/musializer"); + nob_cmd_append(&cmd, + "./src/musializer.c", + "./src/hotreload_linux.c"); + nob_cmd_append(&cmd, + "-Wl,-rpath=./build/", + "-Wl,-rpath=./", + nob_temp_sprintf("-Wl,-rpath=./build/raylib/%s", MUSIALIZER_TARGET_NAME), + // NOTE: just in case somebody wants to run musializer from within the ./build/ folder + nob_temp_sprintf("-Wl,-rpath=./raylib/%s", MUSIALIZER_TARGET_NAME)); + nob_cmd_append(&cmd, + nob_temp_sprintf("-L./build/raylib/%s", MUSIALIZER_TARGET_NAME), + "-l:libraylib.so"); + nob_cmd_append(&cmd, "-lm", "-lpthread"); + nob_da_append(&procs, nob_cmd_run_async(cmd)); + if (!nob_procs_wait(procs)) nob_return_defer(false); +#else + cmd.count = 0; + nob_cmd_append(&cmd, "cc"); + nob_cmd_append(&cmd, "-Wall", "-Wextra", "-ggdb"); + nob_cmd_append(&cmd, "-I./build/"); + nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/"); + nob_cmd_append(&cmd, "-o", "./build/musializer"); + nob_cmd_append(&cmd, + "./src/plug.c", + "./src/ffmpeg_linux.c", + "./src/musializer.c"); + nob_cmd_append(&cmd, + nob_temp_sprintf("-L./build/raylib/%s", MUSIALIZER_TARGET_NAME), + "-l:libraylib.a"); + nob_cmd_append(&cmd, "-lm", "-lpthread"); + if (!nob_cmd_run_sync(cmd)) nob_return_defer(false); +#endif // MUSIALIZER_HOTRELOAD + +defer: + nob_cmd_free(cmd); + nob_da_free(procs); + return result; +} + +bool build_raylib(void) +{ + bool result = true; + Nob_Cmd cmd = {0}; + Nob_File_Paths object_files = {0}; + + if (!nob_mkdir_if_not_exists("./build/raylib")) { + nob_return_defer(false); + } + + Nob_Procs procs = {0}; + + const char *build_path = nob_temp_sprintf("./build/raylib/%s", MUSIALIZER_TARGET_NAME); + + if (!nob_mkdir_if_not_exists(build_path)) { + nob_return_defer(false); + } + + for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) { + const char *input_path = nob_temp_sprintf("./raylib/raylib-"RAYLIB_VERSION"/src/%s.c", raylib_modules[i]); + const char *output_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]); + output_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]); + + nob_da_append(&object_files, output_path); + + if (nob_needs_rebuild(output_path, &input_path, 1)) { + cmd.count = 0; + nob_cmd_append(&cmd, "cc"); + nob_cmd_append(&cmd, "-ggdb", "-DPLATFORM_DESKTOP", "-fPIC"); + nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/external/glfw/include"); + nob_cmd_append(&cmd, "-c", input_path); + nob_cmd_append(&cmd, "-o", output_path); + nob_cmd_append(&cmd, "-I/usr/X11R6/include", "-L/usr/X11R6/lib"); + Nob_Proc proc = nob_cmd_run_async(cmd); + nob_da_append(&procs, proc); + } + } + cmd.count = 0; + + if (!nob_procs_wait(procs)) nob_return_defer(false); + +#ifndef MUSIALIZER_HOTRELOAD + const char *libraylib_path = nob_temp_sprintf("%s/libraylib.a", build_path); + + if (nob_needs_rebuild(libraylib_path, object_files.items, object_files.count)) { + nob_cmd_append(&cmd, "ar", "-crs", libraylib_path); + for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) { + const char *input_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]); + nob_cmd_append(&cmd, input_path); + } + if (!nob_cmd_run_sync(cmd)) nob_return_defer(false); + } +#else + const char *libraylib_path = nob_temp_sprintf("%s/libraylib.so", build_path); + + if (nob_needs_rebuild(libraylib_path, object_files.items, object_files.count)) { + nob_cmd_append(&cmd, "cc"); + nob_cmd_append(&cmd, "-shared"); + nob_cmd_append(&cmd, "-o", libraylib_path); + for (size_t i = 0; i < NOB_ARRAY_LEN(raylib_modules); ++i) { + const char *input_path = nob_temp_sprintf("%s/%s.o", build_path, raylib_modules[i]); + nob_cmd_append(&cmd, input_path); + } + if (!nob_cmd_run_sync(cmd)) nob_return_defer(false); + } +#endif // MUSIALIZER_HOTRELOAD + +defer: + nob_cmd_free(cmd); + nob_da_free(object_files); + return result; +} + +bool build_dist() +{ +#ifdef MUSIALIZER_HOTRELOAD + nob_log(NOB_ERROR, "We do not ship with hotreload enabled"); + return false; +#else + if (!nob_mkdir_if_not_exists("./musializer-openbsd-x86_64/")) return false; + if (!nob_copy_file("./build/musializer", "./musializer-openbsd-x86_64/musializer")) return false; + if (!nob_copy_directory_recursively("./resources/", "./musializer-openbsd-x86_64/resources/")) return false; + // TODO: should we pack ffmpeg with Linux build? + // There are some static executables for Linux + Nob_Cmd cmd = {0}; + nob_cmd_append(&cmd, "tar", "fvcz", "./musializer-openbsd-x86_64.tar.gz", "./musializer-openbsd-x86_64"); + bool ok = nob_cmd_run_sync(cmd); + nob_cmd_free(cmd); + if (!ok) return false; + + return true; +#endif // MUSIALIZER_HOTRELOAD +} From 4dd3e4605d61608bebceaa95433a86f1d56097ac Mon Sep 17 00:00:00 2001 From: LainLayer Date: Wed, 14 Feb 2024 15:24:52 +0300 Subject: [PATCH 2/3] Updated readme with mentions of OpenBSD --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8c63356..3c1e2f5 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ Before using `nob` you need to bootstrap it. Just compile it with the available I really recommend to read [nob.c](./nob.c) and [nob.h](./src/nob.h) to get an idea of how it all actually works. The Build System is a work in progress, so if something breaks be ready to dive into it. -### Linux +### Linux and OpenBSD ```console $ cc -o nob nob.c # ONLY ONCE!!! @@ -86,7 +86,7 @@ $ wine ./build/musializer.exe ## Hot Reloading -**Only on Linux for now** +**Only on Linux and OpenBSD for now** Edit `./build/config.h` and enable `MUSIALIZER_HOTRELOAD`. From 8cf74b1234a666662f0e063cbdc3edc715cf3ad9 Mon Sep 17 00:00:00 2001 From: LainLayer Date: Thu, 15 Feb 2024 00:47:49 +0300 Subject: [PATCH 3/3] removed unnecessary compile flag --- src/nob_openbsd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/nob_openbsd.c b/src/nob_openbsd.c index 9ac262a..ea6ce34 100644 --- a/src/nob_openbsd.c +++ b/src/nob_openbsd.c @@ -103,7 +103,7 @@ bool build_raylib(void) nob_cmd_append(&cmd, "-I./raylib/raylib-"RAYLIB_VERSION"/src/external/glfw/include"); nob_cmd_append(&cmd, "-c", input_path); nob_cmd_append(&cmd, "-o", output_path); - nob_cmd_append(&cmd, "-I/usr/X11R6/include", "-L/usr/X11R6/lib"); + nob_cmd_append(&cmd, "-I/usr/X11R6/include"); Nob_Proc proc = nob_cmd_run_async(cmd); nob_da_append(&procs, proc); }