{ description = "Raylib + RmlUI gamejam dev environment (desktop + wasm)"; inputs = { nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, utils }: utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; rmluiSrc = pkgs.fetchFromGitHub { owner = "mikke89"; repo = "RmlUi"; rev = "9c74c4fadc2ad7f1496239e560bab19ca2fe5072"; hash = "sha256-YZz41ViE3+a0VPypnbJ1Orlf5Hyxd65se5yzyHIY7ZI="; }; rmluiCmakeFlags = [ "-DRMLUI_LUA_BINDINGS=OFF" "-DRMLUI_SVG_PLUGIN=OFF" "-DBUILD_SAMPLES=OFF" "-DBUILD_TESTING=OFF" ]; wasmFindOverrides = [ "-DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH" "-DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH" "-DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH" ]; # ---- native RmlUi (shared lib) -------------------------------------- rmlui = pkgs.stdenv.mkDerivation { pname = "rmlui"; version = "master"; src = rmluiSrc; nativeBuildInputs = [ pkgs.cmake pkgs.pkg-config ]; buildInputs = [ pkgs.freetype ]; cmakeFlags = rmluiCmakeFlags ++ [ "-DBUILD_SHARED_LIBS=ON" ]; }; # ---- WASM Freetype (static, minimal deps) --------------------------- freetypeWasm = pkgs.stdenv.mkDerivation { pname = "freetype-wasm"; version = pkgs.freetype.version; src = pkgs.freetype.src; nativeBuildInputs = [ pkgs.cmake pkgs.emscripten ]; dontFixup = true; configurePhase = '' emcmake cmake -S . -B build \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ -DFT_DISABLE_ZLIB=TRUE \ -DFT_DISABLE_BZIP2=TRUE \ -DFT_DISABLE_PNG=TRUE \ -DFT_DISABLE_HARFBUZZ=TRUE \ -DFT_DISABLE_BROTLI=TRUE \ -DCMAKE_INSTALL_PREFIX=$out ''; buildPhase = "emmake make -C build -j$NIX_BUILD_CORES"; installPhase = "emmake make -C build install"; }; # ---- WASM RmlUi (static) --------------------------------------------- rmluiWasm = pkgs.stdenv.mkDerivation { pname = "rmlui-wasm"; version = "master"; src = rmluiSrc; nativeBuildInputs = [ pkgs.cmake pkgs.emscripten ]; dontFixup = true; configurePhase = '' emcmake cmake -S . -B build \ -DCMAKE_BUILD_TYPE=Release \ -DBUILD_SHARED_LIBS=OFF \ ${pkgs.lib.concatStringsSep " " rmluiCmakeFlags} \ ${pkgs.lib.concatStringsSep " " wasmFindOverrides} \ -DCMAKE_PREFIX_PATH="${freetypeWasm}" \ -DCMAKE_INSTALL_PREFIX=$out ''; buildPhase = "emmake make -C build -j$NIX_BUILD_CORES"; installPhase = "emmake make -C build install"; }; # ---- WASM raylib (PLATFORM=Web) --------------------------------------- raylibWasm = pkgs.stdenv.mkDerivation { pname = "raylib-wasm"; version = pkgs.raylib.version; src = pkgs.raylib.src; nativeBuildInputs = [ pkgs.cmake pkgs.emscripten ]; dontFixup = true; configurePhase = '' emcmake cmake -S . -B build \ -DCMAKE_BUILD_TYPE=Release \ -DPLATFORM=Web \ -DBUILD_EXAMPLES=OFF \ -DCMAKE_INSTALL_PREFIX=$out ''; buildPhase = "emmake make -C build -j$NIX_BUILD_CORES"; installPhase = "emmake make -C build install"; }; # ---- native toolchain / runtime --------------------------------------- nativeBuildTools = with pkgs; [ cmake pkg-config clang-tools ]; nativeRuntimeDeps = with pkgs; [ raylib libGL libX11 libXcursor libXrandr libXinerama libXi wayland libxkbcommon rmlui freetype ]; in { devShells.default = pkgs.mkShell { nativeBuildInputs = nativeBuildTools; buildInputs = nativeRuntimeDeps; shellHook = '' export C_INCLUDE_PATH="${rmlui}/include:${pkgs.raylib}/include" export CPLUS_INCLUDE_PATH="$C_INCLUDE_PATH" export LIBRARY_PATH="${pkgs.lib.makeLibraryPath nativeRuntimeDeps}" export LD_LIBRARY_PATH="$LIBRARY_PATH:$LD_LIBRARY_PATH" echo "native dev shell ready (raylib + rmlui)" ''; }; devShells.wasm = pkgs.mkShell { nativeBuildInputs = [ pkgs.cmake pkgs.emscripten pkgs.python3 ]; shellHook = '' export RAYLIB_WASM="${raylibWasm}" export RMLUI_WASM="${rmluiWasm}" export FREETYPE_WASM="${freetypeWasm}" echo "wasm dev shell ready — configure with:" echo " emcmake cmake -B build-wasm -DPLATFORM=Web \\" echo " -DCMAKE_FIND_ROOT_PATH_MODE_INCLUDE=BOTH \\" echo " -DCMAKE_FIND_ROOT_PATH_MODE_LIBRARY=BOTH \\" echo " -DCMAKE_FIND_ROOT_PATH_MODE_PACKAGE=BOTH \\" echo " -DCMAKE_PREFIX_PATH=\"\$RAYLIB_WASM;\$RMLUI_WASM;\$FREETYPE_WASM\"" echo " emmake make -C build-wasm" ''; }; packages.default = pkgs.stdenv.mkDerivation { pname = "gamejam"; version = "0.1.0"; src = ./.; nativeBuildInputs = nativeBuildTools ++ [ pkgs.makeWrapper ]; buildInputs = nativeRuntimeDeps; cmakeFlags = [ "-DCMAKE_BUILD_TYPE=Release" ]; postInstall = '' wrapProgram $out/bin/gamejam \ --prefix LD_LIBRARY_PATH : "${pkgs.lib.makeLibraryPath nativeRuntimeDeps}" ''; }; packages.wasm = pkgs.stdenv.mkDerivation { pname = "gamejam-wasm"; version = "0.1.0"; src = ./.; nativeBuildInputs = [ pkgs.cmake pkgs.emscripten ]; dontFixup = true; configurePhase = '' emcmake cmake -S . -B build \ -DCMAKE_BUILD_TYPE=Release \ -DPLATFORM=Web \ ${pkgs.lib.concatStringsSep " " wasmFindOverrides} \ -DCMAKE_PREFIX_PATH="${raylibWasm};${rmluiWasm};${freetypeWasm}" \ -DCMAKE_INSTALL_PREFIX=$out ''; buildPhase = "emmake make -C build -j$NIX_BUILD_CORES"; installPhase = '' mkdir -p $out cp -r build/*.html build/*.js build/*.wasm $out/ 2>/dev/null || true emmake make -C build install || true ''; }; } ); }