Add devenv setup

This commit is contained in:
David Chavez 2025-12-12 10:11:45 +01:00
parent 7391a20657
commit d7929bb322
2 changed files with 270 additions and 0 deletions

267
devenv.nix Normal file
View file

@ -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;
};
}

3
devenv.yaml Normal file
View file

@ -0,0 +1,3 @@
inputs:
nixpkgs:
url: github:cachix/devenv-nixpkgs/rolling