Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blender improvements #11

Closed
wants to merge 8 commits into from
8 changes: 8 additions & 0 deletions nixos/doc/manual/release-notes/rl-2311.section.md
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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).
Expand Down Expand Up @@ -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.
Expand All @@ -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`.

272 changes: 40 additions & 232 deletions pkgs/applications/misc/blender/default.nix
Original file line number Diff line number Diff line change
@@ -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}";
}
13 changes: 13 additions & 0 deletions pkgs/applications/misc/blender/draco-p1.patch
Original file line number Diff line number Diff line change
@@ -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
Original file line number Diff line number Diff line change
@@ -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:
Expand Down
Loading