diff options
Diffstat (limited to 'nixpkgs/pkgs/applications/misc/blender/default.nix')
-rw-r--r-- | nixpkgs/pkgs/applications/misc/blender/default.nix | 409 |
1 files changed, 268 insertions, 141 deletions
diff --git a/nixpkgs/pkgs/applications/misc/blender/default.nix b/nixpkgs/pkgs/applications/misc/blender/default.nix index ec1f11617321..ebbc6cc84fef 100644 --- a/nixpkgs/pkgs/applications/misc/blender/default.nix +++ b/nixpkgs/pkgs/applications/misc/blender/default.nix @@ -1,47 +1,108 @@ -{ config, stdenv, lib, fetchurl, fetchzip, fetchpatch, boost, cmake, ffmpeg, gettext, glew -, 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, fftwFloat, 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 -, callPackage +{ + Cocoa, + CoreGraphics, + ForceFeedback, + OpenAL, + OpenGL, + SDL, + addOpenGLRunpath, + alembic, + boost, + callPackage, + cmake, + colladaSupport ? true, + config, + cudaPackages, + cudaSupport ? config.cudaSupport, + dbus, + embree, + fetchpatch, + fetchurl, + fetchzip, + ffmpeg, + fftw, + fftwFloat, + freetype, + gettext, + glew, + gmp, + hipSupport ? false, + jackaudioSupport ? false, + jemalloc, + lib, + libGL, + libGLU, + libX11, + libXext, + libXi, + libXrender, + libXxf86vm, + libdecor, + libepoxy, + libffi, + libharu, + libjack2, + libjpeg, + libpng, + libsamplerate, + libsndfile, + libspnav, + libtiff, + libwebp, + libxkbcommon, + llvmPackages, + makeWrapper, + mesa, + ocl-icd, + openal, + opencollada, + opencolorio, + openexr, + openimagedenoise, + openimageio, + openjpeg, + openpgl, + opensubdiv, + openvdb, + openxr-loader, + pkg-config, + potrace, + pugixml, + python310Packages, # must use instead of python3.pkgs, see https://github.com/NixOS/nixpkgs/issues/211340 + rocmPackages, # comes with a significantly larger closure size + runCommand, + spaceNavSupport ? stdenv.isLinux, + stdenv, + tbb, + wayland, + wayland-protocols, + waylandSupport ? stdenv.isLinux, + zlib, + zstd, }: let - pythonPackages = python310Packages; - inherit (pythonPackages) python; - buildEnv = callPackage ./wrapper.nix {}; - 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"; - }; + python3Packages = python310Packages; + python3 = python3Packages.python; + libdecor' = libdecor.overrideAttrs (old: { # Blender uses private APIs, need to patch to expose them patches = (old.patches or [ ]) ++ [ ./libdecor.patch ]; }); + optix = fetchzip { + # URL from https://gitlab.archlinux.org/archlinux/packaging/packages/blender/-/commit/333add667b43255dcb011215a2d2af48281e83cf#9b9baac1eb9b72790eef5540a1685306fc43fd6c_30_30 + url = "https://developer.download.nvidia.com/redist/optix/v7.3/OptiX-7.3.0-Include.zip"; + hash = "sha256-aMrp0Uff4c3ICRn4S6zedf6Q4Mc0/duBhKwKgYgMXVU="; + }; in -stdenv.mkDerivation (finalAttrs: rec { + +stdenv.mkDerivation (finalAttrs: { pname = "blender"; version = "4.0.2"; src = fetchurl { - url = "https://download.blender.org/source/${pname}-${version}.tar.xz"; + url = "https://download.blender.org/source/${finalAttrs.pname}-${finalAttrs.version}.tar.xz"; hash = "sha256-qqDnKdp1kc+/RXcq92NFl32qp7EaCvNdmPkxPiRgd6M="; }; @@ -53,101 +114,62 @@ stdenv.mkDerivation (finalAttrs: rec { }) ] ++ lib.optional stdenv.isDarwin ./darwin.patch; - nativeBuildInputs = - [ cmake makeWrapper python310Packages.wrapPython llvmPackages.llvm.dev - ] - ++ lib.optionals cudaSupport [ - addOpenGLRunpath - cudaPackages.cuda_nvcc - ] - ++ lib.optionals waylandSupport [ pkg-config ]; - buildInputs = - [ boost ffmpeg gettext glew - freetype libjpeg libpng libsamplerate libsndfile libtiff libwebp - opencolorio openexr openimageio openjpeg python zlib zstd fftw fftwFloat 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.optionals cudaSupport [ cudaPackages.cuda_cudart ] - ++ 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 '' + postPatch = + ( + if stdenv.isDarwin then + '' + : > build_files/cmake/platform/platform_apple_xcode.cmake + substituteInPlace source/creator/CMakeLists.txt \ + --replace '${"$"}{LIBDIR}/python' \ + '${python3}' + substituteInPlace build_files/cmake/platform/platform_apple.cmake \ + --replace '${"$"}{LIBDIR}/python' \ + '${python3}' \ + --replace '${"$"}{LIBDIR}/opencollada' \ + '${opencollada}' \ + --replace '${"$"}{PYTHON_LIBPATH}/site-packages/numpy' \ + '${python3Packages.numpy}/${python3.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"' ''); + env.NIX_CFLAGS_COMPILE = "-I${python3}/include/${python3.libPrefix}"; + cmakeFlags = [ + "-DPYTHON_INCLUDE_DIR=${python3}/include/${python3.libPrefix}" + "-DPYTHON_LIBPATH=${python3}/lib" + "-DPYTHON_LIBRARY=${python3.libPrefix}" + "-DPYTHON_NUMPY_INCLUDE_DIRS=${python3Packages.numpy}/${python3.sitePackages}/numpy/core/include" + "-DPYTHON_NUMPY_PATH=${python3Packages.numpy}/${python3.sitePackages}" + "-DPYTHON_VERSION=${python3.pythonVersion}" "-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_IMAGE_OPENJPEG=ON" + "-DWITH_INSTALL_PORTABLE=OFF" + "-DWITH_MOD_OCEANSIM=ON" + "-DWITH_OPENCOLLADA=${if colladaSupport then "ON" else "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_OPENVDB=ON" "-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_SDL=OFF" "-DWITH_TBB=ON" - "-DWITH_IMAGE_OPENJPEG=ON" - "-DWITH_OPENCOLLADA=${if colladaSupport then "ON" else "OFF"}" + + # 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" ] ++ lib.optionals waylandSupport [ "-DWITH_GHOST_WAYLAND=ON" @@ -155,43 +177,135 @@ stdenv.mkDerivation (finalAttrs: rec { "-DWITH_GHOST_WAYLAND_DYNLOAD=OFF" "-DWITH_GHOST_WAYLAND_LIBDECOR=ON" ] - ++ lib.optionals stdenv.hostPlatform.isAarch64 [ - "-DWITH_CYCLES_EMBREE=OFF" - ] + ++ lib.optionals stdenv.hostPlatform.isAarch64 [ "-DWITH_CYCLES_EMBREE=OFF" ] ++ lib.optionals stdenv.isDarwin [ + "-DLIBDIR=/does-not-exist" "-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 stdenv.cc.isClang "-DPYTHON_LINKFLAGS=" # Clang doesn't support "-export-dynamic" ++ lib.optional jackaudioSupport "-DWITH_JACK=ON" ++ lib.optionals cudaSupport [ + "-DOPTIX_ROOT_DIR=${optix}" "-DWITH_CYCLES_CUDA_BINARIES=ON" "-DWITH_CYCLES_DEVICE_OPTIX=ON" - "-DOPTIX_ROOT_DIR=${optix}" ]; - env.NIX_CFLAGS_COMPILE = "-I${python}/include/${python.libPrefix}"; + nativeBuildInputs = + [ + cmake + llvmPackages.llvm.dev + makeWrapper + python3Packages.wrapPython + ] + ++ lib.optionals cudaSupport [ + addOpenGLRunpath + cudaPackages.cuda_nvcc + ] + ++ lib.optionals waylandSupport [ pkg-config ]; + + buildInputs = + [ + alembic + boost + ffmpeg + fftw + fftwFloat + freetype + gettext + glew + gmp + jemalloc + libepoxy + libharu + libjpeg + libpng + libsamplerate + libsndfile + libtiff + libwebp + opencolorio + openexr + openimageio + openjpeg + openpgl + (opensubdiv.override { inherit cudaSupport; }) + potrace + pugixml + python3 + tbb + zlib + zstd + ] + ++ lib.optionals (!stdenv.isAarch64) [ + embree + openimagedenoise + ] + ++ ( + if (!stdenv.isDarwin) then + [ + libGL + libGLU + libX11 + libXext + libXi + libXrender + libXxf86vm + openal + openvdb # OpenVDB currently doesn't build on darwin + openxr-loader + ] + else + [ + Cocoa + CoreGraphics + ForceFeedback + OpenAL + OpenGL + SDL + llvmPackages.openmp + ] + ) + ++ lib.optionals cudaSupport [ cudaPackages.cuda_cudart ] + ++ lib.optionals waylandSupport [ + dbus + libdecor' + libffi + libxkbcommon + wayland + wayland-protocols + ] + ++ lib.optional colladaSupport opencollada + ++ lib.optional jackaudioSupport libjack2 + ++ lib.optional spaceNavSupport libspnav; - # 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"; + pythonPath = + let + ps = python3Packages; + in + [ + ps.numpy + ps.requests + ps.zstandard + ]; 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' - ''; + 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 finalAttrs.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. @@ -203,12 +317,18 @@ stdenv.mkDerivation (finalAttrs: rec { ''; passthru = { - inherit python pythonPackages; + python = python3; + pythonPackages = python3Packages; - withPackages = f: let packages = f pythonPackages; in buildEnv.override { blender = finalAttrs.finalPackage; extraModules = packages; }; + withPackages = + f: + (callPackage ./wrapper.nix { }).override { + blender = finalAttrs.finalPackage; + extraModules = (f python3Packages); + }; tests = { - render = runCommand "${pname}-test" { } '' + render = runCommand "${finalAttrs.pname}-test" { } '' set -euo pipefail export LIBGL_DRIVERS_PATH=${mesa.drivers}/lib/dri @@ -244,16 +364,23 @@ stdenv.mkDerivation (finalAttrs: rec { }; }; - meta = with lib; { + meta = { 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" ]; + license = with lib.licenses; [ gpl2Plus ] ++ lib.optional cudaSupport unfree; + platforms = [ + "aarch64-linux" + "x86_64-darwin" + "x86_64-linux" + ]; broken = stdenv.isDarwin; - maintainers = with maintainers; [ goibhniu veprbl ]; + maintainers = with lib.maintainers; [ + goibhniu + veprbl + ]; mainProgram = "blender"; }; }) |