From d7929bb322195485ea0b78ad13a897d454eb0703 Mon Sep 17 00:00:00 2001 From: David Chavez Date: Fri, 12 Dec 2025 10:11:45 +0100 Subject: [PATCH] Add devenv setup --- devenv.nix | 267 ++++++++++++++++++++++++++++++++++++++++++++++++++++ devenv.yaml | 3 + 2 files changed, 270 insertions(+) create mode 100644 devenv.nix create mode 100644 devenv.yaml diff --git a/devenv.nix b/devenv.nix new file mode 100644 index 0000000..9dcba50 --- /dev/null +++ b/devenv.nix @@ -0,0 +1,267 @@ +{ + pkgs, + lib, + ... +}: +let + # Get the unwrapped LLVM clang for MIPS cross-compilation (patches build) + # The wrapped clang doesn't work for cross-compilation targets + llvmPackages = pkgs.llvmPackages_18; + unwrappedClang = llvmPackages.clang-unwrapped; + unwrappedLld = llvmPackages.lld; + + # N64Recomp - built from source as a Nix derivation + n64recomp = pkgs.gccStdenv.mkDerivation { + pname = "n64recomp"; + version = "unstable-2024-12-11"; + + src = pkgs.fetchFromGitHub { + owner = "Mr-Wiseguy"; + repo = "N64Recomp"; + rev = "98bf104b1b5ed83126af8bcab0cc964782617dbf"; + hash = "sha256-qDV52g04tOCQW+Nqzm8pnXwqs4q027TnHyuGYsGzIhU="; + fetchSubmodules = true; + }; + + nativeBuildInputs = with pkgs; [ + cmake + ninja + ]; + + cmakeFlags = [ + "-DCMAKE_BUILD_TYPE=Release" + ]; + + installPhase = '' + mkdir -p $out/bin + cp N64Recomp $out/bin/ + cp RSPRecomp $out/bin/ + ''; + + meta = with pkgs.lib; { + description = "N64 static recompilation tools"; + homepage = "https://github.com/Mr-Wiseguy/N64Recomp"; + license = licenses.mit; + platforms = platforms.unix; + }; + }; +in +{ + # https://devenv.sh/packages/ + packages = + with pkgs; + [ + # Build tools + cmake + ninja + pkg-config + git + gnumake # Required for building patches + + # Compilers and linkers (for native compilation) + llvmPackages.clang + llvmPackages.lld + llvmPackages.llvm # For llvm-ar, llvm-objcopy + + # Graphics development dependencies (Vulkan/MoltenVK) + vulkan-headers + vulkan-loader + vulkan-tools + spirv-tools + spirv-headers + glslang + shaderc + + # SDL2 - NOT using nix's SDL2 because it's now sdl2-compat which requires SDL3 + # Instead we rely on pkgx SDL2 being available (pkgx +libsdl.org) + # or system SDL2 + + # Freetype (required for RmlUi text rendering) + freetype + + # Development tools + lldb + + # N64Recomp tools (built from source via Nix) + n64recomp + ] + ++ lib.optionals pkgs.stdenv.isLinux [ + # Linux specific packages + clang + clang-tools + libGL + libxkbcommon + wayland + wayland-protocols + mesa + xorg.libX11 + xorg.libXrandr + xorg.libXi + vulkan-validation-layers + freetype + gtk3 # For file dialogs + ]; + + # Environment variables + env = { + # CMake build type for development + CMAKE_BUILD_TYPE = "Debug"; + + # Help CMake find freetype + CMAKE_PREFIX_PATH = "${pkgs.freetype}"; + } // lib.optionalAttrs pkgs.stdenv.isLinux { + # Vulkan SDK path for validation layers (Linux only) + VK_LAYER_PATH = "${pkgs.vulkan-validation-layers}/share/vulkan/explicit_layer.d"; + VK_INSTANCE_LAYERS = "VK_LAYER_KHRONOS_validation"; + } // lib.optionalAttrs pkgs.stdenv.isDarwin { + # Vulkan SDK path for macOS (MoltenVK) + VULKAN_SDK = "/Users/dcvz/VulkanSDK/1.3.296.0/macOS"; + VK_ICD_FILENAMES = "/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/icd.d/MoltenVK_icd.json"; + VK_LAYER_PATH = "/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/explicit_layer.d"; + }; + + # https://devenv.sh/scripts/ + scripts = { + configure.exec = '' + echo "Configuring Zelda64Recompiled build with CMake..." + ${if pkgs.stdenv.isDarwin then '' + # Use system toolchain for macOS (required for proper framework support) + export SDKROOT="/Applications/Xcode-16.2.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + export DEVELOPER_DIR="/Applications/Xcode-16.2.0.app/Contents/Developer" + # Clear Nix environment variables that interfere with system toolchain + unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ + CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH + echo "Using SDK: $SDKROOT" + + # Get SDL2 and Freetype paths from pkgx + SDL2_PREFIX=$(pkgx +libsdl.org pkg-config --variable=prefix sdl2 2>/dev/null || echo "") + FREETYPE_PREFIX=$(pkgx +freetype.org pkg-config --variable=prefix freetype2 2>/dev/null || echo "") + + if [ -z "$SDL2_PREFIX" ]; then + echo "ERROR: pkgx SDL2 not found. Install with: pkgx +libsdl.org" + exit 1 + else + echo "Using SDL2 from pkgx: $SDL2_PREFIX" + SDL2_CMAKE_DIR="$SDL2_PREFIX/lib/cmake/SDL2" + fi + + if [ -z "$FREETYPE_PREFIX" ]; then + echo "Using Freetype from nix: ${pkgs.freetype}" + FREETYPE_INCLUDE="${pkgs.freetype.dev}/include/freetype2" + FREETYPE_LIB="${pkgs.freetype}/lib/libfreetype.dylib" + else + echo "Using Freetype from pkgx: $FREETYPE_PREFIX" + FREETYPE_INCLUDE="$FREETYPE_PREFIX/include/freetype2" + FREETYPE_LIB="$FREETYPE_PREFIX/lib/libfreetype.dylib" + fi + + cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_OSX_DEPLOYMENT_TARGET=11.0 \ + -DCMAKE_OSX_SYSROOT="$SDKROOT" \ + -DCMAKE_C_COMPILER="/usr/bin/clang" \ + -DCMAKE_CXX_COMPILER="/usr/bin/clang++" \ + -DCMAKE_CXX_FLAGS="-stdlib=libc++" \ + -DCMAKE_EXE_LINKER_FLAGS="-stdlib=libc++" \ + -DVULKAN_SDK="/Users/dcvz/VulkanSDK/1.3.296.0/macOS" \ + -DPATCHES_C_COMPILER="${unwrappedClang}/bin/clang" \ + -DPATCHES_LD="${unwrappedLld}/bin/ld.lld" \ + -DPATCHES_OBJCOPY="${llvmPackages.llvm}/bin/llvm-objcopy" \ + -DCMAKE_AR="${llvmPackages.llvm}/bin/llvm-ar" \ + -DFREETYPE_INCLUDE_DIRS="$FREETYPE_INCLUDE" \ + -DFREETYPE_LIBRARY="$FREETYPE_LIB" \ + -DSDL2_DIR="$SDL2_CMAKE_DIR" + '' else '' + cmake -B build -S . -G Ninja -DCMAKE_BUILD_TYPE=Debug \ + -DCMAKE_CXX_COMPILER=clang++ \ + -DCMAKE_C_COMPILER=clang \ + -DPATCHES_C_COMPILER=clang \ + -DPATCHES_LD=ld.lld + ''} + ''; + + build.exec = '' + echo "Building Zelda64Recompiled..." + ${if pkgs.stdenv.isDarwin then '' + # Ensure same environment as configure + export SDKROOT="/Applications/Xcode-16.2.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + export DEVELOPER_DIR="/Applications/Xcode-16.2.0.app/Contents/Developer" + unset CPATH LIBRARY_PATH NIX_CFLAGS_COMPILE NIX_LDFLAGS NIX_CPPFLAGS NIX_CXXSTDLIB_COMPILE \ + CMAKE_PREFIX_PATH PKG_CONFIG_PATH CPLUS_INCLUDE_PATH C_INCLUDE_PATH + '' else ""} + cmake --build build -j$(nproc 2>/dev/null || sysctl -n hw.ncpu) + ''; + + clean.exec = '' + echo "Cleaning build directory..." + rm -rf build build-cmake + ''; + + clean-all.exec = '' + echo "Cleaning all generated files..." + rm -rf build build-cmake RecompiledFuncs RecompiledPatches + cd patches && make clean || true + echo "Done! Run 'recomp' then 'configure' and 'build' to rebuild from scratch." + ''; + + run.exec = '' + echo "Running Zelda64Recompiled..." + ${if pkgs.stdenv.isDarwin then '' + export VULKAN_SDK="/Users/dcvz/VulkanSDK/1.3.296.0/macOS" + export VK_ICD_FILENAMES="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/icd.d/MoltenVK_icd.json" + export VK_LAYER_PATH="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/explicit_layer.d" + export DYLD_LIBRARY_PATH="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/lib:$DYLD_LIBRARY_PATH" + open build/Zelda64Recompiled.app + '' else '' + ./build/Zelda64Recompiled + ''} + ''; + + run-cli.exec = '' + echo "Running Zelda64Recompiled (CLI mode)..." + ${if pkgs.stdenv.isDarwin then '' + // enable metal stats + export MTL_HUD_ENABLED=1 + export VULKAN_SDK="/Users/dcvz/VulkanSDK/1.3.296.0/macOS" + export VK_ICD_FILENAMES="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/icd.d/MoltenVK_icd.json" + export VK_LAYER_PATH="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/share/vulkan/explicit_layer.d" + export DYLD_LIBRARY_PATH="/Users/dcvz/VulkanSDK/1.3.296.0/macOS/lib:$DYLD_LIBRARY_PATH" + ./build/Zelda64Recompiled.app/Contents/MacOS/Zelda64Recompiled + '' else '' + ./build/Zelda64Recompiled + ''} + ''; + + build-patches.exec = '' + echo "Building patches..." + ${if pkgs.stdenv.isDarwin then '' + export SDKROOT="/Applications/Xcode-16.2.0.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk" + export DEVELOPER_DIR="/Applications/Xcode-16.2.0.app/Contents/Developer" + '' else ""} + make -C patches CC=clang LD=ld.lld + ''; + + # Run N64Recomp/RSPRecomp to generate RecompiledFuncs + # Also copies binaries to repo root for cmake to use during patch recompilation + recomp.exec = '' + echo "Running recompiler tools (from Nix)..." + echo "N64Recomp: $(which N64Recomp)" + echo "RSPRecomp: $(which RSPRecomp)" + + # Copy binaries to repo root for cmake to find during build + cp -f "$(which N64Recomp)" ./N64Recomp + cp -f "$(which RSPRecomp)" ./RSPRecomp + echo "Copied N64Recomp and RSPRecomp to repo root" + + N64Recomp us.rev1.toml + RSPRecomp aspMain.us.rev1.toml + RSPRecomp njpgdspMain.us.rev1.toml + echo "Done! RecompiledFuncs generated." + ''; + }; + + # https://devenv.sh/languages/ + languages = { + c.enable = true; + cplusplus.enable = true; + }; +} diff --git a/devenv.yaml b/devenv.yaml new file mode 100644 index 0000000..6bf1e6c --- /dev/null +++ b/devenv.yaml @@ -0,0 +1,3 @@ +inputs: + nixpkgs: + url: github:cachix/devenv-nixpkgs/rolling