mirror of
https://github.com/Zelda64Recomp/Zelda64Recomp.git
synced 2025-12-19 14:32:48 +00:00
Add devenv setup
This commit is contained in:
parent
7391a20657
commit
d7929bb322
2 changed files with 270 additions and 0 deletions
267
devenv.nix
Normal file
267
devenv.nix
Normal 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
3
devenv.yaml
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
inputs:
|
||||
nixpkgs:
|
||||
url: github:cachix/devenv-nixpkgs/rolling
|
||||
Loading…
Add table
Reference in a new issue