{ pkgs ? import {} }: let llvm18 = pkgs.llvmPackages_18; llvm21 = pkgs.llvmPackages_21; # Unwrapped Cross Drivers clang21u = pkgs.llvmPackages_21.clang-unwrapped; clang18u = pkgs.llvmPackages_18.clang-unwrapped; # Clang 21 resource dir (builtin headers + compiler-rt, as Ubuntu has them) clang21ResourceDir = pkgs.runCommand "eden-clang-21-resource-dir" { } '' mkdir -p $out/lib ln -s ${clang21u.lib}/lib/clang/21/include $out/include ln -s ${pkgs.llvmPackages_21.compiler-rt}/lib/linux $out/lib/linux ''; python = pkgs.python3.withPackages (ps: [ ps.mako ps.pyyaml ps.ply ps.packaging # tools/launcher/bake-loading-text.py (the loading screen's and the overlay's baked font). ps.numpy ps.pillow ]); # Merged LLVM 21 libdir (libLLVM-21.so, libclang.so, libclang-cpp.so in one dir) libdirs21 = pkgs.lib.concatMapStringsSep " " (d: pkgs.lib.concatMapStringsSep " " (o: if o == "out" then "${d}/lib" else if d ? "${o}" then "${d.${o}}/lib" else "") (d.outputs or [ "out" ])) [ llvm21.llvm llvm21.clang llvm21.libclang ]; shimLib = pkgs.runCommand "eden-llvm21-libdir" { } '' mkdir -p $out/lib for p in ${libdirs21}; do [ -d "$p" ] || continue for base in libLLVM-21 libclang libclang-cpp; do for f in "$p"/$base.so*; do [ -e "$f" ] || continue ln -sf "$f" "$out/lib/$(basename "$f")" ln -sf "$(basename "$f")" "$out/lib/$base.so" done done done ''; realLlvmCfg21 = "${llvm21.llvm.dev}/bin/llvm-config"; realLlvmCfg18 = "${llvm18.llvm.dev}/bin/llvm-config"; # Toolchain Bin Shims shimBin = pkgs.runCommand "eden-toolchain-bin" { } '' mkdir -p $out/bin # Unversioned clang* (Payload SDK driver), reporting clang21ResourceDir for tool in clang clang++ clang-cpp; do cat > $out/bin/$tool < $out/bin/$tool-18 < $out/bin/ld.lld < $out/bin/llvm-config <&2 exit 1 fi cmake -S . -B . -G Ninja \ -DLLVM_DIR="$llvm_cmake_dir" \ -DLLVM_INCLUDE_TESTS=OFF \ -DLLVM_SPIRV_INCLUDE_TESTS=OFF \ -DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${pkgs.spirv-headers} \ -DBUILD_SHARED_LIBS=ON \ -DCMAKE_INSTALL_PREFIX=$out \ -DCMAKE_BUILD_TYPE=Release cmake --build . -j$NIX_BUILD_CORES cmake --install . ''; }; # BASH_ENV: tools/*.sh reset PATH; this re-prepends the nix PATH in every bash bashEnv = pkgs.writeText "eden-bash-env" '' if [ -n "''${EDEN_NIX_PREFIX:-}" ]; then case "$PATH" in "''${EDEN_NIX_PREFIX}"*) ;; *) PATH="''${EDEN_NIX_PREFIX}$PATH"; export PATH ;; esac trap 'case "$PATH" in "''${EDEN_NIX_PREFIX}"*) ;; *) PATH="''${EDEN_NIX_PREFIX}$PATH"; export PATH ;; esac' DEBUG fi ''; in pkgs.mkShell { name = "prospero-eden"; nativeBuildInputs = [ shimBin pkgs.cmake pkgs.ninja pkgs.meson pkgs.gnumake pkgs.ccache pkgs.nasm pkgs.bison pkgs.flex pkgs.pkg-config pkgs.util-linux pkgs.curl pkgs.wget pkgs.git pkgs.rsync pkgs.unzip pkgs.file pkgs.patch pkgs.glslang pkgs.spirv-tools pkgs.spirv-headers pkgs.xxd pkgs.which llvm21.clang llvm21.llvm llvm21.lld llvm21.libclang llvm18.clang llvm18.llvm llvm18.lld llvmspirv python ]; env = { # sourced by every non-interactive bash; restores our PATH after scripts reset it BASH_ENV = "${bashEnv}"; # Payload SDK wrappers select the LLVM install; the shim reports our bindir/libdir LLVM_CONFIG = "${shimBin}/bin/llvm-config"; # shimLib/llvmspirv for LLVM 21 host tools; gcc runtime for -fuse-ld=lld links LD_LIBRARY_PATH = "${shimLib}/lib:${llvmspirv}/lib:${pkgs.stdenv.cc.cc.lib}/lib"; # nixpkgs' cc-wrapper hardening (FORTIFY, stack protector) differs from Ubuntu's toolchain NIX_HARDENING_ENABLE = ""; }; shellHook = '' export EDEN_NIX_PREFIX="$PATH:" echo "ProsperoEden shell: LLVM 18.1 + LLVM 21.1, llvm-spirv @21" echo " clang-18=$(clang-18 --version 2>/dev/null | head -1)" echo " clang-21=$(clang-21 --version 2>/dev/null | head -1)" echo " ld.lld-21=$(ld.lld-21 --version 2>/dev/null)" echo " llvm-config=$(llvm-config --version 2>/dev/null)" ''; }