diff --git a/nixos/doc/manual/release-notes/rl-2311.section.md b/nixos/doc/manual/release-notes/rl-2311.section.md index 06b17194a3133..fc0ef658df447 100644 --- a/nixos/doc/manual/release-notes/rl-2311.section.md +++ b/nixos/doc/manual/release-notes/rl-2311.section.md @@ -383,6 +383,7 @@ - `pkgs.openvpn3` now optionally supports systemd-resolved. `programs.openvpn3` will automatically enable systemd-resolved support if `config.services.resolved.enable` is enabled. + - `services.fail2ban.jails` can now be configured with attribute sets defining settings and filters instead of lines. The stringed options `daemonConfig` and `extraSettings` have respectively been replaced by `daemonSettings` and `jails.DEFAULT.settings` which use attribute sets. - The application firewall `opensnitch` now uses the process monitor method eBPF as default as recommended by upstream. The method can be changed with the setting [services.opensnitch.settings.ProcMonitorMethod](#opt-services.opensnitch.settings.ProcMonitorMethod). @@ -470,6 +471,10 @@ The module update takes care of the new config syntax and the data itself (user If you use this feature, updates to CoreDNS may require updating `vendorHash` by following these steps again. +- `blender` now provides both the lastest stable and LTS versions under `blenderVersions`. `blender` and `blender-hip` now default to `blenderVersions.stable`, which points to the latest stable version. The latest LTS version is available with `blender-lts`. An attribute `isLTS` is added. + +- `blender-with-packages` has been removed in favor of `blender.withPackages`. It can be used as `blender.withPackages(ps: [ps.bpycv])`, similar to `python3.withPackages`. + - `ffmpeg` default upgraded from `ffmpeg_5` to `ffmpeg_6`. - `fusuma` now enables the following plugins: [appmatcher](https://github.com/iberianpig/fusuma-plugin-appmatcher), [keypress](https://github.com/iberianpig/fusuma-plugin-keypress), [sendkey](https://github.com/iberianpig/fusuma-plugin-sendkey), [tap](https://github.com/iberianpig/fusuma-plugin-tap) and [wmctrl](https://github.com/iberianpig/fusuma-plugin-wmctrl). @@ -502,6 +507,8 @@ The module update takes care of the new config syntax and the data itself (user can automatically format the root device by setting `virtualisation.fileSystems."/".autoFormat = true;`. +- All `blender` packages now passes its version of python under `blender.python`. + - `python3.pkgs.flitBuildHook` has been removed. Use `flit-core` and `format = "pyproject"` instead. - The `extend` function of `llvmPackages` has been removed due it coming from the `tools` attrset thus only extending the `tool` attrset. A possible replacement is to construct the set from `libraries` and `tools`, or patch nixpkgs. @@ -517,3 +524,4 @@ The module update takes care of the new config syntax and the data itself (user - `teleport` has been upgraded from major version 12 to major version 14. Please see upstream [upgrade instructions](https://goteleport.com/docs/management/operations/upgrading/) and release notes for versions [13](https://goteleport.com/docs/changelog/#1300-050823) and [14](https://goteleport.com/docs/changelog/#1400-092023). Note that Teleport does not officially support upgrades across more than one major version at a time. If you're running Teleport server components, it is recommended to first upgrade to an intermediate 13.x version by setting `services.teleport.package = pkgs.teleport_13`. Afterwards, this option can be removed to upgrade to the default version (14). - The Linux kernel module `msr` (see [`msr(4)`](https://man7.org/linux/man-pages/man4/msr.4.html)), which provides an interface to read and write the model-specific registers (MSRs) of an x86 CPU, can now be configured via `hardware.cpu.x86.msr`. + diff --git a/pkgs/applications/misc/blender/default.nix b/pkgs/applications/misc/blender/default.nix index 8e7fde6d9c299..18fa3a6b2c03b 100644 --- a/pkgs/applications/misc/blender/default.nix +++ b/pkgs/applications/misc/blender/default.nix @@ -1,243 +1,51 @@ -{ config, stdenv, lib, fetchurl, fetchzip, boost, cmake, ffmpeg, gettext, glew -, ilmbase, libepoxy, libXi, libX11, libXext, libXrender -, libjpeg, libpng, libsamplerate, libsndfile -, libtiff, libwebp, libGLU, libGL, openal, opencolorio, openexr, openimagedenoise, openimageio, openjpeg, python310Packages -, openvdb, libXxf86vm, tbb, alembic -, zlib, zstd, fftw, opensubdiv, freetype, jemalloc, ocl-icd, addOpenGLRunpath -, jackaudioSupport ? false, libjack2 -, cudaSupport ? config.cudaSupport, cudaPackages ? { } -, hipSupport ? false, rocmPackages # comes with a significantly larger closure size -, colladaSupport ? true, opencollada -, spaceNavSupport ? stdenv.isLinux, libspnav -, makeWrapper -, pugixml, llvmPackages, SDL, Cocoa, CoreGraphics, ForceFeedback, OpenAL, OpenGL -, waylandSupport ? stdenv.isLinux, pkg-config, wayland, wayland-protocols, libffi, libdecor, libxkbcommon, dbus -, potrace -, openxr-loader -, embree, gmp, libharu -, openpgl -, mesa -, runCommand +{ lib +, stdenv +, llvmPackages_10 +, darwin +, callPackage +, python310 }: let - python = python310Packages.python; - optix = fetchzip { - # url taken from the archlinux blender PKGBUILD - url = "https://developer.download.nvidia.com/redist/optix/v7.3/OptiX-7.3.0-Include.zip"; - sha256 = "0max1j4822mchj0xpz9lqzh91zkmvsn4py0r174cvqfz8z8ykjk8"; - }; + versions = lib.importJSON ./versions.json; -in -stdenv.mkDerivation (finalAttrs: rec { - pname = "blender"; - version = "3.6.5"; - - src = fetchurl { - url = "https://download.blender.org/source/${pname}-${version}.tar.xz"; - hash = "sha256-QAHA/pn22HLsfH6VX4Sp7r25raFxAPS1Gergjez38kM="; - }; - - patches = [ - ./draco.patch - ] ++ lib.optional stdenv.isDarwin ./darwin.patch; - - nativeBuildInputs = - [ cmake makeWrapper python310Packages.wrapPython llvmPackages.llvm.dev - ] - ++ lib.optionals cudaSupport [ addOpenGLRunpath ] - ++ lib.optionals waylandSupport [ pkg-config ]; - buildInputs = - [ boost ffmpeg gettext glew ilmbase - freetype libjpeg libpng libsamplerate libsndfile libtiff libwebp - opencolorio openexr openimageio openjpeg python zlib zstd fftw jemalloc - alembic - (opensubdiv.override { inherit cudaSupport; }) - tbb - gmp - pugixml - potrace - libharu - libepoxy - openpgl - ] - ++ lib.optionals waylandSupport [ - wayland wayland-protocols libffi libdecor libxkbcommon dbus - ] - ++ lib.optionals (!stdenv.isAarch64) [ - openimagedenoise - embree - ] - ++ (if (!stdenv.isDarwin) then [ - libXi libX11 libXext libXrender - libGLU libGL openal - libXxf86vm - openxr-loader - # OpenVDB currently doesn't build on darwin - openvdb - ] - else [ - llvmPackages.openmp SDL Cocoa CoreGraphics ForceFeedback OpenAL OpenGL - ]) - ++ lib.optional jackaudioSupport libjack2 - ++ lib.optional cudaSupport cudaPackages.cudatoolkit - ++ lib.optional colladaSupport opencollada - ++ lib.optional spaceNavSupport libspnav; - pythonPath = with python310Packages; [ numpy requests zstandard ]; - - postPatch = '' - '' + - (if stdenv.isDarwin then '' - : > build_files/cmake/platform/platform_apple_xcode.cmake - substituteInPlace source/creator/CMakeLists.txt \ - --replace '${"$"}{LIBDIR}/python' \ - '${python}' - substituteInPlace build_files/cmake/platform/platform_apple.cmake \ - --replace '${"$"}{LIBDIR}/python' \ - '${python}' \ - --replace '${"$"}{LIBDIR}/opencollada' \ - '${opencollada}' \ - --replace '${"$"}{PYTHON_LIBPATH}/site-packages/numpy' \ - '${python310Packages.numpy}/${python.sitePackages}/numpy' - '' else '' - substituteInPlace extern/clew/src/clew.c --replace '"libOpenCL.so"' '"${ocl-icd}/lib/libOpenCL.so"' - '') + - (lib.optionalString hipSupport '' - substituteInPlace extern/hipew/src/hipew.c --replace '"/opt/rocm/hip/lib/libamdhip64.so"' '"${rocmPackages.clr}/lib/libamdhip64.so"' - substituteInPlace extern/hipew/src/hipew.c --replace '"opt/rocm/hip/bin"' '"${rocmPackages.clr}/bin"' - ''); - - cmakeFlags = - [ - "-DWITH_ALEMBIC=ON" - # Blender supplies its own FindAlembic.cmake (incompatible with the Alembic-supplied config file) - "-DALEMBIC_INCLUDE_DIR=${lib.getDev alembic}/include" - "-DALEMBIC_LIBRARY=${lib.getLib alembic}/lib/libAlembic.so" - "-DWITH_MOD_OCEANSIM=ON" - "-DWITH_CODEC_FFMPEG=ON" - "-DWITH_CODEC_SNDFILE=ON" - "-DWITH_INSTALL_PORTABLE=OFF" - "-DWITH_FFTW3=ON" - "-DWITH_SDL=OFF" - "-DWITH_OPENCOLORIO=ON" - "-DWITH_OPENSUBDIV=ON" - "-DPYTHON_LIBRARY=${python.libPrefix}" - "-DPYTHON_LIBPATH=${python}/lib" - "-DPYTHON_INCLUDE_DIR=${python}/include/${python.libPrefix}" - "-DPYTHON_VERSION=${python.pythonVersion}" - "-DWITH_PYTHON_INSTALL=OFF" - "-DWITH_PYTHON_INSTALL_NUMPY=OFF" - "-DPYTHON_NUMPY_PATH=${python310Packages.numpy}/${python.sitePackages}" - "-DPYTHON_NUMPY_INCLUDE_DIRS=${python310Packages.numpy}/${python.sitePackages}/numpy/core/include" - "-DWITH_PYTHON_INSTALL_REQUESTS=OFF" - "-DWITH_OPENVDB=ON" - "-DWITH_TBB=ON" - "-DWITH_IMAGE_OPENJPEG=ON" - "-DWITH_OPENCOLLADA=${if colladaSupport then "ON" else "OFF"}" - ] - ++ lib.optionals waylandSupport [ - "-DWITH_GHOST_WAYLAND=ON" - "-DWITH_GHOST_WAYLAND_DBUS=ON" - "-DWITH_GHOST_WAYLAND_DYNLOAD=OFF" - "-DWITH_GHOST_WAYLAND_LIBDECOR=ON" - ] - ++ lib.optionals stdenv.hostPlatform.isAarch64 [ - "-DWITH_CYCLES_EMBREE=OFF" - ] - ++ lib.optionals stdenv.isDarwin [ - "-DWITH_CYCLES_OSL=OFF" # requires LLVM - "-DWITH_OPENVDB=OFF" # OpenVDB currently doesn't build on darwin + latestStable = lib.last (builtins.sort lib.versionOlder (builtins.attrNames versions)); + latestLTS = lib.last (builtins.sort lib.versionOlder (builtins.attrNames (lib.filterAttrs (_: v: v.isLTS == true) versions))); - "-DLIBDIR=/does-not-exist" - ] - # Clang doesn't support "-export-dynamic" - ++ lib.optional stdenv.cc.isClang "-DPYTHON_LINKFLAGS=" - ++ lib.optional jackaudioSupport "-DWITH_JACK=ON" - ++ lib.optionals cudaSupport [ - "-DWITH_CYCLES_CUDA_BINARIES=ON" - "-DWITH_CYCLES_DEVICE_OPTIX=ON" - "-DOPTIX_ROOT_DIR=${optix}" - ]; + buildEnv = callPackage ./wrapper.nix {}; - env.NIX_CFLAGS_COMPILE = "-I${ilmbase.dev}/include/OpenEXR -I${python}/include/${python.libPrefix}"; + packages = + lib.mapAttrs' + (version: content: rec { + name = "blender_${version}"; + value = callPackage ./generic.nix { + inherit (darwin.apple_sdk.frameworks) Cocoa CoreGraphics ForceFeedback OpenAL OpenGL; - # Since some dependencies are built with gcc 6, we need gcc 6's - # libstdc++ in our RPATH. Sigh. - NIX_LDFLAGS = lib.optionalString cudaSupport "-rpath ${stdenv.cc.cc.lib}/lib"; + # LLVM 11 crashes when compiling GHOST_SystemCocoa.mm + stdenv = if stdenv.isDarwin then llvmPackages_10.stdenv else stdenv; - blenderExecutable = - placeholder "out" + (if stdenv.isDarwin then "/Applications/Blender.app/Contents/MacOS/Blender" else "/bin/blender"); - postInstall = lib.optionalString stdenv.isDarwin '' - mkdir $out/Applications - mv $out/Blender.app $out/Applications - '' + '' - mv $out/share/blender/${lib.versions.majorMinor version}/python{,-ext} - buildPythonPath "$pythonPath" - wrapProgram $blenderExecutable \ - --prefix PATH : $program_PATH \ - --prefix PYTHONPATH : "$program_PYTHONPATH" \ - --add-flags '--python-use-system-env' - ''; + # TODO Consider following https://vfxplatform.com/ for dependency tracking + # Like "VFX_RefCY": "2024", which outlines python 3.11, qt 6.5+ etc + python = python310; - # Set RUNPATH so that libcuda and libnvrtc in /run/opengl-driver(-32)/lib can be - # found. See the explanation in libglvnd. - postFixup = lib.optionalString cudaSupport '' - for program in $out/bin/blender $out/bin/.blender-wrapped; do - isELF "$program" || continue - addOpenGLRunpath "$program" - done - ''; + withPackages = f: let packages = f value.python.pkgs; in buildEnv.override { blender = value; extraModules = packages; }; - passthru = { - inherit python; + inherit (content) version hashes isLTS; + }; + }) + versions; - tests = { - render = runCommand "${pname}-test" { } '' - set -euo pipefail - - export LIBGL_DRIVERS_PATH=${mesa.drivers}/lib/dri - export __EGL_VENDOR_LIBRARY_FILENAMES=${mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json - - cat <<'PYTHON' > scene-config.py - import bpy - bpy.context.scene.eevee.taa_render_samples = 32 - bpy.context.scene.cycles.samples = 32 - if ${if stdenv.isAarch64 then "True" else "False"}: - bpy.context.scene.cycles.use_denoising = False - bpy.context.scene.render.resolution_x = 100 - bpy.context.scene.render.resolution_y = 100 - bpy.context.scene.render.threads_mode = 'FIXED' - bpy.context.scene.render.threads = 1 - PYTHON - - mkdir $out - for engine in BLENDER_EEVEE CYCLES; do - echo "Rendering with $engine..." - # Beware that argument order matters - ${finalAttrs.finalPackage}/bin/blender \ - --background \ - -noaudio \ - --factory-startup \ - --python-exit-code 1 \ - --python scene-config.py \ - --engine "$engine" \ - --render-output "$out/$engine" \ - --render-frame 1 - done - ''; - }; - }; - - meta = with lib; { - description = "3D Creation/Animation/Publishing System"; - homepage = "https://www.blender.org"; - # They comment two licenses: GPLv2 and Blender License, but they - # say: "We've decided to cancel the BL offering for an indefinite period." - # OptiX, enabled with cudaSupport, is non-free. - license = with licenses; [ gpl2Plus ] ++ optional cudaSupport unfree; - platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" ]; - broken = stdenv.isDarwin; - maintainers = with maintainers; [ goibhniu veprbl ]; - mainProgram = "blender"; - }; -}) + packages-hip = + lib.mapAttrs' + (packageName: package: { + name = builtins.replaceStrings ["blender_"] [""] "blender-hip_${packageName}"; + value = package.override {hipSupport = true;}; + }) + packages; +in + packages + // packages-hip + // rec { + stable = packages."blender_${latestStable}"; + lts = packages."blender_${latestLTS}"; + } diff --git a/pkgs/applications/misc/blender/draco-p1.patch b/pkgs/applications/misc/blender/draco-p1.patch new file mode 100644 index 0000000000000..d4f03586a9122 --- /dev/null +++ b/pkgs/applications/misc/blender/draco-p1.patch @@ -0,0 +1,13 @@ +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -898,11 +898,6 @@ set_and_warn_dependency(WITH_PYTHON WITH_CYCLES OFF) + set_and_warn_dependency(WITH_PYTHON WITH_DRACO OFF) + set_and_warn_dependency(WITH_PYTHON WITH_MOD_FLUID OFF) + +-if(WITH_DRACO AND NOT WITH_PYTHON_INSTALL) +- message(STATUS "WITH_DRACO requires WITH_PYTHON_INSTALL to be ON, disabling WITH_DRACO for now") +- set(WITH_DRACO OFF) +-endif() +- + # enable boost for cycles, audaspace or i18n + # otherwise if the user disabled diff --git a/pkgs/applications/misc/blender/draco.patch b/pkgs/applications/misc/blender/draco-p2.patch similarity index 56% rename from pkgs/applications/misc/blender/draco.patch rename to pkgs/applications/misc/blender/draco-p2.patch index 2a856a0638aee..1fa8910ff1f6c 100644 --- a/pkgs/applications/misc/blender/draco.patch +++ b/pkgs/applications/misc/blender/draco-p2.patch @@ -1,17 +1,3 @@ ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -898,11 +898,6 @@ set_and_warn_dependency(WITH_PYTHON WITH_CYCLES OFF) - set_and_warn_dependency(WITH_PYTHON WITH_DRACO OFF) - set_and_warn_dependency(WITH_PYTHON WITH_MOD_FLUID OFF) - --if(WITH_DRACO AND NOT WITH_PYTHON_INSTALL) -- message(STATUS "WITH_DRACO requires WITH_PYTHON_INSTALL to be ON, disabling WITH_DRACO for now") -- set(WITH_DRACO OFF) --endif() -- - # enable boost for cycles, audaspace or i18n - # otherwise if the user disabled - --- a/scripts/addons/io_scene_gltf2/io/com/gltf2_io_draco_compression_extension.py +++ b/scripts/addons/io_scene_gltf2/io/com/gltf2_io_draco_compression_extension.py @@ -17,7 +17,7 @@ def dll_path() -> Path: diff --git a/pkgs/applications/misc/blender/generic.nix b/pkgs/applications/misc/blender/generic.nix new file mode 100644 index 0000000000000..1b1c66cf17b35 --- /dev/null +++ b/pkgs/applications/misc/blender/generic.nix @@ -0,0 +1,282 @@ +{ config, stdenv, lib, fetchFromGitea, fetchzip, boost, cmake, ffmpeg, gettext, glew +, ilmbase, libepoxy, libXi, libX11, libXext, libXrender +, libjpeg, libpng, libsamplerate, libsndfile +, libtiff, libwebp, libGLU, libGL, openal, opencolorio, openexr, openimagedenoise, openimageio, openjpeg +, openvdb, libXxf86vm, tbb, alembic +, zlib, zstd, fftw, opensubdiv, freetype, jemalloc, ocl-icd, addOpenGLRunpath +, jackaudioSupport ? false, libjack2 +, cudaSupport ? config.cudaSupport, cudaPackages +, hipSupport ? false, rocmPackages # comes with a significantly larger closure size +, colladaSupport ? true, opencollada +, spaceNavSupport ? stdenv.isLinux, libspnav +, makeWrapper +, pugixml, llvmPackages, SDL, Cocoa, CoreGraphics, ForceFeedback, OpenAL, OpenGL +, waylandSupport ? stdenv.isLinux, pkg-config, wayland, wayland-protocols, libffi, libdecor, libxkbcommon, dbus +, potrace +, openxr-loader +, embree, gmp, libharu +, openpgl +, mesa +, runCommand +, version, hashes, isLTS, python, withPackages, xvfb-run +}: + +let + optix = fetchzip { + # url taken from the archlinux blender PKGBUILD + # Using OptiX SDK 7.3 according to build instructions + # https://wiki.blender.org/wiki/Building_Blender/GPU_Binaries + url = "https://developer.download.nvidia.com/redist/optix/v7.3/OptiX-7.3.0-Include.zip"; + hash = "sha256-aMrp0Uff4c3ICRn4S6zedf6Q4Mc0/duBhKwKgYgMXVU="; + }; + blender-addons = fetchFromGitea { + domain = "projects.blender.org"; + owner = "blender"; + repo = "blender-addons"; + rev = "v${version}"; + hash = hashes.addons; + + postFetch = '' + patch -p3 -d $out < ${./draco-p2.patch} + ''; + }; + +in +stdenv.mkDerivation (finalAttrs: rec { + pname = "blender"; + inherit version; + + src = fetchFromGitea { + domain = "projects.blender.org"; + owner = "blender"; + repo = "blender"; + rev = "v${version}"; + hash = hashes.blender; + + # Blender 3.3 uses submodules, but 3.5+ doesnt. + # See https://projects.blender.org/blender/blender/pulls/104755 + fetchSubmodules = lib.versionOlder version "3.5"; + }; + + prePatch = if lib.versionAtLeast version "3.5" then '' + mkdir scripts/addons + cp -Rv ${blender-addons}/* scripts/addons + '' else '' + cp -Rv ${blender-addons}/* release/scripts/addons +''; + + patches = [ + ./draco-p1.patch + ] ++ lib.optional stdenv.isDarwin ./darwin.patch; + + nativeBuildInputs = [ + cmake + makeWrapper + python.pkgs.wrapPython + llvmPackages.llvm.dev + ] ++ lib.optionals cudaSupport [ addOpenGLRunpath ] + ++ lib.optionals waylandSupport [ pkg-config ]; + buildInputs = + [ boost ffmpeg gettext glew ilmbase + freetype libjpeg libpng libsamplerate libsndfile libtiff libwebp + opencolorio openexr openimageio openjpeg python zlib zstd fftw jemalloc + alembic + (opensubdiv.override { inherit cudaSupport; }) + tbb + gmp + pugixml + potrace + libharu + libepoxy + openpgl + ] + ++ lib.optionals waylandSupport [ + wayland wayland-protocols libffi libdecor libxkbcommon dbus + ] + ++ lib.optionals (!stdenv.isAarch64) [ + openimagedenoise + embree + ] + ++ (if (!stdenv.isDarwin) then [ + libXi libX11 libXext libXrender + libGLU libGL openal + libXxf86vm + openxr-loader + # OpenVDB currently doesn't build on darwin + openvdb + ] + else [ + llvmPackages.openmp SDL Cocoa CoreGraphics ForceFeedback OpenAL OpenGL + ]) + ++ lib.optional jackaudioSupport libjack2 + ++ lib.optional cudaSupport cudaPackages.cudatoolkit + ++ lib.optional colladaSupport opencollada + ++ lib.optional spaceNavSupport libspnav; + pythonPath = with python.pkgs; [ numpy requests zstandard ]; + + postPatch = (if stdenv.isDarwin then '' + : > build_files/cmake/platform/platform_apple_xcode.cmake + substituteInPlace source/creator/CMakeLists.txt \ + --replace '${"$"}{LIBDIR}/python' \ + '${python}' + substituteInPlace build_files/cmake/platform/platform_apple.cmake \ + --replace '${"$"}{LIBDIR}/python' \ + '${python}' \ + --replace '${"$"}{LIBDIR}/opencollada' \ + '${opencollada}' \ + --replace '${"$"}{PYTHON_LIBPATH}/site-packages/numpy' \ + '${python.pkgs.numpy}/${python.sitePackages}/numpy' + '' else '' + substituteInPlace extern/clew/src/clew.c --replace '"libOpenCL.so"' '"${ocl-icd}/lib/libOpenCL.so"' + '') + + (lib.optionalString hipSupport '' + substituteInPlace extern/hipew/src/hipew.c \ + --replace '"/opt/rocm/hip/lib/libamdhip64.so"' '"${rocmPackages.clr}/lib/libamdhip64.so"' \ + --replace '"opt/rocm/hip/bin"' '"${rocmPackages.clr}/bin"' + ''); + + cmakeFlags = + [ + "-DWITH_ALEMBIC=ON" + # Blender supplies its own FindAlembic.cmake (incompatible with the Alembic-supplied config file) + "-DALEMBIC_INCLUDE_DIR=${lib.getDev alembic}/include" + "-DALEMBIC_LIBRARY=${lib.getLib alembic}/lib/libAlembic.so" + "-DWITH_MOD_OCEANSIM=ON" + "-DWITH_CODEC_FFMPEG=ON" + "-DWITH_CODEC_SNDFILE=ON" + "-DWITH_INSTALL_PORTABLE=OFF" + "-DWITH_FFTW3=ON" + "-DWITH_SDL=OFF" + "-DWITH_OPENCOLORIO=ON" + "-DWITH_OPENSUBDIV=ON" + "-DPYTHON_LIBRARY=${python.libPrefix}" + "-DPYTHON_LIBPATH=${python}/lib" + "-DPYTHON_INCLUDE_DIR=${python}/include/${python.libPrefix}" + "-DPYTHON_VERSION=${python.pythonVersion}" + "-DWITH_PYTHON_INSTALL=OFF" + "-DWITH_PYTHON_INSTALL_NUMPY=OFF" + "-DPYTHON_NUMPY_PATH=${python.pkgs.numpy}/${python.sitePackages}" + "-DPYTHON_NUMPY_INCLUDE_DIRS=${python.pkgs.numpy}/${python.sitePackages}/numpy/core/include" + "-DWITH_PYTHON_INSTALL_REQUESTS=OFF" + "-DWITH_OPENVDB=ON" + "-DWITH_TBB=ON" + "-DWITH_IMAGE_OPENJPEG=ON" + "-DWITH_OPENCOLLADA=${if colladaSupport then "ON" else "OFF"}" + ] + ++ lib.optionals waylandSupport [ + "-DWITH_GHOST_WAYLAND=ON" + "-DWITH_GHOST_WAYLAND_DBUS=ON" + "-DWITH_GHOST_WAYLAND_DYNLOAD=OFF" + "-DWITH_GHOST_WAYLAND_LIBDECOR=ON" + ] + ++ lib.optionals stdenv.hostPlatform.isAarch64 [ + "-DWITH_CYCLES_EMBREE=OFF" + ] + ++ lib.optionals stdenv.isDarwin [ + "-DWITH_CYCLES_OSL=OFF" # requires LLVM + "-DWITH_OPENVDB=OFF" # OpenVDB currently doesn't build on darwin + + "-DLIBDIR=/does-not-exist" + ] + # Clang doesn't support "-export-dynamic" + ++ lib.optional stdenv.cc.isClang "-DPYTHON_LINKFLAGS=" + ++ lib.optional jackaudioSupport "-DWITH_JACK=ON" + ++ lib.optionals cudaSupport [ + "-DWITH_CYCLES_CUDA_BINARIES=ON" + "-DWITH_CYCLES_DEVICE_OPTIX=ON" + "-DOPTIX_ROOT_DIR=${optix}" + ]; + + env.NIX_CFLAGS_COMPILE = "-I${ilmbase.dev}/include/OpenEXR -I${python}/include/${python.libPrefix}"; + + # Since some dependencies are built with gcc 6, we need gcc 6's + # libstdc++ in our RPATH. Sigh. + NIX_LDFLAGS = lib.optionalString cudaSupport "-rpath ${stdenv.cc.cc.lib}/lib"; + + blenderExecutable = + placeholder "out" + (if stdenv.isDarwin then "/Applications/Blender.app/Contents/MacOS/Blender" else "/bin/blender"); + postInstall = lib.optionalString stdenv.isDarwin '' + mkdir $out/Applications + mv $out/Blender.app $out/Applications + '' + '' + mv $out/share/blender/${lib.versions.majorMinor version}/python{,-ext} + buildPythonPath "$pythonPath" + wrapProgram $blenderExecutable \ + --prefix PATH : $program_PATH \ + --prefix PYTHONPATH : "$program_PYTHONPATH" \ + --add-flags '--python-use-system-env' + ''; + + # Set RUNPATH so that libcuda and libnvrtc in /run/opengl-driver(-32)/lib can be + # found. See the explanation in libglvnd. + postFixup = lib.optionalString cudaSupport '' + for program in $out/bin/blender $out/bin/.blender-wrapped; do + isELF "$program" || continue + addOpenGLRunpath "$program" + done + ''; + + passthru = { + inherit python isLTS withPackages; + + tests = { + render = runCommand "${pname}-test" { } '' + set -euo pipefail + + export LIBGL_DRIVERS_PATH=${mesa.drivers}/lib/dri + export __EGL_VENDOR_LIBRARY_FILENAMES=${mesa.drivers}/share/glvnd/egl_vendor.d/50_mesa.json + + cat <<'PYTHON' > scene-config.py + import bpy + bpy.context.scene.eevee.taa_render_samples = 32 + bpy.context.scene.cycles.samples = 32 + if ${if stdenv.isAarch64 then "True" else "False"}: + bpy.context.scene.cycles.use_denoising = False + bpy.context.scene.render.resolution_x = 100 + bpy.context.scene.render.resolution_y = 100 + bpy.context.scene.render.threads_mode = 'FIXED' + bpy.context.scene.render.threads = 1 + PYTHON + + mkdir $out + for engine in BLENDER_EEVEE CYCLES; do + # Beware that argument order matters + arguments=$(cat <<' ARGS' + --background \ + -noaudio \ + --factory-startup \ + --python-exit-code 1 \ + --python scene-config.py \ + --engine "$engine" \ + --render-output "$out/$engine" \ + --render-frame 1 + ARGS) + + echo "Rendering with $engine..." + + # Blender doesn't support headless rendering on EEVEE before 3.4 + if [ ${if lib.versionOlder version "3.4" then "0" else "1"} -eq 0 ] && [ $engine == "BLENDER_EEVEE" ] + then + echo "Using xfvb workaround..." + eval "${xvfb-run}/bin/xvfb-run ${finalAttrs.finalPackage}/bin/blender $arguments" + else + eval "${finalAttrs.finalPackage}/bin/blender $arguments" + fi + done + ''; + }; + }; + + meta = with lib; { + description = "3D Creation/Animation/Publishing System"; + homepage = "https://www.blender.org"; + # They comment two licenses: GPLv2 and Blender License, but they + # say: "We've decided to cancel the BL offering for an indefinite period." + # OptiX, enabled with cudaSupport, is non-free. + license = with licenses; [ gpl2Plus ] ++ optional cudaSupport unfree; + platforms = [ "x86_64-linux" "x86_64-darwin" "aarch64-linux" ]; + broken = stdenv.isDarwin; + maintainers = with maintainers; [ goibhniu veprbl hubble ]; + mainProgram = "blender"; + }; +}) diff --git a/pkgs/applications/misc/blender/update.py b/pkgs/applications/misc/blender/update.py new file mode 100755 index 0000000000000..8a3c24c00bafa --- /dev/null +++ b/pkgs/applications/misc/blender/update.py @@ -0,0 +1,128 @@ +#!/usr/bin/env nix-shell +#!nix-shell -i python3 -p git python3 nurl python3Packages.packaging + +import json +import subprocess +import re +import os +from packaging.version import parse + +# URL *with* trailing slash +url = "https://projects.blender.org/" +blender_repo = "blender/blender" +blender_addons_repo = "blender/blender-addons" + +# https://wiki.blender.org/wiki/Reference/Release_Notes +lts_versions = ["2.83", "2.93", "3.3", "3.6"] +active_versions = ["3.3", "3.6"] + +# List of available Blender versions for nixpkgs +blender_versions = list() +addon_versions = list() +index = dict() + + +# Retrieve list of matching major+minor versions from newest to oldest +def find_versions(repo, version): + return re.findall( + r"v[0-9.]+$", + subprocess.run([ + "git", "ls-remote", "--tags", "--sort=-version:refname", repo, + "v" + version + ".*" + ], + capture_output=True, + text=True).stdout, re.MULTILINE) + + +def nix_prefetch_sha256(repo, version, postFetch="", submodules=False): + print("Getting sha256 hash for {}, v{}".format(repo, version)) + command = [ + 'nurl', + "--fetcher", + "fetchFromGitea", + repo, + "v" + version, + "-H", + ] + if submodules: + command += ["-S"] + if postFetch != "": + command += ["--arg-str", "postFetch", postFetch] + return subprocess.run(command, capture_output=True, text=True).stdout + + +if __name__ == "__main__": + # Get the new newest version of both Blender and blender-addons + # Also removes the "v" from the beginning of the versions + for ver in active_versions: + blender_versions.append( + find_versions(url + blender_repo, ver)[0].replace("v", "")) + addon_versions.append( + find_versions(url + blender_addons_repo, ver)[0].replace("v", "")) + + # Encode all information to JSON + if blender_versions != addon_versions: + raise Exception(''' + Available latest Blender versions do not line up with latest Addons versions. + Check upstream. + ''') + else: + for (version, blender, addon) in zip(active_versions, blender_versions, + addon_versions): + index[version.replace(".", "_")] = { + "version": blender, + "isLTS": version in lts_versions, + "hashes": { + "blender": + nix_prefetch_sha256( + url + blender_repo, + blender, + submodules=(True if parse(version) < parse("3.5") else + False)), + "addons": + nix_prefetch_sha256( + url + blender_addons_repo, addon, + "patch -p3 -d $out < ${./draco-p2.patch}") + } + } + + # Print changes + print("====== Changes ======\n") + d = os.path.dirname(os.path.abspath(__file__)) + with open(os.path.join(d, 'versions.json'), 'r') as f: + changes = "" + current = json.load(f) + + # Check for version updates, new versions, and hash mismatches + for v in index: + if v in current: + if index[v]["version"] != current[v]["version"]: + changes += "blender_{}: {} -> {}\n".format( + v, current[v]["version"], index[v]["version"]) + elif index[v]["hashes"] != current[v]["hashes"]: + changes += "blender_{}: correct hash mismatch\n".format(v) + else: + continue + else: + changes += "blender_{}: init {}\n".format( + v, index[v]["version"]) + + # Check if versions removed + for v in current: + if v not in index: + changes += "blender_{}: remove\n".format(v) + else: + continue + + if changes == "": + print("No changes made") + exit() + + print(changes) + print("=====================") + + # Write file + with open(os.path.join(d, 'versions.json'), 'w') as f: + print("Writing to versions.json...") + json.dump(index, f, indent=4) + f.write('\n') diff --git a/pkgs/applications/misc/blender/versions.json b/pkgs/applications/misc/blender/versions.json new file mode 100644 index 0000000000000..9207da3f4f0c5 --- /dev/null +++ b/pkgs/applications/misc/blender/versions.json @@ -0,0 +1,18 @@ +{ + "3_3": { + "version": "3.3.12", + "isLTS": true, + "hashes": { + "blender": "sha256-xTdaUNayIm2SFMhIQSC3IYR9vy3Oh8A/ETHkwosOCPs=", + "addons": "sha256-zrdVR1QuKoUdgZpOuQQgpjn2ehKqJ38KfJ0meFR/92s=" + } + }, + "3_6": { + "version": "3.6.5", + "isLTS": true, + "hashes": { + "blender": "sha256-U8z+xjz0vAZ9pUvRpVzcCcXfOvDmpFUPuOkgUvVwNow=", + "addons": "sha256-K4jbWuWaXtSjEqbmZC+7SnsNUJCcru1U1HuI4LCuuGM=" + } + } +} diff --git a/pkgs/applications/misc/blender/wrapper.nix b/pkgs/applications/misc/blender/wrapper.nix index 3828d61a8645c..8526f5387e6e2 100644 --- a/pkgs/applications/misc/blender/wrapper.nix +++ b/pkgs/applications/misc/blender/wrapper.nix @@ -2,17 +2,15 @@ , lib , blender , makeWrapper -, python3Packages -}: -{ name ? "wrapped" -, packages ? [] +, extraModules ? [] }: +{ name ? "wrapped" }: stdenv.mkDerivation { pname = "blender-${name}"; inherit (blender) version; src = blender; - nativeBuildInputs = [ python3Packages.wrapPython makeWrapper ]; + nativeBuildInputs = [ blender.python.pkgs.wrapPython makeWrapper ]; installPhase = '' mkdir $out/{share/applications,bin} -p sed 's/Exec=blender/Exec=blender-${name}/g' $src/share/applications/blender.desktop > $out/share/applications/blender-${name}.desktop @@ -27,7 +25,7 @@ stdenv.mkDerivation { --prefix PYTHONPATH : $program_PYTHONPATH ''; - pythonPath = packages; + pythonPath = extraModules; meta = blender.meta; } diff --git a/pkgs/development/python-modules/bpycv/default.nix b/pkgs/development/python-modules/bpycv/default.nix index a6d385e977817..2d1d53ed5188a 100644 --- a/pkgs/development/python-modules/bpycv/default.nix +++ b/pkgs/development/python-modules/bpycv/default.nix @@ -2,7 +2,6 @@ , lib , beautifulsoup4 , blender -, blender-with-packages , boxx , bpycv , buildPythonPackage @@ -52,13 +51,8 @@ buildPythonPackage rec { hash = "sha256-dGb6KvbXTGTu5f4AqhA+i4AwTqBoR5SdXk0vsMEcD3Q="; rev = "6ce0e65c107d572011394da16ffdf851e988dbb4"; }; - nativeBuildInputs = [ - ((blender-with-packages.override {inherit blender python3Packages;}) { - packages = [ bpycv ]; - }) - ]; } '' - blender-wrapped -b -P ${./bpycv-test.py} + ${blender.withPackages(ps: [ps.bpycv]){}}/bin/blender-wrapped -b -P ${./bpycv-test.py} ''; }; diff --git a/pkgs/top-level/aliases.nix b/pkgs/top-level/aliases.nix index 5dc11a345a6dd..bf797c3f96f8e 100644 --- a/pkgs/top-level/aliases.nix +++ b/pkgs/top-level/aliases.nix @@ -92,6 +92,7 @@ mapAliases ({ bird2 = bird; # Added 2022-02-21 bitwig-studio1 = throw "bitwig-studio1 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03 bitwig-studio2 = throw "bitwig-studio2 has been removed, you can upgrade to 'bitwig-studio'"; # Added 2023-01-03 + blender-with-packages = throw "blender-with-packages has been removed in favor of blender.withPackages"; # Added 2023-10-26 bluezFull = throw "'bluezFull' has been renamed to/replaced by 'bluez'"; # Converted to throw 2023-09-10 boost168 = throw "boost168 has been deprecated in favor of the latest version"; # Added 2023-06-08 boost169 = throw "boost169 has been deprecated in favor of the latest version"; # Added 2023-06-08 diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index 99bf72a34481a..2d2654ff98e7f 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -30667,15 +30667,15 @@ with pkgs; bleachbit = callPackage ../applications/misc/bleachbit { }; - blender = callPackage ../applications/misc/blender { - # LLVM 11 crashes when compiling GHOST_SystemCocoa.mm - stdenv = if stdenv.isDarwin then llvmPackages_10.stdenv else stdenv; - inherit (darwin.apple_sdk.frameworks) Cocoa CoreGraphics ForceFeedback OpenAL OpenGL; - }; + blender = blenderVersions.stable; + + blender-lts = blenderVersions.lts; + + blender-hip = blenderVersions.stable.override { hipSupport = true; }; - blender-with-packages = callPackage ../applications/misc/blender/wrapper.nix { }; + blender-hip-lts = blenderVersions.lts.override { hipSupport = true; }; - blender-hip = blender.override { hipSupport = true; }; + blenderVersions = recurseIntoAttrs (callPackage ../applications/misc/blender { }); blflash = callPackage ../tools/misc/blflash { };