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