mirror of
https://github.com/Zelda64Recomp/Zelda64Recomp.git
synced 2025-12-23 00:12:31 +00:00
267 lines
9.2 KiB
Nix
267 lines
9.2 KiB
Nix
{
|
|
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;
|
|
};
|
|
}
|