diff options
Diffstat (limited to 'media-gfx/blender')
16 files changed, 3709 insertions, 877 deletions
diff --git a/media-gfx/blender/Manifest b/media-gfx/blender/Manifest index bee1f4e6649e..8c2a8f9424a6 100644 --- a/media-gfx/blender/Manifest +++ b/media-gfx/blender/Manifest @@ -2,14 +2,25 @@ AUX blender-4.0.2-CUDA_NVCC_FLAGS.patch 627 BLAKE2B 45c9f327ee6d2fbd45446ba0787f AUX blender-4.0.2-FindClang.patch 451 BLAKE2B 4b57395d440b590f9b2e097b74fbcf46dbe12fd13536cb335b914246995ede928f1208872c5044e1d0ecb1a702d0c46b656eb4b3abc3b0ed149abaf0d74bd433 SHA512 21aa3e158585184dfc1ccd931b53142cf436507a9126f4cee465214e7183553d02451babc5a636d3eb4ae0fd3ed0f0effb7b8962889f6dbec3e9476a61d0bbb2 AUX blender-4.1.1-FindLLVM.patch 1388 BLAKE2B 721ba19ba6bdfde1672889d530bbd252665c12568363920561b7cfb7491e98a130cf0accc197f46a760c1bc57357183ce89903f2555125097d23361f1fe39ea7 SHA512 b13e8efaaf711bfba2a015b65153988c7ca9042e58785a483987634110c2bbdaec311744c633b7402dfaaca321984a5dc3fc549689c21fe0bfd6c27d890289da AUX blender-4.1.1-numpy.patch 1060 BLAKE2B 76b4c83e852f25be042c2a8267ad2b55fcbf8c3d4c3c2d1e8640e349174029de13a791d53e66215126dc76cdefca40b1e9f253e317f02f6d40a04652e9519bd5 SHA512 d3047c0eba1ce6d4cb68df65bd1563b7eb7c14253ff82edfcdae0a19d8270027a45273442258e0afef19bf1e805b99b91ae76a95fb4a0ada0454ee75f36c43b1 +AUX blender-4.2.9-python3.12.patch 2959 BLAKE2B bd4d3df5cdcd6c0fd7a8286887b79ce088be77970e0a6570fe6ee2a6e8ec4b5ca008e08af0a92d89956365f5d0677bd6614a33a450441e335421c4325f1fd830 SHA512 38471b8bc999a94306a5a48566cd5b5cc8530d8ecad4cd2fdb696ca6f7c8d5685c9b159c1830bf18cf858bf7c8bfa7fbaa19504386624d0b072e8883af7426c8 +AUX blender-4.2.9-python3.12_1.patch 1598 BLAKE2B ba2f609c36c870a16929397b92d6e9d1ed422f69b3ac395bdf95715599ff18a820f72cd4f6377ee57b883d6433a69d680200a010234be016ccf1ae2f9a81fbd8 SHA512 bfc9793d1fd1581dd552da1de3314e3c10bbb821ea43c092a4e33931f1844639be1a8ce2a4f2a559e4b4ba07c738ce674b3ae77fe98f5f47bcc976f88eaa43b8 +AUX blender-4.2.9-python3.13.patch 21761 BLAKE2B f382b7acf401e65a2d68236af457e89f214de022d488f9b202359513e1a056cfa2ef08b69df707c9d41cf48717b1553aa86e9959e3534ca2455b6299f38c7d6a SHA512 69eb94cb77e7be10bf95f34edf753f038417077df45e15f2e27171d6cdea258e3a90dcca278b84118fe2e3f710a3011527769cff595127dae324a7aeb92056e6 AUX blender-4.3.2-ffmpeg7.patch 5743 BLAKE2B b301fade57f45d427fb35cbeabd8233823199b4240f613be764c0b7715e0909b3718f42d4fd3062995d70baaefbda3706f06d369f404bde68fa63750a74a33c8 SHA512 33a80074020bd53056d00347fc142304e012704929f6859f7362cfaae46ab5d61a13a22e51b418c91ff42c5204de5eaf95165aebc000280ef67a72071b3db542 -DIST blender-3.6.18.tar.xz 67900952 BLAKE2B d4a619197abc3e4969846913f3c88cd64fd679bbefe007354af6ba2e83d47a8fcd27b3bcbaf6d850d28960eedeb3c50ff9336d0e61fd488d4916b6628bfd67dd SHA512 48a8b3e8b2fe75305061d7cb9b7b8491cef4f23fbd809d1fc34663a4f97f487d6e7e6e92848110fe6aa5a2fed18a2c1a2a0c1c928aa813e2456f7786681eae60 -DIST blender-4.1.1.tar.xz 82146268 BLAKE2B 1ab4a6c1046851ef619394c62fc73794430dc091e2cab26d3d1d542e9d4519889e9b9731606385e9dc8657448ca3827875526f4a57dd1b5c326a73d8a6f9be8d SHA512 13ad0cdd09879b5c28554faca5a54172f43dc3dcb749d2d1723d3e89e741e6255179af3bd88309b735e058b9b350191e44f3158e882e55f1cedea70b8b21540e +AUX blender-4.3.2-openvdb-12.patch 3176 BLAKE2B cbfb071db599c65495940c81de2c851ce8e97740f8c1956522cd0e9760191a6c169b35de114584e57996bda267aadf4416af2e1b5558c0b47f0d522958ab8949 SHA512 36bbae508d25e1a29035c8c91587dd9cd3476bc30e51dee37fcef1e3fcd66e01b837404b1fdebb2a909994575dc9523a5fc9c24438c3274feaf4c5ede18897da +AUX blender-4.3.2-optix-8.1.0.patch 1015 BLAKE2B 718b69882e0fe880f621a6b8d17f5bed1a33400a2635085e4b88ff7f1c3855805072974d130b007a32b14f9e79e38b982e7df116a5acd64249c165d37c2f75ce SHA512 8e7e9cc8db76225080ace46b8488fc5681beacc44e83543056a664880eca48c6b556c30378503d1933d82d86de7e44367918af393faabcc224bd5e365dc0c31c +AUX blender-4.3.2-system-glog.patch 2142 BLAKE2B 51f558717757265bc319ba68601b2d6422994946627a2888e951f2121789d414c71774de532c93685c56a27e50825fd04d4f9a4fd2802afd5fe40fae11e65cc0 SHA512 57bc0d557c242c83ecc7297020bcf08e5d5787770f73e54501736d7beb169ff4928fafea5509353c6352ca52d63d033e4aaaed0c4fcc0f6c956412ea0c3d2186 +AUX blender-4.4.0-optix-compile-flags.patch 1240 BLAKE2B b4c878f0adbcd6bafe266c98473bd1969d3f1f9afd3cfa750e009709ade04a6a619e36cf5fe826f4f52deeeb7e05a00f0887f719bdc797ed68b09149b659af68 SHA512 87028dea9f6e775b73e1c5ec1b05e9d78b3c8c7cede20bd8ade169f3d1d20b7d9e03cddd96f455c48dd382aafaea0ad1f31807067c289c391e0eec42cb8a4bdb DIST blender-4.2.4.tar.xz 72804204 BLAKE2B 613ae4671cc9263d18fe988b07e8744eb04f67fe53f1c14ad3fbc7d80c58a577e7753871ca775cd40ab5f26ef2bc9030cda57012dda0c4785769f04263aea15b SHA512 1f61c1866aaa680c91fc6e3402b1e10533c8cce32572ffb825c53dc7c15ca51f1157a32d10134ca9e612fbf719406421ccc920b2d8ddd2993675784797381c6a +DIST blender-4.2.9.tar.xz 72811408 BLAKE2B b33227a3d2ab97578d919d37419b5486e049d42404f7d3e0e4f096dae813004749facba571b3525de10c0a9b9d7c9d67a0eefcf7200a3975e4e5b6874c4d47b0 SHA512 71d08f22ee8dd25f9ad260ab16fc7266586a92de5b6ba784a825c179d75ac423a570f62ddccc51a1f22bc86dbee9a628472b26dcd35d2a97b7d0bd951fceeee8 DIST blender-4.3.2.tar.xz 74473996 BLAKE2B 9a5c8973561f3296b0ec35990ab4951e34f7c0dd5bee3dd120a49989dc8ca7ebfc9610654e8be9d14463af2197626f490324cdd03118db755f5d0b1f7acce375 SHA512 44697faf9acc2c1e75783d432a1a0040339c3445834961a995e95974d4088e75ee5cb647a3908125259d1910d180910e5bc50d34d40d35f33e03197893581477 -EBUILD blender-3.6.18-r1.ebuild 14139 BLAKE2B 7a228242dd7b9f8a3d1f90db34a140c7107cbc867eb45445af19a9ebade3520355b4116b00e703af774f96d1786bf86a401736be8e5c608470332736e4b3c902 SHA512 935d9ae19518fa732f44ff1f6fc982dae741f2303f34849a3340c35b0a7495cb90801b573273b885543bb03a7b7acae422ce221b78388c1176b3667a17a3013d -EBUILD blender-4.1.1-r4.ebuild 17514 BLAKE2B 262a0baacd13f6317d477edd22c521c0f4b6949aee209ddf7f87d35f079afcb3fdb36256319726ce7c9c429f77a19054d59732edef6247403d6099a5ed483b4d SHA512 357088f90093d84b3732a862ae99b68dd99915d908ed5ccceb35a17e97913436178dbfb9f953b4ebe0549bc1cb60d50010609e8bd0355aac3f13c2dafd442b15 -EBUILD blender-4.2.4-r1.ebuild 17336 BLAKE2B c92d040e877556af726ca3d591d90f451e103673f5e6d3657c7a1d9e085d1b1dab2a89eac443755f9fb4dc5f51ac5787c5e3b88d19d013b39f11ef6cedcbc3a3 SHA512 1c817081e243434750d86f0c6d6c711d95d6385470447f2869104a679b86bb228b4908f6c1c91a748489a40abd5ace09ef4aaa02bd3d3c96a8119a63f70a68d2 -EBUILD blender-4.3.2-r1.ebuild 17378 BLAKE2B 9c73ef6b70aaff2b4fc5762c4a6a0028b4767c9a30715cc937a0af9d65960edf5ae14872e53db8b7c256297e9c09bdcd1bfd7df47baaa1bdcdba5360a980797a SHA512 f7b491da4b2786c5f1b43c085ebff4e7ff3055f61850be88f27a12a7629e0e4d2d0be3d36186b7baf13d7faa4f62346ec901433b681dd81cbb1ccccf18d9abb0 -EBUILD blender-9999.ebuild 17338 BLAKE2B 54e2eadbf4fafd83b160732df13d62219b164e9d212cbddceb21af88c730574c0ee743f719fe06a39d024651f3f62598a83eabedce830eecb710e84bda260449 SHA512 3b7b7bfe04683aa41cdff10fcf9191b09c04698b3ec35a6d57bdb568d10b0d61f9b2bcfac60d9ef6f5131bbb47e8c614e8e283166778b2bc874ba267042d95e3 -MISC metadata.xml 3459 BLAKE2B 6fb5c60150a6ff87ef3011bd439886dbba0d41137cd7eb36afe5ce13daf4038178880f19a3afda52decc576132d6b44b17d99bafb611207b8417790706b299f9 SHA512 8057e29057a0a2d3851c44c95116b5ac8c04fbbf3efd1540df63ffe7837201007a99883fca9c6e31f89fb20a099959a81f97d88b14f99cf4910ae9e771b5fdbc +DIST blender-4.4.1.tar.xz 85518840 BLAKE2B a482a2d246222b5395f5e1c5cfa9fd2dbab0d5dc33145ec5cfaae3e7d7083e65034e1f5b54bc4605ab45905d08c2938c97ab488659d822997ee853c9e34fcc55 SHA512 db6b117b841890b172f4d13c6f38b73f36aae5648ed74f5233eb311328d467644005bd24fb4f9c7ea9b2dad7ff584fc7b3831f5ab34f3f900555c68f4af5b901 +DIST blender-4.4.3.tar.xz 85519376 BLAKE2B bb2f93d96b98e4104f1e49f3bd9be8992e37d2005665ad913ccd7e9097fba4823567d0aba3cd6487097d52043c5681fde4489c040e24ae4df6014337eb97f9f5 SHA512 0a500a7abee2e2dea7cdc925539c3f906271525ec88877e12920315552a057072c68806d6cdf7a6eb43b2b7d611e8697c5ad093b22f2402f96a11718538012e6 +DIST blender-assets-4.3.2.tar.xz 8763844 BLAKE2B 0eca4a7bfb630096dfe9dd5f8c8071d9ca8c1aaab560a8694df4add507c3e8a641a4e0ad197f110b639d2d399a23c5c25af6fb060ca3316e1a44d286f6b23f7e SHA512 ce9483b3e5b83d1b29bdfa3a14f7be7176e85ec50a414213a67badcce3c24cd8da349fee22b08cc95d6e5906420bbcd5c5f15855445da6364e6054f968c20678 +DIST blender-test-data-4.4.0.tar.xz 386262908 BLAKE2B 4b7f16f5d19d9569ae19a8e9feeb134841801c89ea64a787c1caa6a4bddce700ebe2a9a15cb2053701c404743dc0749643a1b03fc45f523f792e3729de11f0e8 SHA512 babd235aeb5cf87764b48000dc7776b5e8121d60d930f4aa92ea27cf275608cfc6c3ed47e59d499c85c670dc1ee329e26882e76d8a9a2567b42d3de551a5a9a0 +EBUILD blender-4.2.4-r2.ebuild 17227 BLAKE2B 4c7348e8b8749be2ac01639237b3b537216a19a392c12e0df5bd2023563a67a8620f34a99995044c54e3c33cef090b6d85e87b35880074293259e2079fa28065 SHA512 cac983807538bec7656f4999d5e3d61140aeff83b491ca7f93f3707154817ff5a8ba7991c95c0053df2fb3796b45593d83a3ecd233f089745b43836c6bca0ae0 +EBUILD blender-4.2.9-r1.ebuild 19908 BLAKE2B ec2727162ac07e3dbcda1d5d39c710747d1933008b586835e285d3da752258b4e3f4cc0a88e67f0d6d269e36f70ac34512fd91400d45743c0929cef491aa6b5d SHA512 d0e116b49db9dd2e9c9278b56354c7f5abdc2e84eed3f263ece9cfc807aafc52e26a0e9e8c25f8e8461f0ad5330d1e2412732276229deddf6ee35fe69f7f55e0 +EBUILD blender-4.3.2-r4.ebuild 22636 BLAKE2B d8c08bd3cf27c3e9444bc9f1154b4d43abe15df68034d683181a9ab4814baaced1424f2de22b6f262dea7a173aa5ab66c12a768bfb7983e5a838981ee6cc5751 SHA512 c50a4771060b7b6f1b0e3d0f6549a751eee4f24c8e8fdc4edb19b93c7718a7c9300421ebf8bc4263ab327f7928928d55fb63ae5cc1008233e24d732ef9da480f +EBUILD blender-4.4.1-r1.ebuild 23198 BLAKE2B ff61b67aba290d44590c5749200ad574760e6338f2888f1f174cc1eab6ec3f36248b397923b88afccd37f37da4b180113ed657476dfcdeb7961250faa63b9b83 SHA512 b6e732f2e0caa16184b0f8a727d24d988435f289f8b2ae9f46195b0ca5947581956c90dd3bda897e9092fd4da08f1300b8c1f692b45eea235c71f3a134520249 +EBUILD blender-4.4.3.ebuild 24543 BLAKE2B 72cc3a776c9dd2c428e707f6e2acff41904e1e2d835114df2c1735cf5d43cb37b1bd00b597a83c3277d490e4a9d828ac21f1d3f391cd7b34d194790464e6f224 SHA512 e87f8791a3b6ff6f270d3faca6a6219cfd7f395f13b17ef8436b2ff725e5629857985f0346e7ca6d588d65c2bf3bccf5ee42d6f08fea8ea6d9b896c6d873f96a +EBUILD blender-9999.ebuild 24622 BLAKE2B fb5b75baf7ba3379a0de01cd2af15cd8037dd3effc633769f201ca06495f166f0b744eb81e2615416feb92e4e437a605bbfa8c011535bfac35c5bec377fc5802 SHA512 6d936eca6b0975558d6730a202653e6fe5a9872a10deecd4bf2f5823f9ae4da6be7bec07f9fbc169130a27c50a53aa18006c9eb6dfc2da1a38bc58dba7f4162a +MISC metadata.xml 3583 BLAKE2B d066c16c25c4e8ef1137b87ae2270657bcb7a3af6db9249090deb8369a994afd1c0f3aed322e958e229adfa425e1cd7d7b8a184ecd77dc0390922e6a13996aad SHA512 b4fca9907b050e7fe72ea38148dd540ed0fdd99d856afc9357a3e2223bab3c000dfd4e90c7e91e8f8c9ad159483f12645a7563c560461169597676bfaaa6004a diff --git a/media-gfx/blender/blender-3.6.18-r1.ebuild b/media-gfx/blender/blender-3.6.18-r1.ebuild deleted file mode 100644 index c5e81c940568..000000000000 --- a/media-gfx/blender/blender-3.6.18-r1.ebuild +++ /dev/null @@ -1,447 +0,0 @@ -# Copyright 1999-2025 Gentoo Authors -# Distributed under the terms of the GNU General Public License v2 - -EAPI=8 - -PYTHON_COMPAT=( python3_10 python3_11 ) - -inherit check-reqs cmake flag-o-matic pax-utils python-single-r1 toolchain-funcs xdg-utils - -DESCRIPTION="3D Creation/Animation/Publishing System" -HOMEPAGE="https://www.blender.org" - -if [[ ${PV} = *9999* ]] ; then - # Subversion is needed for downloading unit test files - inherit git-r3 subversion - EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" - ADDONS_EGIT_REPO_URI="https://projects.blender.org/blender/blender-addons.git" -else - SRC_URI="https://download.blender.org/source/${P}.tar.xz" - # Update these between major releases. - TEST_TARBALL_VERSION="$(ver_cut 1-2).0" - # SRC_URI+=" test? ( https://dev.gentoo.org/~sam/distfiles/${CATEGORY}/${PN}/${PN}-${TEST_TARBALL_VERSION}-tests.tar.xz )" - KEYWORDS="amd64 ~arm ~arm64" -fi - -LICENSE="GPL-3+ cycles? ( Apache-2.0 )" -SLOT="${PV%.*}" -IUSE="+bullet +dds +fluid +openexr +tbb - alembic collada +color-management cuda +cycles cycles-bin-kernels - debug doc +embree +ffmpeg +fftw +gmp jack jemalloc jpeg2k - man +nanovdb ndof nls openal +oidn +openmp +openpgl +opensubdiv - +openvdb optix osl +pdf +potrace +pugixml pulseaudio sdl - +sndfile test +tiff valgrind wayland X" -RESTRICT="!test? ( test )" - -REQUIRED_USE="${PYTHON_REQUIRED_USE} - alembic? ( openexr ) - cuda? ( cycles ) - cycles? ( openexr tiff ) - fluid? ( tbb ) - openvdb? ( tbb ) - optix? ( cuda ) - osl? ( cycles ) - test? ( color-management )" - -# Library versions for official builds can be found in the blender source directory in: -# build_files/build_environment/install_deps.sh -RDEPEND="${PYTHON_DEPS} - dev-libs/boost:=[nls?] - dev-libs/lzo:2= - $(python_gen_cond_dep ' - dev-python/cython[${PYTHON_USEDEP}] - dev-python/numpy[${PYTHON_USEDEP}] - dev-python/zstandard[${PYTHON_USEDEP}] - dev-python/requests[${PYTHON_USEDEP}] - ') - media-libs/freetype:=[brotli] - media-libs/libepoxy:= - media-libs/libjpeg-turbo:= - media-libs/libpng:= - media-libs/libsamplerate - >=media-libs/openimageio-2.4.6.0:= - sys-libs/zlib:= - virtual/glu - virtual/libintl - virtual/opengl - alembic? ( >=media-gfx/alembic-1.8.3-r2[boost(+),hdf(+)] ) - collada? ( >=media-libs/opencollada-1.6.68 ) - color-management? ( media-libs/opencolorio:= ) - cuda? ( dev-util/nvidia-cuda-toolkit:= ) - embree? ( >=media-libs/embree-3.10.0:=[raymask] ) - ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) - fftw? ( sci-libs/fftw:3.0= ) - gmp? ( dev-libs/gmp[cxx] ) - jack? ( virtual/jack ) - jemalloc? ( dev-libs/jemalloc:= ) - jpeg2k? ( media-libs/openjpeg:2= ) - ndof? ( - app-misc/spacenavd - dev-libs/libspnav - ) - nls? ( virtual/libiconv ) - openal? ( media-libs/openal ) - oidn? ( >=media-libs/oidn-1.4.1 ) - openexr? ( - >=dev-libs/imath-3.1.4-r2:= - >=media-libs/openexr-3:0= - ) - openpgl? ( media-libs/openpgl:0/0.5 ) - opensubdiv? ( >=media-libs/opensubdiv-3.4.0 ) - openvdb? ( - <media-gfx/openvdb-11.0.0:=[nanovdb?] - dev-libs/c-blosc:= - ) - optix? ( <dev-libs/optix-7.5.0 ) - osl? ( <media-libs/osl-1.13:= ) - pdf? ( media-libs/libharu ) - potrace? ( media-gfx/potrace ) - pugixml? ( dev-libs/pugixml ) - pulseaudio? ( media-libs/libpulse ) - sdl? ( media-libs/libsdl2[sound,joystick] ) - sndfile? ( media-libs/libsndfile ) - tbb? ( dev-cpp/tbb:= ) - tiff? ( media-libs/tiff:= ) - valgrind? ( dev-debug/valgrind ) - wayland? ( - >=dev-libs/wayland-1.12 - >=dev-libs/wayland-protocols-1.15 - >=x11-libs/libxkbcommon-0.2.0 - media-libs/mesa[wayland] - sys-apps/dbus - ) - X? ( - x11-libs/libX11 - x11-libs/libXi - x11-libs/libXxf86vm - ) -" - -DEPEND="${RDEPEND} - dev-cpp/eigen:= -" - -BDEPEND=" - virtual/pkgconfig - doc? ( - app-text/doxygen[dot] - dev-python/sphinx[latex] - dev-texlive/texlive-bibtexextra - dev-texlive/texlive-fontsextra - dev-texlive/texlive-fontutils - dev-texlive/texlive-latex - dev-texlive/texlive-latexextra - ) - nls? ( sys-devel/gettext ) - wayland? ( - dev-util/wayland-scanner - ) -" - -blender_check_requirements() { - [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp - - if use doc; then - CHECKREQS_DISK_BUILD="4G" check-reqs_pkg_pretend - fi -} - -blender_get_version() { - # Get blender version from blender itself. - BV=$(grep "BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d " " -f 3; assert) - if ((${BV:0:1} < 3)) ; then - # Add period (290 -> 2.90). - BV=${BV:0:1}.${BV:1} - else - # Add period and skip the middle number (301 -> 3.1) - BV=${BV:0:1}.${BV:2} - fi -} - -pkg_pretend() { - blender_check_requirements -} - -pkg_setup() { - blender_check_requirements - python-single-r1_pkg_setup -} - -src_unpack() { - if [[ ${PV} = *9999* ]] ; then - git-r3_src_unpack - - git-r3_fetch "${ADDONS_EGIT_REPO_URI}" - git-r3_checkout "${ADDONS_EGIT_REPO_URI}" "${S}/scripts/addons" - - if use test; then - TESTS_SVN_URL=https://svn.blender.org/svnroot/bf-blender/trunk/lib/tests - subversion_fetch ${TESTS_SVN_URL} ../lib/tests - fi - ASSETS_SVN_URL=https://svn.blender.org/svnroot/bf-blender/trunk/lib/assets - subversion_fetch ${ASSETS_SVN_URL} ../lib/assets - else - default - if use test; then - #The tests are downloaded from: https://svn.blender.org/svnroot/bf-blender/tags/blender-${SLOT}-release/lib/tests - mkdir -p lib || die - mv "${WORKDIR}/blender-${TEST_TARBALL_VERSION}-tests/tests" lib || die - fi - fi - -} - -src_prepare() { - cmake_src_prepare - - blender_get_version - - # Disable MS Windows help generation. The variable doesn't do what it - # it sounds like. - sed -e "s|GENERATE_HTMLHELP = YES|GENERATE_HTMLHELP = NO|" \ - -i doc/doxygen/Doxyfile || die - - # Prepare icons and .desktop files for slotting. - sed -e "s|blender.svg|blender-${BV}.svg|" -i source/creator/CMakeLists.txt || die - sed -e "s|blender-symbolic.svg|blender-${BV}-symbolic.svg|" -i source/creator/CMakeLists.txt || die - sed -e "s|blender.desktop|blender-${BV}.desktop|" -i source/creator/CMakeLists.txt || die - - sed -e "s|Name=Blender|Name=Blender ${PV}|" -i release/freedesktop/blender.desktop || die - sed -e "s|Exec=blender|Exec=blender-${BV}|" -i release/freedesktop/blender.desktop || die - sed -e "s|Icon=blender|Icon=blender-${BV}|" -i release/freedesktop/blender.desktop || die - - mv release/freedesktop/icons/scalable/apps/blender.svg "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" || die - mv release/freedesktop/icons/symbolic/apps/blender-symbolic.svg "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" || die - mv release/freedesktop/blender.desktop "release/freedesktop/blender-${BV}.desktop" || die - - if use test; then - # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. - sed -e "s|set(TEST_INSTALL_DIR.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i tests/CMakeLists.txt || die - sed -e "s|string(REPLACE.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i build_files/cmake/Modules/GTestTesting.cmake || die - fi -} - -src_configure() { - # -Werror=odr, -Werror=lto-type-mismatch - # https://bugs.gentoo.org/859607 - # https://projects.blender.org/blender/blender/issues/120444 - filter-lto - - # Workaround for bug #922600 - append-ldflags $(test-flags-CCLD -Wl,--undefined-version) - - append-lfs-flags - blender_get_version - - local mycmakeargs=( - -DBUILD_SHARED_LIBS=OFF - -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" - -DPYTHON_LIBRARY="$(python_get_library_path)" - -DPYTHON_VERSION="${EPYTHON/python/}" - -DWITH_ALEMBIC=$(usex alembic) - -DWITH_ASSERT_ABORT=$(usex debug) - -DWITH_BOOST=ON - -DWITH_BULLET=$(usex bullet) - -DWITH_CODEC_FFMPEG=$(usex ffmpeg) - -DWITH_CODEC_SNDFILE=$(usex sndfile) - -DWITH_CXX_GUARDEDALLOC=$(usex debug) - -DWITH_CYCLES=$(usex cycles) - -DWITH_CYCLES_CUDA_BINARIES=$(usex cycles-bin-kernels) - -DWITH_CYCLES_DEVICE_CUDA=$(usex cuda TRUE FALSE) - -DWITH_CYCLES_DEVICE_OPTIX=$(usex optix) - -DWITH_CYCLES_EMBREE=$(usex embree) - -DWITH_CYCLES_OSL=$(usex osl) - -DWITH_CYCLES_PATH_GUIDING=$(usex openpgl) - -DWITH_CYCLES_STANDALONE=OFF - -DWITH_CYCLES_STANDALONE_GUI=OFF - -DWITH_DOC_MANPAGE=$(usex man) - -DWITH_FFTW3=$(usex fftw) - -DWITH_GHOST_WAYLAND=$(usex wayland) - -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" - -DWITH_GHOST_WAYLAND_DBUS=$(usex wayland) - -DWITH_GHOST_WAYLAND_DYNLOAD=OFF - -DWITH_GHOST_WAYLAND_LIBDECOR=OFF - -DWITH_GHOST_X11=$(usex X) - -DWITH_GMP=$(usex gmp) - -DWITH_GTESTS=$(usex test) - -DWITH_HARU=$(usex pdf) - -DWITH_HEADLESS=$($(use X || use wayland) && echo OFF || echo ON) - -DWITH_INSTALL_PORTABLE=OFF - -DWITH_IMAGE_DDS=$(usex dds) - -DWITH_IMAGE_OPENEXR=$(usex openexr) - -DWITH_IMAGE_OPENJPEG=$(usex jpeg2k) - -DWITH_IMAGE_TIFF=$(usex tiff) - -DWITH_INPUT_NDOF=$(usex ndof) - -DWITH_INTERNATIONAL=$(usex nls) - -DWITH_JACK=$(usex jack) - -DWITH_MEM_JEMALLOC=$(usex jemalloc) - -DWITH_MEM_VALGRIND=$(usex valgrind) - -DWITH_MOD_FLUID=$(usex fluid) - -DWITH_MOD_OCEANSIM=$(usex fftw) - -DWITH_NANOVDB=$(usex nanovdb) - -DWITH_OPENAL=$(usex openal) - -DWITH_OPENCOLLADA=$(usex collada) - -DWITH_OPENCOLORIO=$(usex color-management) - -DWITH_OPENIMAGEDENOISE=$(usex oidn) - -DWITH_OPENMP=$(usex openmp) - -DWITH_OPENSUBDIV=$(usex opensubdiv) - -DWITH_OPENVDB=$(usex openvdb) - -DWITH_OPENVDB_BLOSC=$(usex openvdb) - -DWITH_POTRACE=$(usex potrace) - -DWITH_PUGIXML=$(usex pugixml) - -DWITH_PULSEAUDIO=$(usex pulseaudio) - -DWITH_PYTHON_INSTALL=OFF - -DWITH_SDL=$(usex sdl) - -DWITH_STATIC_LIBS=OFF - -DWITH_SYSTEM_EIGEN3=ON - -DWITH_SYSTEM_FREETYPE=ON - -DWITH_SYSTEM_LZO=ON - -DWITH_TBB=$(usex tbb) - -DWITH_USD=OFF - -DWITH_XR_OPENXR=OFF - ) - - if use optix; then - mycmakeargs+=( - -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${EPREFIX}"/opt/optix - -DOPTIX_ROOT_DIR="${EPREFIX}"/opt/optix - ) - fi - - # This is currently needed on arm64 to get the NEON SIMD wrapper to compile the code successfully - use arm64 && append-flags -flax-vector-conversions - - append-flags $(usex debug '-DDEBUG' '-DNDEBUG') - - if tc-is-gcc ; then - # These options only exist when GCC is detected. - # We disable these to respect the user's choice of linker. - mycmakeargs+=( - -DWITH_LINKER_GOLD=OFF - -DWITH_LINKER_LLD=OFF - ) - fi - - cmake_src_configure -} - -src_test() { - # A lot of tests needs to have access to the installed data files. - # So install them into the image directory now. - DESTDIR="${T}" cmake_build install - - blender_get_version - # Define custom blender data/script file paths not be able to find them otherwise during testing. - # (Because the data is in the image directory and it will default to look in /usr/share) - export BLENDER_SYSTEM_SCRIPTS="${T}/usr/share/blender/${BV}/scripts" - export BLENDER_SYSTEM_DATAFILES="${T}/usr/share/blender/${BV}/datafiles" - - # Sanity check that the script and datafile path is valid. - # If they are not vaild, blender will fallback to the default path which is not what we want. - [ -d "$BLENDER_SYSTEM_SCRIPTS" ] || die "The custom script path is invalid, fix the ebuild!" - [ -d "$BLENDER_SYSTEM_DATAFILES" ] || die "The custom datafiles path is invalid, fix the ebuild!" - - cmake_src_test - - # Clean up the image directory for src_install - rm -fr "${T}"/usr || die -} - -src_install() { - blender_get_version - - # Pax mark blender for hardened support. - pax-mark m "${BUILD_DIR}"/bin/blender - - cmake_src_install - - if use man; then - # Slot the man page - mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die - fi - - if use doc; then - # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. - # (Because the data is in the image directory and it will default to look in /usr/share) - export BLENDER_SYSTEM_SCRIPTS=${ED}/usr/share/blender/${BV}/scripts - export BLENDER_SYSTEM_DATAFILES=${ED}/usr/share/blender/${BV}/datafiles - - # Workaround for binary drivers. - addpredict /dev/ati - addpredict /dev/dri - addpredict /dev/nvidiactl - - einfo "Generating Blender C/C++ API docs ..." - cd "${CMAKE_USE_DIR}"/doc/doxygen || die - doxygen -u Doxyfile || die - doxygen || die "doxygen failed to build API docs." - - cd "${CMAKE_USE_DIR}" || die - einfo "Generating (BPY) Blender Python API docs ..." - "${BUILD_DIR}"/bin/blender --background --python doc/python_api/sphinx_doc_gen.py -noaudio || die "sphinx failed." - - cd "${CMAKE_USE_DIR}"/doc/python_api || die - sphinx-build sphinx-in BPY_API || die "sphinx failed." - - docinto "html/API/python" - dodoc -r "${CMAKE_USE_DIR}"/doc/python_api/BPY_API/. - - docinto "html/API/blender" - dodoc -r "${CMAKE_USE_DIR}"/doc/doxygen/html/. - fi - - # Fix doc installdir - docinto html - dodoc "${CMAKE_USE_DIR}"/release/text/readme.html - rm -r "${ED}"/usr/share/doc/blender || die - - python_optimize "${ED}/usr/share/blender/${BV}/scripts" - - mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" || die - mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die -} - -pkg_postinst() { - elog - elog "Blender uses python integration. As such, may have some" - elog "inherent risks with running unknown python scripts." - elog - elog "It is recommended to change your blender temp directory" - elog "from /tmp to /home/user/tmp or another tmp file under your" - elog "home directory. This can be done by starting blender, then" - elog "changing the 'Temporary Files' directory in Blender preferences." - elog - - if use osl; then - ewarn "" - ewarn "OSL is know to cause runtime segfaults if Mesa has been linked to" - ewarn "an other LLVM version than what OSL is linked to." - ewarn "See https://bugs.gentoo.org/880671 for more details" - ewarn "" - fi - - if ! use python_single_target_python3_10; then - elog "You are building Blender with a newer python version than" - elog "supported by this version upstream." - elog "If you experience breakages with e.g. plugins, please switch to" - elog "python_single_target_python3_10 instead." - elog "Bug: https://bugs.gentoo.org/737388" - elog - fi - - xdg_icon_cache_update - xdg_mimeinfo_database_update - xdg_desktop_database_update -} - -pkg_postrm() { - xdg_icon_cache_update - xdg_mimeinfo_database_update - xdg_desktop_database_update - - ewarn "" - ewarn "You may want to remove the following directory." - ewarn "~/.config/${PN}/${SLOT}/cache/" - ewarn "It may contain extra render kernels not tracked by portage" - ewarn "" -} diff --git a/media-gfx/blender/blender-4.2.4-r1.ebuild b/media-gfx/blender/blender-4.2.4-r2.ebuild index 8fcb55057a7b..6ddd54e6f898 100644 --- a/media-gfx/blender/blender-4.2.4-r1.ebuild +++ b/media-gfx/blender/blender-4.2.4-r2.ebuild @@ -5,7 +5,7 @@ EAPI=8 PYTHON_COMPAT=( python3_{11..12} ) # NOTE must match media-libs/osl -LLVM_COMPAT=( {15..18} ) +LLVM_COMPAT=( {17..18} ) LLVM_OPTIONAL=1 inherit check-reqs cmake cuda flag-o-matic llvm-r1 pax-utils python-single-r1 toolchain-funcs xdg-utils @@ -36,7 +36,7 @@ SLOT="${PV%.*}" IUSE=" alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack - jemalloc jpeg2k man +nanovdb ndof nls +oidn oneapi openal +openexr +openmp +openpgl + jemalloc jpeg2k man +nanovdb ndof nls +oidn openal +openexr +openmp +openpgl +opensubdiv +openvdb optix osl +otf +pdf +potrace +pugixml pulseaudio renderdoc sdl +sndfile +tbb test +tiff valgrind vulkan wayland +webp X " @@ -81,7 +81,7 @@ RDEPEND="${PYTHON_DEPS} color-management? ( media-libs/opencolorio:= ) cuda? ( dev-util/nvidia-cuda-toolkit:= ) embree? ( media-libs/embree:=[raymask] ) - ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) + ffmpeg? ( <media-video/ffmpeg-7:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) fftw? ( sci-libs/fftw:3.0= ) gmp? ( dev-libs/gmp[cxx] ) gnome? ( gui-libs/libdecor ) @@ -96,7 +96,6 @@ RDEPEND="${PYTHON_DEPS} nls? ( virtual/libiconv ) openal? ( media-libs/openal ) oidn? ( >=media-libs/oidn-2.1.0 ) - oneapi? ( dev-libs/intel-compute-runtime[l0] ) openexr? ( >=dev-libs/imath-3.1.7:= >=media-libs/openexr-3.2.1:0= @@ -205,12 +204,6 @@ blender_get_version() { pkg_pretend() { blender_check_requirements - - if use oneapi; then - einfo "The Intel oneAPI support is rudimentary." - einfo "" - einfo "Please report any bugs you find to https://bugs.gentoo.org/" - fi } pkg_setup() { @@ -231,10 +224,11 @@ src_unpack() { else default - if use test; then - mkdir -p "${S}/tests/data/" || die - mv blender-test-data/* "${S}/tests/data/" || die - fi + # BUG upstream returns LFS references instead of files + # if use test; then + # mkdir -p "${S}/tests/data/" || die + # mv blender-test-data/* "${S}/tests/data/" || die + # fi fi } @@ -321,9 +315,6 @@ src_configure() { -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" -DWITH_CYCLES_HIP_BINARIES=$(usex hip $(usex cycles-bin-kernels)) - -DWITH_CYCLES_DEVICE_ONEAPI="$(usex oneapi)" - -DWITH_CYCLES_ONEAPI_BINARIES="$(usex oneapi $(usex cycles-bin-kernels))" - -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra -DWITH_CYCLES_EMBREE="$(usex embree)" -DWITH_CYCLES_OSL=$(usex osl) @@ -509,6 +500,11 @@ src_install() { cmake_src_install + # X-KDE-RunOnDiscreteGpu is obsolete, so trim it + sed \ + -e "/X-KDE-RunOnDiscreteGpu.*/d" \ + -i "${ED}/usr/share/applications/blender-${BV}.desktop" || die + if use man; then # Slot the man page mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die diff --git a/media-gfx/blender/blender-4.1.1-r4.ebuild b/media-gfx/blender/blender-4.2.9-r1.ebuild index 3fbedcbe3c5f..0d486b771b9c 100644 --- a/media-gfx/blender/blender-4.1.1-r4.ebuild +++ b/media-gfx/blender/blender-4.2.9-r1.ebuild @@ -5,20 +5,34 @@ EAPI=8 PYTHON_COMPAT=( python3_{11..12} ) # NOTE must match media-libs/osl -LLVM_COMPAT=( {15..18} ) +LLVM_COMPAT=( {17..18} ) LLVM_OPTIONAL=1 -inherit check-reqs cmake cuda flag-o-matic llvm-r1 pax-utils python-single-r1 toolchain-funcs xdg-utils +inherit check-reqs cmake cuda flag-o-matic llvm-r1 pax-utils python-single-r1 toolchain-funcs xdg-utils virtualx DESCRIPTION="3D Creation/Animation/Publishing System" HOMEPAGE="https://www.blender.org" +# # NOTE BLENDER_VERSION +# https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenkernel/BKE_blender_version.h +# BLENDER_RELEASE=4.4 +BLENDER_BRANCH="$(ver_cut 1-2)" + if [[ ${PV} = *9999* ]] ; then - EGIT_LFS="yes" inherit git-r3 + + EGIT_LFS="yes" EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" EGIT_SUBMODULES=( '*' '-lib/*' ) - ADDONS_EGIT_REPO_URI="https://projects.blender.org/blender/blender-addons.git" + if ver_test "${BLENDER_BRANCH}" -lt "4.2"; then + ADDONS_EGIT_REPO_URI="https://projects.blender.org/blender/blender-addons.git" + fi + + # if ver_test "${BLENDER_BRANCH}" -lt "${BLENDER_RELEASE}"; then + if [[ ${PV} != 9999* ]] ; then + EGIT_BRANCH="blender-v${BLENDER_BRANCH}-release" + fi + RESTRICT="!test? ( test )" else SRC_URI=" @@ -28,20 +42,26 @@ else # https://projects.blender.org/blender/blender-test-data/archive/blender-v$(ver_cut 1-2)-release.tar.gz # ) # " - KEYWORDS="amd64 ~arm ~arm64" + KEYWORDS="~amd64 ~arm ~arm64" RESTRICT="test" # the test archive returns LFS references. fi LICENSE="GPL-3+ cycles? ( Apache-2.0 )" -SLOT="${PV%.*}" +SLOT="${BLENDER_BRANCH}" + +# NOTE +openpgl breaks on very old amd64 hardware IUSE=" alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels - debug doc +embree experimental +ffmpeg +fftw +fluid +gmp gnome hip jack - jemalloc jpeg2k man +nanovdb ndof nls +oidn oneapi openal +openexr +openmp openpgl - +opensubdiv +openvdb optix osl +otf +pdf +potrace +pugixml pulseaudio - renderdoc sdl +sndfile +tbb test +tiff valgrind vulkan wayland +webp X + debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack + jemalloc jpeg2k man +nanovdb ndof nls +oidn openal +openexr +openmp +openpgl + +opensubdiv +openvdb optix osl +pdf +potrace +pugixml pulseaudio + renderdoc sdl +sndfile +tbb test +tiff +truetype valgrind vulkan wayland +webp X " +if [[ ${PV} = *9999* ]] ; then + IUSE+="experimental" +fi + REQUIRED_USE="${PYTHON_REQUIRED_USE} alembic? ( openexr ) cuda? ( cycles ) @@ -72,7 +92,7 @@ RDEPEND="${PYTHON_DEPS} media-libs/libjpeg-turbo:= media-libs/libpng:= media-libs/libsamplerate - >=media-libs/openimageio-2.5.6.0:= + <media-libs/openimageio-3:= sys-libs/zlib:= virtual/glu virtual/libintl @@ -97,7 +117,6 @@ RDEPEND="${PYTHON_DEPS} nls? ( virtual/libiconv ) openal? ( media-libs/openal ) oidn? ( >=media-libs/oidn-2.1.0 ) - oneapi? ( dev-libs/intel-compute-runtime[l0] ) openexr? ( >=dev-libs/imath-3.1.7:= >=media-libs/openexr-3.2.1:0= @@ -108,9 +127,9 @@ RDEPEND="${PYTHON_DEPS} >=media-gfx/openvdb-11.0.0:=[nanovdb?] dev-libs/c-blosc:= ) - optix? ( dev-libs/optix ) + optix? ( <dev-libs/optix-9:= ) osl? ( - >=media-libs/osl-1.13:=[${LLVM_USEDEP}] + <media-libs/osl-1.14:=[${LLVM_USEDEP}] media-libs/mesa[${LLVM_USEDEP}] ) pdf? ( media-libs/libharu ) @@ -136,7 +155,7 @@ RDEPEND="${PYTHON_DEPS} dev-util/glslang media-libs/vulkan-loader ) - otf? ( + truetype? ( media-libs/harfbuzz ) renderdoc? ( @@ -182,6 +201,12 @@ PATCHES=( "${FILESDIR}/${PN}-4.0.2-CUDA_NVCC_FLAGS.patch" "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.2.9-python3.12.patch" + "${FILESDIR}/${PN}-4.3.2-ffmpeg7.patch" + "${FILESDIR}/${PN}-4.3.2-openvdb-12.patch" + "${FILESDIR}/${PN}-4.3.2-optix-8.1.0.patch" + "${FILESDIR}/${PN}-4.3.2-system-glog.patch" + "${FILESDIR}/${PN}-4.4.0-optix-compile-flags.patch" ) blender_check_requirements() { @@ -194,24 +219,14 @@ blender_check_requirements() { blender_get_version() { # Get blender version from blender itself. + # NOTE maps x0y to x.y + # TODO this can potentially break for x > 9 and y > 9 BV=$(grep "BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d " " -f 3; assert) - if ((${BV:0:1} < 3)) ; then - # Add period (290 -> 2.90). - BV=${BV:0:1}.${BV:1} - else - # Add period and skip the middle number (301 -> 3.1) - BV=${BV:0:1}.${BV:2} - fi + BV=${BV:0:1}.${BV:2} } pkg_pretend() { blender_check_requirements - - if use oneapi; then - einfo "The Intel oneAPI support is rudimentary." - einfo "" - einfo "Please report any bugs you find to https://bugs.gentoo.org/" - fi } pkg_setup() { @@ -230,6 +245,10 @@ src_unpack() { fi git-r3_src_unpack + # NOTE Add-ons bundled with Blender releases up to Blender 4.1. Blender 4.2 LTS and later include only a handful + # of core add-ons, while others are part of the Extensions Platform at https://extensions.blender.org + ver_test "${BLENDER_BRANCH}" -ge "4.2" && return + git-r3_fetch "${ADDONS_EGIT_REPO_URI}" git-r3_checkout "${ADDONS_EGIT_REPO_URI}" "${S}/scripts/addons" else @@ -268,22 +287,45 @@ src_prepare() { -e "s|Icon=blender|Icon=blender-${BV}|" \ -i release/freedesktop/blender.desktop || die - sed -e "s|\${CMAKE_INSTALL_PREFIX}/\${BLENDER_BIN}|${T}/usr/\${BLENDER_BIN}|g" -i source/creator/CMakeLists.txt || die + sed \ + -e "/CMAKE_INSTALL_PREFIX_WITH_CONFIG/{s|\${CMAKE_INSTALL_PREFIX}|${T}/usr|g}" \ + -i CMakeLists.txt \ + || die CMAKE_INSTALL_PREFIX_WITH_CONFIG mv \ - release/freedesktop/icons/scalable/apps/blender.svg \ - "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" || die + "release/freedesktop/icons/scalable/apps/blender.svg" \ + "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" \ + || die mv \ - release/freedesktop/icons/symbolic/apps/blender-symbolic.svg \ - "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" || die - mv release/freedesktop/blender.desktop "release/freedesktop/blender-${BV}.desktop" || die - mv release/freedesktop/org.blender.Blender.metainfo.xml "release/freedesktop/blender-${BV}.metainfo.xml" - mv release/freedesktop/org.blender.Blender.appdata.xml "release/freedesktop/blender-${BV}.appdata.xml" + "release/freedesktop/icons/symbolic/apps/blender-symbolic.svg" \ + "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" \ + || die + mv \ + "release/freedesktop/blender.desktop" \ + "release/freedesktop/blender-${BV}.desktop" \ + || die + + local info_file test_file + if ver_test -ge 4; then + info_file="metainfo" + test_file="build_files/cmake/testing.cmake" + else + info_file="appdata" + test_file="build_files/cmake/Modules/GTestTesting.cmake" + fi + mv \ + "release/freedesktop/org.blender.Blender.${info_file}.xml" \ + "release/freedesktop/blender-${BV}.${info_file}.xml" \ + || die if use test; then # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. - sed -e "s|set(TEST_INSTALL_DIR.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i tests/CMakeLists.txt || die - sed -e "s|string(REPLACE.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i build_files/cmake/testing.cmake || die + sed \ + -e "/string(REPLACE.*TEST_INSTALL_DIR/{s|\${CMAKE_INSTALL_PREFIX}|${T}/usr|g}" \ + -i "${test_file}" \ + || die "REPLACE.*TEST_INSTALL_DIR" + + sed '1i #include <cstdint>' -i extern/gtest/src/gtest-death-test.cc || die fi if use vulkan; then @@ -304,8 +346,15 @@ src_configure() { blender_get_version local mycmakeargs=( - -DWITH_LIBS_PRECOMPILED=no - -DBUILD_SHARED_LIBS=no + -DCMAKE_POLICY_DEFAULT_CMP0177="OLD" + + # we build a host-specific binary + -DWITH_INSTALL_PORTABLE="no" + -DWITH_CPU_CHECK="no" + + -DWITH_LIBS_PRECOMPILED="no" + -DBUILD_SHARED_LIBS="no" # this over-ridden by cmake.eclass + -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" -DPYTHON_LIBRARY="$(python_get_library_path)" -DPYTHON_VERSION="${EPYTHON/python/}" @@ -324,9 +373,6 @@ src_configure() { -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" -DWITH_CYCLES_HIP_BINARIES=$(usex hip $(usex cycles-bin-kernels)) - -DWITH_CYCLES_DEVICE_ONEAPI="$(usex oneapi)" - -DWITH_CYCLES_ONEAPI_BINARIES="$(usex oneapi $(usex cycles-bin-kernels))" - -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra -DWITH_CYCLES_EMBREE="$(usex embree)" -DWITH_CYCLES_OSL=$(usex osl) @@ -336,22 +382,20 @@ src_configure() { -DWITH_DOC_MANPAGE=$(usex man) -DWITH_DRACO="no" # TODO: Package Draco - -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" -DWITH_FFTW3=$(usex fftw) -DWITH_GHOST_WAYLAND=$(usex wayland) -DWITH_GHOST_WAYLAND_DYNLOAD="no" -DWITH_GHOST_X11=$(usex X) -DWITH_GMP=$(usex gmp) -DWITH_GTESTS=$(usex test) - -DWITH_HARFBUZZ="$(usex otf)" + -DWITH_HARFBUZZ="$(usex truetype)" -DWITH_HARU=$(usex pdf) - -DWITH_HEADLESS=$($(use X || use wayland) && echo OFF || echo ON) + -DWITH_HEADLESS="$(usex !X "$(usex !wayland)")" -DWITH_HYDRA="no" # TODO: Package Hydra -DWITH_IMAGE_OPENEXR=$(usex openexr) -DWITH_IMAGE_OPENJPEG=$(usex jpeg2k) -DWITH_IMAGE_WEBP=$(usex webp) -DWITH_INPUT_NDOF=$(usex ndof) - -DWITH_INSTALL_PORTABLE="no" -DWITH_INTERNATIONAL=$(usex nls) -DWITH_JACK=$(usex jack) -DWITH_MATERIALX="no" # TODO: Package MaterialX @@ -371,20 +415,21 @@ src_configure() { -DWITH_POTRACE=$(usex potrace) -DWITH_PUGIXML=$(usex pugixml) -DWITH_PULSEAUDIO=$(usex pulseaudio) - -DWITH_PYTHON_INSTALL=no - -DWITH_PYTHON_INSTALL_NUMPY=no - -DWITH_PYTHON_INSTALL_ZSTANDARD=no + -DWITH_PYTHON_INSTALL="no" + -DWITH_PYTHON_INSTALL_NUMPY="no" + -DWITH_PYTHON_INSTALL_ZSTANDARD="no" -DWITH_RENDERDOC="$(usex renderdoc)" -DWITH_SDL=$(usex sdl) - -DWITH_STATIC_LIBS=no - -DWITH_STRICT_BUILD_OPTIONS=yes - -DWITH_SYSTEM_EIGEN3=yes - -DWITH_SYSTEM_FREETYPE=yes - -DWITH_SYSTEM_LZO=yes + -DWITH_STATIC_LIBS="no" + -DWITH_STRICT_BUILD_OPTIONS="yes" + -DWITH_SYSTEM_EIGEN3="yes" + -DWITH_SYSTEM_FREETYPE="yes" + -DWITH_SYSTEM_LZO="yes" -DWITH_TBB=$(usex tbb) -DWITH_USD="no" # TODO: Package USD -DWITH_VULKAN_BACKEND="$(usex vulkan)" - -DWITH_XR_OPENXR=no + -DWITH_XR_OPENXR="no" + -DWITH_UNITY_BUILD="no" ) if has_version ">=dev-python/numpy-2"; then @@ -396,14 +441,24 @@ src_configure() { # requires dev-vcs/git if [[ ${PV} = *9999* ]] ; then - mycmakeargs+=( -DWITH_BUILDINFO="yes" ) + mycmakeargs+=( + -DWITH_BUILDINFO="yes" + -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" + ) else mycmakeargs+=( -DWITH_BUILDINFO="no" ) fi if use cuda; then + if [[ -z "${CUDAARCHS}" ]]; then + CUDAARCHS="all-major" + else + CUDAARCHS="sm_${CUDAARCHS}" + fi + mycmakeargs+=( -DCUDA_NVCC_FLAGS="--compiler-bindir;$(cuda_gccdir)" + -DCYCLES_CUDA_BINARIES_ARCH="${CUDAARCHS}" ) fi @@ -432,7 +487,7 @@ src_configure() { use arm64 && append-flags -flax-vector-conversions append-cflags "$(usex debug '-DDEBUG' '-DNDEBUG')" - append-cppflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + append-cxxflags "$(usex debug '-DDEBUG' '-DNDEBUG')" if tc-is-gcc ; then # These options only exist when GCC is detected. @@ -460,7 +515,8 @@ src_configure() { use hip && CYCLES_TEST_DEVICES+=( "HIP" ) fi mycmakeargs+=( - -DCYCLES_TEST_DEVICES:STRING="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" + -DCMAKE_INSTALL_PREFIX_WITH_CONFIG="${T}/usr" + -DCYCLES_TEST_DEVICES="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" -DWITH_COMPOSITOR_REALTIME_TESTS=yes -DWITH_GPU_DRAW_TESTS=yes -DWITH_GPU_RENDER_TESTS=yes @@ -478,13 +534,11 @@ src_test() { blender_get_version # Define custom blender data/script file paths not be able to find them otherwise during testing. # (Because the data is in the image directory and it will default to look in /usr/share) - export BLENDER_SYSTEM_SCRIPTS="${T}/usr/share/blender/${BV}/scripts" - export BLENDER_SYSTEM_DATAFILES="${T}/usr/share/blender/${BV}/datafiles" + local -x BLENDER_SYSTEM_RESOURCES="${T%/}/usr/share/blender/${BV}" # Sanity check that the script and datafile path is valid. # If they are not vaild, blender will fallback to the default path which is not what we want. - [ -d "$BLENDER_SYSTEM_SCRIPTS" ] || die "The custom script path is invalid, fix the ebuild!" - [ -d "$BLENDER_SYSTEM_DATAFILES" ] || die "The custom datafiles path is invalid, fix the ebuild!" + [[ -d "${BLENDER_SYSTEM_RESOURCES}" ]] || die "The custom resources path is invalid, fix the ebuild!" if use cuda; then cuda_add_sandbox -w @@ -492,11 +546,58 @@ src_test() { addwrite "/dev/char/" fi - if use X; then + addwrite "/dev/char/" + addwrite "/dev/nvidiactl" + addwrite "/dev/nvidia0" + addwrite "/dev/nvidia-modeset" + addwrite "/dev/dri/" + + local -x CMAKE_SKIP_TESTS=( + draw + gpu + script_load_modules + script_bundled_modules + script_pyapi_bpy_driver_secure_eval + blendfile_versioning_5_over_8 + blendfile_versioning_7_over_8 + cycles_motion_blur_cpu + cycles_volume_cpu + cycles_motion_blur_cuda + cycles_volume_cuda + eevee_next_grease_pencil + eevee_next_light + eevee_next_motion_blur + eevee_next_pointcloud + eevee_next_render_layer + eevee_next_volume + workbench_motion_blur + workbench_volume + compositor_multiple_node_setups_realtime + compositor_distort_realtime + ) + + if use wayland; then xdg_environment_reset - fi - cmake_src_test + local compositor exit_code + local logfile=${T}/weston.log + weston --xwayland --backend=headless --socket=wayland-5 --idle-time=0 2>"${logfile}" & + compositor=$! + export WAYLAND_DISPLAY=wayland-5 + sleep 1 # wait for xwayland to be up + export DISPLAY=$(grep "xserver listening on display" "${logfile}" | cut -d ' ' -f 5) + + cmake_src_test + + exit_code=$? + kill "${compositor}" + + elif use X; then + xdg_environment_reset + virtx cmake_src_test + else + cmake_src_test + fi # Clean up the image directory for src_install rm -fr "${T}/usr" || die @@ -510,6 +611,11 @@ src_install() { cmake_src_install + # X-KDE-RunOnDiscreteGpu is obsolete, so trim it + sed \ + -e "/X-KDE-RunOnDiscreteGpu.*/d" \ + -i "${ED}/usr/share/applications/blender-${BV}.desktop" || die + if use man; then # Slot the man page mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die @@ -518,8 +624,7 @@ src_install() { if use doc; then # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. # (Because the data is in the image directory and it will default to look in /usr/share) - export BLENDER_SYSTEM_SCRIPTS=${ED}/usr/share/blender/${BV}/scripts - export BLENDER_SYSTEM_DATAFILES=${ED}/usr/share/blender/${BV}/datafiles + local -x BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" # Workaround for binary drivers. addpredict /dev/ati @@ -552,8 +657,9 @@ src_install() { python_optimize "${ED}/usr/share/blender/${BV}/scripts" - mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" || die - mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die + mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" \ + || die "blender-thumbnailer version rename failed" + mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die "blender version rename failed" } pkg_postinst() { diff --git a/media-gfx/blender/blender-4.3.2-r1.ebuild b/media-gfx/blender/blender-4.3.2-r4.ebuild index 105a047649fb..888313bfec06 100644 --- a/media-gfx/blender/blender-4.3.2-r1.ebuild +++ b/media-gfx/blender/blender-4.3.2-r4.ebuild @@ -1,47 +1,89 @@ # Copyright 1999-2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +# shellcheck disable=SC2207 + +# TODO +# - Package Hydra +# https://github.com/Ray-Tracing-Systems/HydraCore +# https://github.com/Ray-Tracing-Systems/HydraAPI +# - Package USD +# https://github.com/PixarAnimationStudios/OpenUSD +# - Package MaterialX +# https://github.com/AcademySoftwareFoundation/MaterialX +# - Package Draco +# https://github.com/google/draco +# - Package Audaspace +# https://github.com/neXyon/audaspace + EAPI=8 -PYTHON_COMPAT=( python3_{11..12} ) +PYTHON_COMPAT=( python3_{11..13} ) # NOTE must match media-libs/osl -LLVM_COMPAT=( {15..18} ) +LLVM_COMPAT=( {17..18} ) LLVM_OPTIONAL=1 -inherit check-reqs cmake cuda flag-o-matic llvm-r1 pax-utils python-single-r1 toolchain-funcs xdg-utils +ROCM_SKIP_GLOBALS=1 + +inherit cuda rocm llvm-r1 +inherit eapi9-pipestatus check-reqs flag-o-matic pax-utils python-single-r1 toolchain-funcs virtualx +inherit cmake xdg-utils DESCRIPTION="3D Creation/Animation/Publishing System" HOMEPAGE="https://www.blender.org" -if [[ ${PV} = *9999* ]] ; then +# NOTE BLENDER_VERSION +# https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenkernel/BKE_blender_version.h +BLENDER_BRANCH="$(ver_cut 1-2)" + +if [[ "${PV}" == *9999* ]]; then EGIT_LFS="yes" inherit git-r3 EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" EGIT_SUBMODULES=( '*' '-lib/*' ) + + if [[ "${PV}" == 9999* ]]; then + EGIT_BRANCH="main" + else + EGIT_BRANCH="blender-v${BLENDER_BRANCH}-release" + fi + RESTRICT="!test? ( test )" else SRC_URI=" https://download.blender.org/source/${P}.tar.xz + https://github.com/negril/gentoo-overlay-vendored/raw/refs/heads/blobs/blender-assets-${PV}.tar.xz " + # BUG upstream returns LFS references instead of files + # SRC_URI+=" # test? ( - # https://projects.blender.org/blender/blender-test-data/archive/blender-v$(ver_cut 1-2)-release.tar.gz + # https://projects.blender.org/blender/blender-test-data/archive/blender-v${BLENDER_BRANCH}-release.tar.gz # ) # " KEYWORDS="~amd64 ~arm ~arm64" - RESTRICT="test" # the test archive returns LFS references. + RESTRICT="test" # the test archive contains LFS references fi -LICENSE="GPL-3+ cycles? ( Apache-2.0 )" -SLOT="${PV%.*}" +# assets is CC0-1.0 +LICENSE="GPL-3+ cycles? ( Apache-2.0 ) CC0-1.0" +SLOT="${BLENDER_BRANCH}" + +# NOTE +openpgl breaks on very old amd64 hardware +# potentially mirror cpu_flags_x86 + REQUIRED_USE IUSE=" alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack - jemalloc jpeg2k man +nanovdb ndof nls +oidn oneapi openal +openexr +openmp +openpgl - +opensubdiv +openvdb optix osl +otf +pdf +potrace +pugixml pulseaudio - renderdoc sdl +sndfile +tbb test +tiff valgrind vulkan wayland +webp X + jemalloc jpeg2k man +nanovdb ndof nls +oidn openal +openexr +opengl +openmp +openpgl + +opensubdiv +openvdb optix osl +pdf +potrace +pugixml pulseaudio + renderdoc sdl +sndfile +tbb test +tiff +truetype valgrind vulkan wayland +webp X " +if [[ "${PV}" == *9999* ]]; then + IUSE+="experimental" +fi + REQUIRED_USE="${PYTHON_REQUIRED_USE} + || ( opengl vulkan ) alembic? ( openexr ) cuda? ( cycles ) cycles? ( openexr tiff tbb ) @@ -52,12 +94,18 @@ REQUIRED_USE="${PYTHON_REQUIRED_USE} openvdb? ( tbb openexr ) optix? ( cuda ) osl? ( cycles pugixml ) - test? ( color-management )" + test? ( + color-management + jpeg2k + ) +" # Library versions for official builds can be found in the blender source directory in: # build_files/build_environment/cmake/versions.cmake RDEPEND="${PYTHON_DEPS} app-arch/zstd + dev-cpp/gflags:= + dev-cpp/glog:= dev-libs/boost:=[nls?] dev-libs/lzo:2= $(python_gen_cond_dep ' @@ -71,21 +119,24 @@ RDEPEND="${PYTHON_DEPS} media-libs/libjpeg-turbo:= media-libs/libpng:= media-libs/libsamplerate - >=media-libs/openimageio-2.5.6.0:= + <media-libs/openimageio-3:= sys-libs/zlib:= virtual/glu virtual/libintl - virtual/opengl + virtual/opengl[X?] alembic? ( >=media-gfx/alembic-1.8.3-r2[boost(+),hdf(+)] ) + bullet? ( sci-physics/bullet:=[double-precision] ) collada? ( >=media-libs/opencollada-1.6.68 ) color-management? ( media-libs/opencolorio:= ) cuda? ( dev-util/nvidia-cuda-toolkit:= ) embree? ( media-libs/embree:=[raymask] ) ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) - fftw? ( sci-libs/fftw:3.0= ) + fftw? ( sci-libs/fftw:3.0=[threads] ) gmp? ( dev-libs/gmp[cxx] ) gnome? ( gui-libs/libdecor ) - hip? ( >=dev-util/hip-5.7 ) + hip? ( + >=dev-util/hip-5.7:= + ) jack? ( virtual/jack ) jemalloc? ( dev-libs/jemalloc:= ) jpeg2k? ( media-libs/openjpeg:2= ) @@ -96,20 +147,19 @@ RDEPEND="${PYTHON_DEPS} nls? ( virtual/libiconv ) openal? ( media-libs/openal ) oidn? ( >=media-libs/oidn-2.1.0 ) - oneapi? ( dev-libs/intel-compute-runtime[l0] ) openexr? ( >=dev-libs/imath-3.1.7:= >=media-libs/openexr-3.2.1:0= ) openpgl? ( media-libs/openpgl:= ) - opensubdiv? ( >=media-libs/opensubdiv-3.5.0 ) + opensubdiv? ( >=media-libs/opensubdiv-3.6.0-r2[opengl,cuda?,openmp?,tbb?] ) openvdb? ( >=media-gfx/openvdb-11.0.0:=[nanovdb?] dev-libs/c-blosc:= ) - optix? ( dev-libs/optix ) + optix? ( <dev-libs/optix-9:= ) osl? ( - >=media-libs/osl-1.13:=[${LLVM_USEDEP}] + <media-libs/osl-1.14:=[${LLVM_USEDEP}] media-libs/mesa[${LLVM_USEDEP}] ) pdf? ( media-libs/libharu ) @@ -135,7 +185,7 @@ RDEPEND="${PYTHON_DEPS} dev-util/glslang media-libs/vulkan-loader ) - otf? ( + truetype? ( media-libs/harfbuzz ) renderdoc? ( @@ -150,11 +200,19 @@ RDEPEND="${PYTHON_DEPS} DEPEND="${RDEPEND} dev-cpp/eigen:= - vulkan? ( - dev-util/spirv-headers - dev-util/vulkan-headers +" + +if [[ "${PV}" == *9999* ]]; then +DEPEND+=" + test? ( + experimental? ( + wayland? ( + dev-libs/weston + ) + ) ) " +fi BDEPEND=" virtual/pkgconfig @@ -167,6 +225,10 @@ BDEPEND=" dev-texlive/texlive-latex dev-texlive/texlive-latexextra ) + vulkan? ( + dev-util/spirv-headers + dev-util/vulkan-headers + ) nls? ( sys-devel/gettext ) wayland? ( dev-util/wayland-scanner @@ -178,10 +240,16 @@ BDEPEND=" PATCHES=( "${FILESDIR}/${PN}-4.0.2-FindClang.patch" - "${FILESDIR}/${PN}-4.0.2-CUDA_NVCC_FLAGS.patch" "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.2.9-python3.12.patch" + "${FILESDIR}/${PN}-4.2.9-python3.13.patch" + "${FILESDIR}/${PN}-4.2.9-python3.12_1.patch" "${FILESDIR}/${PN}-4.3.2-ffmpeg7.patch" + "${FILESDIR}/${PN}-4.3.2-openvdb-12.patch" + "${FILESDIR}/${PN}-4.3.2-optix-8.1.0.patch" + "${FILESDIR}/${PN}-4.3.2-system-glog.patch" + "${FILESDIR}/${PN}-4.4.0-optix-compile-flags.patch" ) blender_check_requirements() { @@ -193,38 +261,43 @@ blender_check_requirements() { } blender_get_version() { + if [[ -n "${BV}" && -n "${BVC}" ]]; then + return + fi + + local status # Get blender version from blender itself. - BV=$(grep "BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d " " -f 3; assert) - if ((${BV:0:1} < 3)) ; then - # Add period (290 -> 2.90). - BV=${BV:0:1}.${BV:1} - else - # Add period and skip the middle number (301 -> 3.1) - BV=${BV:0:1}.${BV:2} + # mirrors build_files/cmake/macros.cmake function(get_blender_version) + # NOTE maps x0y to x.y + # TODO this can potentially break for x > 9 and y > 9 + BV="$(grep "define BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION, (PIPESTATUS: ${status})" + BV="$(printf "%d.%d" "${BV:0: -2}" "${BV: -2}")" + + if [[ "${PV}" != 9999* && "${BLENDER_BRANCH}" != "${BV}" ]]; then + eerror "ebuild (${BLENDER_BRANCH}) and code (${BV}) version mismatch" + die "blender_get_version" fi + + BVC="$(grep "define BLENDER_VERSION_CYCLE " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION_CYCLE, (PIPESTATUS: ${status})" } pkg_pretend() { blender_check_requirements - - if use oneapi; then - einfo "The Intel oneAPI support is rudimentary." - einfo "" - einfo "Please report any bugs you find to https://bugs.gentoo.org/" - fi } pkg_setup() { + blender_check_requirements + python-single-r1_pkg_setup + if use osl; then llvm-r1_pkg_setup fi - - blender_check_requirements - python-single-r1_pkg_setup } src_unpack() { - if [[ ${PV} = *9999* ]] ; then + if [[ "${PV}" == *9999* ]]; then if ! use test; then EGIT_SUBMODULES+=( '-tests/*' ) fi @@ -232,10 +305,11 @@ src_unpack() { else default - if use test; then - mkdir -p "${S}/tests/data/" || die - mv blender-test-data/* "${S}/tests/data/" || die - fi + # BUG upstream returns LFS references instead of files + # if use test; then + # mkdir -p "${S}/tests/data/" || die + # mv blender-test-data/* "${S}/tests/data/" || die + # fi fi } @@ -246,11 +320,6 @@ src_prepare() { blender_get_version - # Disable MS Windows help generation. The variable doesn't do what it - # it sounds like. - sed -e "s|GENERATE_HTMLHELP = YES|GENERATE_HTMLHELP = NO|" \ - -i doc/doxygen/Doxyfile || die - # Prepare icons and .desktop files for slotting. sed \ -e "s|blender.svg|blender-${BV}.svg|" \ @@ -265,22 +334,62 @@ src_prepare() { -e "s|Icon=blender|Icon=blender-${BV}|" \ -i release/freedesktop/blender.desktop || die - sed -e "s|\${CMAKE_INSTALL_PREFIX}/\${BLENDER_BIN}|${T}/usr/\${BLENDER_BIN}|g" -i source/creator/CMakeLists.txt || die + sed \ + -e "/CMAKE_INSTALL_PREFIX_WITH_CONFIG/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i CMakeLists.txt \ + || die CMAKE_INSTALL_PREFIX_WITH_CONFIG mv \ - release/freedesktop/icons/scalable/apps/blender.svg \ - "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" || die + "release/freedesktop/icons/scalable/apps/blender.svg" \ + "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" \ + || die + mv \ + "release/freedesktop/icons/symbolic/apps/blender-symbolic.svg" \ + "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" \ + || die + mv \ + "release/freedesktop/blender.desktop" \ + "release/freedesktop/blender-${BV}.desktop" \ + || die + mv \ - release/freedesktop/icons/symbolic/apps/blender-symbolic.svg \ - "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" || die - mv release/freedesktop/blender.desktop "release/freedesktop/blender-${BV}.desktop" || die - mv release/freedesktop/org.blender.Blender.metainfo.xml "release/freedesktop/blender-${BV}.metainfo.xml" - mv release/freedesktop/org.blender.Blender.appdata.xml "release/freedesktop/blender-${BV}.appdata.xml" + "release/freedesktop/org.blender.Blender.metainfo.xml" \ + "release/freedesktop/blender-${BV}.metainfo.xml" \ + || die + + sed \ + -e "s#\(set(cycles_kernel_runtime_lib_target_path \)\${cycles_kernel_runtime_lib_target_path}\(/lib)\)#\1\${CYCLES_INSTALL_PATH}\2#" \ + -i intern/cycles/kernel/CMakeLists.txt \ + || die + + if use hip; then + # fix hardcoded path + sed \ + -e "s#opt/rocm/hip/bin#$(hipconfig -p)/bin#g" \ + -i extern/hipew/src/hipew.c \ + || die + fi if use test; then # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. - sed -e "s|set(TEST_INSTALL_DIR.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i tests/CMakeLists.txt || die - sed -e "s|string(REPLACE.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i build_files/cmake/testing.cmake || die + sed \ + -e "/string(REPLACE.*TEST_INSTALL_DIR/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i "build_files/cmake/testing.cmake" \ + || die "REPLACE.*TEST_INSTALL_DIR" + + # assertEquals was deprecated in Python-3.2 use assertEqual instead + sed \ + -e 's/assertEquals/assertEqual/g' \ + -i tests/python/bl_animation_action.py \ + || die + + sed -e '1i #include <cstdint>' -i extern/gtest/src/gtest-death-test.cc || die + else + cmake_comment_add_subdirectory tests + fi + + if [[ "${PV}" != *9999* ]]; then + rm "${WORKDIR}/blender-assets/publish/LICENSE" || die fi if use vulkan; then @@ -295,14 +404,23 @@ src_configure() { filter-lto # Workaround for bug #922600 - append-ldflags $(test-flags-CCLD -Wl,--undefined-version) + append-ldflags "$(test-flags-CCLD -Wl,--undefined-version)" append-lfs-flags blender_get_version local mycmakeargs=( - -DWITH_LIBS_PRECOMPILED=no - -DBUILD_SHARED_LIBS=no + -DCMAKE_POLICY_DEFAULT_CMP0177="OLD" + + # we build a host-specific binary + -DWITH_INSTALL_PORTABLE="no" + -DWITH_CPU_CHECK="no" + + -DWITH_STRICT_BUILD_OPTIONS="yes" + -DWITH_LIBS_PRECOMPILED="no" + -DBUILD_SHARED_LIBS="no" # quadriflow only? + -DWITH_STATIC_LIBS=OFF + -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" -DPYTHON_LIBRARY="$(python_get_library_path)" -DPYTHON_VERSION="${EPYTHON/python/}" @@ -311,7 +429,6 @@ src_configure() { -DWITH_BULLET=$(usex bullet) -DWITH_CODEC_FFMPEG=$(usex ffmpeg) -DWITH_CODEC_SNDFILE=$(usex sndfile) - -DWITH_CPU_CHECK=no -DWITH_CYCLES=$(usex cycles) @@ -322,9 +439,6 @@ src_configure() { -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" -DWITH_CYCLES_HIP_BINARIES=$(usex hip $(usex cycles-bin-kernels)) - -DWITH_CYCLES_DEVICE_ONEAPI="$(usex oneapi)" - -DWITH_CYCLES_ONEAPI_BINARIES="$(usex oneapi $(usex cycles-bin-kernels))" - -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra -DWITH_CYCLES_EMBREE="$(usex embree)" -DWITH_CYCLES_OSL=$(usex osl) @@ -340,15 +454,14 @@ src_configure() { -DWITH_GHOST_X11=$(usex X) -DWITH_GMP=$(usex gmp) -DWITH_GTESTS=$(usex test) - -DWITH_HARFBUZZ="$(usex otf)" + -DWITH_HARFBUZZ="$(usex truetype)" -DWITH_HARU=$(usex pdf) - -DWITH_HEADLESS=$($(use X || use wayland) && echo OFF || echo ON) + -DWITH_HEADLESS="$(usex !X "$(usex !wayland)")" -DWITH_HYDRA="no" # TODO: Package Hydra -DWITH_IMAGE_OPENEXR=$(usex openexr) -DWITH_IMAGE_OPENJPEG=$(usex jpeg2k) -DWITH_IMAGE_WEBP=$(usex webp) -DWITH_INPUT_NDOF=$(usex ndof) - -DWITH_INSTALL_PORTABLE="no" -DWITH_INTERNATIONAL=$(usex nls) -DWITH_JACK=$(usex jack) -DWITH_MATERIALX="no" # TODO: Package MaterialX @@ -360,6 +473,7 @@ src_configure() { -DWITH_OPENAL=$(usex openal) -DWITH_OPENCOLLADA=$(usex collada) -DWITH_OPENCOLORIO=$(usex color-management) + -DWITH_OPENGL_BACKEND=$(usex opengl) -DWITH_OPENIMAGEDENOISE=$(usex oidn) -DWITH_OPENMP=$(usex openmp) -DWITH_OPENSUBDIV=$(usex opensubdiv) @@ -373,15 +487,16 @@ src_configure() { -DWITH_PYTHON_INSTALL_ZSTANDARD=no -DWITH_RENDERDOC="$(usex renderdoc)" -DWITH_SDL=$(usex sdl) - -DWITH_STATIC_LIBS=no - -DWITH_STRICT_BUILD_OPTIONS=yes + -DWITH_SYSTEM_BULLET="yes" -DWITH_SYSTEM_EIGEN3=yes -DWITH_SYSTEM_FREETYPE=yes + -DWITH_SYSTEM_GFLAGS="yes" + -DWITH_SYSTEM_GLOG="yes" -DWITH_SYSTEM_LZO=yes -DWITH_TBB=$(usex tbb) -DWITH_USD="no" # TODO: Package USD - -DWITH_VULKAN_BACKEND="$(usex vulkan)" -DWITH_XR_OPENXR=no + -DWITH_UNITY_BUILD="no" ) if has_version ">=dev-python/numpy-2"; then @@ -392,29 +507,44 @@ src_configure() { fi # requires dev-vcs/git - if [[ ${PV} = *9999* ]] ; then - mycmakeargs+=( -DWITH_BUILDINFO="yes" ) + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]]; then + mycmakeargs+=( + # -DWITH_BUILDINFO="no" + -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" + ) else - mycmakeargs+=( -DWITH_BUILDINFO="no" ) + mycmakeargs+=( + -DWITH_EXPERIMENTAL_FEATURES="no" + ) fi if use cuda; then - mycmakeargs+=( - -DCUDA_NVCC_FLAGS="--compiler-bindir;$(cuda_gccdir)" - ) + # Ease compiling with required gcc similar to cuda_sanitize but for cmake + if use cycles-bin-kernels; then + local -x CUDAHOSTCXX="$(cuda_gccdir)" + local -x CUDAHOSTLD="$(tc-getCXX)" + + if [[ -n "${CUDAARCHS}" ]]; then + mycmakeargs+=( + -DCYCLES_CUDA_BINARIES_ARCH="$(echo "${CUDAARCHS}" | sed -e 's/^/sm_/g' -e 's/;/;sm_/g')" + ) + fi + fi fi if use hip; then mycmakeargs+=( - -DROCM_PATH="$(hipconfig -R)" + -DHIP_ROOT_DIR="$(hipconfig -p)" -DHIP_HIPCC_FLAGS="-fcf-protection=none" + -DCMAKE_HIP_LINK_EXECUTABLE="$(get_llvm_prefix)/bin/clang++" + -DCYCLES_HIP_BINARIES_ARCH="$(get_amdgpu_flags)" ) fi if use optix; then mycmakeargs+=( - -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${EPREFIX}"/opt/optix - -DOPTIX_ROOT_DIR="${EPREFIX}"/opt/optix + -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + -DOPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" ) fi @@ -429,17 +559,13 @@ src_configure() { use arm64 && append-flags -flax-vector-conversions append-cflags "$(usex debug '-DDEBUG' '-DNDEBUG')" - append-cppflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + append-cxxflags "$(usex debug '-DDEBUG' '-DNDEBUG')" - if tc-is-gcc ; then - # These options only exist when GCC is detected. + if tc-is-gcc; then # We disable these to respect the user's choice of linker. mycmakeargs+=( -DWITH_LINKER_GOLD=no - -DWITH_LINKER_LLD=no ) - # Ease compiling with required gcc similar to cuda_sanitize but for cmake - use cuda && use cycles-bin-kernels && mycmakeargs+=( -DCUDA_HOST_COMPILER="$(cuda_gccdir)" ) fi if tc-is-clang || use osl; then @@ -449,7 +575,7 @@ src_configure() { ) fi - if use test ; then + if use test; then local CYCLES_TEST_DEVICES=( "CPU" ) if use cycles-bin-kernels; then use cuda && CYCLES_TEST_DEVICES+=( "CUDA" ) @@ -457,46 +583,110 @@ src_configure() { use hip && CYCLES_TEST_DEVICES+=( "HIP" ) fi mycmakeargs+=( - -DCYCLES_TEST_DEVICES:STRING="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" - -DWITH_COMPOSITOR_REALTIME_TESTS=yes - -DWITH_GPU_DRAW_TESTS=yes - -DWITH_GPU_RENDER_TESTS=yes + -DCMAKE_INSTALL_PREFIX_WITH_CONFIG="${T}/usr" + -DCYCLES_TEST_DEVICES="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" ) + + # NOTE in lieu of a FEATURE/build_options + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + mycmakeargs+=( + -DWITH_COMPOSITOR_REALTIME_TESTS="yes" + + -DWITH_CYCLES_TEST_OSL="$(usex osl)" + + -DWITH_GPU_DRAW_TESTS="yes" + + -DWITH_GPU_RENDER_TESTS="yes" + -DWITH_GPU_RENDER_TESTS_SILENT="no" + ) + + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && use experimental; then + mycmakeargs+=( + # Enable user-interface tests using a headless display server. + # Currently this depends on WITH_GHOST_WAYLAND and the weston compositor (Experimental) + -DWITH_UI_TESTS="$(usex wayland)" + -DWESTON_BIN="${ESYSROOT}/usr/bin/weston" + ) + fi + else + mycmakeargs+=( + -DWITH_GPU_RENDER_TESTS="no" + ) + fi fi cmake_src_configure } src_test() { - # A lot of tests needs to have access to the installed data files. + # A lot of tests need to have access to the installed data files. # So install them into the image directory now. DESTDIR="${T}" cmake_build install blender_get_version - # By default, blender will look for system scripts and data in - # /usr/share/, but until this is installed, they are not necessarily - # available there. Use this to have blender search the intermediate - # install directory instead. - export BLENDER_SYSTEM_RESOURCES="${T}/usr/share/blender/${BV}" + # Define custom blender data/script file paths, or we won't be able to find them otherwise during testing. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${T%/}/usr/share/blender/${BV}" - # Brake check: Make sure the above path is valid. - # If not, blender will fallback to the default path which is not what - # we want. - [ -d "$BLENDER_SYSTEM_RESOURCES" ] || die "The custom script path is invalid, fix the ebuild!" + # Sanity check that the script and datafile path is valid. + # If they are not valid, blender will fallback to the default path which is not what we want. + [[ -d "${BLENDER_SYSTEM_RESOURCES}" ]] || die "The custom resources path is invalid, fix the ebuild!" + + # TODO only picks first card + addwrite "/dev/dri/card0" + addwrite "/dev/dri/renderD128" + addwrite "/dev/udmabuf" if use cuda; then cuda_add_sandbox -w - addwrite "/dev/dri/renderD128" addwrite "/dev/char/" fi - if use X; then - xdg_environment_reset + if ! has_version "media-libs/openusd"; then + CMAKE_SKIP_TESTS+=( + # from pxr import Usd # ModuleNotFoundError: No module named 'pxr' + "^script_bundled_modules$" + ) fi - addwrite /dev/dri + # For debugging, print out all information. + local -x VERBOSE="$(usex debug "true" "false")" - cmake_src_test + # Show the window in the foreground. + local -x USE_WINDOW="false" + local -x USE_DEBUG="false" + + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + if [[ "${USE_WINDOW}" = "true" ]] && + [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && + use experimental && use wayland; then + # This runs weston + xdg_environment_reset + fi + + if [[ "${USE_WINDOW}" == "true" ]]; then + xdg_environment_reset + # WITH_GPU_RENDER_TESTS_HEADED + if use wayland; then + local compositor exit_code + local logfile=${T}/weston.log + weston --xwayland --backend=headless --socket=wayland-5 --idle-time=0 2>"${logfile}" & + compositor=$! + local -x WAYLAND_DISPLAY=wayland-5 + sleep 1 # wait for xwayland to be up + local -x DISPLAY="$(grep "xserver listening on display" "${logfile}" | cut -d ' ' -f 5)" + + cmake_src_test + + exit_code=$? + kill "${compositor}" + elif use X; then + virtx cmake_src_test + fi + fi + else + cmake_src_test + fi # Clean up the image directory for src_install rm -fr "${T}/usr" || die @@ -510,22 +700,20 @@ src_install() { cmake_src_install + # X-KDE-RunOnDiscreteGpu is obsolete, so trim it + sed \ + -e "/X-KDE-RunOnDiscreteGpu.*/d" \ + -i "${ED}/usr/share/applications/blender-${BV}.desktop" || die + if use man; then # Slot the man page mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die fi if use doc; then - # By default, blender will look for system scripts and data in - # /usr/share/, but until this is installed, they are not necessarily - # available there. Use this to have blender search the intermediate - # install directory instead. - export BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" - - # Brake check: Make sure the above path is valid. - # If not, blender will fallback to the default path which is not what - # we want. - [ -d "$BLENDER_SYSTEM_RESOURCES" ] || die "The custom script path is invalid, fix the ebuild!" + # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" # Workaround for binary drivers. addpredict /dev/ati @@ -551,6 +739,11 @@ src_install() { dodoc -r "${CMAKE_USE_DIR}"/doc/doxygen/html/. fi + if [[ "${PV}" != *9999* ]]; then + insinto "/usr/share/blender/${BV}/datafiles/assets" + doins -r "${WORKDIR}/blender-assets/publish/"* + fi + # Fix doc installdir docinto html dodoc "${CMAKE_USE_DIR}"/release/text/readme.html @@ -558,8 +751,9 @@ src_install() { python_optimize "${ED}/usr/share/blender/${BV}/scripts" - mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" || die - mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die + mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" \ + || die "blender-thumbnailer version rename failed" + mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die "blender version rename failed" } pkg_postinst() { @@ -573,7 +767,7 @@ pkg_postinst() { elog "changing the 'Temporary Files' directory in Blender preferences." elog - if use osl; then + if use osl && ! has_version "media-libs/mesa[${LLVM_USEDEP}]"; then ewarn "" ewarn "OSL is know to cause runtime segfaults if Mesa has been linked to" ewarn "an other LLVM version than what OSL is linked to." @@ -581,11 +775,12 @@ pkg_postinst() { ewarn "" fi + # NOTE build_files/cmake/Modules/FindPythonLibsUnix.cmake: set(_PYTHON_VERSION_SUPPORTED 3.11) if ! use python_single_target_python3_11; then elog "You are building Blender with a newer python version than" elog "supported by this version upstream." elog "If you experience breakages with e.g. plugins, please switch to" - elog "python_single_target_python3_11 instead." + elog "PYTHON_SINGLE_TARGET: python3_11 instead." elog "Bug: https://bugs.gentoo.org/737388" elog fi @@ -600,9 +795,12 @@ pkg_postrm() { xdg_mimeinfo_database_update xdg_desktop_database_update - ewarn "" - ewarn "You may want to remove the following directory." - ewarn "~/.config/${PN}/${BV}/cache/" - ewarn "It may contain extra render kernels not tracked by portage" - ewarn "" + if [[ -z "${REPLACED_BY_VERSION}" ]]; then + ewarn + ewarn "You may want to remove the following directories" + ewarn "- ~/.config/${PN}/${BV}/cache/" + ewarn "- ~/.cache/cycles/" + ewarn "It may contain extra render kernels not tracked by portage" + ewarn + fi } diff --git a/media-gfx/blender/blender-4.4.1-r1.ebuild b/media-gfx/blender/blender-4.4.1-r1.ebuild new file mode 100644 index 000000000000..c26db7f532a1 --- /dev/null +++ b/media-gfx/blender/blender-4.4.1-r1.ebuild @@ -0,0 +1,841 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# shellcheck disable=SC2207 + +# TODO +# - Package Hydra +# https://github.com/Ray-Tracing-Systems/HydraCore +# https://github.com/Ray-Tracing-Systems/HydraAPI +# - Package USD +# https://github.com/PixarAnimationStudios/OpenUSD +# - Package MaterialX +# https://github.com/AcademySoftwareFoundation/MaterialX +# - Package Draco +# https://github.com/google/draco +# - Package Audaspace +# https://github.com/neXyon/audaspace + +EAPI=8 + +PYTHON_COMPAT=( python3_{11..13} ) +# NOTE must match media-libs/osl +LLVM_COMPAT=( {18..19} ) +LLVM_OPTIONAL=1 + +ROCM_SKIP_GLOBALS=1 + +inherit cuda rocm llvm-r1 +inherit eapi9-pipestatus check-reqs flag-o-matic pax-utils python-single-r1 toolchain-funcs virtualx +inherit cmake xdg-utils + +DESCRIPTION="3D Creation/Animation/Publishing System" +HOMEPAGE="https://www.blender.org" + +# NOTE BLENDER_VERSION +# https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenkernel/BKE_blender_version.h +BLENDER_BRANCH="$(ver_cut 1-2)" + +if [[ "${PV}" == *9999* ]]; then + EGIT_LFS="yes" + inherit git-r3 + EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" + EGIT_SUBMODULES=( '*' '-lib/*' ) + + if [[ "${PV}" == 9999* ]]; then + EGIT_BRANCH="main" + else + EGIT_BRANCH="blender-v${BLENDER_BRANCH}-release" + fi + + RESTRICT="!test? ( test )" +else + SRC_URI=" + https://download.blender.org/source/${P}.tar.xz + " + # BUG upstream returns LFS references instead of files + # SRC_URI+=" + # test? ( + # https://projects.blender.org/blender/blender-test-data/archive/blender-v${BLENDER_BRANCH}-release.tar.gz + # ) + # " + KEYWORDS="~amd64 ~arm ~arm64" + RESTRICT="test" # the test archive contains LFS references +fi + +# assets is CC0-1.0 +LICENSE="GPL-3+ cycles? ( Apache-2.0 ) CC0-1.0" +SLOT="${BLENDER_BRANCH}" + +# NOTE +openpgl breaks on very old amd64 hardware +# potentially mirror cpu_flags_x86 + REQUIRED_USE +IUSE=" + alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels + debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack + jemalloc jpeg2k man +nanovdb ndof nls +oidn openal +openexr +opengl +openmp +openpgl + +opensubdiv +openvdb optix osl pipewire +pdf +potrace +pugixml pulseaudio + renderdoc sdl +sndfile +tbb test +tiff +truetype valgrind vulkan wayland +webp X +" + +if [[ "${PV}" == *9999* ]]; then + IUSE+="experimental" +fi + +REQUIRED_USE="${PYTHON_REQUIRED_USE} + || ( opengl vulkan ) + alembic? ( openexr ) + cuda? ( cycles ) + cycles? ( openexr tiff tbb ) + fluid? ( tbb ) + gnome? ( wayland ) + hip? ( cycles ) + nanovdb? ( openvdb ) + openvdb? ( tbb openexr ) + optix? ( cuda ) + osl? ( cycles pugixml ) + test? ( + color-management + jpeg2k + ) +" + +# Library versions for official builds can be found in the blender source directory in: +# build_files/build_environment/cmake/versions.cmake +RDEPEND="${PYTHON_DEPS} + app-arch/zstd + dev-cpp/gflags:= + dev-cpp/glog:= + dev-libs/boost:=[nls?] + dev-libs/lzo:2= + $(python_gen_cond_dep ' + dev-python/cython[${PYTHON_USEDEP}] + dev-python/numpy[${PYTHON_USEDEP}] + dev-python/zstandard[${PYTHON_USEDEP}] + dev-python/requests[${PYTHON_USEDEP}] + ') + media-libs/freetype:=[brotli] + media-libs/libepoxy:= + media-libs/libjpeg-turbo:= + media-libs/libpng:= + media-libs/libsamplerate + >=media-libs/openimageio-2.5.6.0:= + sys-libs/zlib:= + virtual/glu + virtual/libintl + virtual/opengl[X?] + alembic? ( >=media-gfx/alembic-1.8.3-r2[boost(+),hdf(+)] ) + bullet? ( sci-physics/bullet:=[double-precision] ) + collada? ( >=media-libs/opencollada-1.6.68 ) + color-management? ( media-libs/opencolorio:= ) + cuda? ( dev-util/nvidia-cuda-toolkit:= ) + embree? ( media-libs/embree:=[raymask] ) + ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) + fftw? ( sci-libs/fftw:3.0=[threads] ) + gmp? ( dev-libs/gmp[cxx] ) + gnome? ( gui-libs/libdecor ) + hip? ( + >=dev-util/hip-5.7:= + ) + jack? ( virtual/jack ) + jemalloc? ( dev-libs/jemalloc:= ) + jpeg2k? ( media-libs/openjpeg:2= ) + ndof? ( + app-misc/spacenavd + dev-libs/libspnav + ) + nls? ( virtual/libiconv ) + openal? ( media-libs/openal ) + oidn? ( >=media-libs/oidn-2.1.0 ) + openexr? ( + >=dev-libs/imath-3.1.7:= + >=media-libs/openexr-3.2.1:0= + ) + openpgl? ( media-libs/openpgl:= ) + opensubdiv? ( >=media-libs/opensubdiv-3.6.0-r2[opengl,cuda?,openmp?,tbb?] ) + openvdb? ( + >=media-gfx/openvdb-11.0.0:=[nanovdb?] + dev-libs/c-blosc:= + ) + optix? ( <dev-libs/optix-9:= ) + osl? ( + >=media-libs/osl-1.13:=[${LLVM_USEDEP}] + media-libs/mesa[${LLVM_USEDEP}] + ) + pdf? ( media-libs/libharu ) + potrace? ( media-gfx/potrace ) + pugixml? ( dev-libs/pugixml ) + pulseaudio? ( media-libs/libpulse ) + sdl? ( media-libs/libsdl2[sound,joystick] ) + sndfile? ( media-libs/libsndfile ) + tbb? ( dev-cpp/tbb:= ) + tiff? ( media-libs/tiff:= ) + valgrind? ( dev-debug/valgrind ) + wayland? ( + >=dev-libs/wayland-1.12 + >=dev-libs/wayland-protocols-1.15 + >=x11-libs/libxkbcommon-0.2.0 + dev-util/wayland-scanner + media-libs/mesa[wayland] + sys-apps/dbus + ) + vulkan? ( + media-libs/shaderc + dev-util/spirv-tools + dev-util/glslang + media-libs/vulkan-loader + ) + truetype? ( + media-libs/harfbuzz + ) + renderdoc? ( + media-gfx/renderdoc + ) + X? ( + x11-libs/libX11 + x11-libs/libXi + x11-libs/libXxf86vm + ) +" + +DEPEND="${RDEPEND} + dev-cpp/eigen:= +" + +if [[ "${PV}" == *9999* ]]; then +DEPEND+=" + test? ( + experimental? ( + wayland? ( + dev-libs/weston + ) + ) + ) +" +fi + +BDEPEND=" + virtual/pkgconfig + doc? ( + app-text/doxygen[dot] + dev-python/sphinx[latex] + dev-texlive/texlive-bibtexextra + dev-texlive/texlive-fontsextra + dev-texlive/texlive-fontutils + dev-texlive/texlive-latex + dev-texlive/texlive-latexextra + ) + vulkan? ( + dev-util/spirv-headers + dev-util/vulkan-headers + ) + nls? ( sys-devel/gettext ) + wayland? ( + dev-util/wayland-scanner + ) + X? ( + x11-base/xorg-proto + ) +" + +PATCHES=( + "${FILESDIR}/${PN}-4.0.2-FindClang.patch" + "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" + "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.3.2-system-glog.patch" + "${FILESDIR}/${PN}-4.4.0-optix-compile-flags.patch" +) + +blender_check_requirements() { + [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp + + if use doc; then + CHECKREQS_DISK_BUILD="4G" check-reqs_pkg_pretend + fi +} + +blender_get_version() { + if [[ -n "${BV}" && -n "${BVC}" ]]; then + return + fi + + local status + # Get blender version from blender itself. + # mirrors build_files/cmake/macros.cmake function(get_blender_version) + # NOTE maps x0y to x.y + # TODO this can potentially break for x > 9 and y > 9 + BV="$(grep "define BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION, (PIPESTATUS: ${status})" + BV="$(printf "%d.%d" "${BV:0: -2}" "${BV: -2}")" + + if [[ "${PV}" != 9999* && "${BLENDER_BRANCH}" != "${BV}" ]]; then + eerror "ebuild (${BLENDER_BRANCH}) and code (${BV}) version mismatch" + die "blender_get_version" + fi + + BVC="$(grep "define BLENDER_VERSION_CYCLE " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION_CYCLE, (PIPESTATUS: ${status})" +} + +pkg_pretend() { + blender_check_requirements +} + +pkg_setup() { + blender_check_requirements + python-single-r1_pkg_setup + + if use osl; then + llvm-r1_pkg_setup + fi +} + +src_unpack() { + if [[ "${PV}" == *9999* ]]; then + if ! use test; then + EGIT_SUBMODULES+=( '-tests/*' ) + fi + git-r3_src_unpack + else + default + + # BUG upstream returns LFS references instead of files + # if use test; then + # mkdir -p "${S}/tests/data/" || die + # mv blender-test-data/* "${S}/tests/data/" || die + # fi + fi +} + +src_prepare() { + use cuda && cuda_src_prepare + + cmake_src_prepare + + blender_get_version + + # Prepare icons and .desktop files for slotting. + sed \ + -e "s|blender.svg|blender-${BV}.svg|" \ + -e "s|blender-symbolic.svg|blender-${BV}-symbolic.svg|" \ + -e "s|blender.desktop|blender-${BV}.desktop|" \ + -e "s|org.blender.Blender.metainfo.xml|blender-${BV}.metainfo.xml|" \ + -i source/creator/CMakeLists.txt || die + + sed \ + -e "s|Name=Blender|Name=Blender ${BV}|" \ + -e "s|Exec=blender|Exec=blender-${BV}|" \ + -e "s|Icon=blender|Icon=blender-${BV}|" \ + -i release/freedesktop/blender.desktop || die + + sed \ + -e "/CMAKE_INSTALL_PREFIX_WITH_CONFIG/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i CMakeLists.txt \ + || die CMAKE_INSTALL_PREFIX_WITH_CONFIG + + mv \ + "release/freedesktop/icons/scalable/apps/blender.svg" \ + "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" \ + || die + mv \ + "release/freedesktop/icons/symbolic/apps/blender-symbolic.svg" \ + "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" \ + || die + mv \ + "release/freedesktop/blender.desktop" \ + "release/freedesktop/blender-${BV}.desktop" \ + || die + + mv \ + "release/freedesktop/org.blender.Blender.metainfo.xml" \ + "release/freedesktop/blender-${BV}.metainfo.xml" \ + || die + + sed \ + -e "s#\(set(cycles_kernel_runtime_lib_target_path \)\${cycles_kernel_runtime_lib_target_path}\(/lib)\)#\1\${CYCLES_INSTALL_PATH}\2#" \ + -i intern/cycles/kernel/CMakeLists.txt \ + || die + + if use hip; then + # fix hardcoded path + sed \ + -e "s#opt/rocm/hip/bin#$(hipconfig -p)/bin#g" \ + -i extern/hipew/src/hipew.c \ + || die + fi + + if use test; then + # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. + sed \ + -e "/string(REPLACE.*TEST_INSTALL_DIR/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i "build_files/cmake/testing.cmake" \ + || die "REPLACE.*TEST_INSTALL_DIR" + + # assertEquals was deprecated in Python-3.2 use assertEqual instead + sed \ + -e 's/assertEquals/assertEqual/g' \ + -i tests/python/bl_animation_action.py \ + || die + + sed -e '1i #include <cstdint>' -i extern/gtest/src/gtest-death-test.cc || die + else + cmake_comment_add_subdirectory tests + fi +} + +src_configure() { + # -Werror=odr, -Werror=lto-type-mismatch + # https://bugs.gentoo.org/859607 + # https://projects.blender.org/blender/blender/issues/120444 + filter-lto + + # Workaround for bug #922600 + append-ldflags "$(test-flags-CCLD -Wl,--undefined-version)" + + append-lfs-flags + blender_get_version + + local mycmakeargs=( + # we build a host-specific binary + -DWITH_CPU_CHECK="no" + + -DWITH_STRICT_BUILD_OPTIONS="yes" + -DWITH_LIBS_PRECOMPILED="no" + -DBUILD_SHARED_LIBS="no" # quadriflow only? + -DWITH_STATIC_LIBS=OFF + + # Build Options: + -DWITH_ALEMBIC="$(usex alembic)" + -DWITH_BOOST="yes" + -DWITH_BULLET="$(usex bullet)" + -DWITH_CYCLES="$(usex cycles)" + -DWITH_DOC_MANPAGE="$(usex man)" + -DWITH_FFTW3="$(usex fftw)" + -DWITH_GMP="$(usex gmp)" + -DWITH_GTESTS="$(usex test)" + -DWITH_HARFBUZZ="$(usex truetype)" + -DWITH_HARU="$(usex pdf)" + -DWITH_HEADLESS="$(usex !X "$(usex !wayland)")" + -DWITH_INPUT_NDOF="$(usex ndof)" + -DWITH_INTERNATIONAL="$(usex nls)" + -DWITH_MATERIALX="no" # TODO: Package MaterialX + -DWITH_NANOVDB="$(usex nanovdb)" + -DWITH_OPENCOLLADA="$(usex collada)" + -DWITH_OPENCOLORIO="$(usex color-management)" + -DWITH_OPENGL_BACKEND="$(usex opengl)" + -DWITH_OPENIMAGEDENOISE="$(usex oidn)" + -DWITH_OPENSUBDIV="$(usex opensubdiv)" + -DWITH_OPENVDB="$(usex openvdb)" + -DWITH_OPENVDB_BLOSC="$(usex openvdb)" + -DWITH_POTRACE="$(usex potrace)" + -DWITH_PUGIXML="$(usex pugixml)" + # -DWITH_QUADRIFLOW=ON + -DWITH_RENDERDOC="$(usex renderdoc)" + -DWITH_TBB="$(usex tbb)" + -DWITH_UNITY_BUILD="no" + -DWITH_USD="no" # TODO: Package USD + -DWITH_VULKAN_BACKEND="$(usex vulkan)" # experimental + -DWITH_XR_OPENXR="no" + + -DWITH_SYSTEM_BULLET="yes" + -DWITH_SYSTEM_EIGEN3="yes" + -DWITH_SYSTEM_FREETYPE="yes" + -DWITH_SYSTEM_GFLAGS="yes" + -DWITH_SYSTEM_GLOG="yes" + -DWITH_SYSTEM_LZO="yes" + + # Compiler Options: + # -DWITH_BUILDINFO="yes" + -DWITH_OPENMP="$(usex openmp)" + + # System Options: + -DWITH_INSTALL_PORTABLE="no" + -DWITH_MEM_JEMALLOC="$(usex jemalloc)" + -DWITH_MEM_VALGRIND="$(usex valgrind)" + + # GHOST Options: + -DWITH_GHOST_WAYLAND="$(usex wayland)" + -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" + -DWITH_GHOST_WAYLAND_DYNLOAD="no" + -DWITH_GHOST_X11="$(usex X)" + # -DWITH_GHOST_XDND=ON + # -DWITH_X11_XF86VMODE=ON + # -DWITH_X11_XFIXES=ON + # -DWITH_X11_XINPUT=ON + # -DWITH_GHOST_WAYLAND_DYNLOAD # visible wayland? + # -DWITH_GHOST_WAYLAND_LIBDECOR # visible wayland? + + # Image Formats: + # -DWITH_IMAGE_CINEON=ON + -DWITH_IMAGE_OPENEXR="$(usex openexr)" + -DWITH_IMAGE_OPENJPEG="$(usex jpeg2k)" + -DWITH_IMAGE_WEBP="$(usex webp)" # unlisted + + # Audio: + # -DWITH_AUDASPACE=OFF + # -DWITH_SYSTEM_AUDASPACE=OFF + -DWITH_CODEC_FFMPEG="$(usex ffmpeg)" + -DWITH_CODEC_SNDFILE="$(usex sndfile)" + # -DWITH_COREAUDIO=OFF + -DWITH_JACK="$(usex jack)" + # -DWITH_JACK_DYNLOAD= + -DWITH_OPENAL="$(usex openal)" + -DWITH_PIPEWIRE="$(usex pipewire)" + # -DWITH_PIPEWIRE_DYNLOAD= + -DWITH_PULSEAUDIO="$(usex pulseaudio)" + # -DWITH_PULSEAUDIO_DYNLOAD= + -DWITH_SDL="$(usex sdl)" + # -DWITH_WASAPI=OFF + + # Python: + # -DWITH_PYTHON=ON + -DWITH_PYTHON_INSTALL="no" + # -DWITH_PYTHON_INSTALL_NUMPY="no" + # -DWITH_PYTHON_INSTALL_ZSTANDARD="no" + # -DWITH_PYTHON_MODULE="no" + # -DWITH_PYTHON_SAFETY= + -DWITH_PYTHON_SECURITY="yes" + -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" + -DPYTHON_LIBRARY="$(python_get_library_path)" + -DPYTHON_VERSION="${EPYTHON/python/}" + -DWITH_DRACO="no" # TODO: Package Draco + + # Modifiers: + -DWITH_MOD_FLUID="$(usex fluid)" + # -DWITH_MOD_REMESH=ON + -DWITH_MOD_OCEANSIM="$(usex fftw)" + + # Rendering: + -DWITH_HYDRA="no" # TODO: Package Hydra + + # Rendering (Cycles): + -DWITH_CYCLES_OSL="$(usex osl)" + -DWITH_CYCLES_EMBREE="$(usex embree)" + -DWITH_CYCLES_PATH_GUIDING="$(usex openpgl)" + + -DWITH_CYCLES_DEVICE_OPTIX="$(usex optix)" + -DWITH_CYCLES_DEVICE_CUDA="$(usex cuda)" + -DWITH_CYCLES_CUDA_BINARIES="$(usex cuda "$(usex cycles-bin-kernels)")" + + -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" + -DWITH_CYCLES_HIP_BINARIES="$(usex hip "$(usex cycles-bin-kernels)")" + -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra + + # -DWITH_CYCLES_STANDALONE=OFF + # -DWITH_CYCLES_STANDALONE_GUI=OFF + + -DWITH_BLENDER_THUMBNAILER="yes" + ) + + if has_version ">=dev-python/numpy-2"; then + mycmakeargs+=( + -DPYTHON_NUMPY_INCLUDE_DIRS="$(python_get_sitedir)/numpy/_core/include" + -DPYTHON_NUMPY_PATH="$(python_get_sitedir)/numpy/_core/include" + ) + fi + + # requires dev-vcs/git + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]]; then + mycmakeargs+=( + # -DWITH_BUILDINFO="no" + -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" + ) + else + mycmakeargs+=( + -DWITH_EXPERIMENTAL_FEATURES="no" + ) + fi + + if use cuda; then + # Ease compiling with required gcc similar to cuda_sanitize but for cmake + if use cycles-bin-kernels; then + local -x CUDAHOSTCXX="$(cuda_gccdir)" + local -x CUDAHOSTLD="$(tc-getCXX)" + + if [[ -n "${CUDAARCHS}" ]]; then + mycmakeargs+=( + -DCYCLES_CUDA_BINARIES_ARCH="$(echo "${CUDAARCHS}" | sed -e 's/^/sm_/g' -e 's/;/;sm_/g')" + ) + fi + fi + fi + + if use hip; then + # local -x HIP_PATH="$(hipconfig -p)" + mycmakeargs+=( + # -DROCM_PATH="$(hipconfig -R)" + -DHIP_ROOT_DIR="$(hipconfig -p)" + + -DHIP_HIPCC_FLAGS="-fcf-protection=none" + + # -DHIP_LINKER_EXECUTABLE="$(get_llvm_prefix)/bin/clang++" + -DCMAKE_HIP_LINK_EXECUTABLE="$(get_llvm_prefix)/bin/clang++" + + -DCYCLES_HIP_BINARIES_ARCH="$(get_amdgpu_flags)" + ) + fi + + if use optix; then + mycmakeargs+=( + -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + -DOPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + ) + fi + + if use wayland; then + mycmakeargs+=( + -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" + -DWITH_GHOST_WAYLAND_LIBDECOR="$(usex gnome)" + ) + fi + + # This is currently needed on arm64 to get the NEON SIMD wrapper to compile the code successfully + use arm64 && append-flags -flax-vector-conversions + + append-cflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + append-cxxflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + + if tc-is-gcc; then + # We disable these to respect the user's choice of linker. + mycmakeargs+=( + -DWITH_LINKER_GOLD="no" + ) + fi + + if tc-is-clang || use osl; then + mycmakeargs+=( + -DWITH_CLANG="yes" + -DWITH_LLVM="yes" + ) + fi + + if use test; then + local CYCLES_TEST_DEVICES=( "CPU" ) + if use cycles-bin-kernels; then + use cuda && CYCLES_TEST_DEVICES+=( "CUDA" ) + use optix && CYCLES_TEST_DEVICES+=( "OPTIX" ) + use hip && CYCLES_TEST_DEVICES+=( "HIP" ) + fi + mycmakeargs+=( + -DCMAKE_INSTALL_PREFIX_WITH_CONFIG="${T}/usr" + -DCYCLES_TEST_DEVICES="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" + ) + + # NOTE in lieu of a FEATURE/build_options + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + mycmakeargs+=( + -DWITH_CYCLES_TEST_OSL="$(usex osl)" + + -DWITH_GPU_BACKEND_TESTS="yes" + -DWITH_GPU_COMPOSITOR_TESTS="yes" + + -DWITH_GPU_DRAW_TESTS="yes" + + -DWITH_GPU_RENDER_TESTS="no" + -DWITH_GPU_RENDER_TESTS_HEADED="no" + -DWITH_GPU_RENDER_TESTS_SILENT="yes" + -DWITH_GPU_RENDER_TESTS_VULKAN="$(usex vulkan)" + + -DWITH_SYSTEM_PYTHON_TESTS="yes" + ) + + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && use experimental; then + mycmakeargs+=( + # Enable user-interface tests using a headless display server. + # Currently this depends on WITH_GHOST_WAYLAND and the weston compositor (Experimental) + -DWITH_UI_TESTS="$(usex wayland)" + -DWESTON_BIN="${ESYSROOT}/usr/bin/weston" + ) + fi + else + mycmakeargs+=( + -DWITH_GPU_RENDER_TESTS="no" + ) + fi + fi + + cmake_src_configure +} + +src_test() { + # A lot of tests need to have access to the installed data files. + # So install them into the image directory now. + DESTDIR="${T}" cmake_build install + + blender_get_version + # Define custom blender data/script file paths, or we won't be able to find them otherwise during testing. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${T%/}/usr/share/blender/${BV}" + + # Sanity check that the script and datafile path is valid. + # If they are not valid, blender will fallback to the default path which is not what we want. + [[ -d "${BLENDER_SYSTEM_RESOURCES}" ]] || die "The custom resources path is invalid, fix the ebuild!" + + # TODO only picks first card + addwrite "/dev/dri/card0" + addwrite "/dev/dri/renderD128" + addwrite "/dev/udmabuf" + + if use cuda; then + cuda_add_sandbox -w + addwrite "/dev/char/" + fi + + local -x CMAKE_SKIP_TESTS=( + "^script_pyapi_bpy_driver_secure_eval$" + "^cycles_image_colorspace_cpu$" + "^compositor_cpu_color$" + "^compositor_cpu_filter$" + ) + + if ! has_version "media-libs/openusd"; then + CMAKE_SKIP_TESTS+=( + # from pxr import Usd # ModuleNotFoundError: No module named 'pxr' + "^script_bundled_modules$" + ) + fi + + # For debugging, print out all information. + local -x VERBOSE="$(usex debug "true" "false")" + + # Show the window in the foreground. + local -x USE_WINDOW="false" + local -x USE_DEBUG="false" + + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + if [[ "${USE_WINDOW}" = "true" ]] && + [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && + use experimental && use wayland; then + # This runs weston + xdg_environment_reset + fi + + if [[ "${USE_WINDOW}" == "true" ]]; then + xdg_environment_reset + # WITH_GPU_RENDER_TESTS_HEADED + if use wayland; then + local compositor exit_code + local logfile=${T}/weston.log + weston --xwayland --backend=headless --socket=wayland-5 --idle-time=0 2>"${logfile}" & + compositor=$! + local -x WAYLAND_DISPLAY=wayland-5 + sleep 1 # wait for xwayland to be up + local -x DISPLAY="$(grep "xserver listening on display" "${logfile}" | cut -d ' ' -f 5)" + + cmake_src_test + + exit_code=$? + kill "${compositor}" + elif use X; then + virtx cmake_src_test + fi + fi + else + cmake_src_test + fi + + # Clean up the image directory for src_install + rm -fr "${T}/usr" || die +} + +src_install() { + blender_get_version + + # Pax mark blender for hardened support. + pax-mark m "${BUILD_DIR}/bin/blender" + + cmake_src_install + + if use man; then + # Slot the man page + mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die + fi + + if use doc; then + # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" + + # Workaround for binary drivers. # TODO + addpredict /dev/ati + addpredict /dev/dri + addpredict /dev/nvidiactl + + einfo "Generating Blender C/C++ API docs ..." + cd "${CMAKE_USE_DIR}/doc/doxygen" || die + doxygen -u Doxyfile || die + doxygen || die "doxygen failed to build API docs." + + cd "${CMAKE_USE_DIR}" || die + einfo "Generating (BPY) Blender Python API docs ..." + "${BUILD_DIR}"/bin/blender --background --python "doc/python_api/sphinx_doc_gen.py" -noaudio || die "sphinx failed." + + cd "${CMAKE_USE_DIR}/doc/python_api" || die + sphinx-build sphinx-in BPY_API || die "sphinx failed." + + docinto "html/API/python" + dodoc -r "${CMAKE_USE_DIR}/doc/python_api/BPY_API/" + + docinto "html/API/blender" + dodoc -r "${CMAKE_USE_DIR}/doc/doxygen/html/" + fi + + # Fix doc installdir + docinto html + dodoc "${CMAKE_USE_DIR}/release/text/readme.html" + rm -r "${ED}/usr/share/doc/blender" || die + + python_optimize "${ED}/usr/share/blender/${BV}/scripts" + + mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" \ + || die "blender-thumbnailer version rename failed" + mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die "blender version rename failed" +} + +pkg_postinst() { + elog + elog "Blender uses python integration. As such, may have some" + elog "inherent risks with running unknown python scripts." + elog + elog "It is recommended to change your blender temp directory" + elog "from /tmp to /home/user/tmp or another tmp file under your" + elog "home directory. This can be done by starting blender, then" + elog "changing the 'Temporary Files' directory in Blender preferences." + elog + + if use osl && ! has_version "media-libs/mesa[${LLVM_USEDEP}]"; then + ewarn "" + ewarn "OSL is know to cause runtime segfaults if Mesa has been linked to" + ewarn "an other LLVM version than what OSL is linked to." + ewarn "See https://bugs.gentoo.org/880671 for more details" + ewarn "" + fi + + # NOTE build_files/cmake/Modules/FindPythonLibsUnix.cmake: set(_PYTHON_VERSION_SUPPORTED 3.11) + if ! use python_single_target_python3_11; then + elog "You are building Blender with a newer python version than" + elog "supported by this version upstream." + elog "If you experience breakages with e.g. plugins, please switch to" + elog "PYTHON_SINGLE_TARGET: python3_11 instead." + elog "Bug: https://bugs.gentoo.org/737388" + elog + fi + + xdg_icon_cache_update + xdg_mimeinfo_database_update + xdg_desktop_database_update +} + +pkg_postrm() { + xdg_icon_cache_update + xdg_mimeinfo_database_update + xdg_desktop_database_update + + if [[ -z "${REPLACED_BY_VERSION}" ]]; then + ewarn + ewarn "You may want to remove the following directories" + ewarn "- ~/.config/${PN}/${BV}/cache/" + ewarn "- ~/.cache/cycles/" + ewarn "It may contain extra render kernels not tracked by portage" + ewarn + fi +} diff --git a/media-gfx/blender/blender-4.4.3.ebuild b/media-gfx/blender/blender-4.4.3.ebuild new file mode 100644 index 000000000000..b2666c272501 --- /dev/null +++ b/media-gfx/blender/blender-4.4.3.ebuild @@ -0,0 +1,886 @@ +# Copyright 1999-2025 Gentoo Authors +# Distributed under the terms of the GNU General Public License v2 + +# shellcheck disable=SC2207 + +# TODO +# - Package Hydra +# https://github.com/Ray-Tracing-Systems/HydraCore +# https://github.com/Ray-Tracing-Systems/HydraAPI +# - Package USD +# https://github.com/PixarAnimationStudios/OpenUSD +# - Package MaterialX +# https://github.com/AcademySoftwareFoundation/MaterialX +# - Package Draco +# https://github.com/google/draco +# - Package Audaspace +# https://github.com/neXyon/audaspace + +EAPI=8 + +PYTHON_COMPAT=( python3_{11..13} ) +# NOTE must match media-libs/osl +LLVM_COMPAT=( {18..19} ) +LLVM_OPTIONAL=1 + +ROCM_SKIP_GLOBALS=1 + +inherit cuda rocm llvm-r1 +inherit eapi9-pipestatus check-reqs flag-o-matic pax-utils python-single-r1 toolchain-funcs virtualx +inherit cmake xdg-utils + +DESCRIPTION="3D Creation/Animation/Publishing System" +HOMEPAGE="https://www.blender.org" + +# NOTE BLENDER_VERSION +# https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenkernel/BKE_blender_version.h +BLENDER_BRANCH="$(ver_cut 1-2)" + +if [[ "${PV}" == *9999* ]]; then + EGIT_LFS="yes" + inherit git-r3 + EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" + EGIT_SUBMODULES=( '*' '-lib/*' ) + + if [[ "${PV}" == 9999* ]]; then + EGIT_BRANCH="main" + else + EGIT_BRANCH="blender-v${BLENDER_BRANCH}-release" + fi + +else + SRC_URI=" + https://download.blender.org/source/${P}.tar.xz + test? ( + https://download.blender.org/source/blender-test-data-${BLENDER_BRANCH}.0.tar.xz + ) + " + KEYWORDS="amd64 ~arm ~arm64" +fi + +# assets is CC0-1.0 +LICENSE="GPL-3+ cycles? ( Apache-2.0 ) CC0-1.0" +SLOT="${BLENDER_BRANCH}" + +# NOTE +openpgl breaks on very old amd64 hardware +# potentially mirror cpu_flags_x86 + REQUIRED_USE +IUSE=" + alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels + debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack + jemalloc jpeg2k man +nanovdb ndof nls +oidn openal +openexr +opengl +openmp +openpgl + +opensubdiv +openvdb optix osl pipewire +pdf +potrace +pugixml pulseaudio + renderdoc sdl +sndfile +tbb test +tiff +truetype valgrind vulkan wayland +webp X +" + +if [[ "${PV}" == *9999* ]]; then + IUSE+="experimental" +fi + +RESTRICT="!test? ( test )" + +REQUIRED_USE="${PYTHON_REQUIRED_USE} + || ( opengl vulkan ) + alembic? ( openexr ) + cuda? ( cycles ) + cycles? ( openexr tiff tbb ) + fluid? ( tbb ) + gnome? ( wayland ) + hip? ( cycles ) + nanovdb? ( openvdb ) + openvdb? ( tbb openexr ) + optix? ( cuda ) + osl? ( cycles pugixml ) + test? ( + color-management + jpeg2k + ) +" + +# Library versions for official builds can be found in the blender source directory in: +# build_files/build_environment/cmake/versions.cmake +RDEPEND="${PYTHON_DEPS} + app-arch/zstd + dev-cpp/gflags:= + dev-cpp/glog:= + dev-libs/boost:=[nls?] + dev-libs/lzo:2= + $(python_gen_cond_dep ' + dev-python/cython[${PYTHON_USEDEP}] + dev-python/numpy[${PYTHON_USEDEP}] + dev-python/zstandard[${PYTHON_USEDEP}] + dev-python/requests[${PYTHON_USEDEP}] + ') + media-libs/freetype:=[brotli] + media-libs/libepoxy:= + media-libs/libjpeg-turbo:= + media-libs/libpng:= + media-libs/libsamplerate + >=media-libs/openimageio-2.5.6.0:= + sys-libs/zlib:= + virtual/glu + virtual/libintl + virtual/opengl[X?] + alembic? ( >=media-gfx/alembic-1.8.3-r2[boost(+),hdf(+)] ) + bullet? ( sci-physics/bullet:=[double-precision] ) + collada? ( >=media-libs/opencollada-1.6.68 ) + color-management? ( media-libs/opencolorio:= ) + cuda? ( dev-util/nvidia-cuda-toolkit:= ) + embree? ( media-libs/embree:=[raymask] ) + ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) + fftw? ( sci-libs/fftw:3.0=[threads] ) + gmp? ( dev-libs/gmp[cxx] ) + gnome? ( gui-libs/libdecor ) + hip? ( + >=dev-util/hip-5.7:= + ) + jack? ( virtual/jack ) + jemalloc? ( dev-libs/jemalloc:= ) + jpeg2k? ( media-libs/openjpeg:2= ) + ndof? ( + app-misc/spacenavd + dev-libs/libspnav + ) + nls? ( virtual/libiconv ) + openal? ( media-libs/openal ) + oidn? ( >=media-libs/oidn-2.1.0 ) + openexr? ( + >=dev-libs/imath-3.1.7:= + >=media-libs/openexr-3.2.1:0= + ) + openpgl? ( media-libs/openpgl:= ) + opensubdiv? ( >=media-libs/opensubdiv-3.6.0-r2[opengl,cuda?,openmp?,tbb?] ) + openvdb? ( + >=media-gfx/openvdb-11.0.0:=[nanovdb?] + dev-libs/c-blosc:= + ) + optix? ( <dev-libs/optix-9:= ) + osl? ( + >=media-libs/osl-1.13:=[${LLVM_USEDEP}] + media-libs/mesa[${LLVM_USEDEP}] + ) + pdf? ( media-libs/libharu ) + potrace? ( media-gfx/potrace ) + pugixml? ( dev-libs/pugixml ) + pulseaudio? ( media-libs/libpulse ) + sdl? ( media-libs/libsdl2[sound,joystick] ) + sndfile? ( media-libs/libsndfile ) + tbb? ( dev-cpp/tbb:= ) + tiff? ( media-libs/tiff:= ) + valgrind? ( dev-debug/valgrind ) + wayland? ( + >=dev-libs/wayland-1.12 + >=dev-libs/wayland-protocols-1.15 + >=x11-libs/libxkbcommon-0.2.0 + dev-util/wayland-scanner + media-libs/mesa[wayland] + sys-apps/dbus + ) + vulkan? ( + media-libs/shaderc + dev-util/spirv-tools + dev-util/glslang + media-libs/vulkan-loader + ) + truetype? ( + media-libs/harfbuzz + ) + renderdoc? ( + media-gfx/renderdoc + ) + X? ( + x11-libs/libX11 + x11-libs/libXi + x11-libs/libXxf86vm + ) +" + +DEPEND="${RDEPEND} + dev-cpp/eigen:= +" + +if [[ "${PV}" == *9999* ]]; then +DEPEND+=" + test? ( + experimental? ( + wayland? ( + dev-libs/weston + ) + ) + ) +" +fi + +BDEPEND=" + virtual/pkgconfig + doc? ( + app-text/doxygen[dot] + dev-python/sphinx[latex] + dev-texlive/texlive-bibtexextra + dev-texlive/texlive-fontsextra + dev-texlive/texlive-fontutils + dev-texlive/texlive-latex + dev-texlive/texlive-latexextra + ) + vulkan? ( + dev-util/spirv-headers + dev-util/vulkan-headers + ) + nls? ( sys-devel/gettext ) + wayland? ( + dev-util/wayland-scanner + ) + X? ( + x11-base/xorg-proto + ) +" + +PATCHES=( + "${FILESDIR}/${PN}-4.0.2-FindClang.patch" + "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" + "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.3.2-system-glog.patch" + "${FILESDIR}/${PN}-4.4.0-optix-compile-flags.patch" +) + +blender_check_requirements() { + [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp + + if use doc; then + CHECKREQS_DISK_BUILD="4G" check-reqs_pkg_pretend + fi +} + +blender_get_version() { + if [[ -n "${BV}" && -n "${BVC}" ]]; then + return + fi + + local status + # Get blender version from blender itself. + # mirrors build_files/cmake/macros.cmake function(get_blender_version) + # NOTE maps x0y to x.y + # TODO this can potentially break for x > 9 and y > 9 + BV="$(grep "define BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION, (PIPESTATUS: ${status})" + BV="$(printf "%d.%d" "${BV:0: -2}" "${BV: -2}")" + + if [[ "${PV}" != 9999* && "${BLENDER_BRANCH}" != "${BV}" ]]; then + eerror "ebuild (${BLENDER_BRANCH}) and code (${BV}) version mismatch" + die "blender_get_version" + fi + + BVC="$(grep "define BLENDER_VERSION_CYCLE " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION_CYCLE, (PIPESTATUS: ${status})" +} + +pkg_pretend() { + blender_check_requirements +} + +pkg_setup() { + blender_check_requirements + python-single-r1_pkg_setup + + if use osl; then + llvm-r1_pkg_setup + fi +} + +src_unpack() { + if [[ "${PV}" == *9999* ]]; then + if ! use test; then + EGIT_SUBMODULES+=( '-tests/*' ) + fi + git-r3_src_unpack + else + default + + # TODO + if use test && [[ ${PV} != ${SLOT}.0 ]] ; then + mv "blender-${BLENDER_BRANCH}.0/tests/"* "${S}/tests" || die + fi + fi +} + +src_prepare() { + use cuda && cuda_src_prepare + + cmake_src_prepare + + blender_get_version + + # Prepare icons and .desktop files for slotting. + sed \ + -e "s|blender.svg|blender-${BV}.svg|" \ + -e "s|blender-symbolic.svg|blender-${BV}-symbolic.svg|" \ + -e "s|blender.desktop|blender-${BV}.desktop|" \ + -e "s|org.blender.Blender.metainfo.xml|blender-${BV}.metainfo.xml|" \ + -i source/creator/CMakeLists.txt || die + + sed \ + -e "s|Name=Blender|Name=Blender ${BV}|" \ + -e "s|Exec=blender|Exec=blender-${BV}|" \ + -e "s|Icon=blender|Icon=blender-${BV}|" \ + -i release/freedesktop/blender.desktop || die + + sed \ + -e "/CMAKE_INSTALL_PREFIX_WITH_CONFIG/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i CMakeLists.txt \ + || die CMAKE_INSTALL_PREFIX_WITH_CONFIG + + # WITH_SYSTEM_GLOG=yes + cmake_run_in extern cmake_comment_add_subdirectory glog + + mv \ + "release/freedesktop/icons/scalable/apps/blender.svg" \ + "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" \ + || die + mv \ + "release/freedesktop/icons/symbolic/apps/blender-symbolic.svg" \ + "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" \ + || die + mv \ + "release/freedesktop/blender.desktop" \ + "release/freedesktop/blender-${BV}.desktop" \ + || die + + mv \ + "release/freedesktop/org.blender.Blender.metainfo.xml" \ + "release/freedesktop/blender-${BV}.metainfo.xml" \ + || die + + sed \ + -e "s#\(set(cycles_kernel_runtime_lib_target_path \)\${cycles_kernel_runtime_lib_target_path}\(/lib)\)#\1\${CYCLES_INSTALL_PATH}\2#" \ + -i intern/cycles/kernel/CMakeLists.txt \ + || die + + if use hip; then + # fix hardcoded path + sed \ + -e "s#opt/rocm/hip/bin#$(hipconfig -p)/bin#g" \ + -i extern/hipew/src/hipew.c \ + || die + fi + + if use test; then + # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. + sed \ + -e "/string(REPLACE.*TEST_INSTALL_DIR/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i "build_files/cmake/testing.cmake" \ + || die "REPLACE.*TEST_INSTALL_DIR" + + # assertEquals was deprecated in Python-3.2 use assertEqual instead + sed \ + -e 's/assertEquals/assertEqual/g' \ + -i tests/python/bl_animation_action.py \ + || die + + sed -e '1i #include <cstdint>' -i extern/gtest/src/gtest-death-test.cc || die + else + cmake_comment_add_subdirectory tests + fi + + rm -rf extern/gflags || die +} + +src_configure() { + # -Werror=odr, -Werror=lto-type-mismatch + # https://bugs.gentoo.org/859607 + # https://projects.blender.org/blender/blender/issues/120444 + filter-lto + + # Workaround for bug #922600 + append-ldflags "$(test-flags-CCLD -Wl,--undefined-version)" + + append-lfs-flags + blender_get_version + + local mycmakeargs=( + # we build a host-specific binary + -DWITH_CPU_CHECK="no" + + -DWITH_STRICT_BUILD_OPTIONS="yes" + -DWITH_LIBS_PRECOMPILED="no" + -DBUILD_SHARED_LIBS="no" # quadriflow only? + -DWITH_STATIC_LIBS=OFF + + # Build Options: + -DWITH_ALEMBIC="$(usex alembic)" + -DWITH_BOOST="yes" + -DWITH_BULLET="$(usex bullet)" + -DWITH_CYCLES="$(usex cycles)" + -DWITH_DOC_MANPAGE="$(usex man)" + -DWITH_FFTW3="$(usex fftw)" + -DWITH_GMP="$(usex gmp)" + -DWITH_GTESTS="$(usex test)" + -DWITH_HARFBUZZ="$(usex truetype)" + -DWITH_HARU="$(usex pdf)" + -DWITH_HEADLESS="$(usex !X "$(usex !wayland)")" + -DWITH_INPUT_NDOF="$(usex ndof)" + -DWITH_INTERNATIONAL="$(usex nls)" + -DWITH_MATERIALX="no" # TODO: Package MaterialX + -DWITH_NANOVDB="$(usex nanovdb)" + -DWITH_OPENCOLLADA="$(usex collada)" + -DWITH_OPENCOLORIO="$(usex color-management)" + -DWITH_OPENGL_BACKEND="$(usex opengl)" + -DWITH_OPENIMAGEDENOISE="$(usex oidn)" + -DWITH_OPENSUBDIV="$(usex opensubdiv)" + -DWITH_OPENVDB="$(usex openvdb)" + -DWITH_OPENVDB_BLOSC="$(usex openvdb)" + -DWITH_POTRACE="$(usex potrace)" + -DWITH_PUGIXML="$(usex pugixml)" + # -DWITH_QUADRIFLOW=ON + -DWITH_RENDERDOC="$(usex renderdoc)" + -DWITH_TBB="$(usex tbb)" + -DWITH_UNITY_BUILD="no" + -DWITH_USD="no" # TODO: Package USD + -DWITH_VULKAN_BACKEND="$(usex vulkan)" # experimental + -DWITH_XR_OPENXR="no" + + -DWITH_SYSTEM_BULLET="yes" + -DWITH_SYSTEM_EIGEN3="yes" + -DWITH_SYSTEM_FREETYPE="yes" + -DWITH_SYSTEM_GFLAGS="yes" + -DWITH_SYSTEM_GLOG="yes" + -DWITH_SYSTEM_LZO="yes" + + # Compiler Options: + # -DWITH_BUILDINFO="yes" + -DWITH_OPENMP="$(usex openmp)" + + # System Options: + -DWITH_INSTALL_PORTABLE="no" + -DWITH_MEM_JEMALLOC="$(usex jemalloc)" + -DWITH_MEM_VALGRIND="$(usex valgrind)" + + # GHOST Options: + -DWITH_GHOST_WAYLAND="$(usex wayland)" + # -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" + -DWITH_GHOST_WAYLAND_DYNLOAD="no" + -DWITH_GHOST_X11="$(usex X)" + # -DWITH_GHOST_XDND=ON + # -DWITH_X11_XF86VMODE=ON + # -DWITH_X11_XFIXES=ON + # -DWITH_X11_XINPUT=ON + # -DWITH_GHOST_WAYLAND_DYNLOAD # visible wayland? + # -DWITH_GHOST_WAYLAND_LIBDECOR # visible wayland? + + # Image Formats: + # -DWITH_IMAGE_CINEON=ON + -DWITH_IMAGE_OPENEXR="$(usex openexr)" + -DWITH_IMAGE_OPENJPEG="$(usex jpeg2k)" + -DWITH_IMAGE_WEBP="$(usex webp)" # unlisted + + # Audio: + # -DWITH_AUDASPACE=OFF + # -DWITH_SYSTEM_AUDASPACE=OFF + -DWITH_CODEC_FFMPEG="$(usex ffmpeg)" + -DWITH_CODEC_SNDFILE="$(usex sndfile)" + # -DWITH_COREAUDIO=OFF + -DWITH_JACK="$(usex jack)" + # -DWITH_JACK_DYNLOAD= + -DWITH_OPENAL="$(usex openal)" + -DWITH_PIPEWIRE="$(usex pipewire)" + # -DWITH_PIPEWIRE_DYNLOAD= + -DWITH_PULSEAUDIO="$(usex pulseaudio)" + # -DWITH_PULSEAUDIO_DYNLOAD= + -DWITH_SDL="$(usex sdl)" + # -DWITH_WASAPI=OFF + + # Python: + # -DWITH_PYTHON=ON + -DWITH_PYTHON_INSTALL="no" + -DWITH_PYTHON_INSTALL_NUMPY="no" + -DWITH_PYTHON_INSTALL_ZSTANDARD="no" + # -DWITH_PYTHON_MODULE="no" + -DWITH_PYTHON_SAFETY="OFF" + -DWITH_PYTHON_SECURITY="yes" + -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" + -DPYTHON_LIBRARY="$(python_get_library_path)" + -DPYTHON_VERSION="${EPYTHON/python/}" + -DWITH_DRACO="yes" # TODO: Package Draco # NOTE use bundled for now + + # Modifiers: + -DWITH_MOD_FLUID="$(usex fluid)" + # -DWITH_MOD_REMESH=ON + -DWITH_MOD_OCEANSIM="$(usex fftw)" + + # Rendering: + -DWITH_HYDRA="no" # TODO: Package Hydra + + # Rendering (Cycles): + -DWITH_CYCLES_OSL="$(usex osl)" + -DWITH_CYCLES_EMBREE="$(usex embree)" + -DWITH_CYCLES_PATH_GUIDING="$(usex openpgl)" + + -DWITH_CYCLES_DEVICE_OPTIX="$(usex optix)" + -DWITH_CYCLES_DEVICE_CUDA="$(usex cuda)" + -DWITH_CYCLES_CUDA_BINARIES="$(usex cuda "$(usex cycles-bin-kernels)")" + + -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" + -DWITH_CYCLES_HIP_BINARIES="$(usex hip "$(usex cycles-bin-kernels)")" + -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra + + # -DWITH_CYCLES_STANDALONE=OFF + # -DWITH_CYCLES_STANDALONE_GUI=OFF + + -DWITH_BLENDER_THUMBNAILER="yes" + ) + + if has_version ">=dev-python/numpy-2"; then + mycmakeargs+=( + -DPYTHON_NUMPY_INCLUDE_DIRS="$(python_get_sitedir)/numpy/_core/include" + -DPYTHON_NUMPY_PATH="$(python_get_sitedir)/numpy/_core/include" + ) + fi + + # requires dev-vcs/git + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]]; then + mycmakeargs+=( + # -DWITH_BUILDINFO="no" + -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" + ) + else + mycmakeargs+=( + -DWITH_EXPERIMENTAL_FEATURES="no" + ) + fi + + if use cuda; then + # Ease compiling with required gcc similar to cuda_sanitize but for cmake + if use cycles-bin-kernels; then + local -x CUDAHOSTCXX="$(cuda_gccdir)" + local -x CUDAHOSTLD="$(tc-getCXX)" + + if [[ -n "${CUDAARCHS}" ]]; then + mycmakeargs+=( + -DCYCLES_CUDA_BINARIES_ARCH="$(echo "${CUDAARCHS}" | sed -e 's/^/sm_/g' -e 's/;/;sm_/g')" + ) + fi + fi + fi + + if use hip; then + mycmakeargs+=( + -DHIP_ROOT_DIR="$(hipconfig -p)" + + -DHIP_HIPCC_FLAGS="-fcf-protection=none" + + -DCMAKE_HIP_LINK_EXECUTABLE="$(get_llvm_prefix)/bin/clang++" + + -DCYCLES_HIP_BINARIES_ARCH="$(get_amdgpu_flags)" + ) + fi + + if use optix; then + mycmakeargs+=( + -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + -DOPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + ) + fi + + if use wayland; then + mycmakeargs+=( + -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" + -DWITH_GHOST_WAYLAND_LIBDECOR="$(usex gnome)" + ) + fi + + # This is currently needed on arm64 to get the NEON SIMD wrapper to compile the code successfully + use arm64 && append-flags -flax-vector-conversions + + append-cflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + append-cxxflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + + if tc-is-gcc; then + # We disable these to respect the user's choice of linker. + mycmakeargs+=( + -DWITH_LINKER_GOLD="no" + ) + fi + + if tc-is-clang || use osl; then + mycmakeargs+=( + -DWITH_CLANG="yes" + -DWITH_LLVM="yes" + ) + fi + + if use test; then + local CYCLES_TEST_DEVICES=( "CPU" ) + if use cycles-bin-kernels; then + use cuda && CYCLES_TEST_DEVICES+=( "CUDA" ) + use optix && CYCLES_TEST_DEVICES+=( "OPTIX" ) + use hip && CYCLES_TEST_DEVICES+=( "HIP" ) + fi + mycmakeargs+=( + -DCMAKE_INSTALL_PREFIX_WITH_CONFIG="${T}/usr" + -DCYCLES_TEST_DEVICES="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" + ) + + # NOTE in lieu of a FEATURE/build_options + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + einfo "running expensive tests EXPENSIVE_TESTS=${EXPENSIVE_TESTS}" + mycmakeargs+=( + -DWITH_CYCLES_TEST_OSL="$(usex osl)" + + -DWITH_GPU_BACKEND_TESTS="yes" + -DWITH_GPU_COMPOSITOR_TESTS="yes" + + -DWITH_GPU_DRAW_TESTS="yes" + + -DWITH_GPU_RENDER_TESTS="no" + -DWITH_GPU_RENDER_TESTS_HEADED="no" + -DWITH_GPU_RENDER_TESTS_SILENT="yes" + -DWITH_GPU_RENDER_TESTS_VULKAN="$(usex vulkan)" + + -DWITH_SYSTEM_PYTHON_TESTS="yes" + -DTEST_SYSTEM_PYTHON_EXE="${PYTHON}" + ) + + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && use experimental; then + mycmakeargs+=( + # Enable user-interface tests using a headless display server. + # Currently this depends on WITH_GHOST_WAYLAND and the weston compositor (Experimental) + -DWITH_UI_TESTS="$(usex wayland)" + -DWESTON_BIN="${ESYSROOT}/usr/bin/weston" + ) + fi + else + mycmakeargs+=( + -DWITH_GPU_RENDER_TESTS="no" + ) + fi + fi + + cmake_src_configure +} + +src_test() { + # A lot of tests need to have access to the installed data files. + # So install them into the image directory now. + DESTDIR="${T}" cmake_build install + + blender_get_version + # Define custom blender data/script file paths, or we won't be able to find them otherwise during testing. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${T%/}/usr/share/blender/${BV}" + + # Sanity check that the script and datafile path is valid. + # If they are not valid, blender will fallback to the default path which is not what we want. + [[ -d "${BLENDER_SYSTEM_RESOURCES}" ]] || die "The custom resources path is invalid, fix the ebuild!" + + # TODO only picks first card + addwrite "/dev/dri/card0" + addwrite "/dev/dri/renderD128" + addwrite "/dev/udmabuf" + + if use cuda; then + cuda_add_sandbox -w + addwrite "/proc/self/task" + addpredict "/dev/char/" + fi + + local -x CMAKE_SKIP_TESTS=( + "^compositor_cpu_color$" + "^compositor_cpu_filter$" + "^cycles_image_colorspace_cpu$" + "^script_pyapi_bpy_driver_secure_eval$" + ) + + if [[ "${RUN_FAILING_TESTS:-0}" -eq 0 ]]; then + einfo "not running failing tests RUN_FAILING_TESTS=${RUN_FAILING_TESTS}" + CMAKE_SKIP_TESTS+=( + "^BLI$" + "^asset_system$" + "^cycles$" + "^cycles_bsdf_cpu$" + "^cycles_bsdf_cuda$" + "^cycles_bsdf_optix$" + "^cycles_displacement_cpu$" + "^cycles_displacement_cuda$" + "^cycles_displacement_optix$" + "^cycles_image_data_types_cpu$" + "^cycles_image_data_types_cuda$" + "^cycles_image_data_types_optix$" + "^cycles_osl_cpu$" + "^cycles_principled_bsdf_cpu$" + "^cycles_principled_bsdf_cuda$" + "^cycles_principled_bsdf_optix$" + "^cycles_shader_cpu$" + "^cycles_shader_cuda$" + "^cycles_shader_optix$" + "^ffmpeg_libs$" # needs H265 + "^imbuf_save$" # needs oiio with working webp + "^geo_node_curves_curve_to_points$" + "^geo_node_geometry_duplicate_elements_curve_points$" + ) + fi + + if ! has_version "media-libs/openusd"; then + CMAKE_SKIP_TESTS+=( + # from pxr import Usd # ModuleNotFoundError: No module named 'pxr' + "^script_bundled_modules$" + ) + fi + + if ! has_version "media-libs/openimageio[python]"; then + CMAKE_SKIP_TESTS+=( + # import OpenImageIO as oiio # ModuleNotFoundError: No module named 'OpenImageIO' + "^compositor_cpu_file_output$" + ) + fi + + # oiio can't find webp due to missing cmake files # 937031 + sed -e "s/ WEBP//g" -i "${BUILD_DIR}/tests/python/CTestTestfile.cmake" || die + + # For debugging, print out all information. + local -x VERBOSE="$(usex debug "true" "false")" + "${VERBOSE}" && einfo "VERBOSE=${VERBOSE}" + + # Show the window in the foreground. + # local -x USE_WINDOW="true" # non-zero + [[ -v USE_WINDOW ]] && einfo "USE_WINDOW=${USE_WINDOW}" + + # local -x USE_DEBUG="true" # non-zero + [[ -v USE_DEBUG ]] && einfo "USE_DEBUG=${USE_DEBUG}" + + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + einfo "running expensive tests EXPENSIVE_TESTS=${EXPENSIVE_TESTS}" + # if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && + # use experimental && use wayland; then + # # This runs weston + # xdg_environment_reset + # fi + + xdg_environment_reset + # WITH_GPU_RENDER_TESTS_HEADED + if use wayland; then + local compositor exit_code + local logfile=${T}/weston.log + weston --xwayland --backend=headless --socket=wayland-5 --idle-time=0 2>"${logfile}" & + compositor=$! + local -x WAYLAND_DISPLAY=wayland-5 + sleep 1 # wait for xwayland to be up + # TODO use eapi9-pipestatus + local -x DISPLAY="$(grep "xserver listening on display" "${logfile}" | cut -d ' ' -f 5)" + + cmake_src_test + + exit_code=$? + kill "${compositor}" + elif use X; then + virtx cmake_src_test + else + cmake_src_test + fi + else + cmake_src_test + fi + + # Clean up the image directory for src_install + rm -fr "${T}/usr" || die +} + +src_install() { + blender_get_version + + # Pax mark blender for hardened support. + pax-mark m "${BUILD_DIR}/bin/blender" + + cmake_src_install + + if use man; then + # Slot the man page + mv "${ED}/usr/share/man/man1/blender.1" "${ED}/usr/share/man/man1/blender-${BV}.1" || die + fi + + if use doc; then + # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" + + # Workaround for binary drivers. # TODO + addpredict /dev/ati + addpredict /dev/dri + addpredict /dev/nvidiactl + + einfo "Generating Blender C/C++ API docs ..." + cd "${CMAKE_USE_DIR}/doc/doxygen" || die + doxygen -u Doxyfile || die + doxygen || die "doxygen failed to build API docs." + + cd "${CMAKE_USE_DIR}" || die + einfo "Generating (BPY) Blender Python API docs ..." + "${BUILD_DIR}"/bin/blender --background --python "doc/python_api/sphinx_doc_gen.py" -noaudio || die "sphinx failed." + + cd "${CMAKE_USE_DIR}/doc/python_api" || die + sphinx-build sphinx-in BPY_API || die "sphinx failed." + + docinto "html/API/python" + dodoc -r "${CMAKE_USE_DIR}/doc/python_api/BPY_API/" + + docinto "html/API/blender" + dodoc -r "${CMAKE_USE_DIR}/doc/doxygen/html/" + fi + + # Fix doc installdir + docinto html + dodoc "${CMAKE_USE_DIR}/release/text/readme.html" + rm -r "${ED}/usr/share/doc/blender" || die + + python_optimize "${ED}/usr/share/blender/${BV}/scripts" + + mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" \ + || die "blender-thumbnailer version rename failed" + mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die "blender version rename failed" +} + +pkg_postinst() { + elog + elog "Blender uses python integration. As such, may have some" + elog "inherent risks with running unknown python scripts." + elog + elog "It is recommended to change your blender temp directory" + elog "from /tmp to /home/user/tmp or another tmp file under your" + elog "home directory. This can be done by starting blender, then" + elog "changing the 'Temporary Files' directory in Blender preferences." + elog + + if use osl && ! has_version "media-libs/mesa[${LLVM_USEDEP}]"; then + ewarn "" + ewarn "OSL is know to cause runtime segfaults if Mesa has been linked to" + ewarn "an other LLVM version than what OSL is linked to." + ewarn "See https://bugs.gentoo.org/880671 for more details" + ewarn "" + fi + + # NOTE build_files/cmake/Modules/FindPythonLibsUnix.cmake: set(_PYTHON_VERSION_SUPPORTED 3.11) + if ! use python_single_target_python3_11; then + elog "You are building Blender with a newer python version than" + elog "supported by this version upstream." + elog "If you experience breakages with e.g. plugins, please switch to" + elog "PYTHON_SINGLE_TARGET: python3_11 instead." + elog "Bug: https://bugs.gentoo.org/737388" + elog + fi + + xdg_icon_cache_update + xdg_mimeinfo_database_update + xdg_desktop_database_update +} + +pkg_postrm() { + xdg_icon_cache_update + xdg_mimeinfo_database_update + xdg_desktop_database_update + + if [[ -z "${REPLACED_BY_VERSION}" ]]; then + ewarn + ewarn "You may want to remove the following directories" + ewarn "- ~/.config/${PN}/${BV}/cache/" + ewarn "- ~/.cache/cycles/" + ewarn "It may contain extra render kernels not tracked by portage" + ewarn + fi +} diff --git a/media-gfx/blender/blender-9999.ebuild b/media-gfx/blender/blender-9999.ebuild index 8cf95a7b4ed5..abd723cdd1e4 100644 --- a/media-gfx/blender/blender-9999.ebuild +++ b/media-gfx/blender/blender-9999.ebuild @@ -1,47 +1,85 @@ # Copyright 1999-2025 Gentoo Authors # Distributed under the terms of the GNU General Public License v2 +# shellcheck disable=SC2207 + +# TODO +# - Package Hydra +# https://github.com/Ray-Tracing-Systems/HydraCore +# https://github.com/Ray-Tracing-Systems/HydraAPI +# - Package USD +# https://github.com/PixarAnimationStudios/OpenUSD +# - Package MaterialX +# https://github.com/AcademySoftwareFoundation/MaterialX +# - Package Draco +# https://github.com/google/draco +# - Package Audaspace +# https://github.com/neXyon/audaspace + EAPI=8 -PYTHON_COMPAT=( python3_{11..12} ) +PYTHON_COMPAT=( python3_{11..13} ) # NOTE must match media-libs/osl -LLVM_COMPAT=( {15..18} ) +LLVM_COMPAT=( {18..19} ) LLVM_OPTIONAL=1 -inherit check-reqs cmake cuda flag-o-matic llvm-r1 pax-utils python-single-r1 toolchain-funcs xdg-utils +ROCM_SKIP_GLOBALS=1 + +inherit cuda rocm llvm-r1 +inherit eapi9-pipestatus check-reqs flag-o-matic pax-utils python-single-r1 toolchain-funcs virtualx +inherit cmake xdg-utils DESCRIPTION="3D Creation/Animation/Publishing System" HOMEPAGE="https://www.blender.org" -if [[ ${PV} = *9999* ]] ; then +# NOTE BLENDER_VERSION +# https://projects.blender.org/blender/blender/src/branch/main/source/blender/blenkernel/BKE_blender_version.h +BLENDER_BRANCH="$(ver_cut 1-2)" + +if [[ "${PV}" == *9999* ]]; then EGIT_LFS="yes" inherit git-r3 EGIT_REPO_URI="https://projects.blender.org/blender/blender.git" EGIT_SUBMODULES=( '*' '-lib/*' ) - RESTRICT="!test? ( test )" + + if [[ "${PV}" == 9999* ]]; then + EGIT_BRANCH="main" + else + EGIT_BRANCH="blender-v${BLENDER_BRANCH}-release" + fi + else SRC_URI=" https://download.blender.org/source/${P}.tar.xz + test? ( + https://download.blender.org/source/blender-test-data-${BLENDER_BRANCH}.0.tar.xz + ) " - # test? ( - # https://projects.blender.org/blender/blender-test-data/archive/blender-v$(ver_cut 1-2)-release.tar.gz - # ) - # " KEYWORDS="~amd64 ~arm ~arm64" - RESTRICT="test" # the test archive returns LFS references. fi -LICENSE="GPL-3+ cycles? ( Apache-2.0 )" -SLOT="${PV%.*}" +# assets is CC0-1.0 +LICENSE="GPL-3+ cycles? ( Apache-2.0 ) CC0-1.0" +SLOT="${BLENDER_BRANCH}" + +# NOTE +openpgl breaks on very old amd64 hardware +# potentially mirror cpu_flags_x86 + REQUIRED_USE IUSE=" alembic +bullet collada +color-management cuda +cycles +cycles-bin-kernels debug doc +embree +ffmpeg +fftw +fluid +gmp gnome hip jack - jemalloc jpeg2k man +nanovdb ndof nls +oidn oneapi openal +openexr +openmp +openpgl - +opensubdiv +openvdb optix osl +otf +pdf +potrace +pugixml pulseaudio - renderdoc sdl +sndfile +tbb test +tiff valgrind vulkan wayland +webp X + jemalloc jpeg2k man manifold +nanovdb ndof nls +oidn oneapi openal +openexr +opengl +openpgl + +opensubdiv +openvdb optix osl pipewire +pdf +potrace +pugixml pulseaudio + renderdoc sdl +sndfile +tbb test +tiff +truetype valgrind vulkan wayland +webp X " +if [[ "${PV}" == *9999* ]]; then + IUSE+="experimental" +fi + +RESTRICT="!test? ( test )" + REQUIRED_USE="${PYTHON_REQUIRED_USE} + || ( opengl vulkan ) alembic? ( openexr ) cuda? ( cycles ) cycles? ( openexr tiff tbb ) @@ -52,12 +90,18 @@ REQUIRED_USE="${PYTHON_REQUIRED_USE} openvdb? ( tbb openexr ) optix? ( cuda ) osl? ( cycles pugixml ) - test? ( color-management )" + test? ( + color-management + jpeg2k + ) +" # Library versions for official builds can be found in the blender source directory in: # build_files/build_environment/cmake/versions.cmake RDEPEND="${PYTHON_DEPS} app-arch/zstd + dev-cpp/gflags:= + dev-cpp/glog:= dev-libs/boost:=[nls?] dev-libs/lzo:2= $(python_gen_cond_dep ' @@ -75,20 +119,24 @@ RDEPEND="${PYTHON_DEPS} sys-libs/zlib:= virtual/glu virtual/libintl - virtual/opengl + virtual/opengl[X?] alembic? ( >=media-gfx/alembic-1.8.3-r2[boost(+),hdf(+)] ) + bullet? ( sci-physics/bullet:=[double-precision] ) collada? ( >=media-libs/opencollada-1.6.68 ) color-management? ( media-libs/opencolorio:= ) cuda? ( dev-util/nvidia-cuda-toolkit:= ) embree? ( media-libs/embree:=[raymask] ) ffmpeg? ( media-video/ffmpeg:=[encode(+),lame(-),jpeg2k?,opus,theora,vorbis,vpx,x264,xvid] ) - fftw? ( sci-libs/fftw:3.0= ) + fftw? ( sci-libs/fftw:3.0=[threads] ) gmp? ( dev-libs/gmp[cxx] ) gnome? ( gui-libs/libdecor ) - hip? ( >=dev-util/hip-5.7 ) + hip? ( + >=dev-util/hip-5.7:= + ) jack? ( virtual/jack ) jemalloc? ( dev-libs/jemalloc:= ) jpeg2k? ( media-libs/openjpeg:2= ) + manifold? ( >sci-mathematics/manifold-3.0.1 ) ndof? ( app-misc/spacenavd dev-libs/libspnav @@ -96,18 +144,18 @@ RDEPEND="${PYTHON_DEPS} nls? ( virtual/libiconv ) openal? ( media-libs/openal ) oidn? ( >=media-libs/oidn-2.1.0 ) - oneapi? ( dev-libs/intel-compute-runtime[l0] ) + oneapi? ( dev-libs/intel-compute-runtime:=[l0] ) openexr? ( >=dev-libs/imath-3.1.7:= >=media-libs/openexr-3.2.1:0= ) openpgl? ( media-libs/openpgl:= ) - opensubdiv? ( >=media-libs/opensubdiv-3.5.0 ) + opensubdiv? ( >=media-libs/opensubdiv-3.6.0-r2[opengl,cuda?,tbb?] ) openvdb? ( >=media-gfx/openvdb-11.0.0:=[nanovdb?] dev-libs/c-blosc:= ) - optix? ( dev-libs/optix ) + optix? ( <dev-libs/optix-9:= ) osl? ( >=media-libs/osl-1.13:=[${LLVM_USEDEP}] media-libs/mesa[${LLVM_USEDEP}] @@ -135,7 +183,7 @@ RDEPEND="${PYTHON_DEPS} dev-util/glslang media-libs/vulkan-loader ) - otf? ( + truetype? ( media-libs/harfbuzz ) renderdoc? ( @@ -150,11 +198,19 @@ RDEPEND="${PYTHON_DEPS} DEPEND="${RDEPEND} dev-cpp/eigen:= - vulkan? ( - dev-util/spirv-headers - dev-util/vulkan-headers +" + +if [[ "${PV}" == *9999* ]]; then +DEPEND+=" + test? ( + experimental? ( + wayland? ( + dev-libs/weston + ) + ) ) " +fi BDEPEND=" virtual/pkgconfig @@ -167,6 +223,10 @@ BDEPEND=" dev-texlive/texlive-latex dev-texlive/texlive-latexextra ) + vulkan? ( + dev-util/spirv-headers + dev-util/vulkan-headers + ) nls? ( sys-devel/gettext ) wayland? ( dev-util/wayland-scanner @@ -178,29 +238,39 @@ BDEPEND=" PATCHES=( "${FILESDIR}/${PN}-4.0.2-FindClang.patch" - "${FILESDIR}/${PN}-4.0.2-CUDA_NVCC_FLAGS.patch" "${FILESDIR}/${PN}-4.1.1-FindLLVM.patch" "${FILESDIR}/${PN}-4.1.1-numpy.patch" + "${FILESDIR}/${PN}-4.3.2-system-glog.patch" + "${FILESDIR}/${PN}-4.4.0-optix-compile-flags.patch" ) blender_check_requirements() { - [[ ${MERGE_TYPE} != binary ]] && use openmp && tc-check-openmp - if use doc; then CHECKREQS_DISK_BUILD="4G" check-reqs_pkg_pretend fi } blender_get_version() { + if [[ -n "${BV}" && -n "${BVC}" ]]; then + return + fi + + local status # Get blender version from blender itself. - BV=$(grep "BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d " " -f 3; assert) - if ((${BV:0:1} < 3)) ; then - # Add period (290 -> 2.90). - BV=${BV:0:1}.${BV:1} - else - # Add period and skip the middle number (301 -> 3.1) - BV=${BV:0:1}.${BV:2} + # mirrors build_files/cmake/macros.cmake function(get_blender_version) + # NOTE maps x0y to x.y + # TODO this can potentially break for x > 9 and y > 9 + BV="$(grep "define BLENDER_VERSION " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION, (PIPESTATUS: ${status})" + BV="$(printf "%d.%d" "${BV:0: -2}" "${BV: -2}")" + + if [[ "${PV}" != 9999* && "${BLENDER_BRANCH}" != "${BV}" ]]; then + eerror "ebuild (${BLENDER_BRANCH}) and code (${BV}) version mismatch" + die "blender_get_version" fi + + BVC="$(grep "define BLENDER_VERSION_CYCLE " source/blender/blenkernel/BKE_blender_version.h | cut -d ' ' -f 3)" + status="$(pipestatus -v)" || die "fails to detect BLENDER_VERSION_CYCLE, (PIPESTATUS: ${status})" } pkg_pretend() { @@ -210,20 +280,26 @@ pkg_pretend() { einfo "The Intel oneAPI support is rudimentary." einfo "" einfo "Please report any bugs you find to https://bugs.gentoo.org/" + if ! command -v icpx &>/dev/null && ! command -v dpcpp &>/dev/null; then + eerror "Could not find icpx or dpcpp." + eerror "You need SYCL/DCP++ to enable oneapi support." + eerror "Try sys-devel/DPC++::science" + die "FindSYCL would fail. Aborting." + fi fi } pkg_setup() { + blender_check_requirements + python-single-r1_pkg_setup + if use osl; then llvm-r1_pkg_setup fi - - blender_check_requirements - python-single-r1_pkg_setup } src_unpack() { - if [[ ${PV} = *9999* ]] ; then + if [[ "${PV}" == *9999* ]]; then if ! use test; then EGIT_SUBMODULES+=( '-tests/*' ) fi @@ -231,9 +307,9 @@ src_unpack() { else default - if use test; then - mkdir -p "${S}/tests/data/" || die - mv blender-test-data/* "${S}/tests/data/" || die + # TODO + if use test && [[ ${PV} != ${SLOT}.0 ]] ; then + mv "blender-${BLENDER_BRANCH}.0/tests/"* "${S}/tests" || die fi fi } @@ -245,11 +321,6 @@ src_prepare() { blender_get_version - # Disable MS Windows help generation. The variable doesn't do what it - # it sounds like. - sed -e "s|GENERATE_HTMLHELP = YES|GENERATE_HTMLHELP = NO|" \ - -i doc/doxygen/Doxyfile || die - # Prepare icons and .desktop files for slotting. sed \ -e "s|blender.svg|blender-${BV}.svg|" \ @@ -264,27 +335,64 @@ src_prepare() { -e "s|Icon=blender|Icon=blender-${BV}|" \ -i release/freedesktop/blender.desktop || die - sed -e "s|\${CMAKE_INSTALL_PREFIX}/\${BLENDER_BIN}|${T}/usr/\${BLENDER_BIN}|g" -i source/creator/CMakeLists.txt || die + sed \ + -e "/CMAKE_INSTALL_PREFIX_WITH_CONFIG/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i CMakeLists.txt \ + || die CMAKE_INSTALL_PREFIX_WITH_CONFIG + # WITH_SYSTEM_GLOG=yes + cmake_run_in extern cmake_comment_add_subdirectory glog + + mv \ + "release/freedesktop/icons/scalable/apps/blender.svg" \ + "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" \ + || die + mv \ + "release/freedesktop/icons/symbolic/apps/blender-symbolic.svg" \ + "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" \ + || die mv \ - release/freedesktop/icons/scalable/apps/blender.svg \ - "release/freedesktop/icons/scalable/apps/blender-${BV}.svg" || die + "release/freedesktop/blender.desktop" \ + "release/freedesktop/blender-${BV}.desktop" \ + || die + mv \ - release/freedesktop/icons/symbolic/apps/blender-symbolic.svg \ - "release/freedesktop/icons/symbolic/apps/blender-${BV}-symbolic.svg" || die - mv release/freedesktop/blender.desktop "release/freedesktop/blender-${BV}.desktop" || die - mv release/freedesktop/org.blender.Blender.metainfo.xml "release/freedesktop/blender-${BV}.metainfo.xml" - mv release/freedesktop/org.blender.Blender.appdata.xml "release/freedesktop/blender-${BV}.appdata.xml" + "release/freedesktop/org.blender.Blender.metainfo.xml" \ + "release/freedesktop/blender-${BV}.metainfo.xml" \ + || die + + sed \ + -e "s#\(set(cycles_kernel_runtime_lib_target_path \)\${cycles_kernel_runtime_lib_target_path}\(/lib)\)#\1\${CYCLES_INSTALL_PATH}\2#" \ + -i intern/cycles/kernel/CMakeLists.txt \ + || die + + if use hip; then + # fix hardcoded path + sed \ + -e "s#opt/rocm/hip/bin#$(hipconfig -p)/bin#g" \ + -i extern/hipew/src/hipew.c \ + || die + fi if use test; then # Without this the tests will try to use /usr/bin/blender and /usr/share/blender/ to run the tests. - sed -e "s|set(TEST_INSTALL_DIR.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i tests/CMakeLists.txt || die - sed -e "s|string(REPLACE.*|set(TEST_INSTALL_DIR ${T}/usr)|g" -i build_files/cmake/testing.cmake || die + sed \ + -e "/string(REPLACE.*TEST_INSTALL_DIR/{s|\${CMAKE_INSTALL_PREFIX}|${T}\${CMAKE_INSTALL_PREFIX}|g}" \ + -i "build_files/cmake/testing.cmake" \ + || die "REPLACE.*TEST_INSTALL_DIR" + + # assertEquals was deprecated in Python-3.2 use assertEqual instead + sed \ + -e 's/assertEquals/assertEqual/g' \ + -i tests/python/bl_animation_action.py \ + || die + + sed -e '1i #include <cstdint>' -i extern/gtest/src/gtest-death-test.cc || die + else + cmake_comment_add_subdirectory tests fi - if use vulkan; then - sed -e "s/extern_vulkan_memory_allocator/extern_vulkan_memory_allocator\nSPIRV-Tools-opt\nSPIRV-Tools\nSPIRV-Tools-link\nglslang\nSPIRV\nSPVRemapper/" -i source/blender/gpu/CMakeLists.txt || die - fi + rm -rf extern/gflags || die } src_configure() { @@ -294,93 +402,143 @@ src_configure() { filter-lto # Workaround for bug #922600 - append-ldflags $(test-flags-CCLD -Wl,--undefined-version) + append-ldflags "$(test-flags-CCLD -Wl,--undefined-version)" append-lfs-flags blender_get_version local mycmakeargs=( - -DWITH_LIBS_PRECOMPILED=no - -DBUILD_SHARED_LIBS=no + # we build a host-specific binary + -DWITH_CPU_CHECK="no" + + -DWITH_STRICT_BUILD_OPTIONS="yes" + -DWITH_LIBS_PRECOMPILED="no" + -DBUILD_SHARED_LIBS="no" # quadriflow only? + -DWITH_STATIC_LIBS=OFF + + # Build Options: + -DWITH_ALEMBIC="$(usex alembic)" + -DWITH_BOOST="yes" + -DWITH_BULLET="$(usex bullet)" + -DWITH_CYCLES="$(usex cycles)" + -DWITH_DOC_MANPAGE="$(usex man)" + -DWITH_FFTW3="$(usex fftw)" + -DWITH_GMP="$(usex gmp)" + -DWITH_GTESTS="$(usex test)" + -DWITH_HARFBUZZ="$(usex truetype)" + -DWITH_HARU="$(usex pdf)" + -DWITH_HEADLESS="$(usex !X "$(usex !wayland)")" + -DWITH_INPUT_NDOF="$(usex ndof)" + -DWITH_INTERNATIONAL="$(usex nls)" + -DWITH_MANIFOLD="$(usex manifold)" + -DWITH_MATERIALX="no" # TODO: Package MaterialX + -DWITH_NANOVDB="$(usex nanovdb)" + -DWITH_OPENCOLLADA="$(usex collada)" + -DWITH_OPENCOLORIO="$(usex color-management)" + -DWITH_OPENGL_BACKEND="$(usex opengl)" + -DWITH_OPENIMAGEDENOISE="$(usex oidn)" + -DWITH_OPENSUBDIV="$(usex opensubdiv)" + -DWITH_OPENVDB="$(usex openvdb)" + -DWITH_OPENVDB_BLOSC="$(usex openvdb)" + -DWITH_POTRACE="$(usex potrace)" + -DWITH_PUGIXML="$(usex pugixml)" + # -DWITH_QUADRIFLOW=ON + -DWITH_RENDERDOC="$(usex renderdoc)" + -DWITH_TBB="$(usex tbb)" + -DWITH_UNITY_BUILD="no" + -DWITH_USD="no" # TODO: Package USD + -DWITH_VULKAN_BACKEND="$(usex vulkan)" # experimental + -DWITH_XR_OPENXR="no" + + -DWITH_SYSTEM_BULLET="yes" + -DWITH_SYSTEM_EIGEN3="yes" + -DWITH_SYSTEM_FREETYPE="yes" + -DWITH_SYSTEM_GFLAGS="yes" + -DWITH_SYSTEM_GLOG="yes" + -DWITH_SYSTEM_LZO="yes" + + # Compiler Options: + # -DWITH_BUILDINFO="yes" + + # System Options: + -DWITH_INSTALL_PORTABLE="no" + -DWITH_MEM_JEMALLOC="$(usex jemalloc)" + -DWITH_MEM_VALGRIND="$(usex valgrind)" + + # GHOST Options: + -DWITH_GHOST_WAYLAND="$(usex wayland)" + # -DWITH_GHOST_WAYLAND_APP_ID="blender-${BV}" + -DWITH_GHOST_WAYLAND_DYNLOAD="no" + -DWITH_GHOST_X11="$(usex X)" + # -DWITH_GHOST_XDND=ON + # -DWITH_X11_XF86VMODE=ON + # -DWITH_X11_XFIXES=ON + # -DWITH_X11_XINPUT=ON + # -DWITH_GHOST_WAYLAND_DYNLOAD # visible wayland? + # -DWITH_GHOST_WAYLAND_LIBDECOR # visible wayland? + + # Image Formats: + # -DWITH_IMAGE_CINEON=ON + -DWITH_IMAGE_OPENEXR="$(usex openexr)" + -DWITH_IMAGE_OPENJPEG="$(usex jpeg2k)" + -DWITH_IMAGE_WEBP="$(usex webp)" # unlisted + + # Audio: + # -DWITH_AUDASPACE=OFF + # -DWITH_SYSTEM_AUDASPACE=OFF + -DWITH_CODEC_FFMPEG="$(usex ffmpeg)" + -DWITH_CODEC_SNDFILE="$(usex sndfile)" + # -DWITH_COREAUDIO=OFF + -DWITH_JACK="$(usex jack)" + # -DWITH_JACK_DYNLOAD= + -DWITH_OPENAL="$(usex openal)" + -DWITH_PIPEWIRE="$(usex pipewire)" + # -DWITH_PIPEWIRE_DYNLOAD= + -DWITH_PULSEAUDIO="$(usex pulseaudio)" + # -DWITH_PULSEAUDIO_DYNLOAD= + -DWITH_SDL="$(usex sdl)" + # -DWITH_WASAPI=OFF + + # Python: + # -DWITH_PYTHON=ON + -DWITH_PYTHON_INSTALL="no" + -DWITH_PYTHON_INSTALL_NUMPY="no" + -DWITH_PYTHON_INSTALL_ZSTANDARD="no" + # -DWITH_PYTHON_MODULE="no" + -DWITH_PYTHON_SAFETY="OFF" + -DWITH_PYTHON_SECURITY="yes" -DPYTHON_INCLUDE_DIR="$(python_get_includedir)" -DPYTHON_LIBRARY="$(python_get_library_path)" -DPYTHON_VERSION="${EPYTHON/python/}" - -DWITH_ALEMBIC=$(usex alembic) - -DWITH_BOOST=yes - -DWITH_BULLET=$(usex bullet) - -DWITH_CODEC_FFMPEG=$(usex ffmpeg) - -DWITH_CODEC_SNDFILE=$(usex sndfile) - -DWITH_CPU_CHECK=no + -DWITH_DRACO="yes" # TODO: Package Draco # NOTE use bundled for now - -DWITH_CYCLES=$(usex cycles) + # Modifiers: + -DWITH_MOD_FLUID="$(usex fluid)" + # -DWITH_MOD_REMESH=ON + -DWITH_MOD_OCEANSIM="$(usex fftw)" - -DWITH_CYCLES_DEVICE_CUDA=$(usex cuda) - -DWITH_CYCLES_CUDA_BINARIES="$(usex cuda $(usex cycles-bin-kernels))" - -DWITH_CYCLES_DEVICE_OPTIX=$(usex optix) + # Rendering: + -DWITH_HYDRA="no" # TODO: Package Hydra - -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" - -DWITH_CYCLES_HIP_BINARIES=$(usex hip $(usex cycles-bin-kernels)) + # Rendering (Cycles): + -DWITH_CYCLES_OSL="$(usex osl)" + -DWITH_CYCLES_EMBREE="$(usex embree)" + -DWITH_CYCLES_PATH_GUIDING="$(usex openpgl)" - -DWITH_CYCLES_DEVICE_ONEAPI="$(usex oneapi)" - -DWITH_CYCLES_ONEAPI_BINARIES="$(usex oneapi $(usex cycles-bin-kernels))" + -DWITH_CYCLES_DEVICE_OPTIX="$(usex optix)" + -DWITH_CYCLES_DEVICE_CUDA="$(usex cuda)" + -DWITH_CYCLES_CUDA_BINARIES="$(usex cuda "$(usex cycles-bin-kernels)")" + -DWITH_CYCLES_DEVICE_ONEAPI="$(usex oneapi)" + -DWITH_CYCLES_ONEAPI_BINARIES="$(usex oneapi "$(usex cycles-bin-kernels)")" + -DWITH_CYCLES_DEVICE_HIP="$(usex hip)" + -DWITH_CYCLES_HIP_BINARIES="$(usex hip "$(usex cycles-bin-kernels)")" -DWITH_CYCLES_HYDRA_RENDER_DELEGATE="no" # TODO: package Hydra - -DWITH_CYCLES_EMBREE="$(usex embree)" - -DWITH_CYCLES_OSL=$(usex osl) - -DWITH_CYCLES_PATH_GUIDING=$(usex openpgl) - -DWITH_CYCLES_STANDALONE=no - -DWITH_CYCLES_STANDALONE_GUI=no - - -DWITH_DOC_MANPAGE=$(usex man) - -DWITH_DRACO="yes" # TODO: Package Draco - -DWITH_FFTW3=$(usex fftw) - -DWITH_GHOST_WAYLAND=$(usex wayland) - -DWITH_GHOST_WAYLAND_DYNLOAD="no" - -DWITH_GHOST_X11=$(usex X) - -DWITH_GMP=$(usex gmp) - -DWITH_GTESTS=$(usex test) - -DWITH_HARFBUZZ="$(usex otf)" - -DWITH_HARU=$(usex pdf) - -DWITH_HEADLESS=$($(use X || use wayland) && echo OFF || echo ON) - -DWITH_HYDRA="no" # TODO: Package Hydra - -DWITH_IMAGE_OPENEXR=$(usex openexr) - -DWITH_IMAGE_OPENJPEG=$(usex jpeg2k) - -DWITH_IMAGE_WEBP=$(usex webp) - -DWITH_INPUT_NDOF=$(usex ndof) - -DWITH_INSTALL_PORTABLE="no" - -DWITH_INTERNATIONAL=$(usex nls) - -DWITH_JACK=$(usex jack) - -DWITH_MATERIALX="no" # TODO: Package MaterialX - -DWITH_MEM_JEMALLOC=$(usex jemalloc) - -DWITH_MEM_VALGRIND=$(usex valgrind) - -DWITH_MOD_FLUID=$(usex fluid) - -DWITH_MOD_OCEANSIM=$(usex fftw) - -DWITH_NANOVDB=$(usex nanovdb) - -DWITH_OPENAL=$(usex openal) - -DWITH_OPENCOLLADA=$(usex collada) - -DWITH_OPENCOLORIO=$(usex color-management) - -DWITH_OPENIMAGEDENOISE=$(usex oidn) - -DWITH_OPENMP=$(usex openmp) - -DWITH_OPENSUBDIV=$(usex opensubdiv) - -DWITH_OPENVDB=$(usex openvdb) - -DWITH_OPENVDB_BLOSC=$(usex openvdb) - -DWITH_POTRACE=$(usex potrace) - -DWITH_PUGIXML=$(usex pugixml) - -DWITH_PULSEAUDIO=$(usex pulseaudio) - -DWITH_PYTHON_INSTALL=no - -DWITH_PYTHON_INSTALL_NUMPY=no - -DWITH_PYTHON_INSTALL_ZSTANDARD=no - -DWITH_RENDERDOC="$(usex renderdoc)" - -DWITH_SDL=$(usex sdl) - -DWITH_STATIC_LIBS=no - -DWITH_STRICT_BUILD_OPTIONS=yes - -DWITH_SYSTEM_EIGEN3=yes - -DWITH_SYSTEM_FREETYPE=yes - -DWITH_SYSTEM_LZO=yes - -DWITH_TBB=$(usex tbb) - -DWITH_USD="no" # TODO: Package USD - -DWITH_VULKAN_BACKEND="$(usex vulkan)" - -DWITH_XR_OPENXR=no + + # -DWITH_CYCLES_STANDALONE=OFF + # -DWITH_CYCLES_STANDALONE_GUI=OFF + + -DWITH_BLENDER_THUMBNAILER="yes" ) if has_version ">=dev-python/numpy-2"; then @@ -391,29 +549,47 @@ src_configure() { fi # requires dev-vcs/git - if [[ ${PV} = *9999* ]] ; then - mycmakeargs+=( -DWITH_BUILDINFO="yes" ) + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]]; then + mycmakeargs+=( + # -DWITH_BUILDINFO="no" + -DWITH_EXPERIMENTAL_FEATURES="$(usex experimental)" + ) else - mycmakeargs+=( -DWITH_BUILDINFO="no" ) + mycmakeargs+=( + -DWITH_EXPERIMENTAL_FEATURES="no" + ) fi if use cuda; then - mycmakeargs+=( - -DCUDA_NVCC_FLAGS="--compiler-bindir;$(cuda_gccdir)" - ) + # Ease compiling with required gcc similar to cuda_sanitize but for cmake + if use cycles-bin-kernels; then + local -x CUDAHOSTCXX="$(cuda_gccdir)" + local -x CUDAHOSTLD="$(tc-getCXX)" + + if [[ -n "${CUDAARCHS}" ]]; then + mycmakeargs+=( + -DCYCLES_CUDA_BINARIES_ARCH="$(echo "${CUDAARCHS}" | sed -e 's/^/sm_/g' -e 's/;/;sm_/g')" + ) + fi + fi fi if use hip; then mycmakeargs+=( - -DROCM_PATH="$(hipconfig -R)" + -DHIP_ROOT_DIR="$(hipconfig -p)" + -DHIP_HIPCC_FLAGS="-fcf-protection=none" + + -DCMAKE_HIP_LINK_EXECUTABLE="$(get_llvm_prefix)/bin/clang++" + + -DCYCLES_HIP_BINARIES_ARCH="$(get_amdgpu_flags)" ) fi if use optix; then mycmakeargs+=( - -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${EPREFIX}"/opt/optix - -DOPTIX_ROOT_DIR="${EPREFIX}"/opt/optix + -DCYCLES_RUNTIME_OPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" + -DOPTIX_ROOT_DIR="${ESYSROOT}/opt/optix" ) fi @@ -428,74 +604,176 @@ src_configure() { use arm64 && append-flags -flax-vector-conversions append-cflags "$(usex debug '-DDEBUG' '-DNDEBUG')" - append-cppflags "$(usex debug '-DDEBUG' '-DNDEBUG')" + append-cxxflags "$(usex debug '-DDEBUG' '-DNDEBUG')" - if tc-is-gcc ; then - # These options only exist when GCC is detected. + if tc-is-gcc; then # We disable these to respect the user's choice of linker. mycmakeargs+=( - -DWITH_LINKER_GOLD=no - -DWITH_LINKER_LLD=no + -DWITH_LINKER_GOLD="no" ) - # Ease compiling with required gcc similar to cuda_sanitize but for cmake - use cuda && use cycles-bin-kernels && mycmakeargs+=( -DCUDA_HOST_COMPILER="$(cuda_gccdir)" ) fi if tc-is-clang || use osl; then mycmakeargs+=( - -DWITH_CLANG=yes - -DWITH_LLVM=yes + -DWITH_CLANG="yes" + -DWITH_LLVM="yes" ) fi - if use test ; then + if use test; then local CYCLES_TEST_DEVICES=( "CPU" ) if use cycles-bin-kernels; then use cuda && CYCLES_TEST_DEVICES+=( "CUDA" ) use optix && CYCLES_TEST_DEVICES+=( "OPTIX" ) use hip && CYCLES_TEST_DEVICES+=( "HIP" ) + use oneapi && CYCLES_TEST_DEVICES+=( "ONEAPI" ) fi mycmakeargs+=( - -DCYCLES_TEST_DEVICES:STRING="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" - -DWITH_COMPOSITOR_REALTIME_TESTS=yes - -DWITH_GPU_DRAW_TESTS=yes - -DWITH_GPU_RENDER_TESTS=yes + -DCMAKE_INSTALL_PREFIX_WITH_CONFIG="${T}/usr" + -DCYCLES_TEST_DEVICES="$(local IFS=";"; echo "${CYCLES_TEST_DEVICES[*]}")" ) + + # NOTE in lieu of a FEATURE/build_options + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + einfo "running expensive tests EXPENSIVE_TESTS=${EXPENSIVE_TESTS}" + mycmakeargs+=( + -DWITH_CYCLES_TEST_OSL="$(usex osl)" + + -DWITH_GPU_BACKEND_TESTS="yes" + -DWITH_GPU_COMPOSITOR_TESTS="yes" + + -DWITH_GPU_DRAW_TESTS="yes" + + -DWITH_GPU_RENDER_TESTS="no" + -DWITH_GPU_RENDER_TESTS_HEADED="no" + -DWITH_GPU_RENDER_TESTS_SILENT="yes" + -DWITH_GPU_RENDER_TESTS_VULKAN="$(usex vulkan)" + + -DWITH_SYSTEM_PYTHON_TESTS="yes" + -DTEST_SYSTEM_PYTHON_EXE="${PYTHON}" + ) + + if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && use experimental; then + mycmakeargs+=( + # Enable user-interface tests using a headless display server. + # Currently this depends on WITH_GHOST_WAYLAND and the weston compositor (Experimental) + -DWITH_UI_TESTS="$(usex wayland)" + -DWESTON_BIN="${ESYSROOT}/usr/bin/weston" + ) + fi + else + mycmakeargs+=( + -DWITH_GPU_RENDER_TESTS="no" + ) + fi fi cmake_src_configure } src_test() { - # A lot of tests needs to have access to the installed data files. + # A lot of tests need to have access to the installed data files. # So install them into the image directory now. DESTDIR="${T}" cmake_build install blender_get_version - # By default, blender will look for system scripts and data in - # /usr/share/, but until this is installed, they are not necessarily - # available there. Use this to have blender search the intermediate - # install directory instead. - export BLENDER_SYSTEM_RESOURCES="${T}/usr/share/blender/${BV}" + # Define custom blender data/script file paths, or we won't be able to find them otherwise during testing. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${T%/}/usr/share/blender/${BV}" + + # Sanity check that the script and datafile path is valid. + # If they are not valid, blender will fallback to the default path which is not what we want. + [[ -d "${BLENDER_SYSTEM_RESOURCES}" ]] || die "The custom resources path is invalid, fix the ebuild!" - # Brake check: Make sure the above path is valid. - # If not, blender will fallback to the default path which is not what - # we want. - [ -d "$BLENDER_SYSTEM_RESOURCES" ] || die "The custom script path is invalid, fix the ebuild!" + # TODO only picks first card + addwrite "/dev/dri/card0" + addwrite "/dev/dri/renderD128" + addwrite "/dev/udmabuf" if use cuda; then cuda_add_sandbox -w - addwrite "/dev/dri/renderD128" - addwrite "/dev/char/" + addwrite "/proc/self/task" + addpredict "/dev/char/" fi - if use X; then - xdg_environment_reset + local -x CMAKE_SKIP_TESTS=( + "^compositor_cpu_color$" + "^compositor_cpu_filter$" + "^cycles_image_colorspace_cpu$" + "^script_pyapi_bpy_driver_secure_eval$" + ) + + if [[ "${RUN_FAILING_TESTS:-0}" -eq 0 ]]; then + einfo "not running failing tests RUN_FAILING_TESTS=${RUN_FAILING_TESTS}" + CMAKE_SKIP_TESTS+=( + "^cycles_bsdf_cuda$" + "^cycles_image_data_types_cpu$" + "^cycles_image_data_types_optix$" + "^cycles_image_mapping_cpu$" + "^cycles_osl_cpu$" + ) + fi + + if ! has_version "media-libs/openusd"; then + CMAKE_SKIP_TESTS+=( + # from pxr import Usd # ModuleNotFoundError: No module named 'pxr' + "^script_bundled_modules$" + ) fi - addwrite /dev/dri + if ! has_version "media-libs/openimageio[python]"; then + CMAKE_SKIP_TESTS+=( + # import OpenImageIO as oiio # ModuleNotFoundError: No module named 'OpenImageIO' + "^compositor_cpu_file_output$" + ) + fi + + # oiio can't find webp due to missing cmake files # 937031 + sed -e "s/ WEBP//g" -i "${BUILD_DIR}/tests/python/CTestTestfile.cmake" || die + + # For debugging, print out all information. + local -x VERBOSE="$(usex debug "true" "false")" + "${VERBOSE}" && einfo "VERBOSE=${VERBOSE}" + + # Show the window in the foreground. + # local -x USE_WINDOW="true" # non-zero + [[ -v USE_WINDOW ]] && einfo "USE_WINDOW=${USE_WINDOW}" + + # local -x USE_DEBUG="true" # non-zero + [[ -v USE_DEBUG ]] && einfo "USE_DEBUG=${USE_DEBUG}" + + if [[ "${EXPENSIVE_TESTS:-0}" -gt 0 ]]; then + einfo "running expensive tests EXPENSIVE_TESTS=${EXPENSIVE_TESTS}" + # if [[ "${PV}" == *9999* && "${BVC}" == "alpha" ]] && + # use experimental && use wayland; then + # # This runs weston + # xdg_environment_reset + # fi - cmake_src_test + xdg_environment_reset + # WITH_GPU_RENDER_TESTS_HEADED + if use wayland; then + local compositor exit_code + local logfile=${T}/weston.log + weston --xwayland --backend=headless --socket=wayland-5 --idle-time=0 2>"${logfile}" & + compositor=$! + local -x WAYLAND_DISPLAY=wayland-5 + sleep 1 # wait for xwayland to be up + # TODO use eapi9-pipestatus + local -x DISPLAY="$(grep "xserver listening on display" "${logfile}" | cut -d ' ' -f 5)" + + cmake_src_test + + exit_code=$? + kill "${compositor}" + elif use X; then + virtx cmake_src_test + else + cmake_src_test + fi + else + cmake_src_test + fi # Clean up the image directory for src_install rm -fr "${T}/usr" || die @@ -505,7 +783,7 @@ src_install() { blender_get_version # Pax mark blender for hardened support. - pax-mark m "${BUILD_DIR}"/bin/blender + pax-mark m "${BUILD_DIR}/bin/blender" cmake_src_install @@ -515,50 +793,44 @@ src_install() { fi if use doc; then - # By default, blender will look for system scripts and data in - # /usr/share/, but until this is installed, they are not necessarily - # available there. Use this to have blender search the intermediate - # install directory instead. - export BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" - - # Brake check: Make sure the above path is valid. - # If not, blender will fallback to the default path which is not what - # we want. - [ -d "$BLENDER_SYSTEM_RESOURCES" ] || die "The custom script path is invalid, fix the ebuild!" - - # Workaround for binary drivers. + # Define custom blender data/script file paths. Otherwise Blender will not be able to find them during doc building. + # (Because the data is in the image directory and it will default to look in /usr/share) + local -x BLENDER_SYSTEM_RESOURCES="${ED}/usr/share/blender/${BV}" + + # Workaround for binary drivers. # TODO addpredict /dev/ati addpredict /dev/dri addpredict /dev/nvidiactl einfo "Generating Blender C/C++ API docs ..." - cd "${CMAKE_USE_DIR}"/doc/doxygen || die + cd "${CMAKE_USE_DIR}/doc/doxygen" || die doxygen -u Doxyfile || die doxygen || die "doxygen failed to build API docs." cd "${CMAKE_USE_DIR}" || die einfo "Generating (BPY) Blender Python API docs ..." - "${BUILD_DIR}"/bin/blender --background --python doc/python_api/sphinx_doc_gen.py -noaudio || die "sphinx failed." + "${BUILD_DIR}"/bin/blender --background --python "doc/python_api/sphinx_doc_gen.py" -noaudio || die "sphinx failed." - cd "${CMAKE_USE_DIR}"/doc/python_api || die + cd "${CMAKE_USE_DIR}/doc/python_api" || die sphinx-build sphinx-in BPY_API || die "sphinx failed." docinto "html/API/python" - dodoc -r "${CMAKE_USE_DIR}"/doc/python_api/BPY_API/. + dodoc -r "${CMAKE_USE_DIR}/doc/python_api/BPY_API/" docinto "html/API/blender" - dodoc -r "${CMAKE_USE_DIR}"/doc/doxygen/html/. + dodoc -r "${CMAKE_USE_DIR}/doc/doxygen/html/" fi # Fix doc installdir docinto html - dodoc "${CMAKE_USE_DIR}"/release/text/readme.html - rm -r "${ED}"/usr/share/doc/blender || die + dodoc "${CMAKE_USE_DIR}/release/text/readme.html" + rm -r "${ED}/usr/share/doc/blender" || die python_optimize "${ED}/usr/share/blender/${BV}/scripts" - mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" || die - mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die + mv "${ED}/usr/bin/blender-thumbnailer" "${ED}/usr/bin/blender-${BV}-thumbnailer" \ + || die "blender-thumbnailer version rename failed" + mv "${ED}/usr/bin/blender" "${ED}/usr/bin/blender-${BV}" || die "blender version rename failed" } pkg_postinst() { @@ -572,7 +844,7 @@ pkg_postinst() { elog "changing the 'Temporary Files' directory in Blender preferences." elog - if use osl; then + if use osl && ! has_version "media-libs/mesa[${LLVM_USEDEP}]"; then ewarn "" ewarn "OSL is know to cause runtime segfaults if Mesa has been linked to" ewarn "an other LLVM version than what OSL is linked to." @@ -580,11 +852,12 @@ pkg_postinst() { ewarn "" fi + # NOTE build_files/cmake/Modules/FindPythonLibsUnix.cmake: set(_PYTHON_VERSION_SUPPORTED 3.11) if ! use python_single_target_python3_11; then elog "You are building Blender with a newer python version than" elog "supported by this version upstream." elog "If you experience breakages with e.g. plugins, please switch to" - elog "python_single_target_python3_11 instead." + elog "PYTHON_SINGLE_TARGET: python3_11 instead." elog "Bug: https://bugs.gentoo.org/737388" elog fi @@ -599,9 +872,12 @@ pkg_postrm() { xdg_mimeinfo_database_update xdg_desktop_database_update - ewarn "" - ewarn "You may want to remove the following directory." - ewarn "~/.config/${PN}/${BV}/cache/" - ewarn "It may contain extra render kernels not tracked by portage" - ewarn "" + if [[ -z "${REPLACED_BY_VERSION}" ]]; then + ewarn + ewarn "You may want to remove the following directories" + ewarn "- ~/.config/${PN}/${BV}/cache/" + ewarn "- ~/.cache/cycles/" + ewarn "It may contain extra render kernels not tracked by portage" + ewarn + fi } diff --git a/media-gfx/blender/files/blender-4.2.9-python3.12.patch b/media-gfx/blender/files/blender-4.2.9-python3.12.patch new file mode 100644 index 000000000000..94d0875cf67d --- /dev/null +++ b/media-gfx/blender/files/blender-4.2.9-python3.12.patch @@ -0,0 +1,68 @@ +From 1865de1c738a1a1ead520fbd38487815e13906e9 Mon Sep 17 00:00:00 2001 +From: Campbell Barton <campbell@blender.org> +Date: Thu, 28 Nov 2024 12:04:45 +1100 +Subject: [PATCH] Fix #129926: Crash with Python 3.12 & Manta flow + +Python 3.12 no longer supports calls to PyImport_AppendInittab +once initialized. + +The call was redundant as Blender's `bpy_internal_modules` already +includes the "manta" module. + +Resolve by disabling the call when Python's lifecycle isn't being +managed by manta-flow. +--- + extern/mantaflow/helper/pwrapper/registry.cpp | 19 ++++++++++++++----- + 1 file changed, 14 insertions(+), 5 deletions(-) + +diff --git a/extern/mantaflow/helper/pwrapper/registry.cpp b/extern/mantaflow/helper/pwrapper/registry.cpp +index b4206a41dea..3ad7475d0e3 100644 +--- a/extern/mantaflow/helper/pwrapper/registry.cpp ++++ b/extern/mantaflow/helper/pwrapper/registry.cpp +@@ -112,7 +112,7 @@ class WrapperRegistry { + const std::string &name, + Manta::PbArgs &args, + Manta::PbClass *parent); +- void construct(const std::string &scriptname, const vector<string> &args); ++ void construct(bool python_lifecycle, const std::string &scriptname, const vector<string> &args); + void cleanup(); + void renameObjects(); + void runPreInit(PyObject *name_space); +@@ -566,7 +566,9 @@ PyObject *WrapperRegistry::createPyObject(const string &classname, + } + + // prepare typeinfo and register python module +-void WrapperRegistry::construct(const string &scriptname, const vector<string> &args) ++void WrapperRegistry::construct(const bool python_lifecycle, ++ const string &scriptname, ++ const vector<string> &args) + { + mScriptName = scriptname; + this->args = args; +@@ -575,8 +577,15 @@ void WrapperRegistry::construct(const string &scriptname, const vector<string> & + registerMeta(); + registerDummyTypes(); + +- // work around for certain gcc versions, cast to char* +- PyImport_AppendInittab((char *)gDefaultModuleName.c_str(), PyInit_manta_main); ++ // Don't extend the init-tab when Python is already initialized. ++ // Since Python 3.12 this isn't supported and will crash. ++ // ++ // When `python_lifecycle` is false (when manta-flow is embedded), it's the responsibility ++ // of the application embedding this code to include #PyInit_manta_main in the init-tab. ++ if (python_lifecycle) { ++ // work around for certain gcc versions, cast to char* ++ PyImport_AppendInittab((char *)gDefaultModuleName.c_str(), PyInit_manta_main); ++ } + } + + inline PyObject *castPy(PyTypeObject *p) +@@ -711,7 +720,7 @@ void setup(const bool python_lifecycle, + const std::vector<std::string> &args, + PyObject *name_space) + { +- WrapperRegistry::instance().construct(filename, args); ++ WrapperRegistry::instance().construct(python_lifecycle, filename, args); + if (python_lifecycle) { + Py_Initialize(); + } diff --git a/media-gfx/blender/files/blender-4.2.9-python3.12_1.patch b/media-gfx/blender/files/blender-4.2.9-python3.12_1.patch new file mode 100644 index 000000000000..0312e786861c --- /dev/null +++ b/media-gfx/blender/files/blender-4.2.9-python3.12_1.patch @@ -0,0 +1,39 @@ +From f60f2b769b1d43d253d470c99f8555e90cb45fd9 Mon Sep 17 00:00:00 2001 +From: Campbell Barton <campbell@blender.org> +Date: Mon, 21 Oct 2024 20:45:35 +1100 +Subject: [PATCH] Unbreak building with Python 3.12 + +Support for 3.13 [0] broke 3.12. + +[0]: d9f38fca5ffe29136cd6f390e318ad8455864582 +--- + source/blender/python/generic/py_capi_utils.cc | 2 +- + source/blender/python/generic/py_capi_utils.hh | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/source/blender/python/generic/py_capi_utils.cc b/source/blender/python/generic/py_capi_utils.cc +index 74c829d717e..d6c58a5c6eb 100644 +--- a/source/blender/python/generic/py_capi_utils.cc ++++ b/source/blender/python/generic/py_capi_utils.cc +@@ -39,7 +39,7 @@ + # include "BLI_math_base.h" /* isfinite() */ + #endif + +-#if PY_VERSION_HEX <= 0x030c0000 /* <=3.12 */ ++#if PY_VERSION_HEX < 0x030d0000 /* <3.13 */ + # define PyLong_AsInt _PyLong_AsInt + # define PyUnicode_CompareWithASCIIString _PyUnicode_EqualToASCIIString + #endif +diff --git a/source/blender/python/generic/py_capi_utils.hh b/source/blender/python/generic/py_capi_utils.hh +index 81740e0d0ad..29222d35c2c 100644 +--- a/source/blender/python/generic/py_capi_utils.hh ++++ b/source/blender/python/generic/py_capi_utils.hh +@@ -339,7 +339,7 @@ uint64_t PyC_Long_AsU64(PyObject *value); + /* inline so type signatures match as expected */ + Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value) + { +-#if PY_VERSION_HEX <= 0x030c0000 /* <=3.12 */ ++#if PY_VERSION_HEX < 0x030d0000 /* <3.13 */ + return (int32_t)_PyLong_AsInt(value); + #else + return (int32_t)PyLong_AsInt(value); diff --git a/media-gfx/blender/files/blender-4.2.9-python3.13.patch b/media-gfx/blender/files/blender-4.2.9-python3.13.patch new file mode 100644 index 000000000000..0dd6f4b95b4d --- /dev/null +++ b/media-gfx/blender/files/blender-4.2.9-python3.13.patch @@ -0,0 +1,626 @@ +From d9f38fca5ffe29136cd6f390e318ad8455864582 Mon Sep 17 00:00:00 2001 +From: Campbell Barton <campbell@blender.org> +Date: Fri, 18 Oct 2024 12:23:34 +1100 +Subject: [PATCH] PyAPI: support Python 3.13 + +- `_PySet_NextEntry` has been removed, use generic iterator access + which will has some additional overhead as it needs to create + an iterator to access the values. + +- Add v3.13 compatibility defines to account for renaming: + _PyObject_LookupAttr -> PyObject_GetOptionalAttr + _PyLong_AsInt -> PyLong_AsInt + +- Unfortunately use of Python's internal API needs to be used to + inspect op-codes in `bpy_driver.cc`. + +Testing GLTF/FBX IO there isn't any significant performance impact +from these changes. + +Resolves #123871. +--- + .../blender/python/bmesh/bmesh_py_ops_call.cc | 16 +- + source/blender/python/generic/py_capi_rna.cc | 140 ++++++++++-------- + .../blender/python/generic/py_capi_utils.cc | 56 ++++--- + .../blender/python/generic/py_capi_utils.hh | 4 + + .../blender/python/generic/python_compat.hh | 10 +- + .../blender/python/gpu/gpu_py_framebuffer.cc | 6 +- + source/blender/python/intern/bpy.cc | 48 +++--- + source/blender/python/intern/bpy_driver.cc | 37 ++++- + .../python/intern/bpy_library_write.cc | 27 ++-- + source/blender/python/intern/bpy_rna.cc | 6 +- + 10 files changed, 218 insertions(+), 132 deletions(-) + +diff --git a/source/blender/python/bmesh/bmesh_py_ops_call.cc b/source/blender/python/bmesh/bmesh_py_ops_call.cc +index d5a2e6b02ad..624e4d02e98 100644 +--- a/source/blender/python/bmesh/bmesh_py_ops_call.cc ++++ b/source/blender/python/bmesh/bmesh_py_ops_call.cc +@@ -548,11 +548,12 @@ static int bpy_slot_from_py(BMesh *bm, + break; + } + case BMO_OP_SLOT_SUBTYPE_MAP_EMPTY: { +- if (PySet_Size(value) > 0) { ++ if (PySet_GET_SIZE(value) > 0) { ++ PyObject *it = PyObject_GetIter(value); + PyObject *arg_key; +- Py_ssize_t arg_pos = 0; +- Py_ssize_t arg_hash = 0; +- while (_PySet_NextEntry(value, &arg_pos, &arg_key, &arg_hash)) { ++ while ((arg_key = PyIter_Next(it))) { ++ /* Borrow from the set. */ ++ Py_DECREF(arg_key); + + if (bpy_slot_from_py_elem_check((BPy_BMElem *)arg_key, + bm, +@@ -561,11 +562,16 @@ static int bpy_slot_from_py(BMesh *bm, + slot_name, + "invalid key in set") == -1) + { +- return -1; /* error is set in bpy_slot_from_py_elem_check() */ ++ /* Error is set in #bpy_slot_from_py_elem_check(). */ ++ break; + } + + BMO_slot_map_empty_insert(bmop, slot, ((BPy_BMElem *)arg_key)->ele); + } ++ Py_DECREF(it); ++ if (arg_key) { ++ return -1; ++ } + } + break; + } +diff --git a/source/blender/python/generic/py_capi_rna.cc b/source/blender/python/generic/py_capi_rna.cc +index 11827fa0836..a41e474f619 100644 +--- a/source/blender/python/generic/py_capi_rna.cc ++++ b/source/blender/python/generic/py_capi_rna.cc +@@ -75,60 +75,66 @@ BLI_bitmap *pyrna_enum_bitmap_from_set(const EnumPropertyItem *items, + int bitmap_size, + const char *error_prefix) + { +- /* Set looping. */ +- Py_ssize_t pos = 0; +- Py_ssize_t hash = 0; +- PyObject *key; +- ++ BLI_assert(PySet_Check(value)); + BLI_bitmap *bitmap = BLI_BITMAP_NEW(bitmap_size, __func__); + +- while (_PySet_NextEntry(value, &pos, &key, &hash)) { +- const char *param = PyUnicode_AsUTF8(key); +- if (param == nullptr) { +- PyErr_Format(PyExc_TypeError, +- "%.200s expected a string, not %.200s", +- error_prefix, +- Py_TYPE(key)->tp_name); +- goto error; +- } ++ if (PySet_GET_SIZE(value) > 0) { ++ /* Set looping. */ ++ PyObject *it = PyObject_GetIter(value); ++ PyObject *key; ++ while ((key = PyIter_Next(it))) { ++ /* Borrow from the set. */ ++ Py_DECREF(key); + +- int ret; +- if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { +- goto error; +- } ++ const char *param = PyUnicode_AsUTF8(key); ++ if (param == nullptr) { ++ PyErr_Format(PyExc_TypeError, ++ "%.200s expected a string, not %.200s", ++ error_prefix, ++ Py_TYPE(key)->tp_name); ++ break; ++ } + +- int index = ret; ++ int ret; ++ if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { ++ break; ++ } + +- if (type_convert_sign) { +- if (type_size == 2) { +- union { +- signed short as_signed; +- ushort as_unsigned; +- } ret_convert; +- ret_convert.as_signed = (signed short)ret; +- index = int(ret_convert.as_unsigned); +- } +- else if (type_size == 1) { +- union { +- signed char as_signed; +- uchar as_unsigned; +- } ret_convert; +- ret_convert.as_signed = (signed char)ret; +- index = int(ret_convert.as_unsigned); +- } +- else { +- BLI_assert_unreachable(); ++ int index = ret; ++ ++ if (type_convert_sign) { ++ if (type_size == 2) { ++ union { ++ signed short as_signed; ++ ushort as_unsigned; ++ } ret_convert; ++ ret_convert.as_signed = (signed short)ret; ++ index = int(ret_convert.as_unsigned); ++ } ++ else if (type_size == 1) { ++ union { ++ signed char as_signed; ++ uchar as_unsigned; ++ } ret_convert; ++ ret_convert.as_signed = (signed char)ret; ++ index = int(ret_convert.as_unsigned); ++ } ++ else { ++ BLI_assert_unreachable(); ++ } + } ++ BLI_assert(index < bitmap_size); ++ BLI_BITMAP_ENABLE(bitmap, index); ++ } ++ Py_DECREF(it); ++ ++ if (key) { ++ MEM_freeN(bitmap); ++ bitmap = nullptr; + } +- BLI_assert(index < bitmap_size); +- BLI_BITMAP_ENABLE(bitmap, index); + } + + return bitmap; +- +-error: +- MEM_freeN(bitmap); +- return nullptr; + } + + int pyrna_enum_bitfield_from_set(const EnumPropertyItem *items, +@@ -136,32 +142,40 @@ int pyrna_enum_bitfield_from_set(const EnumPropertyItem *items, + int *r_value, + const char *error_prefix) + { ++ BLI_assert(PySet_Check(value)); + /* Set of enum items, concatenate all values with OR. */ +- int ret, flag = 0; +- +- /* Set looping. */ +- Py_ssize_t pos = 0; +- Py_ssize_t hash = 0; +- PyObject *key; ++ int flag = 0; + + *r_value = 0; + +- while (_PySet_NextEntry(value, &pos, &key, &hash)) { +- const char *param = PyUnicode_AsUTF8(key); ++ PyObject *key = nullptr; ++ if (PySet_GET_SIZE(value) > 0) { ++ /* Set looping. */ ++ PyObject *it = PyObject_GetIter(value); ++ while ((key = PyIter_Next(it))) { ++ /* Borrow from the set. */ ++ Py_DECREF(key); + +- if (param == nullptr) { +- PyErr_Format(PyExc_TypeError, +- "%.200s expected a string, not %.200s", +- error_prefix, +- Py_TYPE(key)->tp_name); ++ const char *param = PyUnicode_AsUTF8(key); ++ if (param == nullptr) { ++ PyErr_Format(PyExc_TypeError, ++ "%.200s expected a string, not %.200s", ++ error_prefix, ++ Py_TYPE(key)->tp_name); ++ break; ++ } ++ ++ int ret; ++ if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { ++ break; ++ } ++ ++ flag |= ret; ++ } ++ Py_DECREF(it); ++ if (key) { + return -1; + } +- +- if (pyrna_enum_value_from_id(items, param, &ret, error_prefix) == -1) { +- return -1; +- } +- +- flag |= ret; + } + + *r_value = flag; +diff --git a/source/blender/python/generic/py_capi_utils.cc b/source/blender/python/generic/py_capi_utils.cc +index 3311064e7c5..74c829d717e 100644 +--- a/source/blender/python/generic/py_capi_utils.cc ++++ b/source/blender/python/generic/py_capi_utils.cc +@@ -39,6 +39,11 @@ + # include "BLI_math_base.h" /* isfinite() */ + #endif + ++#if PY_VERSION_HEX <= 0x030c0000 /* <=3.12 */ ++# define PyLong_AsInt _PyLong_AsInt ++# define PyUnicode_CompareWithASCIIString _PyUnicode_EqualToASCIIString ++#endif ++ + /* -------------------------------------------------------------------- */ + /** \name Fast Python to C Array Conversion for Primitive Types + * \{ */ +@@ -874,10 +879,12 @@ static void pyc_exception_buffer_handle_system_exit() + if (!PyErr_ExceptionMatches(PyExc_SystemExit)) { + return; + } +- /* Inspecting, follow Python's logic in #_Py_HandleSystemExit & treat as a regular exception. */ ++/* Inspecting, follow Python's logic in #_Py_HandleSystemExit & treat as a regular exception. */ ++# if 0 /* FIXME: */ + if (_Py_GetConfig()->inspect) { + return; + } ++# endif + + /* NOTE(@ideasman42): A `SystemExit` exception will exit immediately (unless inspecting). + * So print the error and exit now. Without this #PyErr_Display shows the error stack-trace +@@ -1424,11 +1431,6 @@ int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items, + /* set of enum items, concatenate all values with OR */ + int ret, flag = 0; + +- /* set looping */ +- Py_ssize_t pos = 0; +- Py_ssize_t hash = 0; +- PyObject *key; +- + if (!PySet_Check(value)) { + PyErr_Format(PyExc_TypeError, + "%.200s expected a set, not %.200s", +@@ -1439,22 +1441,32 @@ int PyC_FlagSet_ToBitfield(const PyC_FlagSet *items, + + *r_value = 0; + +- while (_PySet_NextEntry(value, &pos, &key, &hash)) { +- const char *param = PyUnicode_AsUTF8(key); ++ if (PySet_GET_SIZE(value) > 0) { ++ PyObject *it = PyObject_GetIter(value); ++ PyObject *key; ++ while ((key = PyIter_Next(it))) { ++ /* Borrow from the set. */ ++ Py_DECREF(key); + +- if (param == nullptr) { +- PyErr_Format(PyExc_TypeError, +- "%.200s set must contain strings, not %.200s", +- error_prefix, +- Py_TYPE(key)->tp_name); ++ const char *param = PyUnicode_AsUTF8(key); ++ if (param == nullptr) { ++ PyErr_Format(PyExc_TypeError, ++ "%.200s set must contain strings, not %.200s", ++ error_prefix, ++ Py_TYPE(key)->tp_name); ++ break; ++ } ++ ++ if (PyC_FlagSet_ValueFromID(items, param, &ret, error_prefix) < 0) { ++ break; ++ } ++ ++ flag |= ret; ++ } ++ Py_DECREF(it); ++ if (key != nullptr) { + return -1; + } +- +- if (PyC_FlagSet_ValueFromID(items, param, &ret, error_prefix) < 0) { +- return -1; +- } +- +- flag |= ret; + } + + *r_value = flag; +@@ -1724,7 +1736,7 @@ static ulong pyc_Long_AsUnsignedLong(PyObject *value) + + int PyC_Long_AsBool(PyObject *value) + { +- const int test = _PyLong_AsInt(value); ++ const int test = PyLong_AsInt(value); + if (UNLIKELY(test == -1 && PyErr_Occurred())) { + return -1; + } +@@ -1737,7 +1749,7 @@ int PyC_Long_AsBool(PyObject *value) + + int8_t PyC_Long_AsI8(PyObject *value) + { +- const int test = _PyLong_AsInt(value); ++ const int test = PyLong_AsInt(value); + if (UNLIKELY(test == -1 && PyErr_Occurred())) { + return -1; + } +@@ -1750,7 +1762,7 @@ int8_t PyC_Long_AsI8(PyObject *value) + + int16_t PyC_Long_AsI16(PyObject *value) + { +- const int test = _PyLong_AsInt(value); ++ const int test = PyLong_AsInt(value); + if (UNLIKELY(test == -1 && PyErr_Occurred())) { + return -1; + } +diff --git a/source/blender/python/generic/py_capi_utils.hh b/source/blender/python/generic/py_capi_utils.hh +index 4a641f78471..81740e0d0ad 100644 +--- a/source/blender/python/generic/py_capi_utils.hh ++++ b/source/blender/python/generic/py_capi_utils.hh +@@ -339,7 +339,11 @@ uint64_t PyC_Long_AsU64(PyObject *value); + /* inline so type signatures match as expected */ + Py_LOCAL_INLINE(int32_t) PyC_Long_AsI32(PyObject *value) + { ++#if PY_VERSION_HEX <= 0x030c0000 /* <=3.12 */ + return (int32_t)_PyLong_AsInt(value); ++#else ++ return (int32_t)PyLong_AsInt(value); ++#endif + } + Py_LOCAL_INLINE(int64_t) PyC_Long_AsI64(PyObject *value) + { +diff --git a/source/blender/python/generic/python_compat.hh b/source/blender/python/generic/python_compat.hh +index f18d0fb59b3..e2799aeeb46 100644 +--- a/source/blender/python/generic/python_compat.hh ++++ b/source/blender/python/generic/python_compat.hh +@@ -9,9 +9,17 @@ + + #pragma once + ++/* Removes `intialized` member from Python 3.13+. */ ++#if PY_VERSION_HEX >= 0x030d0000 ++# define PY_ARG_PARSER_HEAD_COMPAT() ++#elif PY_VERSION_HEX >= 0x030c0000 + /* Add `intialized` member for Python 3.12+. */ +-#if PY_VERSION_HEX >= 0x030c0000 + # define PY_ARG_PARSER_HEAD_COMPAT() 0, + #else + # define PY_ARG_PARSER_HEAD_COMPAT() + #endif ++ ++/* Python 3.13 made some changes, use the "new" names. */ ++#if PY_VERSION_HEX < 0x030d0000 ++# define PyObject_GetOptionalAttr _PyObject_LookupAttr ++#endif +diff --git a/source/blender/python/gpu/gpu_py_framebuffer.cc b/source/blender/python/gpu/gpu_py_framebuffer.cc +index 899ad21f770..9bef53654df 100644 +--- a/source/blender/python/gpu/gpu_py_framebuffer.cc ++++ b/source/blender/python/gpu/gpu_py_framebuffer.cc +@@ -286,14 +286,14 @@ static bool pygpu_framebuffer_new_parse_arg(PyObject *o, GPUAttachment *r_attach + return false; + } + +- if (c_texture && _PyUnicode_EqualToASCIIString(key, c_texture)) { ++ if (c_texture && PyUnicode_CompareWithASCIIString(key, c_texture)) { + /* Compare only once. */ + c_texture = nullptr; + if (!bpygpu_ParseTexture(value, &tmp_attach.tex)) { + return false; + } + } +- else if (c_layer && _PyUnicode_EqualToASCIIString(key, c_layer)) { ++ else if (c_layer && PyUnicode_CompareWithASCIIString(key, c_layer)) { + /* Compare only once. */ + c_layer = nullptr; + tmp_attach.layer = PyLong_AsLong(value); +@@ -301,7 +301,7 @@ static bool pygpu_framebuffer_new_parse_arg(PyObject *o, GPUAttachment *r_attach + return false; + } + } +- else if (c_mip && _PyUnicode_EqualToASCIIString(key, c_mip)) { ++ else if (c_mip && PyUnicode_CompareWithASCIIString(key, c_mip)) { + /* Compare only once. */ + c_mip = nullptr; + tmp_attach.mip = PyLong_AsLong(value); +diff --git a/source/blender/python/intern/bpy.cc b/source/blender/python/intern/bpy.cc +index 7cdd00fc7a3..42ea76e40ac 100644 +--- a/source/blender/python/intern/bpy.cc ++++ b/source/blender/python/intern/bpy.cc +@@ -610,38 +610,40 @@ PyDoc_STRVAR( + " :rtype: dict\n"); + static PyObject *bpy_wm_capabilities(PyObject *self) + { +- static _Py_Identifier PyId_capabilities = {"_wm_capabilities_", -1}; +- ++ PyObject *py_id_capabilities = PyUnicode_FromString("_wm_capabilities_"); + PyObject *result = nullptr; +- switch (_PyObject_LookupAttrId(self, &PyId_capabilities, &result)) { +- case 1: +- return result; +- case 0: +- break; +- default: +- /* Unlikely, but there may be an error, forward it. */ +- return nullptr; +- } ++ switch (PyObject_GetOptionalAttr(self, py_id_capabilities, &result)) { ++ case 1: { ++ result = PyDict_New(); + +- result = PyDict_New(); +- +- const eWM_CapabilitiesFlag flag = WM_capabilities_flag(); ++ const eWM_CapabilitiesFlag flag = WM_capabilities_flag(); + + #define SetFlagItem(x) \ + PyDict_SetItemString(result, STRINGIFY(x), PyBool_FromLong((WM_CAPABILITY_##x) & flag)); + +- SetFlagItem(CURSOR_WARP); +- SetFlagItem(WINDOW_POSITION); +- SetFlagItem(PRIMARY_CLIPBOARD); +- SetFlagItem(GPU_FRONT_BUFFER_READ); +- SetFlagItem(CLIPBOARD_IMAGES); +- SetFlagItem(DESKTOP_SAMPLE); +- SetFlagItem(INPUT_IME); +- SetFlagItem(TRACKPAD_PHYSICAL_DIRECTION); ++ SetFlagItem(CURSOR_WARP); ++ SetFlagItem(WINDOW_POSITION); ++ SetFlagItem(PRIMARY_CLIPBOARD); ++ SetFlagItem(GPU_FRONT_BUFFER_READ); ++ SetFlagItem(CLIPBOARD_IMAGES); ++ SetFlagItem(DESKTOP_SAMPLE); ++ SetFlagItem(INPUT_IME); ++ SetFlagItem(TRACKPAD_PHYSICAL_DIRECTION); + + #undef SetFlagItem ++ PyObject_SetAttr(self, py_id_capabilities, result); ++ break; ++ } ++ case 0: ++ BLI_assert(result != nullptr); ++ break; ++ default: ++ /* Unlikely, but there may be an error, forward it. */ ++ BLI_assert(result == nullptr); ++ break; ++ } + +- _PyObject_SetAttrId(self, &PyId_capabilities, result); ++ Py_DECREF(py_id_capabilities); + return result; + } + +diff --git a/source/blender/python/intern/bpy_driver.cc b/source/blender/python/intern/bpy_driver.cc +index b32bfbc2a56..e589f0992e1 100644 +--- a/source/blender/python/intern/bpy_driver.cc ++++ b/source/blender/python/intern/bpy_driver.cc +@@ -43,6 +43,13 @@ + # include <opcode.h> + #endif + ++#if PY_VERSION_HEX >= 0x030d0000 /* >=3.13 */ ++/* WARNING(@ideasman42): Using `Py_BUILD_CORE` is a last resort, ++ * the alternative would be not to inspect OP-CODES at all. */ ++# define Py_BUILD_CORE ++# include <internal/pycore_code.h> ++#endif ++ + PyObject *bpy_pydriver_Dict = nullptr; + + #ifdef USE_BYTECODE_WHITELIST +@@ -375,7 +382,35 @@ static bool is_opcode_secure(const int opcode) + OK_OP(LOAD_CONST) /* Ok because constants are accepted. */ + OK_OP(LOAD_NAME) /* Ok, because `PyCodeObject.names` is checked. */ + OK_OP(CALL) /* Ok, because we check its "name" before calling. */ +- OK_OP(KW_NAMES) /* Ok, because it's used for calling functions with keyword arguments. */ ++# if PY_VERSION_HEX >= 0x030d0000 ++ OK_OP(CALL_KW) /* Ok, because it's used for calling functions with keyword arguments. */ ++ ++ OK_OP(CALL_FUNCTION_EX); ++ ++ /* OK because the names are checked. */ ++ OK_OP(CALL_ALLOC_AND_ENTER_INIT) ++ OK_OP(CALL_BOUND_METHOD_EXACT_ARGS) ++ OK_OP(CALL_BOUND_METHOD_GENERAL) ++ OK_OP(CALL_BUILTIN_CLASS) ++ OK_OP(CALL_BUILTIN_FAST) ++ OK_OP(CALL_BUILTIN_FAST_WITH_KEYWORDS) ++ OK_OP(CALL_BUILTIN_O) ++ OK_OP(CALL_ISINSTANCE) ++ OK_OP(CALL_LEN) ++ OK_OP(CALL_LIST_APPEND) ++ OK_OP(CALL_METHOD_DESCRIPTOR_FAST) ++ OK_OP(CALL_METHOD_DESCRIPTOR_FAST_WITH_KEYWORDS) ++ OK_OP(CALL_METHOD_DESCRIPTOR_NOARGS) ++ OK_OP(CALL_METHOD_DESCRIPTOR_O) ++ OK_OP(CALL_NON_PY_GENERAL) ++ OK_OP(CALL_PY_EXACT_ARGS) ++ OK_OP(CALL_PY_GENERAL) ++ OK_OP(CALL_STR_1) ++ OK_OP(CALL_TUPLE_1) ++ OK_OP(CALL_TYPE_1) ++# else ++ OK_OP(KW_NAMES) /* Ok, because it's used for calling functions with keyword arguments. */ ++# endif + + # if PY_VERSION_HEX < 0x030c0000 + OK_OP(PRECALL) /* Ok, because it's used for calling. */ +diff --git a/source/blender/python/intern/bpy_library_write.cc b/source/blender/python/intern/bpy_library_write.cc +index d1c0b32ac07..59bf476427f 100644 +--- a/source/blender/python/intern/bpy_library_write.cc ++++ b/source/blender/python/intern/bpy_library_write.cc +@@ -136,20 +136,25 @@ static PyObject *bpy_lib_write(BPy_PropertyRNA *self, PyObject *args, PyObject * + PartialWriteContext::IDAddOperations::ADD_DEPENDENCIES | + (use_fake_user ? PartialWriteContext::IDAddOperations::SET_FAKE_USER : 0))}; + +- Py_ssize_t pos, hash; +- PyObject *key; +- ID *id = nullptr; +- +- pos = hash = 0; +- while (_PySet_NextEntry(datablocks, &pos, &key, &hash)) { +- if (!pyrna_id_FromPyObject(key, &id)) { +- PyErr_Format(PyExc_TypeError, "Expected an ID type, not %.200s", Py_TYPE(key)->tp_name); +- return nullptr; +- } +- else { ++ if (PySet_GET_SIZE(datablocks) > 0) { ++ PyObject *it = PyObject_GetIter(datablocks); ++ PyObject *key; ++ while ((key = PyIter_Next(it))) { ++ /* Borrow from the set. */ ++ Py_DECREF(key); ++ ID *id; ++ if (!pyrna_id_FromPyObject(key, &id)) { ++ PyErr_Format(PyExc_TypeError, "Expected an ID type, not %.200s", Py_TYPE(key)->tp_name); ++ break; ++ } + partial_write_ctx.id_add(id, add_options, nullptr); + } ++ Py_DECREF(it); ++ if (key) { ++ return nullptr; ++ } + } ++ + BLI_assert(partial_write_ctx.is_valid()); + + /* write blend */ +diff --git a/source/blender/python/intern/bpy_rna.cc b/source/blender/python/intern/bpy_rna.cc +index eb365bf0238..a9cb115f57e 100644 +--- a/source/blender/python/intern/bpy_rna.cc ++++ b/source/blender/python/intern/bpy_rna.cc +@@ -8639,7 +8639,7 @@ static int bpy_class_validate_recursive(PointerRNA *dummy_ptr, + continue; + } + +- /* TODO(@ideasman42): Use Python3.7x _PyObject_LookupAttr(), also in the macro below. */ ++ /* TODO(@ideasman42): Use #PyObject_GetOptionalAttr(), also in the macro below. */ + identifier = RNA_property_identifier(prop); + item = PyObject_GetAttrString(py_class, identifier); + +@@ -9263,7 +9263,7 @@ static PyObject *pyrna_register_class(PyObject * /*self*/, PyObject *py_class) + + /* Call classed register method. + * Note that zero falls through, no attribute, no error. */ +- switch (_PyObject_LookupAttr(py_class, bpy_intern_str_register, &py_cls_meth)) { ++ switch (PyObject_GetOptionalAttr(py_class, bpy_intern_str_register, &py_cls_meth)) { + case 1: { + PyObject *ret = PyObject_CallObject(py_cls_meth, nullptr); + Py_DECREF(py_cls_meth); +@@ -9378,7 +9378,7 @@ static PyObject *pyrna_unregister_class(PyObject * /*self*/, PyObject *py_class) + + /* Call classed unregister method. + * Note that zero falls through, no attribute, no error. */ +- switch (_PyObject_LookupAttr(py_class, bpy_intern_str_unregister, &py_cls_meth)) { ++ switch (PyObject_GetOptionalAttr(py_class, bpy_intern_str_unregister, &py_cls_meth)) { + case 1: { + PyObject *ret = PyObject_CallObject(py_cls_meth, nullptr); + Py_DECREF(py_cls_meth); diff --git a/media-gfx/blender/files/blender-4.3.2-openvdb-12.patch b/media-gfx/blender/files/blender-4.3.2-openvdb-12.patch new file mode 100644 index 000000000000..02cca15f7c94 --- /dev/null +++ b/media-gfx/blender/files/blender-4.3.2-openvdb-12.patch @@ -0,0 +1,76 @@ +https://projects.blender.org/blender/blender/pulls/131833 +From 91412f2a28db69ac2a73c1bc646e350063d8ddd5 Mon Sep 17 00:00:00 2001 +From: Brecht Van Lommel <brecht@blender.org> +Date: Fri, 13 Dec 2024 04:29:29 +0100 +Subject: [PATCH] Cycles: Support building with OpenVDB 12 + +--- + intern/cycles/scene/image_vdb.cpp | 20 +++++++++++++++----- + intern/cycles/scene/image_vdb.h | 8 +++++++- + 2 files changed, 22 insertions(+), 6 deletions(-) + +diff --git a/intern/cycles/scene/image_vdb.cpp b/intern/cycles/scene/image_vdb.cpp +index d94a7973adc..42964fac81d 100644 +--- a/intern/cycles/scene/image_vdb.cpp ++++ b/intern/cycles/scene/image_vdb.cpp +@@ -55,23 +55,33 @@ struct ToNanoOp { + try { + # if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \ + (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 6) ++# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \ ++ (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 7) ++ /* OpenVDB 12. */ ++ using nanovdb::tools::createNanoGrid; ++ using nanovdb::tools::StatsMode; ++# else + /* OpenVDB 11. */ ++ using nanovdb::createNanoGrid; ++ using nanovdb::StatsMode; ++# endif ++ + if constexpr (std::is_same_v<FloatGridType, openvdb::FloatGrid>) { + openvdb::FloatGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid)); + if (precision == 0) { +- nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, nanovdb::FpN>(floatgrid); ++ nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::FpN>(floatgrid); + } + else if (precision == 16) { +- nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, nanovdb::Fp16>(floatgrid); ++ nanogrid = createNanoGrid<openvdb::FloatGrid, nanovdb::Fp16>(floatgrid); + } + else { +- nanogrid = nanovdb::createNanoGrid<openvdb::FloatGrid, float>(floatgrid); ++ nanogrid = createNanoGrid<openvdb::FloatGrid, float>(floatgrid); + } + } + else if constexpr (std::is_same_v<FloatGridType, openvdb::Vec3fGrid>) { + openvdb::Vec3fGrid floatgrid(*openvdb::gridConstPtrCast<GridType>(grid)); +- nanogrid = nanovdb::createNanoGrid<openvdb::Vec3fGrid, nanovdb::Vec3f>( +- floatgrid, nanovdb::StatsMode::Disable); ++ nanogrid = createNanoGrid<openvdb::Vec3fGrid, nanovdb::Vec3f>(floatgrid, ++ StatsMode::Disable); + } + # else + /* OpenVDB 10. */ +diff --git a/intern/cycles/scene/image_vdb.h b/intern/cycles/scene/image_vdb.h +index 49853cf3753..e0af9b87db1 100644 +--- a/intern/cycles/scene/image_vdb.h ++++ b/intern/cycles/scene/image_vdb.h +@@ -9,7 +9,13 @@ + # include <openvdb/openvdb.h> + #endif + #ifdef WITH_NANOVDB +-# include <nanovdb/util/GridHandle.h> ++# include <nanovdb/NanoVDB.h> ++# if NANOVDB_MAJOR_VERSION_NUMBER > 32 || \ ++ (NANOVDB_MAJOR_VERSION_NUMBER == 32 && NANOVDB_MINOR_VERSION_NUMBER >= 7) ++# include <nanovdb/GridHandle.h> ++# else ++# include <nanovdb/util/GridHandle.h> ++# endif + #endif + + #include "scene/image.h" +-- +2.45.2 + diff --git a/media-gfx/blender/files/blender-4.3.2-optix-8.1.0.patch b/media-gfx/blender/files/blender-4.3.2-optix-8.1.0.patch new file mode 100644 index 000000000000..092c30db2bc5 --- /dev/null +++ b/media-gfx/blender/files/blender-4.3.2-optix-8.1.0.patch @@ -0,0 +1,34 @@ +From 7ce8dbf5f82af7c80890d18b27e1d9df6009d5b4 Mon Sep 17 00:00:00 2001 +From: Patrick Mours <pmours@nvidia.com> +Date: Mon, 18 Nov 2024 13:16:41 +0100 +Subject: [PATCH] Change OptiX function table name for OptiX 8.1 support + +--- + intern/cycles/device/optix/device.cpp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/intern/cycles/device/optix/device.cpp b/intern/cycles/device/optix/device.cpp +index 60a1dbfe4e3..c8608ab5d75 100644 +--- a/intern/cycles/device/optix/device.cpp ++++ b/intern/cycles/device/optix/device.cpp +@@ -21,12 +21,16 @@ + # include <optix_function_table_definition.h> + #endif + ++#ifndef OPTIX_FUNCTION_TABLE_SYMBOL ++# define OPTIX_FUNCTION_TABLE_SYMBOL g_optixFunctionTable ++#endif ++ + CCL_NAMESPACE_BEGIN + + bool device_optix_init() + { + #ifdef WITH_OPTIX +- if (g_optixFunctionTable.optixDeviceContextCreate != NULL) { ++ if (OPTIX_FUNCTION_TABLE_SYMBOL.optixDeviceContextCreate != NULL) { + /* Already initialized function table. */ + return true; + } +-- +2.47.2 + diff --git a/media-gfx/blender/files/blender-4.3.2-system-glog.patch b/media-gfx/blender/files/blender-4.3.2-system-glog.patch new file mode 100644 index 000000000000..9bf54f0e7bd5 --- /dev/null +++ b/media-gfx/blender/files/blender-4.3.2-system-glog.patch @@ -0,0 +1,79 @@ +From 6284e504b144619411ac41092d53fc8541c84cdb Mon Sep 17 00:00:00 2001 +From: Paul Zander <negril.nx@gmail.com> +Date: Tue, 15 Apr 2025 13:48:00 +0200 +Subject: [PATCH] system glog + +Signed-off-by: Paul Zander <negril.nx@gmail.com> + +diff --git a/extern/CMakeLists.txt b/extern/CMakeLists.txt +index 418d2255a75..6b5cd31f9b7 100644 +--- a/extern/CMakeLists.txt ++++ b/extern/CMakeLists.txt +@@ -77,7 +77,9 @@ if(WITH_LIBMV OR WITH_GTESTS OR (WITH_CYCLES AND WITH_CYCLES_LOGGING)) + if(NOT WITH_SYSTEM_GFLAGS) + add_subdirectory(gflags) + endif() +- add_subdirectory(glog) ++ if(NOT WITH_SYSTEM_GLOG) ++ add_subdirectory(glog) ++ endif() + endif() + + if(WITH_GTESTS) +diff --git a/intern/libmv/CMakeLists.txt b/intern/libmv/CMakeLists.txt +index 965d0028020..825c2141f5a 100644 +--- a/intern/libmv/CMakeLists.txt ++++ b/intern/libmv/CMakeLists.txt +@@ -34,6 +34,8 @@ if(WITH_LIBMV) + ${GLOG_INCLUDE_DIRS} + ../guardedalloc + ) ++ ++ list(REMOVE_DUPLICATES INC) + + list(APPEND INC_SYS + ${EIGEN3_INCLUDE_DIRS} +diff --git a/tests/gtests/testing/CMakeLists.txt b/tests/gtests/testing/CMakeLists.txt +index ff7f6905836..d46b1d65174 100644 +--- a/tests/gtests/testing/CMakeLists.txt ++++ b/tests/gtests/testing/CMakeLists.txt +@@ -13,6 +13,8 @@ set(INC + ${GFLAGS_INCLUDE_DIRS} + ../../../extern/gtest/include + ) ++ ++list(REMOVE_DUPLICATES INC) + + set(INC_SYS + ) +-- +2.49.0 + +From 0547b825d9ab0b7c89a41eb4000f0d2892c17d85 Mon Sep 17 00:00:00 2001 +From: Paul Zander <negril.nx@gmail.com> +Date: Tue, 29 Apr 2025 18:22:53 +0200 +Subject: [PATCH] fix-system-glog + +Signed-off-by: Paul Zander <negril.nx@gmail.com> + +diff --git a/intern/cycles/util/CMakeLists.txt b/intern/cycles/util/CMakeLists.txt +index fe28dfd66ce..03c17167269 100644 +--- a/intern/cycles/util/CMakeLists.txt ++++ b/intern/cycles/util/CMakeLists.txt +@@ -130,6 +130,13 @@ if(CXX_HAS_AVX2) + set_source_files_properties(transform_avx2.cpp PROPERTIES COMPILE_FLAGS "${CYCLES_AVX2_FLAGS}") + endif() + ++if(WITH_CYCLES_LOGGING) ++ list(APPEND LIB ++ ${GLOG_LIBRARIES} ++ ${GFLAGS_LIBRARIES} ++ ) ++endif() ++ + include_directories(${INC}) + include_directories(SYSTEM ${INC_SYS}) + +-- +2.49.0 + diff --git a/media-gfx/blender/files/blender-4.4.0-optix-compile-flags.patch b/media-gfx/blender/files/blender-4.4.0-optix-compile-flags.patch new file mode 100644 index 000000000000..4fd1c20839cc --- /dev/null +++ b/media-gfx/blender/files/blender-4.4.0-optix-compile-flags.patch @@ -0,0 +1,40 @@ +From 6e8072c20d37f2ba4b0eaded448d21ffa6f073a1 Mon Sep 17 00:00:00 2001 +From: Paul Zander <negril.nx@gmail.com> +Date: Mon, 21 Apr 2025 17:49:59 +0200 +Subject: [PATCH] optix compile flags + +Copy CUDA_HOST_COMPILER logic from cuda to optix + +pass CUDA_NVCC_FLAGS into the custom nvcc call for optix, as for +WITH_CYCLES_CUDA_BINARIES + +Signed-off-by: Paul Zander <negril.nx+gentoo@gmail.com> +Signed-off-by: Paul Zander <negril.nx@gmail.com> + +diff --git a/intern/cycles/kernel/CMakeLists.txt b/intern/cycles/kernel/CMakeLists.txt +index 6144de7be33..a59d6dd2b7e 100644 +--- a/intern/cycles/kernel/CMakeLists.txt ++++ b/intern/cycles/kernel/CMakeLists.txt +@@ -943,6 +943,11 @@ if(WITH_CYCLES_DEVICE_OPTIX AND WITH_CYCLES_CUDA_BINARIES) + -Wno-deprecated-gpu-targets + -o ${output}) + ++ if(CUDA_HOST_COMPILER) ++ set(cuda_flags ${cuda_flags} ++ -ccbin="${CUDA_HOST_COMPILER}") ++ endif() ++ + if(WITH_NANOVDB) + set(cuda_flags ${cuda_flags} + -D WITH_NANOVDB) +@@ -970,6 +975,7 @@ if(WITH_CYCLES_DEVICE_OPTIX AND WITH_CYCLES_CUDA_BINARIES) + ${CUDA_NVCC_EXECUTABLE} + --ptx + -arch=sm_50 ++ ${CUDA_NVCC_FLAGS} + ${cuda_flags} + ${input} + WORKING_DIRECTORY +-- +2.49.0 + diff --git a/media-gfx/blender/metadata.xml b/media-gfx/blender/metadata.xml index 927ab93cc1a5..0452fbb36970 100644 --- a/media-gfx/blender/metadata.xml +++ b/media-gfx/blender/metadata.xml @@ -44,18 +44,18 @@ This makes it so that the user doesn't have to wait for the kernels to compile when they are used for the first time in Blender. If this option is not on, they will be built as needed at runtime. </flag> - <flag name="dds"> - Adds DDS textures support to Blender. - </flag> <flag name="embree"> Use embree to accelerate certain areas of the Cycles render engine. </flag> <flag name="experimental"> - Build Experimental Blender Modules + Enable experimental features </flag> <flag name="fluid"> Adds fluid simulation support via the built-in Mantaflow library. </flag> + <flag name="manifold"> + Enable Manifold render backend via <pkg>sci-mathematics/manifold</pkg> + </flag> <flag name="nanovdb"> Enable nanoVDB support in Cycles. Uses less memory than regular openVDB when rendering. </flag> @@ -63,7 +63,7 @@ Enable NDOF input devices (SpaceNavigator and friends). </flag> <flag name="oidn">Enable OpenImageDenoiser Support</flag> - <flag name="oneapi">Build OIDN with Intel oneAPI SyCL support</flag> + <flag name="oneapi">Build cycles renderer with Intel oneAPI SyCL support</flag> <flag name="openpgl">Enable path guiding support in Cycles</flag> <flag name="opensubdiv"> Add rendering support form OpenSubdiv from Dreamworks Animation @@ -78,6 +78,9 @@ <flag name="osl"> Add support for OpenShadingLanguage scripting. </flag> + <flag name="pipewire"> + Enable Pipewire for audio support on Linux + </flag> <flag name="potrace"> Add support for converting bitmaps into Grease pencil line using the potrace library. </flag> |