mirror of
https://github.com/TwilitRealm/dusklight
synced 2026-07-29 23:27:25 -04:00
b6b297f1ac
* nix: add miniz to dependencies * nix: enable parallel building * amend! nix: add miniz to dependencies nix: add miniz to dependencies * nix: remove enableParellelBulding, needSubmodules The flake now includes submodules in inputs, so we no longer need to throw an error when they aren't there. EnableParallelBuilding was added in error, cmake already compiles in parallel when under nix.
384 lines
13 KiB
Nix
384 lines
13 KiB
Nix
{
|
|
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
|
|
|
inputs.nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
|
|
inputs.self.submodules = true;
|
|
|
|
outputs =
|
|
{ self, nixpkgs }:
|
|
let
|
|
inherit (nixpkgs) lib;
|
|
|
|
supportedSystems = [
|
|
"x86_64-linux"
|
|
"aarch64-linux"
|
|
"x86_64-darwin"
|
|
"aarch64-darwin"
|
|
];
|
|
forAllSystems = lib.genAttrs supportedSystems;
|
|
|
|
dawnVersion = "v20260618.032059";
|
|
nodVersion = "v2.0.0-alpha.10";
|
|
versionSuffix = "nix-" + (self.shortRev or self.dirtyShortRev or "dirty");
|
|
|
|
dawnInfo = {
|
|
"x86_64-linux" = {
|
|
triple = "linux-x86_64";
|
|
hash = "sha256-GFSd573b+VQx/VmFdNQgWDd0V9ayQlcw0Zuopke12ak=";
|
|
};
|
|
"aarch64-linux" = {
|
|
triple = "linux-aarch64";
|
|
hash = "sha256-ZaoP7BAjBMnfAv2/AMRi3FNH2ZtyqASCSFyU/oB2Mzg=";
|
|
};
|
|
"aarch64-darwin" = {
|
|
triple = "darwin-arm64";
|
|
hash = "sha256-HT+qtlLaSHyoXPrUcXgcTGa877X5YfzbxRD4bJb7i1Y=";
|
|
};
|
|
"x86_64-darwin" = {
|
|
triple = "darwin-x86_64";
|
|
hash = "sha256-cUNaCbA7rlKSukDVKGaVEVw0Zt1+mSbaHbmUCMvMVWc=";
|
|
};
|
|
};
|
|
|
|
nodPrebuiltInfo = {
|
|
"x86_64-linux" = {
|
|
triple = "linux-x86_64";
|
|
hash = "sha256-FVQWECVA2gWdc+n5OQ/Tvwn8z0qdgjSd1WlFt5HKOec=";
|
|
};
|
|
"aarch64-darwin" = {
|
|
triple = "macos-arm64";
|
|
hash = "sha256-8ZEejxksVgShNKUVRCBYaLOp9x/qOC9pAeVrElQUGUk=";
|
|
};
|
|
};
|
|
|
|
perSystem =
|
|
system:
|
|
let
|
|
pkgs = import nixpkgs { inherit system; };
|
|
inherit (pkgs.stdenv.hostPlatform) isDarwin;
|
|
hasNodPrebuilt = nodPrebuiltInfo ? ${system};
|
|
|
|
aurora = builtins.pathExists "${self}/extern/aurora/CMakeLists.txt";
|
|
|
|
dawn = pkgs.fetchzip {
|
|
url = "https://github.com/encounter/dawn/releases/download/${dawnVersion}/dawn-${dawnInfo.${system}.triple}.tar.gz";
|
|
hash = dawnInfo.${system}.hash;
|
|
stripRoot = false;
|
|
};
|
|
|
|
corrosion = pkgs.fetchFromGitHub {
|
|
owner = "corrosion-rs";
|
|
repo = "corrosion";
|
|
rev = "v0.6.1";
|
|
hash = "sha256-ppuDNObfKhneD9AlnPAvyCRHKW3BidXKglD1j/LE9CM=";
|
|
};
|
|
|
|
nodFromSource = pkgs.stdenv.mkDerivation (finalAttrs: {
|
|
pname = "nod";
|
|
version = nodVersion;
|
|
src = pkgs.fetchFromGitHub {
|
|
owner = "encounter";
|
|
repo = "nod";
|
|
rev = nodVersion;
|
|
hash = "sha256-r8qDlOVxv5iKiFjJQrcBuL9HVoOM3yEjRVnQIMqaICs=";
|
|
};
|
|
patches = [ ./fix-cmake-paths.patch ];
|
|
cargoDeps = pkgs.rustPlatform.importCargoLock {
|
|
lockFile = "${finalAttrs.src}/Cargo.lock";
|
|
};
|
|
postPatch = ''
|
|
substituteInPlace CMakeLists.txt \
|
|
--replace-warn "add_subdirectory(nod-ffi/examples)" ""
|
|
'';
|
|
nativeBuildInputs = [
|
|
pkgs.cmake
|
|
pkgs.ninja
|
|
pkgs.rustPlatform.cargoSetupHook
|
|
pkgs.cargo
|
|
pkgs.rustc
|
|
];
|
|
CARGO_NET_OFFLINE = "true";
|
|
cmakeFlags = [
|
|
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
|
"-DFETCHCONTENT_SOURCE_DIR_CORROSION=${corrosion}"
|
|
"-DNOD_ENABLE_INSTALL=ON"
|
|
"-DBUILD_SHARED_LIBS=OFF"
|
|
];
|
|
doCheck = false;
|
|
});
|
|
|
|
nod =
|
|
if hasNodPrebuilt then
|
|
pkgs.fetchzip {
|
|
url = "https://github.com/encounter/nod/releases/download/${nodVersion}/libnod-${
|
|
nodPrebuiltInfo.${system}.triple
|
|
}.tar.gz";
|
|
hash = nodPrebuiltInfo.${system}.hash;
|
|
stripRoot = false;
|
|
}
|
|
else
|
|
nodFromSource;
|
|
|
|
fetchContentDirs = {
|
|
DAWN_PREBUILT = dawn;
|
|
NOD_PREBUILT = nod;
|
|
CXXOPTS = pkgs.cxxopts.src;
|
|
JSON = pkgs.nlohmann_json.src;
|
|
XXHASH = pkgs.xxhash.src;
|
|
ZSTD = pkgs.zstd.src;
|
|
|
|
|
|
MINIZ = pkgs.fetchzip {
|
|
url = "https://github.com/richgel999/miniz/releases/download/3.0.2/miniz-3.0.2.zip";
|
|
hash = "sha256-DXysXkQEmoDAMMg1F8KexkwpXNyiHNzLJqXR9SMEkxk=";
|
|
stripRoot = false;
|
|
};
|
|
|
|
FMT = pkgs.fetchzip {
|
|
url = "https://github.com/fmtlib/fmt/archive/refs/tags/12.1.0.tar.gz";
|
|
hash = "sha256-ZmI1Dv0ZabPlxa02OpERI47jp7zFfjpeWCy1WyuPYZ0=";
|
|
};
|
|
TRACY = pkgs.fetchzip {
|
|
url = "https://github.com/wolfpld/tracy/archive/6789e7d6f9a65ec98926b602097a33a9676d2606.tar.gz";
|
|
hash = "sha256-Xxyd7G/mnXEPpN+ehmwl0AkAhS3CwObpJNDgcqbdUJg=";
|
|
};
|
|
IMGUI = pkgs.fetchFromGitHub {
|
|
owner = "ocornut";
|
|
repo = "imgui";
|
|
rev = "v1.91.9b-docking";
|
|
hash = "sha256-mQOJ6jCN+7VopgZ61yzaCnt4R1QLrW7+47xxMhFRHLQ=";
|
|
};
|
|
SQLITE3 = pkgs.fetchzip {
|
|
url = "https://sqlite.org/2026/sqlite-amalgamation-3510300.zip";
|
|
hash = "sha256-pNMR8zxaaqfAzQ0AQBOXMct4usdjey1Q0Gnitg06UhM=";
|
|
};
|
|
RMLUI = pkgs.fetchzip {
|
|
url = "https://github.com/mikke89/RmlUi/archive/f9b8c9e2935d5df2c7dff2c190d3968e99b0c3dc.tar.gz";
|
|
hash = "sha256-g4O/JZUrrcseOz8o2QJRt+2CeuiLnVeuDJc906xvuIg=";
|
|
};
|
|
};
|
|
|
|
dusklight =
|
|
pkgs.stdenv.mkDerivation {
|
|
pname = "dusklight";
|
|
version = versionSuffix;
|
|
src = ./.;
|
|
|
|
postUnpack = ''
|
|
chmod -R u+w "$sourceRoot"
|
|
substituteInPlace "$sourceRoot/extern/aurora/CMakeLists.txt" \
|
|
--replace-warn "add_subdirectory(tests)" ""
|
|
'';
|
|
|
|
nativeBuildInputs = [
|
|
pkgs.cmake
|
|
pkgs.ninja
|
|
pkgs.pkg-config
|
|
pkgs.python3
|
|
pkgs.python3Packages.markupsafe
|
|
]
|
|
++ lib.optionals (!isDarwin) [ pkgs.autoPatchelfHook ];
|
|
|
|
buildInputs = [
|
|
pkgs.sdl3
|
|
pkgs.freetype
|
|
pkgs.zstd
|
|
pkgs.cxxopts
|
|
pkgs.nlohmann_json
|
|
pkgs.xxhash
|
|
pkgs.abseil-cpp
|
|
pkgs.zlib
|
|
pkgs.libpng
|
|
pkgs.libjpeg_turbo
|
|
pkgs.curl
|
|
pkgs.openssl
|
|
]
|
|
++ lib.optionals isDarwin [
|
|
pkgs.apple-sdk_15
|
|
pkgs.libiconv
|
|
]
|
|
++ lib.optionals (!isDarwin) [
|
|
pkgs.libGL
|
|
pkgs.libGLU
|
|
pkgs.libglvnd
|
|
pkgs.vulkan-loader
|
|
pkgs.libX11
|
|
pkgs.libxcb
|
|
pkgs.libXcursor
|
|
pkgs.libxi
|
|
pkgs.libxrandr
|
|
pkgs.libxscrnsaver
|
|
pkgs.libxtst
|
|
pkgs.libxinerama
|
|
pkgs.libxkbcommon
|
|
pkgs.wayland
|
|
pkgs.libdecor
|
|
pkgs.alsa-lib
|
|
pkgs.libpulseaudio
|
|
pkgs.pipewire
|
|
pkgs.dbus
|
|
pkgs.udev
|
|
pkgs.libusb1
|
|
pkgs.libunwind
|
|
pkgs.gtk3
|
|
nod
|
|
];
|
|
|
|
cmakeBuildType = "RelWithDebInfo";
|
|
ninjaFlags = [ "dusklight" ];
|
|
|
|
cmakeFlags = [
|
|
"-DDUSK_VERSION_OVERRIDE=${versionSuffix}"
|
|
"-DFETCHCONTENT_FULLY_DISCONNECTED=ON"
|
|
"-DAURORA_DAWN_PROVIDER=package"
|
|
"-DAURORA_DAWN_LINKAGE=static"
|
|
"-DAURORA_NOD_PROVIDER=system"
|
|
"-DAURORA_SDL3_PROVIDER=system"
|
|
"-DBUILD_SHARED_LIBS=OFF"
|
|
]
|
|
++ lib.mapAttrsToList (key: src: "-DFETCHCONTENT_SOURCE_DIR_${key}=${src}") fetchContentDirs;
|
|
|
|
installPhase =
|
|
if isDarwin then
|
|
''
|
|
runHook preInstall
|
|
mkdir -p "$out/Applications"
|
|
cp -r Dusklight.app "$out/Applications/Dusklight.app"
|
|
runHook postInstall
|
|
''
|
|
else
|
|
''
|
|
runHook preInstall
|
|
install -Dm755 dusklight "$out/bin/dusklight"
|
|
cp -r "$src/res" "$out/bin/res"
|
|
install -Dm644 "$src/platforms/freedesktop/dev.twilitrealm.dusk.desktop" \
|
|
"$out/share/applications/dev.twilitrealm.dusk.desktop"
|
|
for size in 16 32 48 64 128 256 512 1024; do
|
|
install -Dm644 "$src/platforms/freedesktop/''${size}x''${size}/apps/dev.twilitrealm.dusk.png" \
|
|
"$out/share/icons/hicolor/''${size}x''${size}/apps/dev.twilitrealm.dusk.png"
|
|
done
|
|
runHook postInstall
|
|
'';
|
|
|
|
postFixup = lib.optionalString (!isDarwin) ''
|
|
patchelf \
|
|
--add-needed "${pkgs.vulkan-loader}/lib/libvulkan.so" \
|
|
$out/bin/dusklight
|
|
'';
|
|
|
|
dontStrip = true;
|
|
|
|
meta = {
|
|
description = "Dusklight — native PC port of the Twilight Princess decompilation";
|
|
homepage = "https://github.com/zeldaret/tp";
|
|
platforms = supportedSystems;
|
|
mainProgram = "dusklight";
|
|
};
|
|
};
|
|
|
|
# Tooling common to every supported host (Linux and macOS).
|
|
commonDevTools = [
|
|
pkgs.cmake
|
|
pkgs.ninja
|
|
pkgs.pkg-config
|
|
pkgs.git
|
|
pkgs.python3
|
|
pkgs.python3Packages.markupsafe
|
|
pkgs.rustc
|
|
pkgs.cargo
|
|
pkgs.sccache
|
|
];
|
|
|
|
# Linux-only system libraries — mirrors the apt deps from .github/workflows/build.yml
|
|
# so the cmake presets resolve the same set of headers as CI.
|
|
linuxDevDeps = [
|
|
# Compilers / linkers
|
|
pkgs.clang
|
|
pkgs.lld
|
|
# C/C++ utilities
|
|
pkgs.curl
|
|
pkgs.openssl
|
|
pkgs.zlib
|
|
pkgs.libpng
|
|
pkgs.libjpeg_turbo
|
|
pkgs.freetype
|
|
pkgs.zstd
|
|
pkgs.fmt
|
|
pkgs.tracy
|
|
pkgs.cxxopts
|
|
pkgs.abseil-cpp
|
|
pkgs.sdl3
|
|
pkgs.ncurses
|
|
pkgs.libunwind
|
|
pkgs.libusb1
|
|
pkgs.fuse
|
|
# Wayland / display server
|
|
pkgs.wayland
|
|
pkgs.wayland-protocols
|
|
pkgs.libxkbcommon
|
|
pkgs.libdecor
|
|
# OpenGL / Vulkan
|
|
pkgs.libGL
|
|
pkgs.libGLU
|
|
pkgs.libglvnd
|
|
pkgs.vulkan-headers
|
|
pkgs.vulkan-loader
|
|
# X11
|
|
pkgs.libX11
|
|
pkgs.libxcb
|
|
pkgs.libXcursor
|
|
pkgs.libxi
|
|
pkgs.libxrandr
|
|
pkgs.libxscrnsaver
|
|
pkgs.libxtst
|
|
pkgs.libxinerama
|
|
# Audio
|
|
pkgs.alsa-lib
|
|
pkgs.libpulseaudio
|
|
pkgs.pipewire
|
|
# System integration
|
|
pkgs.dbus
|
|
pkgs.udev
|
|
pkgs.gtk3
|
|
];
|
|
|
|
# On macOS we deliberately avoid pulling Nix's cc-wrapper so CMake picks up
|
|
# Apple Clang and the Xcode SDK directly, matching the macOS CI workflow.
|
|
darwinShell = pkgs.mkShellNoCC {
|
|
packages = commonDevTools;
|
|
shellHook = ''
|
|
echo "Dusklight dev shell (macOS)"
|
|
echo "Requires Xcode Command Line Tools for Apple Clang and the macOS SDK."
|
|
echo "Configure: cmake --preset macos-default-relwithdebinfo"
|
|
echo "Build: cmake --build --preset macos-default-relwithdebinfo"
|
|
'';
|
|
};
|
|
|
|
linuxShell = pkgs.mkShell {
|
|
packages = commonDevTools ++ linuxDevDeps;
|
|
shellHook = ''
|
|
echo "Dusklight dev shell (Linux)"
|
|
echo "Configure: cmake --preset linux-default-relwithdebinfo"
|
|
echo " cmake --preset linux-clang-relwithdebinfo"
|
|
echo "Build: cmake --build --preset <preset>"
|
|
'';
|
|
};
|
|
in
|
|
{
|
|
packages = {
|
|
default = dusklight;
|
|
dusklight = dusklight;
|
|
}
|
|
// lib.optionalAttrs (!hasNodPrebuilt) { nod = nodFromSource; };
|
|
|
|
devShells.default = if isDarwin then darwinShell else linuxShell;
|
|
};
|
|
|
|
systems = forAllSystems perSystem;
|
|
in
|
|
{
|
|
packages = lib.mapAttrs (_: s: s.packages) systems;
|
|
devShells = lib.mapAttrs (_: s: s.devShells) systems;
|
|
};
|
|
}
|