2024-04-21 15:54:59 +00:00
{
Cocoa ,
CoreGraphics ,
ForceFeedback ,
OpenAL ,
OpenGL ,
SDL ,
2024-07-31 10:19:44 +00:00
addDriverRunpath ,
2024-04-21 15:54:59 +00:00
alembic ,
2024-07-01 15:47:52 +00:00
blender ,
2024-04-21 15:54:59 +00:00
boost ,
2024-05-15 15:35:15 +00:00
brotli ,
2024-04-21 15:54:59 +00:00
callPackage ,
cmake ,
colladaSupport ? true ,
config ,
cudaPackages ,
cudaSupport ? config . cudaSupport ,
dbus ,
embree ,
2024-07-27 06:49:29 +00:00
fetchgit ,
2024-04-21 15:54:59 +00:00
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 ,
openal ,
opencollada ,
opencolorio ,
openexr ,
openimagedenoise ,
openimageio ,
openjpeg ,
openpgl ,
opensubdiv ,
openvdb ,
openxr-loader ,
pkg-config ,
potrace ,
pugixml ,
2024-07-27 06:49:29 +00:00
python3Packages , # must use instead of python3.pkgs, see https://github.com/NixOS/nixpkgs/issues/211340
2024-04-21 15:54:59 +00:00
rocmPackages , # comes with a significantly larger closure size
runCommand ,
2024-09-26 11:04:55 +00:00
spaceNavSupport ? stdenv . hostPlatform . isLinux ,
2024-05-15 15:35:15 +00:00
sse2neon ,
2024-04-21 15:54:59 +00:00
stdenv ,
tbb ,
wayland ,
wayland-protocols ,
2024-09-19 14:19:46 +00:00
wayland-scanner ,
2024-09-26 11:04:55 +00:00
waylandSupport ? stdenv . hostPlatform . isLinux ,
2024-04-21 15:54:59 +00:00
zlib ,
zstd ,
2020-04-24 23:36:52 +00:00
} :
2021-01-09 10:05:03 +00:00
let
2024-09-26 11:04:55 +00:00
embreeSupport =
( ! stdenv . hostPlatform . isAarch64 && stdenv . hostPlatform . isLinux ) || stdenv . hostPlatform . isDarwin ;
openImageDenoiseSupport =
( ! stdenv . hostPlatform . isAarch64 && stdenv . hostPlatform . isLinux ) || stdenv . hostPlatform . isDarwin ;
openUsdSupport = ! stdenv . hostPlatform . isDarwin ;
2024-09-19 14:19:46 +00:00
2024-04-21 15:54:59 +00:00
python3 = python3Packages . python ;
pyPkgsOpenusd = python3Packages . openusd . override { withOsl = false ; } ;
2024-01-02 11:29:13 +00:00
libdecor' = libdecor . overrideAttrs ( old : {
# Blender uses private APIs, need to patch to expose them
patches = ( old . patches or [ ] ) ++ [ ./libdecor.patch ] ;
} ) ;
2020-04-24 23:36:52 +00:00
2024-04-21 15:54:59 +00:00
optix = fetchzip {
# URL from https://gitlab.archlinux.org/archlinux/packaging/packages/blender/-/commit/333add667b43255dcb011215a2d2af48281e83cf#9b9baac1eb9b72790eef5540a1685306fc43fd6c_30_30
url = " h t t p s : / / d e v e l o p e r . d o w n l o a d . n v i d i a . c o m / r e d i s t / o p t i x / v 7 . 3 / O p t i X - 7 . 3 . 0 - I n c l u d e . z i p " ;
hash = " s h a 2 5 6 - a M r p 0 U f f 4 c 3 I C R n 4 S 6 z e d f 6 Q 4 M c 0 / d u B h K w K g Y g M X V U = " ;
} ;
2021-01-09 10:05:03 +00:00
in
2024-04-21 15:54:59 +00:00
stdenv . mkDerivation ( finalAttrs : {
2020-04-24 23:36:52 +00:00
pname = " b l e n d e r " ;
2024-09-26 11:04:55 +00:00
version = " 4 . 2 . 2 " ;
2020-04-24 23:36:52 +00:00
2024-07-27 06:49:29 +00:00
srcs = [
( fetchzip {
name = " s o u r c e " ;
url = " h t t p s : / / d o w n l o a d . b l e n d e r . o r g / s o u r c e / b l e n d e r - ${ finalAttrs . version } . t a r . x z " ;
2024-09-26 11:04:55 +00:00
hash = " s h a 2 5 6 - w v 9 E w B 4 D X S V S 5 K + l b + 7 g U 3 p T r M D O / E L e V 2 e E r i v f s W U = " ;
2024-07-27 06:49:29 +00:00
} )
( fetchgit {
name = " a s s e t s " ;
url = " h t t p s : / / p r o j e c t s . b l e n d e r . o r g / b l e n d e r / b l e n d e r - a s s e t s . g i t " ;
2024-09-26 11:04:55 +00:00
rev = " v ${ finalAttrs . version } " ;
2024-07-27 06:49:29 +00:00
fetchLFS = true ;
hash = " s h a 2 5 6 - v e p K 0 i n P M u l e A J B S i p w o I 9 9 n M B B i F a K / e S M H D e t E t j Y = " ;
} )
] ;
postUnpack = ''
chmod - R u + w *
rm - r assets/working
mv assets - - target-directory source/release/datafiles /
'' ;
sourceRoot = " s o u r c e " ;
2020-04-24 23:36:52 +00:00
2024-09-26 11:04:55 +00:00
patches = [ ./draco.patch ] ++ lib . optional stdenv . hostPlatform . isDarwin ./darwin.patch ;
2020-04-24 23:36:52 +00:00
2024-04-21 15:54:59 +00:00
postPatch =
2024-09-26 11:04:55 +00:00
( lib . optionalString stdenv . hostPlatform . isDarwin ''
2024-07-27 06:49:29 +00:00
: > build_files/cmake/platform/platform_apple_xcode.cmake
substituteInPlace source/creator/CMakeLists.txt \
- - replace-fail ' $ { " $ " } { LIBDIR } /python ' \
' $ { python3 } ' \
- - replace-fail ' $ { " $ " } { LIBDIR } /materialx / ' ' $ { python3Packages . materialx } / '
substituteInPlace build_files/cmake/platform/platform_apple.cmake \
- - replace-fail ' $ { " $ " } { LIBDIR } /brotli/lib/libbrotlicommon-static.a ' \
' $ { lib . getLib brotli } /lib/libbrotlicommon.dylib ' \
- - replace-fail ' $ { " $ " } { LIBDIR } /brotli/lib/libbrotlidec-static.a ' \
' $ { lib . getLib brotli } /lib/libbrotlidec.dylib '
'' )
2024-04-21 15:54:59 +00:00
+ ( lib . optionalString hipSupport ''
2023-10-19 13:55:26 +00:00
substituteInPlace extern/hipew/src/hipew.c - - replace ' " / o p t / r o c m / h i p / l i b / l i b a m d h i p 6 4 . s o " ' ' " ${ rocmPackages . clr } / l i b / l i b a m d h i p 6 4 . s o " '
substituteInPlace extern/hipew/src/hipew.c - - replace ' " o p t / r o c m / h i p / b i n " ' ' " ${ rocmPackages . clr } / b i n " '
2023-02-16 17:41:37 +00:00
'' ) ;
2020-04-24 23:36:52 +00:00
2024-04-21 15:54:59 +00:00
env . NIX_CFLAGS_COMPILE = " - I ${ python3 } / i n c l u d e / ${ python3 . libPrefix } " ;
2020-04-24 23:36:52 +00:00
cmakeFlags =
[
2024-09-19 14:19:46 +00:00
" - D M a t e r i a l X _ D I R = ${ python3Packages . materialx } / l i b / c m a k e / M a t e r i a l X "
2024-04-21 15:54:59 +00:00
" - D P Y T H O N _ I N C L U D E _ D I R = ${ python3 } / i n c l u d e / ${ python3 . libPrefix } "
" - D P Y T H O N _ L I B P A T H = ${ python3 } / l i b "
" - D P Y T H O N _ L I B R A R Y = ${ python3 . libPrefix } "
" - D P Y T H O N _ N U M P Y _ I N C L U D E _ D I R S = ${ python3Packages . numpy } / ${ python3 . sitePackages } / n u m p y / c o r e / i n c l u d e "
" - D P Y T H O N _ N U M P Y _ P A T H = ${ python3Packages . numpy } / ${ python3 . sitePackages } "
" - D P Y T H O N _ V E R S I O N = ${ python3 . pythonVersion } "
2020-04-24 23:36:52 +00:00
" - D W I T H _ A L E M B I C = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ B U I L D I N F O = O F F "
2020-04-24 23:36:52 +00:00
" - D W I T H _ C O D E C _ F F M P E G = O N "
" - D W I T H _ C O D E C _ S N D F I L E = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ C P U _ C H E C K = O F F "
" - D W I T H _ C Y C L E S _ D E V I C E _ O P T I X = ${ if cudaSupport then " O N " else " O F F " } "
" - D W I T H _ C Y C L E S _ E M B R E E = ${ if embreeSupport then " O N " else " O F F " } "
" - D W I T H _ C Y C L E S _ O S L = O F F "
2020-04-24 23:36:52 +00:00
" - D W I T H _ F F T W 3 = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ H Y D R A = ${ if openUsdSupport then " O N " else " O F F " } "
2024-04-21 15:54:59 +00:00
" - D W I T H _ I M A G E _ O P E N J P E G = O N "
" - D W I T H _ I N S T A L L _ P O R T A B L E = O F F "
2024-09-19 14:19:46 +00:00
" - D W I T H _ J A C K = ${ if jackaudioSupport then " O N " else " O F F " } "
" - D W I T H _ L I B S _ P R E C O M P I L E D = O F F "
2024-04-21 15:54:59 +00:00
" - D W I T H _ M O D _ O C E A N S I M = O N "
" - D W I T H _ O P E N C O L L A D A = ${ if colladaSupport then " O N " else " O F F " } "
2020-04-24 23:36:52 +00:00
" - D W I T H _ O P E N C O L O R I O = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ O P E N I M A G E D E N O I S E = ${ if openImageDenoiseSupport then " O N " else " O F F " } "
2020-04-24 23:36:52 +00:00
" - D W I T H _ O P E N S U B D I V = O N "
2024-04-21 15:54:59 +00:00
" - D W I T H _ O P E N V D B = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ P U L S E A U D I O = O F F "
2020-04-24 23:36:52 +00:00
" - D W I T H _ P Y T H O N _ I N S T A L L = O F F "
" - D W I T H _ P Y T H O N _ I N S T A L L _ N U M P Y = O F F "
2021-04-12 18:23:04 +00:00
" - D W I T H _ P Y T H O N _ I N S T A L L _ R E Q U E S T S = O F F "
2024-04-21 15:54:59 +00:00
" - D W I T H _ S D L = O F F "
2024-09-19 14:19:46 +00:00
" - D W I T H _ S T R I C T _ B U I L D _ O P T I O N S = O N "
2020-04-24 23:36:52 +00:00
" - D W I T H _ T B B = O N "
2024-09-19 14:19:46 +00:00
" - D W I T H _ U S D = ${ if openUsdSupport then " O N " else " O F F " } "
2024-04-21 15:54:59 +00:00
# Blender supplies its own FindAlembic.cmake (incompatible with the Alembic-supplied config file)
" - D A L E M B I C _ I N C L U D E _ D I R = ${ lib . getDev alembic } / i n c l u d e "
2024-05-15 15:35:15 +00:00
" - D A L E M B I C _ L I B R A R Y = ${ lib . getLib alembic } / l i b / l i b A l e m b i c ${ stdenv . hostPlatform . extensions . sharedLibrary } "
2020-04-24 23:36:52 +00:00
]
2023-05-24 13:37:59 +00:00
++ lib . optionals waylandSupport [
" - D W I T H _ G H O S T _ W A Y L A N D = O N "
" - D W I T H _ G H O S T _ W A Y L A N D _ D B U S = O N "
" - D W I T H _ G H O S T _ W A Y L A N D _ D Y N L O A D = O F F "
" - D W I T H _ G H O S T _ W A Y L A N D _ L I B D E C O R = O N "
]
2024-09-26 11:04:55 +00:00
++ lib . optionals stdenv . hostPlatform . isDarwin [
2024-04-21 15:54:59 +00:00
" - D L I B D I R = / d o e s - n o t - e x i s t "
2024-05-15 15:35:15 +00:00
" - D S S E 2 N E O N _ I N C L U D E _ D I R = ${ sse2neon } / l i b "
2020-04-24 23:36:52 +00:00
]
2024-04-21 15:54:59 +00:00
++ lib . optional stdenv . cc . isClang " - D P Y T H O N _ L I N K F L A G S = " # Clang doesn't support "-export-dynamic"
2023-02-02 18:25:31 +00:00
++ lib . optionals cudaSupport [
2024-04-21 15:54:59 +00:00
" - D O P T I X _ R O O T _ D I R = ${ optix } "
2021-01-09 10:05:03 +00:00
" - D W I T H _ C Y C L E S _ C U D A _ B I N A R I E S = O N "
] ;
2020-04-24 23:36:52 +00:00
2024-07-27 06:49:29 +00:00
preConfigure = ''
(
expected_python_version = $ ( grep - E - - only-matching ' set \ ( _PYTHON_VERSION_SUPPORTED [ 0 -9 . ] + \ ) ' build_files/cmake/Modules/FindPythonLibsUnix.cmake | grep - E - - only-matching ' [ 0 -9 . ] + ' )
actual_python_version = $ ( python - c ' import sys ; print ( " . " . join ( map ( str , sys . version_info [ 0 : 2 ] ) ) ) ' )
if ! [ [ " $ a c t u a l _ p y t h o n _ v e r s i o n " = " $ e x p e c t e d _ p y t h o n _ v e r s i o n " ] ] ; then
echo " w r o n g P y t h o n v e r s i o n , e x p e c t e d ' $ e x p e c t e d _ p y t h o n _ v e r s i o n ' , g o t ' $ a c t u a l _ p y t h o n _ v e r s i o n ' " > & 2
exit 1
fi
)
'' ;
2024-04-21 15:54:59 +00:00
nativeBuildInputs =
[
cmake
llvmPackages . llvm . dev
makeWrapper
python3Packages . wrapPython
]
++ lib . optionals cudaSupport [
2024-07-31 10:19:44 +00:00
addDriverRunpath
2024-04-21 15:54:59 +00:00
cudaPackages . cuda_nvcc
]
2024-09-19 14:19:46 +00:00
++ lib . optionals waylandSupport [
pkg-config
wayland-scanner
] ;
2020-04-24 23:36:52 +00:00
2024-04-21 15:54:59 +00:00
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 ; } )
2024-05-15 15:35:15 +00:00
openvdb
2024-04-21 15:54:59 +00:00
potrace
pugixml
python3
2024-07-27 06:49:29 +00:00
python3Packages . materialx
2024-04-21 15:54:59 +00:00
tbb
zlib
zstd
]
2024-09-19 14:19:46 +00:00
++ lib . optional embreeSupport embree
++ lib . optional openImageDenoiseSupport ( openimagedenoise . override { inherit cudaSupport ; } )
2024-04-21 15:54:59 +00:00
++ (
2024-09-26 11:04:55 +00:00
if ( ! stdenv . hostPlatform . isDarwin ) then
2024-04-21 15:54:59 +00:00
[
libGL
libGLU
libX11
libXext
libXi
libXrender
libXxf86vm
openal
openxr-loader
]
else
[
Cocoa
CoreGraphics
ForceFeedback
OpenAL
OpenGL
SDL
2024-05-15 15:35:15 +00:00
brotli
2024-04-21 15:54:59 +00:00
llvmPackages . openmp
2024-05-15 15:35:15 +00:00
sse2neon
2024-04-21 15:54:59 +00:00
]
)
++ lib . optionals cudaSupport [ cudaPackages . cuda_cudart ]
2024-09-19 14:19:46 +00:00
++ lib . optionals openUsdSupport [ pyPkgsOpenusd ]
2024-04-21 15:54:59 +00:00
++ lib . optionals waylandSupport [
dbus
libdecor'
libffi
libxkbcommon
wayland
wayland-protocols
]
++ lib . optional colladaSupport opencollada
++ lib . optional jackaudioSupport libjack2
++ lib . optional spaceNavSupport libspnav ;
pythonPath =
let
ps = python3Packages ;
in
[
2024-07-27 06:49:29 +00:00
ps . materialx
2024-04-21 15:54:59 +00:00
ps . numpy
ps . requests
ps . zstandard
2024-05-15 15:35:15 +00:00
]
2024-09-19 14:19:46 +00:00
++ lib . optional openUsdSupport [ pyPkgsOpenusd ] ;
2020-04-24 23:36:52 +00:00
blenderExecutable =
2024-04-21 15:54:59 +00:00
placeholder " o u t "
2024-09-26 11:04:55 +00:00
+ (
if stdenv . hostPlatform . isDarwin then
" / A p p l i c a t i o n s / B l e n d e r . a p p / C o n t e n t s / M a c O S / B l e n d e r "
else
" / b i n / b l e n d e r "
) ;
2024-04-21 15:54:59 +00:00
postInstall =
2024-09-26 11:04:55 +00:00
lib . optionalString stdenv . hostPlatform . isDarwin ''
2024-04-21 15:54:59 +00:00
mkdir $ out/Applications
mv $ out/Blender.app $ out/Applications
''
2024-09-26 11:04:55 +00:00
+ lib . optionalString stdenv . hostPlatform . isLinux ''
2024-04-21 15:54:59 +00:00
mv $ out/share/blender / $ { lib . versions . majorMinor finalAttrs . version } /python { , - ext }
2024-05-15 15:35:15 +00:00
''
+ ''
2024-04-21 15:54:59 +00:00
buildPythonPath " $ p y t h o n P a t h "
wrapProgram $ blenderExecutable \
- - prefix PATH : $ program_PATH \
- - prefix PYTHONPATH : " $ p r o g r a m _ P Y T H O N P A T H " \
- - add-flags ' - - python-use-system-env'
'' ;
2020-04-24 23:36:52 +00:00
# Set RUNPATH so that libcuda and libnvrtc in /run/opengl-driver(-32)/lib can be
# found. See the explanation in libglvnd.
2024-07-27 06:49:29 +00:00
postFixup =
lib . optionalString cudaSupport ''
for program in $ out/bin/blender $ out/bin/.blender-wrapped ; do
isELF " $ p r o g r a m " || continue
2024-07-31 10:19:44 +00:00
addDriverRunpath " $ p r o g r a m "
2024-07-27 06:49:29 +00:00
done
''
2024-09-26 11:04:55 +00:00
+ lib . optionalString stdenv . hostPlatform . isDarwin ''
2024-07-27 06:49:29 +00:00
makeWrapper $ out/Applications/Blender.app/Contents/MacOS/Blender $ out/bin/blender
'' ;
2020-04-24 23:36:52 +00:00
2023-10-09 19:29:22 +00:00
passthru = {
2024-04-21 15:54:59 +00:00
python = python3 ;
pythonPackages = python3Packages ;
2023-11-16 04:20:00 +00:00
2024-04-21 15:54:59 +00:00
withPackages =
f :
( callPackage ./wrapper.nix { } ) . override {
blender = finalAttrs . finalPackage ;
extraModules = ( f python3Packages ) ;
} ;
2023-10-09 19:29:22 +00:00
tests = {
2024-07-27 06:49:29 +00:00
render = runCommand " ${ finalAttrs . pname } - t e s t " { nativeBuildInputs = [ mesa . llvmpipeHook ] ; } ''
2023-10-09 19:29:22 +00:00
set - euo pipefail
cat < < ' PYTHON' > scene-config . py
import bpy
bpy . context . scene . eevee . taa_render_samples = 32
bpy . context . scene . cycles . samples = 32
2024-09-26 11:04:55 +00:00
if $ { if ( stdenv . hostPlatform . isAarch64 && stdenv . hostPlatform . isLinux ) then " T r u e " else " F a l s e " }:
2023-10-09 19:29:22 +00:00
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
2024-07-27 06:49:29 +00:00
for engine in BLENDER_EEVEE_NEXT CYCLES ; do
2023-10-09 19:29:22 +00:00
echo " R e n d e r i n g w i t h $ e n g i n e . . . "
# Beware that argument order matters
2024-05-15 15:35:15 +00:00
$ { lib . getExe finalAttrs . finalPackage } \
2023-10-09 19:29:22 +00:00
- - background \
- noaudio \
- - factory-startup \
- - python-exit-code 1 \
- - python scene-config . py \
- - engine " $ e n g i n e " \
- - render-output " $ o u t / $ e n g i n e " \
- - render-frame 1
done
'' ;
2024-07-01 15:47:52 +00:00
tester-cudaAvailable = cudaPackages . writeGpuTestPython { } ''
import subprocess
subprocess . run ( [ $ {
lib . concatMapStringsSep " , " ( x : '' " ${ x } " '' ) [
( lib . getExe ( blender . override { cudaSupport = true ; } ) )
" - - b a c k g r o u n d "
" - n o a u d i o "
" - - p y t h o n - e x i t - c o d e "
" 1 "
" - - p y t h o n "
" ${ ./test-cuda.py } "
]
} ] , check = True ) # noqa: E501
'' ;
2023-10-09 19:29:22 +00:00
} ;
} ;
2023-05-24 13:37:59 +00:00
2024-04-21 15:54:59 +00:00
meta = {
2020-04-24 23:36:52 +00:00
description = " 3 D C r e a t i o n / A n i m a t i o n / P u b l i s h i n g S y s t e m " ;
homepage = " h t t p s : / / w w w . b l e n d e r . o r g " ;
# They comment two licenses: GPLv2 and Blender License, but they
# say: "We've decided to cancel the BL offering for an indefinite period."
2021-01-09 10:05:03 +00:00
# OptiX, enabled with cudaSupport, is non-free.
2024-07-27 06:49:29 +00:00
license =
with lib . licenses ;
[ gpl2Plus ] ++ lib . optional cudaSupport ( unfree // { shortName = " N V i d i a O p t i X E U L A " ; } ) ;
2024-07-01 15:47:52 +00:00
2024-04-21 15:54:59 +00:00
platforms = [
" a a r c h 6 4 - l i n u x "
" x 8 6 _ 6 4 - d a r w i n "
" x 8 6 _ 6 4 - l i n u x "
2024-05-15 15:35:15 +00:00
" a a r c h 6 4 - d a r w i n "
2024-04-21 15:54:59 +00:00
] ;
2024-09-26 11:04:55 +00:00
broken = stdenv . hostPlatform . isDarwin ; # fails due to too-old SDK, using newer SDK fails to compile
2024-09-19 14:19:46 +00:00
maintainers = with lib . maintainers ; [
amarshall
veprbl
] ;
2023-08-04 22:07:22 +00:00
mainProgram = " b l e n d e r " ;
2020-04-24 23:36:52 +00:00
} ;
2023-10-09 19:29:22 +00:00
} )