From 802ac5ba5afc04a2c4bdd72ef52df281d9065824 Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Thu, 21 Dec 2023 19:16:11 +0100 Subject: [PATCH] Build: Library updates for 4.1 Update libraries to match VFX platform 2024, and a few other upgrades to latest versions. boost 1.82.0 deflate 1.18 (new) ffi 3.4.4 freeglut (deleted) ispc 1.12.1 llvm 17.0.6 materialx 1.38.8 mesa 23.3.0 numpy 1.24.3 opencolorio 2.3.0 openexr 3.2.1 openimageio 2.5.6.0 opensubdiv 3.6.0 openvdb 11.0.0 osl 1.13.5.0 (now dynamic) python 3.11.6 sqlite 3.42.0 sse2neon 0d6e9b3dd4 usd 23.11 vulkan 1.3.270 xm2 2.12.3 This only updates the build scripts, the precompiled libraries for each platform will land over the coming weeks. Ref #113157 Co-authored-by: Ray Molenkamp Co-authored-by: Campbell Barton Pull Request: https://projects.blender.org/blender/blender/pulls/116420 --- build_files/build_environment/CMakeLists.txt | 2 +- .../build_environment/cmake/deflate.cmake | 18 + .../build_environment/cmake/download.cmake | 2 +- .../build_environment/cmake/freeglut.cmake | 21 - .../build_environment/cmake/harvest.cmake | 7 +- .../build_environment/cmake/imath.cmake | 1 + .../build_environment/cmake/ispc.cmake | 4 +- .../build_environment/cmake/llvm.cmake | 2 + .../build_environment/cmake/materialx.cmake | 7 +- .../build_environment/cmake/mesa.cmake | 4 +- .../build_environment/cmake/minizipng.cmake | 7 +- .../build_environment/cmake/opencolorio.cmake | 17 +- .../build_environment/cmake/openexr.cmake | 7 +- .../cmake/openimagedenoise.cmake | 8 + .../build_environment/cmake/openimageio.cmake | 5 +- .../build_environment/cmake/opensubdiv.cmake | 15 +- .../build_environment/cmake/openvdb.cmake | 12 +- build_files/build_environment/cmake/osl.cmake | 18 +- .../build_environment/cmake/pybind11.cmake | 1 + .../build_environment/cmake/python.cmake | 34 +- build_files/build_environment/cmake/usd.cmake | 5 - .../build_environment/cmake/versions.cmake | 118 +- .../build_environment/cmake/xml2.cmake | 55 +- .../linux/linux_rocky8_setup.sh | 4 + .../build_environment/patches/imath_358.diff | 21 + .../build_environment/patches/ispc.diff | 33 +- .../build_environment/patches/llvm.diff | 17 +- .../build_environment/patches/materialx.diff | 13 - .../build_environment/patches/oiio_3984.diff | 13 - .../build_environment/patches/oiio_4044.diff | 13 + .../patches/oiio_deadlock.diff | 62 - .../patches/opencolorio.diff | 28 - .../patches/openexr_b18905772e.diff | 1023 ----------------- .../patches/openexr_deflate_1588.diff | 140 +++ .../patches/openimageio.diff | 4 +- .../build_environment/patches/openvdb.diff | 37 - .../patches/openvdb_1706.diff | 81 ++ .../patches/openvdb_1733.diff | 21 + .../build_environment/patches/osl.diff | 95 -- .../patches/pybind11_4761.diff | 113 ++ .../patches/python_apple.diff | 49 + .../patches/python_unix.diff | 86 +- .../patches/python_windows.diff | 25 - .../build_environment/patches/usd.diff | 15 - .../build_environment/patches/usd_hydra.diff | 37 - .../patches/usd_pull_1965.diff | 106 -- .../cmake/platform/platform_apple.cmake | 1 + .../platform/platform_old_libs_update.cmake | 11 +- .../cmake/platform/platform_unix.cmake | 1 + .../cmake/platform/platform_win32.cmake | 20 +- source/blender/imbuf/CMakeLists.txt | 1 + source/creator/CMakeLists.txt | 94 +- 52 files changed, 780 insertions(+), 1754 deletions(-) create mode 100644 build_files/build_environment/cmake/deflate.cmake delete mode 100644 build_files/build_environment/cmake/freeglut.cmake create mode 100644 build_files/build_environment/patches/imath_358.diff delete mode 100644 build_files/build_environment/patches/materialx.diff delete mode 100644 build_files/build_environment/patches/oiio_3984.diff create mode 100644 build_files/build_environment/patches/oiio_4044.diff delete mode 100644 build_files/build_environment/patches/oiio_deadlock.diff delete mode 100644 build_files/build_environment/patches/opencolorio.diff delete mode 100644 build_files/build_environment/patches/openexr_b18905772e.diff create mode 100644 build_files/build_environment/patches/openexr_deflate_1588.diff create mode 100644 build_files/build_environment/patches/openvdb_1706.diff create mode 100644 build_files/build_environment/patches/openvdb_1733.diff create mode 100644 build_files/build_environment/patches/pybind11_4761.diff create mode 100644 build_files/build_environment/patches/python_apple.diff delete mode 100644 build_files/build_environment/patches/usd_hydra.diff delete mode 100644 build_files/build_environment/patches/usd_pull_1965.diff diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 4e3875be070..0c5a1dcd45d 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -54,12 +54,12 @@ include(cmake/png.cmake) include(cmake/jpeg.cmake) include(cmake/blosc.cmake) include(cmake/pthreads.cmake) +include(cmake/deflate.cmake) include(cmake/imath.cmake) include(cmake/openexr.cmake) include(cmake/brotli.cmake) include(cmake/freetype.cmake) include(cmake/epoxy.cmake) -include(cmake/freeglut.cmake) include(cmake/alembic.cmake) include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) diff --git a/build_files/build_environment/cmake/deflate.cmake b/build_files/build_environment/cmake/deflate.cmake new file mode 100644 index 00000000000..ba08652c523 --- /dev/null +++ b/build_files/build_environment/cmake/deflate.cmake @@ -0,0 +1,18 @@ +# SPDX-FileCopyrightText: 2023 Blender Authors +# +# SPDX-License-Identifier: GPL-2.0-or-later + + +set(DEFLATE_EXTRA_ARGS + -DCMAKE_POSITION_INDEPENDENT_CODE=ON +) + +ExternalProject_Add(external_deflate + URL file://${PACKAGE_DIR}/${DEFLATE_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${DEFLATE_HASH_TYPE}=${DEFLATE_HASH} + PREFIX ${BUILD_DIR}/deflate + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/deflate ${DEFAULT_CMAKE_FLAGS} ${DEFLATE_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/deflate +) diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index f1c04ba6ef8..d51a2909f48 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -84,7 +84,6 @@ download_source(PTHREADS) download_source(OPENEXR) download_source(FREETYPE) download_source(EPOXY) -download_source(FREEGLUT) download_source(ALEMBIC) download_source(OPENSUBDIV) download_source(SDL) @@ -178,3 +177,4 @@ download_source(SHADERC_GLSLANG) download_source(VULKAN_HEADERS) download_source(VULKAN_LOADER) download_source(PYBIND11) +download_source(DEFLATE) diff --git a/build_files/build_environment/cmake/freeglut.cmake b/build_files/build_environment/cmake/freeglut.cmake deleted file mode 100644 index d374d0e2a20..00000000000 --- a/build_files/build_environment/cmake/freeglut.cmake +++ /dev/null @@ -1,21 +0,0 @@ -# SPDX-FileCopyrightText: 2012-2022 Blender Authors -# -# SPDX-License-Identifier: GPL-2.0-or-later - -if(WIN32) - if(BUILD_MODE STREQUAL Release) - set(FREEGLUT_EXTRA_ARGS - -DFREEGLUT_BUILD_SHARED_LIBS=Off - -DFREEGLUT_BUILD_STATIC_LIBS=On - ) - - ExternalProject_Add(external_freeglut - URL file://${PACKAGE_DIR}/${FREEGLUT_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${FREEGLUT_HASH_TYPE}=${FREEGLUT_HASH} - PREFIX ${BUILD_DIR}/freeglut - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/freeglut ${DEFAULT_C_FLAGS} ${DEFAULT_CXX_FLAGS} ${FREEGLUT_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/freeglut - ) - endif() -endif() diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index 9ece4f6d870..21008a40459 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -21,10 +21,6 @@ if(WIN32) # PNG. ${CMAKE_COMMAND} -E copy ${LIBDIR}/png/lib/libpng16_static.lib ${HARVEST_TARGET}/png/lib/libpng.lib && ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/png/include/ ${HARVEST_TARGET}/png/include/ && - # FREEGLUT -> OPENGL. - ${CMAKE_COMMAND} -E copy ${LIBDIR}/freeglut/lib/freeglut_static.lib ${HARVEST_TARGET}/opengl/lib/freeglut_static.lib && - ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/freeglut/include/ ${HARVEST_TARGET}/opengl/include/ && - DEPENDS ) endif() @@ -249,7 +245,7 @@ else() harvest(xr_openxr_sdk/lib xr_openxr_sdk/lib "*.a") harvest_rpath_bin(osl/bin osl/bin "oslc") harvest(osl/include osl/include "*.h") - harvest(osl/lib osl/lib "*.a") + harvest_rpath_lib(osl/lib osl/lib "*${SHAREDLIBEXT}*") harvest(osl/share/OSL/shaders osl/share/OSL/shaders "*.h") harvest(png/include png/include "*.h") harvest(png/lib png/lib "*.a") @@ -277,6 +273,7 @@ else() harvest(webp/lib webp/lib "*.a") harvest(webp/include webp/include "*.h") harvest(usd/include usd/include "*.h") + harvest(usd/include usd/include "*.hpp") harvest_rpath_lib(usd/lib usd/lib "libusd_ms${SHAREDLIBEXT}") harvest(usd/lib/usd usd/lib/usd "*") harvest_rpath_python( diff --git a/build_files/build_environment/cmake/imath.cmake b/build_files/build_environment/cmake/imath.cmake index 6454f31fef6..c9b101216ec 100644 --- a/build_files/build_environment/cmake/imath.cmake +++ b/build_files/build_environment/cmake/imath.cmake @@ -15,6 +15,7 @@ ExternalProject_Add(external_imath PREFIX ${BUILD_DIR}/imath CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/imath ${DEFAULT_CMAKE_FLAGS} ${IMATH_EXTRA_ARGS} + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/imath/src/external_imath < ${PATCH_DIR}/imath_358.diff INSTALL_DIR ${LIBDIR}/imath ) diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index da680d8fb9f..450fcf65d99 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -39,7 +39,9 @@ set(ISPC_EXTRA_ARGS -DISPC_NO_DUMPS=On -DISPC_INCLUDE_EXAMPLES=Off -DISPC_INCLUDE_TESTS=Off - -DLLVM_ROOT=${LIBDIR}/llvm/lib/cmake/llvm + -DISPC_INCLUDE_RT=Off + -DLLVM_CONFIG_EXECUTABLE=${LIBDIR}/llvm/bin/llvm-config + -DLLVM_DIR=${LIBDIR}/llvm/lib/cmake/llvm/ -DLLVM_LIBRARY_DIR=${LIBDIR}/llvm/lib -DCLANG_EXECUTABLE=${LIBDIR}/llvm/bin/clang -DCLANGPP_EXECUTABLE=${LIBDIR}/llvm/bin/clang++ diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index 75f8c28c4ab..c400ec46d77 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -29,6 +29,8 @@ set(LLVM_EXTRA_ARGS -DLLVM_ENABLE_TERMINFO=OFF -DLLVM_BUILD_LLVM_C_DYLIB=OFF -DLLVM_ENABLE_UNWIND_TABLES=OFF + -DLLVM_ENABLE_ZSTD=OFF + -DLLVM_ENABLE_ZLIB=OFF -DLLVM_ENABLE_PROJECTS=clang${LLVM_BUILD_CLANG_TOOLS_EXTRA} -DPython3_ROOT_DIR=${LIBDIR}/python/ -DPython3_EXECUTABLE=${PYTHON_BINARY} diff --git a/build_files/build_environment/cmake/materialx.cmake b/build_files/build_environment/cmake/materialx.cmake index 15e69ebc056..f0c3f6d8af8 100644 --- a/build_files/build_environment/cmake/materialx.cmake +++ b/build_files/build_environment/cmake/materialx.cmake @@ -11,17 +11,22 @@ set(MATERIALX_EXTRA_ARGS -DMATERIALX_BUILD_SHARED_LIBS=ON -DMATERIALX_BUILD_TESTS=OFF -DCMAKE_DEBUG_POSTFIX=_d + # This policy makes pybind11_ROOT work. + -DCMAKE_POLICY_DEFAULT_CMP0074=NEW -Dpybind11_ROOT=${LIBDIR}/pybind11 -DPython_EXECUTABLE=${PYTHON_BINARY} ) +if(WIN32) + LIST(APPEND MATERIALX_EXTRA_ARGS -DPYTHON_LIBRARIES=${LIBDIR}/python/libs/python${PYTHON_SHORT_VERSION_NO_DOTS}${PYTHON_POSTFIX}.lib) +endif() + ExternalProject_Add(external_materialx URL file://${PACKAGE_DIR}/${MATERIALX_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${MATERIALX_HASH_TYPE}=${MATERIALX_HASH} PREFIX ${BUILD_DIR}/materialx CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} - PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/materialx/src/external_materialx < ${PATCH_DIR}/materialx.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/materialx ${DEFAULT_CMAKE_FLAGS} ${MATERIALX_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/materialx ) diff --git a/build_files/build_environment/cmake/mesa.cmake b/build_files/build_environment/cmake/mesa.cmake index 5e510579562..d7533e3c598 100644 --- a/build_files/build_environment/cmake/mesa.cmake +++ b/build_files/build_environment/cmake/mesa.cmake @@ -22,14 +22,14 @@ set(MESA_EXTRA_FLAGS -Dcpp_args=${MESA_CXXFLAGS} -Dc_link_args=${MESA_LDFLAGS} -Dcpp_link_args=${MESA_LDFLAGS} - -Dglx=gallium-xlib + -Dglx=xlib -Dgallium-drivers=swrast - -Ddri-drivers= -Dvulkan-drivers= -Dgbm=disabled -Degl=disabled -Dgles1=disabled -Dgles2=disabled + -Dcpp_rtti=false -Dshared-llvm=disabled # Without this, the build fails when: `wayland-scanner` is not found. # At some point we will likely want to support Wayland. diff --git a/build_files/build_environment/cmake/minizipng.cmake b/build_files/build_environment/cmake/minizipng.cmake index 8eb3073248a..f9116eef7e4 100644 --- a/build_files/build_environment/cmake/minizipng.cmake +++ b/build_files/build_environment/cmake/minizipng.cmake @@ -3,6 +3,8 @@ # SPDX-License-Identifier: GPL-2.0-or-later set(MINIZIPNG_EXTRA_ARGS + # Disable most compression methods like OpenColorIO does, enabling + # more is not needed and will give link errors. -DMZ_FETCH_LIBS=OFF -DMZ_LIBCOMP=OFF -DMZ_PKCRYPT=OFF @@ -11,10 +13,11 @@ set(MINIZIPNG_EXTRA_ARGS -DMZ_SIGNING=OFF -DMZ_LZMA=OFF -DMZ_ZSTD=OFF + -DMZ_BZIP2=OFF + -DMZ_ICONV=OFF + -DMZ_ZLIB=ON -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ - -DBZIP2_LIBRARY=${LIBDIR}/bzip2/lib/${LIBPREFIX}bz2${LIBEXT} - -DBZIP2_INCLUDE_DIR=${LIBDIR}/bzip2/include/ # Because OCIO hardcodes a non standard include path -DCMAKE_INSTALL_INCLUDEDIR=${LIBDIR}/minizipng/include/minizip-ng ) diff --git a/build_files/build_environment/cmake/opencolorio.cmake b/build_files/build_environment/cmake/opencolorio.cmake index e9d92c2b535..d2ffbd82338 100644 --- a/build_files/build_environment/cmake/opencolorio.cmake +++ b/build_files/build_environment/cmake/opencolorio.cmake @@ -11,7 +11,7 @@ set(OPENCOLORIO_EXTRA_ARGS -DOCIO_BUILD_DOCS=OFF -DOCIO_BUILD_TESTS=OFF -DOCIO_BUILD_GPU_TESTS=OFF - -DOCIO_USE_SSE=ON + -DOCIO_USE_SIMD=ON -DOCIO_INSTALL_EXT_PACKAGES=NONE @@ -21,7 +21,7 @@ set(OPENCOLORIO_EXTRA_ARGS -Dpystring_ROOT=${LIBDIR}/pystring -DImath_ROOT=${LIBDIR}/imath -Dminizip-ng_ROOT=${LIBDIR}/minizipng - -Dminizip-ng_INCLUDE_DIR=${LIBDIR}/minizipng/include + -Dminizip-ng_INCLUDE_DIR=${LIBDIR}/minizipng/include/minizip-ng -Dminizip-ng_LIBRARY=${LIBDIR}/minizipng/lib/libminizip${LIBEXT} -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ @@ -30,14 +30,10 @@ set(OPENCOLORIO_EXTRA_ARGS ) if(APPLE) + # Work around issue where minizip-ng_LIBRARY assumes -ng in file name. set(OPENCOLORIO_EXTRA_ARGS ${OPENCOLORIO_EXTRA_ARGS} - "-DCMAKE_SHARED_LINKER_FLAGS=-liconv ${LIBDIR}/bzip2/lib/${LIBPREFIX}bz2${LIBEXT}" - ) -elseif(UNIX) - set(OPENCOLORIO_EXTRA_ARGS - ${OPENCOLORIO_EXTRA_ARGS} - "-DCMAKE_SHARED_LINKER_FLAGS=${LIBDIR}/bzip2/lib/${LIBPREFIX}bz2${LIBEXT}" + -Dminizip_LIBRARY=${LIBDIR}/minizipng/lib/libminizip${LIBEXT} ) endif() @@ -72,7 +68,6 @@ ExternalProject_Add(external_opencolorio URL_HASH ${OPENCOLORIO_HASH_TYPE}=${OPENCOLORIO_HASH} CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/opencolorio - PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/opencolorio/src/external_opencolorio < ${PATCH_DIR}/opencolorio.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opencolorio ${DEFAULT_CMAKE_FLAGS} ${OPENCOLORIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opencolorio ) @@ -93,14 +88,14 @@ if(WIN32) if(BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_opencolorio after_install COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/include ${HARVEST_TARGET}/opencolorio/include - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_2_2.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_2_2.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_2_3.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_2_3.dll COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib ${HARVEST_TARGET}/opencolorio/lib DEPENDEES install ) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_opencolorio after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_d_2_2.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_d_2_2.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/bin/OpenColorIO_d_2_3.dll ${HARVEST_TARGET}/opencolorio/bin/OpenColorIO_d_2_3.dll COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/opencolorio/lib/Opencolorio_d.lib ${HARVEST_TARGET}/opencolorio/lib/OpenColorIO_d.lib COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/opencolorio/lib/site-packages ${HARVEST_TARGET}/opencolorio/lib/site-packages-debug DEPENDEES install diff --git a/build_files/build_environment/cmake/openexr.cmake b/build_files/build_environment/cmake/openexr.cmake index 9a3caecb4fe..32787cde37c 100644 --- a/build_files/build_environment/cmake/openexr.cmake +++ b/build_files/build_environment/cmake/openexr.cmake @@ -14,8 +14,6 @@ endif() set(OPENEXR_EXTRA_ARGS ${OPENEXR_EXTRA_ARGS} - -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} - -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ -DBUILD_TESTING=OFF -DOPENEXR_BUILD_BOTH_STATIC_SHARED=OFF -DBUILD_SHARED_LIBS=ON @@ -23,13 +21,14 @@ set(OPENEXR_EXTRA_ARGS -DOPENEXR_INSTALL_EXAMPLES=OFF -DImath_DIR=${LIBDIR}/imath/lib/cmake/Imath -DOPENEXR_LIB_SUFFIX=${OPENEXR_VERSION_BUILD_POSTFIX} + -Dlibdeflate_DIR=${LIBDIR}/deflate/lib/cmake/libdeflate ) ExternalProject_Add(external_openexr URL file://${PACKAGE_DIR}/${OPENEXR_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENEXR_HASH_TYPE}=${OPENEXR_HASH} - PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openexr/src/external_openexr < ${PATCH_DIR}/openexr_b18905772e.diff + PATCH_COMMAND ${PATCH_CMD} -p 2 -d ${BUILD_DIR}/openexr/src/external_openexr < ${PATCH_DIR}/openexr_deflate_1588.diff CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/openexr CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openexr ${DEFAULT_CMAKE_FLAGS} ${OPENEXR_EXTRA_ARGS} @@ -51,6 +50,6 @@ endif() add_dependencies( external_openexr - external_zlib external_imath + external_deflate ) diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index 04d5b848aeb..5adeb4e2b0f 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -64,6 +64,14 @@ add_dependencies( external_python ) +if(UNIX AND NOT APPLE) + add_dependencies( + external_openimagedenoise + external_dpcpp + external_ocloc + ) +endif() + if(BUILD_MODE STREQUAL Release AND WIN32) ExternalProject_Add_Step(external_openimagedenoise after_install COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openimagedenoise/bin ${HARVEST_TARGET}/openimagedenoise/bin diff --git a/build_files/build_environment/cmake/openimageio.cmake b/build_files/build_environment/cmake/openimageio.cmake index 9b9cc9bbd5f..6638d24c565 100644 --- a/build_files/build_environment/cmake/openimageio.cmake +++ b/build_files/build_environment/cmake/openimageio.cmake @@ -109,9 +109,8 @@ ExternalProject_Add(external_openimageio CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/openimageio PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/openimageio.diff && - ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_deadlock.diff && - ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_3984.diff && - ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_webp.diff + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_webp.diff && + ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/openimageio/src/external_openimageio/ < ${PATCH_DIR}/oiio_4044.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/openimageio ${DEFAULT_CMAKE_FLAGS} ${OPENIMAGEIO_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/openimageio ) diff --git a/build_files/build_environment/cmake/opensubdiv.cmake b/build_files/build_environment/cmake/opensubdiv.cmake index a05e61c3c1e..4d5eff38211 100644 --- a/build_files/build_environment/cmake/opensubdiv.cmake +++ b/build_files/build_environment/cmake/opensubdiv.cmake @@ -22,26 +22,15 @@ set(OPENSUBDIV_EXTRA_ARGS -DNO_GLEW=ON -DNO_GLFW=ON -DNO_GLFW_X11=ON + -DTBB_DIR=${LIBDIR}/tbb/lib/cmake/tbb ) -if(WIN32) - set(OPENSUBDIV_EXTRA_ARGS - ${OPENSUBDIV_EXTRA_ARGS} - -DTBB_INCLUDE_DIR=${LIBDIR}/tbb/include - -DTBB_LIBRARIES=${LIBDIR}/tbb/lib/tbb.lib - ) -else() - set(OPENSUBDIV_EXTRA_ARGS - ${OPENSUBDIV_EXTRA_ARGS} - -DTBB_LOCATION=${LIBDIR}/tbb - ) -endif() - ExternalProject_Add(external_opensubdiv URL file://${PACKAGE_DIR}/${OPENSUBDIV_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} URL_HASH ${OPENSUBDIV_HASH_TYPE}=${OPENSUBDIV_HASH} PREFIX ${BUILD_DIR}/opensubdiv + CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/opensubdiv -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${OPENSUBDIV_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/opensubdiv ) diff --git a/build_files/build_environment/cmake/openvdb.cmake b/build_files/build_environment/cmake/openvdb.cmake index 5d213076fab..864e4bbe695 100644 --- a/build_files/build_environment/cmake/openvdb.cmake +++ b/build_files/build_environment/cmake/openvdb.cmake @@ -37,6 +37,7 @@ set(OPENVDB_EXTRA_ARGS -DOPENVDB_PYTHON_WRAP_ALL_GRID_TYPES=ON -DUSE_NUMPY=ON -DPython_EXECUTABLE=${PYTHON_BINARY} + -Dpybind11_DIR=${LIBDIR}/pybind11/share/cmake/pybind11 # OPENVDB_AX Disabled for now as it adds ~25MB distribution wise # with no blender code depending on it, seems wasteful. @@ -46,7 +47,11 @@ set(OPENVDB_EXTRA_ARGS # -DLLVM_DIR=${LIBDIR}/llvm/lib/cmake/llvm ) -set(OPENVDB_PATCH ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff) +set(OPENVDB_PATCH + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb.diff && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_1706.diff && + ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/openvdb/src/openvdb < ${PATCH_DIR}/openvdb_1733.diff +) ExternalProject_Add(openvdb URL file://${PACKAGE_DIR}/${OPENVDB_FILE} @@ -67,6 +72,7 @@ add_dependencies( external_blosc external_python external_numpy + external_pybind11 ) if(WIN32) @@ -75,7 +81,7 @@ if(WIN32) COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/openvdb/include ${HARVEST_TARGET}/openvdb/include COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/openvdb.lib ${HARVEST_TARGET}/openvdb/lib/openvdb.lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/bin/openvdb.dll ${HARVEST_TARGET}/openvdb/bin/openvdb.dll - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb.pyd + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd DEPENDEES install ) endif() @@ -83,7 +89,7 @@ if(WIN32) ExternalProject_Add_Step(openvdb after_install COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/openvdb_d.lib ${HARVEST_TARGET}/openvdb/lib/openvdb_d.lib COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/bin/openvdb_d.dll ${HARVEST_TARGET}/openvdb/bin/openvdb_d.dll - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb_d.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb_d.pyd + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/openvdb/lib/python${PYTHON_SHORT_VERSION}/site-packages/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd ${HARVEST_TARGET}openvdb/python/pyopenvdb_d.cp${PYTHON_SHORT_VERSION_NO_DOTS}-win_amd64.pyd DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/osl.cmake b/build_files/build_environment/cmake/osl.cmake index 759423ca652..d6121bb3146 100644 --- a/build_files/build_environment/cmake/osl.cmake +++ b/build_files/build_environment/cmake/osl.cmake @@ -22,7 +22,7 @@ set(OSL_EXTRA_ARGS -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include/ ${OSL_FLEX_BISON} -DCMAKE_CXX_STANDARD_LIBRARIES=${OSL_CMAKE_CXX_STANDARD_LIBRARIES} - -DBUILD_SHARED_LIBS=OFF + -DBUILD_SHARED_LIBS=ON -DLINKSTATIC=OFF -DOSL_BUILD_PLUGINS=OFF -DSTOP_ON_WARNING=OFF @@ -38,7 +38,9 @@ set(OSL_EXTRA_ARGS -DJPEG_ROOT=${LIBDIR}/jpeg -DUSE_PYTHON=OFF -DImath_ROOT=${LIBDIR}/imath - -DUSE_OIIO_STATIC=OFF + -DCMAKE_DEBUG_POSTFIX=_d + -DPython_ROOT=${LIBDIR}/python + -DPython_EXECUTABLE=${PYTHON_BINARY} ) ExternalProject_Add(external_osl @@ -83,10 +85,14 @@ if(WIN32) endif() if(BUILD_MODE STREQUAL Debug) ExternalProject_Add_Step(external_osl after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslcomp.lib ${HARVEST_TARGET}/osl/lib/oslcomp_d.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslexec.lib ${HARVEST_TARGET}/osl/lib/oslexec_d.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslquery.lib ${HARVEST_TARGET}/osl/lib/oslquery_d.lib - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslnoise.lib ${HARVEST_TARGET}/osl/lib/oslnoise_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslcomp_d.lib ${HARVEST_TARGET}/osl/lib/oslcomp_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslexec_d.lib ${HARVEST_TARGET}/osl/lib/oslexec_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslquery_d.lib ${HARVEST_TARGET}/osl/lib/oslquery_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/lib/oslnoise_d.lib ${HARVEST_TARGET}/osl/lib/oslnoise_d.lib + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslcomp_d.dll ${HARVEST_TARGET}/osl/bin/oslcomp_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslexec_d.dll ${HARVEST_TARGET}/osl/bin/oslexec_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslquery_d.dll ${HARVEST_TARGET}/osl/bin/oslquery_d.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/osl/bin/oslnoise_d.dll ${HARVEST_TARGET}/osl/bin/oslnoise_d.dll DEPENDEES install ) endif() diff --git a/build_files/build_environment/cmake/pybind11.cmake b/build_files/build_environment/cmake/pybind11.cmake index ffde1d07abd..5167861e86c 100644 --- a/build_files/build_environment/cmake/pybind11.cmake +++ b/build_files/build_environment/cmake/pybind11.cmake @@ -13,6 +13,7 @@ ExternalProject_Add(external_pybind11 URL_HASH ${PYBIND11_HASH_TYPE}=${PYBIND11_HASH} PREFIX ${BUILD_DIR}/pybind11 CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/pybind11/src/external_pybind11 < ${PATCH_DIR}/pybind11_4761.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/pybind11 ${DEFAULT_CMAKE_FLAGS} ${PYBIND11_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/pybind11 ) diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index 6e729fc6125..f2052f4327d 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -37,7 +37,7 @@ if(WIN32) # regardless of the version actually in there. PATCH_COMMAND mkdir ${PYTHON_EXTERNALS_FOLDER_DOS} && mklink /J ${PYTHON_EXTERNALS_FOLDER_DOS}\\zlib-1.2.13 ${ZLIB_SOURCE_FOLDER_DOS} && - mklink /J ${PYTHON_EXTERNALS_FOLDER_DOS}\\openssl-1.1.1u ${SSL_SOURCE_FOLDER_DOS} && + mklink /J ${PYTHON_EXTERNALS_FOLDER_DOS}\\openssl-3.0.11 ${SSL_SOURCE_FOLDER_DOS} && ${CMAKE_COMMAND} -E copy ${ZLIB_SOURCE_FOLDER}/../external_zlib-build/zconf.h ${PYTHON_EXTERNALS_FOLDER}/zlib-1.2.13/zconf.h && ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_windows.diff CONFIGURE_COMMAND echo "." @@ -79,16 +79,36 @@ else() set(PYTHON_CONFIGURE_ENV ${CONFIGURE_ENV}) endif() set(PYTHON_BINARY ${LIBDIR}/python/bin/python${PYTHON_SHORT_VERSION}) - # Link against zlib statically (Unix). Avoid rpath issues (macOS). - set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_unix.diff) - set(PYTHON_CONFIGURE_EXTRA_ARGS "") - set(PYTHON_CFLAGS "-I${LIBDIR}/sqlite/include -I${LIBDIR}/bzip2/include -I${LIBDIR}/lzma/include -I${LIBDIR}/zlib/include ${PLATFORM_CFLAGS}") - set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/bzip2/lib -L${LIBDIR}/lzma/lib -L${LIBDIR}/zlib/lib ${PLATFORM_LDFLAGS}") + + # Various flags to convince Python to use our own versions of ffi, sqlite, ssl, bzip2, lzma and zlib. + # Using pkg-config is only supported for some, and even then we need to work around issues. + set(PYTHON_CONFIGURE_EXTRA_ARGS --with-openssl=${LIBDIR}/ssl) + set(PYTHON_CFLAGS "${PLATFORM_CFLAGS} ") + # Manually specify some library paths. For ffi there is no other way, for sqlite is needed because + # LIBSQLITE3_LIBS does not work, and ssl because it uses the wrong ssl/lib dir instead of ssl/lib64. + set(PYTHON_LDFLAGS "-L${LIBDIR}/ffi/lib -L${LIBDIR}/sqlite/lib -L${LIBDIR}/ssl/lib -L${LIBDIR}/ssl/lib64 ${PLATFORM_LDFLAGS} ") set(PYTHON_CONFIGURE_EXTRA_ENV export CFLAGS=${PYTHON_CFLAGS} && export CPPFLAGS=${PYTHON_CFLAGS} && export LDFLAGS=${PYTHON_LDFLAGS} && - export PKG_CONFIG_PATH=${LIBDIR}/ffi/lib/pkgconfig:${LIBDIR}/ssl/lib/pkgconfig:${LIBDIR}/ssl/lib64/pkgconfig) + # Use pkg-config for libraries that support it. + export PKG_CONFIG_PATH=${LIBDIR}/ffi/lib/pkgconfig:${LIBDIR}/sqlite/lib/pkgconfig:${LIBDIR}/ssl/lib/pkgconfig:${LIBDIR}/ssl/lib64/pkgconfig + # Use flags documented by ./configure for other libs. + export BZIP2_CFLAGS=-I${LIBDIR}/bzip2/include + export BZIP2_LIBS=${LIBDIR}/bzip2/lib/${LIBPREFIX}bz2${LIBEXT} + export LIBLZMA_CFLAGS=-I${LIBDIR}/lzma/include + export LIBLZMA_LIBS=${LIBDIR}/lzma/lib/${LIBPREFIX}lzma${LIBEXT} + export ZLIB_CFLAGS=-I${LIBDIR}/zlib/include + export ZLIB_LIBS=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} + ) + + # This patch indludes changes to fix missing -lm for sqlite and and fix the order of + # -ldl flags for ssl to avoid link errors. + if(APPLE) + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_apple.diff) + else() + set(PYTHON_PATCH ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_unix.diff) + endif() # NOTE: untested on APPLE so far. if(NOT APPLE) diff --git a/build_files/build_environment/cmake/usd.cmake b/build_files/build_environment/cmake/usd.cmake index eed60e57d5a..1251de4d89d 100644 --- a/build_files/build_environment/cmake/usd.cmake +++ b/build_files/build_environment/cmake/usd.cmake @@ -111,12 +111,7 @@ ExternalProject_Add(external_usd CMAKE_GENERATOR ${PLATFORM_ALT_GENERATOR} PREFIX ${BUILD_DIR}/usd LIST_SEPARATOR ^^ - # usd_pull_1965.diff https://github.com/PixarAnimationStudios/USD/pull/1965 - # usd_hydra.diff - https://github.com/bnagirniak/RPRHydraRenderBlenderAddon/blob/master/usd.diff - # usd_hydra.diff also included the blender changes and usd_pull_1965 and has been edited to remove those sections. PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd.diff && - ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd_pull_1965.diff && - ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd_hydra.diff && ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/usd/src/external_usd < ${PATCH_DIR}/usd_core_profile.diff CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/usd -Wno-dev ${DEFAULT_CMAKE_FLAGS} ${USD_EXTRA_ARGS} INSTALL_DIR ${LIBDIR}/usd diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 39781a0e97f..0af1aca6e5f 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -40,12 +40,12 @@ set(JPEG_HASH_TYPE MD5) set(JPEG_FILE libjpeg-turbo-${JPEG_VERSION}.tar.gz) set(JPEG_CPE "cpe:2.3:a:d.r.commander:libjpeg-turbo:${JPEG_VERSION}:*:*:*:*:*:*:*") -set(BOOST_VERSION 1.80.0) -set(BOOST_VERSION_SHORT 1.80) -set(BOOST_VERSION_NODOTS 1_80_0) -set(BOOST_VERSION_NODOTS_SHORT 1_80) +set(BOOST_VERSION 1.82.0) +set(BOOST_VERSION_SHORT 1.82) +set(BOOST_VERSION_NODOTS 1_82_0) +set(BOOST_VERSION_NODOTS_SHORT 1_82) set(BOOST_URI https://boostorg.jfrog.io/artifactory/main/release/${BOOST_VERSION}/source/boost_${BOOST_VERSION_NODOTS}.tar.gz) -set(BOOST_HASH 077f074743ea7b0cb49c6ed43953ae95) +set(BOOST_HASH f7050f554a65f6a42ece221eaeec1660) set(BOOST_HASH_TYPE MD5) set(BOOST_FILE boost_${BOOST_VERSION_NODOTS}.tar.gz) set(BOOST_CPE "cpe:2.3:a:boost:boost:${BOOST_VERSION}:*:*:*:*:*:*:*") @@ -65,15 +65,21 @@ set(PTHREADS_HASH_TYPE MD5) set(PTHREADS_FILE pthreads4w-code-${PTHREADS_VERSION}.zip) set(PTHREADS_HOMEPAGE https://github.com/fwbuilder/pthreads4w) -set(OPENEXR_VERSION 3.1.7) +set(DEFLATE_VERSION 1.18) +set(DEFLATE_URI https://github.com/ebiggers/libdeflate/archive/refs/tags/v${DEFLATE_VERSION}.tar.gz) +set(DEFLATE_HASH a29d9dd653cbe03f2d5cd83972063f9e) +set(DEFLATE_HASH_TYPE MD5) +set(DEFLATE_FILE libdeflate-v${DEFLATE_VERSION}.tar.gz) + +set(OPENEXR_VERSION 3.2.1) set(OPENEXR_URI https://github.com/AcademySoftwareFoundation/openexr/archive/v${OPENEXR_VERSION}.tar.gz) -set(OPENEXR_HASH ae68f0cb8b30a49c961fa87d31c60394) +set(OPENEXR_HASH 1d5bb07433ec641cf3bb1b519a27ea6f) set(OPENEXR_HASH_TYPE MD5) set(OPENEXR_FILE openexr-${OPENEXR_VERSION}.tar.gz) set(OPENEXR_CPE "cpe:2.3:a:openexr:openexr:${OPENEXR_VERSION}:*:*:*:*:*:*:*") set(IMATH_VERSION 3.1.7) -set(IMATH_URI https://github.com/AcademySoftwareFoundation/Imath/archive/v${OPENEXR_VERSION}.tar.gz) +set(IMATH_URI https://github.com/AcademySoftwareFoundation/Imath/archive/v${IMATH_VERSION}.tar.gz) set(IMATH_HASH 5cedab446ab296c080957c3037c6d097) set(IMATH_HASH_TYPE MD5) set(IMATH_FILE imath-${IMATH_VERSION}.tar.gz) @@ -109,22 +115,15 @@ set(EPOXY_HASH f0730aad115c952e77591fcc805b1dc1) set(EPOXY_HASH_TYPE MD5) set(EPOXY_FILE libepoxy-${EPOXY_VERSION}.tar.gz) -set(FREEGLUT_VERSION 3.0.0) -set(FREEGLUT_URI http://prdownloads.sourceforge.net/freeglut/freeglut/${FREEGLUT_VERSION}/freeglut-${FREEGLUT_VERSION}.tar.gz) -set(FREEGLUT_HASH 90c3ca4dd9d51cf32276bc5344ec9754) -set(FREEGLUT_HASH_TYPE MD5) -set(FREEGLUT_FILE freeglut-${FREEGLUT_VERSION}.tar.gz) -set(FREEGLUT_HOMEPAGE https://freeglut.sourceforge.net/) - set(ALEMBIC_VERSION 1.8.3) set(ALEMBIC_URI https://github.com/alembic/alembic/archive/${ALEMBIC_VERSION}.tar.gz) set(ALEMBIC_HASH 2cd8d6e5a3ac4a014e24a4b04f4fadf9) set(ALEMBIC_HASH_TYPE MD5) set(ALEMBIC_FILE alembic-${ALEMBIC_VERSION}.tar.gz) -set(OPENSUBDIV_VERSION v3_5_0) +set(OPENSUBDIV_VERSION v3_6_0) set(OPENSUBDIV_URI https://github.com/PixarAnimationStudios/OpenSubdiv/archive/${OPENSUBDIV_VERSION}.tar.gz) -set(OPENSUBDIV_HASH 230f5cd2911d6240e58a3773b9c6e5e4) +set(OPENSUBDIV_HASH cd03aaf8890bc0b8550eef62029cabe7) set(OPENSUBDIV_HASH_TYPE MD5) set(OPENSUBDIV_FILE opensubdiv-${OPENSUBDIV_VERSION}.tar.gz) @@ -142,9 +141,9 @@ set(OPENCOLLADA_HASH ee7dae874019fea7be11613d07567493) set(OPENCOLLADA_HASH_TYPE MD5) set(OPENCOLLADA_FILE opencollada-${OPENCOLLADA_VERSION}.tar.gz) -set(OPENCOLORIO_VERSION 2.2.0) +set(OPENCOLORIO_VERSION 2.3.0) set(OPENCOLORIO_URI https://github.com/AcademySoftwareFoundation/OpenColorIO/archive/v${OPENCOLORIO_VERSION}.tar.gz) -set(OPENCOLORIO_HASH d58a5980adba2d89a363100a09daa5f3) +set(OPENCOLORIO_HASH c05f24a516fe82d381c4b0d471e12ad5) set(OPENCOLORIO_HASH_TYPE MD5) set(OPENCOLORIO_FILE OpenColorIO-${OPENCOLORIO_VERSION}.tar.gz) @@ -154,9 +153,9 @@ set(MINIZIPNG_HASH 09dcc8a9def348e1be9659e384c2cd55) set(MINIZIPNG_HASH_TYPE MD5) set(MINIZIPNG_FILE minizip-ng-${MINIZIPNG_VERSION}.tar.gz) -set(LLVM_VERSION 12.0.0) +set(LLVM_VERSION 17.0.6) set(LLVM_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${LLVM_VERSION}/llvm-project-${LLVM_VERSION}.src.tar.xz) -set(LLVM_HASH 5a4fab4d7fc84aefffb118ac2c8a4fc0) +set(LLVM_HASH 62a09d65240a5133f001ace48269dbfc) set(LLVM_HASH_TYPE MD5) set(LLVM_FILE llvm-project-${LLVM_VERSION}.src.tar.xz) set(LLVM_CPE "cpe:2.3:a:llvm:compiler:${LLVM_VERSION}:*:*:*:*:*:*:*") @@ -168,15 +167,15 @@ if(APPLE) set(OPENMP_HASH 6eade16057edbdecb3c4eef9daa2bfcf) else() set(OPENMP_VERSION ${LLVM_VERSION}) - set(OPENMP_HASH ac48ce3e4582ccb82f81ab59eb3fc9dc) + set(OPENMP_HASH 5cc01d151821c546bb4ec6fb03d86c29) endif() set(OPENMP_URI https://github.com/llvm/llvm-project/releases/download/llvmorg-${OPENMP_VERSION}/openmp-${OPENMP_VERSION}.src.tar.xz) set(OPENMP_HASH_TYPE MD5) set(OPENMP_FILE openmp-${OPENMP_VERSION}.src.tar.xz) -set(OPENIMAGEIO_VERSION v2.4.15.0) +set(OPENIMAGEIO_VERSION v2.5.6.0) set(OPENIMAGEIO_URI https://github.com/AcademySoftwareFoundation/OpenImageIO/archive/refs/tags/${OPENIMAGEIO_VERSION}.tar.gz) -set(OPENIMAGEIO_HASH 784391406ee309075a3f82e60a42f023) +set(OPENIMAGEIO_HASH d02db17716a20a71a446bdc6de57bd9c) set(OPENIMAGEIO_HASH_TYPE MD5) set(OPENIMAGEIO_FILE OpenImageIO-${OPENIMAGEIO_VERSION}.tar.gz) @@ -205,12 +204,12 @@ set(TIFF_FILE tiff-${TIFF_VERSION}.tar.gz) set(TIFF_CPE "cpe:2.3:a:libtiff:libtiff:${TIFF_VERSION}:*:*:*:*:*:*:*") set(TIFF_HOMEPAGE http://www.simplesystems.org/libtiff/) -# Recent commit from 1.13.0.2 under development, which includes string table +# Recent commit from 1.13.5.0 under development, which includes string table # changes that make the Cycles OptiX implementation work. Official 1.12 OSL # releases should also build but without OptiX support. -set(OSL_VERSION 1a7670600c8b08c2443a78d03c8c27e9a1149140) +set(OSL_VERSION 3d52f3906b12d38ad0f4b991a8f9ea678171bd28) set(OSL_URI https://github.com/AcademySoftwareFoundation/OpenShadingLanguage/archive/${OSL_VERSION}.tar.gz) -set(OSL_HASH 7b6d6716b05d1addb92a8f47280bf77f) +set(OSL_HASH dfe5d69f48930badc1ad39a4e11e2e98) set(OSL_HASH_TYPE MD5) set(OSL_FILE OpenShadingLanguage-${OSL_VERSION}.tar.gz) @@ -219,11 +218,11 @@ set(OSL_FILE OpenShadingLanguage-${OSL_VERSION}.tar.gz) # BZIP2, FFI, SQLITE and change the versions in this file as well. For compliance # reasons there can be no exceptions to this. -set(PYTHON_VERSION 3.10.13) -set(PYTHON_SHORT_VERSION 3.10) -set(PYTHON_SHORT_VERSION_NO_DOTS 310) +set(PYTHON_VERSION 3.11.6) +set(PYTHON_SHORT_VERSION 3.11) +set(PYTHON_SHORT_VERSION_NO_DOTS 311) set(PYTHON_URI https://www.python.org/ftp/python/${PYTHON_VERSION}/Python-${PYTHON_VERSION}.tar.xz) -set(PYTHON_HASH 8847dc6458d1431d0ae0f55942deeb89) +set(PYTHON_HASH d0c5a1a31efe879723e51addf56dd206) set(PYTHON_HASH_TYPE MD5) set(PYTHON_FILE Python-${PYTHON_VERSION}.tar.xz) set(PYTHON_CPE "cpe:2.3:a:python:python:${PYTHON_VERSION}:-:*:*:*:*:*:*") @@ -237,9 +236,9 @@ set(TBB_HASH_TYPE MD5) set(TBB_FILE oneTBB-${TBB_VERSION}.tar.gz) set(TBB_CPE "cpe:2.3:a:intel:threading_building_blocks:${TBB_YEAR}:*:*:*:*:*:*:*") -set(OPENVDB_VERSION 10.0.0) +set(OPENVDB_VERSION 11.0.0) set(OPENVDB_URI https://github.com/AcademySoftwareFoundation/openvdb/archive/v${OPENVDB_VERSION}.tar.gz) -set(OPENVDB_HASH 64301c737e16b26c8f3085a31e6397e9) +set(OPENVDB_HASH 025f4fc4db58419341a4991f1a16174a) set(OPENVDB_HASH_TYPE MD5) set(OPENVDB_FILE openvdb-${OPENVDB_VERSION}.tar.gz) @@ -273,10 +272,10 @@ set(TOML_VERSION 0.10.2) # Build system for other packages (not used by Blender at run-time). set(MESON_VERSION 0.63.0) -set(NUMPY_VERSION 1.23.5) -set(NUMPY_SHORT_VERSION 1.23) +set(NUMPY_VERSION 1.24.3) +set(NUMPY_SHORT_VERSION 1.24) set(NUMPY_URI https://github.com/numpy/numpy/releases/download/v${NUMPY_VERSION}/numpy-${NUMPY_VERSION}.tar.gz) -set(NUMPY_HASH 8b2692a511a3795f3af8af2cd7566a15) +set(NUMPY_HASH 89e5e2e78407032290ae6acf6dcaea46) set(NUMPY_HASH_TYPE MD5) set(NUMPY_FILE numpy-${NUMPY_VERSION}.tar.gz) set(NUMPY_CPE "cpe:2.3:a:numpy:numpy:${NUMPY_VERSION}:*:*:*:*:*:*:*") @@ -397,9 +396,9 @@ set(JEMALLOC_HASH 3d41fbf006e6ebffd489bdb304d009ae) set(JEMALLOC_HASH_TYPE MD5) set(JEMALLOC_FILE jemalloc-${JEMALLOC_VERSION}.tar.bz2) -set(XML2_VERSION 2.10.4) -set(XML2_URI https://download.gnome.org/sources/libxml2/2.10/libxml2-${XML2_VERSION}.tar.xz) -set(XML2_HASH 76808c467a58c31e2dbd511e71d5fd13) +set(XML2_VERSION 2.12.3) +set(XML2_URI https://download.gnome.org/sources/libxml2/2.12/libxml2-${XML2_VERSION}.tar.xz) +set(XML2_HASH 13871e7cf2137b4b9b9da753ffef538c) set(XML2_HASH_TYPE MD5) set(XML2_FILE libxml2-${XML2_VERSION}.tar.xz) set(XML2_CPE "cpe:2.3:a:xmlsoft:libxml2:${XML2_VERSION}:*:*:*:*:*:*:*") @@ -465,13 +464,12 @@ set(BZIP2_HOMEPAGE https://sourceware.org/bzip2/) # NOTE: This will *HAVE* to match the version python ships on windows which # is hardcoded in pythons PCbuild/get_externals.bat. For compliance reasons there # can be no exceptions to this. -set(FFI_VERSION 3.3) -set(FFI_URI https://sourceware.org/pub/libffi/libffi-${FFI_VERSION}.tar.gz) -set(FFI_HASH 72fba7922703ddfa7a028d513ac15a85c8d54c8d67f55fa5a4802885dc652056) +set(FFI_VERSION 3.4.4) +set(FFI_URI https://github.com/libffi/libffi/releases/download/v${FFI_VERSION}/libffi-${FFI_VERSION}.tar.gz) +set(FFI_HASH d66c56ad259a82cf2a9dfc408b32bf5da52371500b84745f7fb8b645712df676) set(FFI_HASH_TYPE SHA256) set(FFI_FILE libffi-${FFI_VERSION}.tar.gz) set(FFI_CPE "cpe:2.3:a:libffi_project:libffi:${FFI_VERSION}:*:*:*:*:*:*:*") -set(FFI_HOMEPAGE https://sourceware.org/libffi/) set(LZMA_VERSION 5.2.5) set(LZMA_URI https://tukaani.org/xz/xz-${LZMA_VERSION}.tar.bz2) @@ -492,10 +490,10 @@ set(SSL_HOMEPAGE https://www.openssl.org) # Note: This will *HAVE* to match the version python ships on windows which # is hardcoded in pythons PCbuild/get_externals.bat for compliance reasons there # can be no exceptions to this. -set(SQLITE_VERSION 3.40.1) -set(SQLLITE_LONG_VERSION 3400100) -set(SQLITE_URI https://www.sqlite.org/2022/sqlite-autoconf-${SQLLITE_LONG_VERSION}.tar.gz) -set(SQLITE_HASH b8c2d4bc0094f5c0ce985dc0e237dfcbaa1f6275) +set(SQLITE_VERSION 3.42.0) +set(SQLLITE_LONG_VERSION 3420000) +set(SQLITE_URI https://www.sqlite.org/2023/sqlite-autoconf-${SQLLITE_LONG_VERSION}.tar.gz) +set(SQLITE_HASH 036575929b174c1b829769255491ba2b32bda9ee) set(SQLITE_HASH_TYPE SHA1) set(SQLITE_FILE sqlite-autoconf-${SQLLITE_LONG_VERSION}.tar.gz) set(SQLITE_CPE "cpe:2.3:a:sqlite:sqlite:${SQLITE_VERSION}:*:*:*:*:*:*:*") @@ -507,15 +505,15 @@ set(EMBREE_HASH 4b525955b08e1249a700dea5b5ffc8b2) set(EMBREE_HASH_TYPE MD5) set(EMBREE_FILE embree-v${EMBREE_VERSION}.zip) -set(USD_VERSION 23.05) +set(USD_VERSION 23.11) set(USD_URI https://github.com/PixarAnimationStudios/OpenUSD/archive/v${USD_VERSION}.tar.gz) -set(USD_HASH d4d92ff112bc82a1718bcd129b853a54) +set(USD_HASH 77358a244f50fc607e8b40764ea4f6c6) set(USD_HASH_TYPE MD5) set(USD_FILE usd-v${USD_VERSION}.tar.gz) -set(MATERIALX_VERSION 1.38.6) +set(MATERIALX_VERSION 1.38.8) set(MATERIALX_URI https://github.com/AcademySoftwareFoundation/MaterialX/archive/refs/tags/v${MATERIALX_VERSION}.tar.gz) -set(MATERIALX_HASH d49c9fdef34b5702fc60058d3e1864f2) +set(MATERIALX_HASH fad8f4e19305fb2ee920cbff638f3560) set(MATERIALX_HASH_TYPE MD5) set(MATERIALX_FILE materialx-v${MATERIALX_VERSION}.tar.gz) @@ -532,9 +530,9 @@ set(LIBGLU_HASH_TYPE MD5) set(LIBGLU_FILE glu-${LIBGLU_VERSION}.tar.xz) set(LIBGLU_HOMEPAGE https://gitlab.freedesktop.org/mesa/glu) -set(MESA_VERSION 21.1.5) +set(MESA_VERSION 23.3.0) set(MESA_URI ftp://ftp.freedesktop.org/pub/mesa/mesa-${MESA_VERSION}.tar.xz) -set(MESA_HASH 022c7293074aeeced2278c872db4fa693147c70f8595b076cf3f1ef81520766d) +set(MESA_HASH 50f729dd60ed6335b989095baad81ef5edf7cfdd4b4b48b9b955917cb07d69c5) set(MESA_HASH_TYPE SHA256) set(MESA_FILE mesa-${MESA_VERSION}.tar.xz) set(MESA_CPE "cpe:2.3:a:mesa3d:mesa:${MESA_VERSION}:*:*:*:*:*:*:*") @@ -581,9 +579,9 @@ set(WAYLAND_WESTON_HASH 44542b60bf9b9fe3add904af11bbad98) set(WAYLAND_WESTON_HASH_TYPE MD5) set(WAYLAND_WESTON_HOMEPAGE https://wayland.freedesktop.org) -set(ISPC_VERSION v1.17.0) +set(ISPC_VERSION v1.21.1) set(ISPC_URI https://github.com/ispc/ispc/archive/${ISPC_VERSION}.tar.gz) -set(ISPC_HASH 4f476a3109332a77fe839a9014c60ca9) +set(ISPC_HASH edd16b016aabc07819d14fd86a1fb5d0) set(ISPC_HASH_TYPE MD5) set(ISPC_FILE ispc-${ISPC_VERSION}.tar.gz) @@ -616,9 +614,9 @@ set(ZSTD_HASH_TYPE SHA256) set(ZSTD_FILE zstd-${ZSTD_VERSION}.tar.gz) set(ZSTD_CPE "cpe:2.3:a:facebook:zstandard:${ZSTD_VERSION}:*:*:*:*:*:*:*") -set(SSE2NEON_VERSION v1.6.0) +set(SSE2NEON_VERSION 0d6e9b3dd4687a0b98c0645e001f96659aae5854) set(SSE2NEON_URI https://github.com/DLTcollab/sse2neon/archive/${SSE2NEON_VERSION}.tar.gz) -set(SSE2NEON_HASH 06f4693219deccb91b457135d836fc514a1c0a57e9fa66b143982901d2d19677) +set(SSE2NEON_HASH 68cf4dfe6d0667ae3e3850233227c4c4937b7b83de01845d356b68d313f25e32) set(SSE2NEON_HASH_TYPE SHA256) set(SSE2NEON_FILE sse2neon-${SSE2NEON_VERSION}.tar.gz) @@ -826,17 +824,17 @@ set(SHADERC_GLSLANG_HASH 3b3c79ad8e9132ffcb8b63cc29c532e2) set(SHADERC_GLSLANG_HASH_TYPE MD5) set(SHADERC_GLSLANG_FILE glslang-${SHADERC_GLSLANG_VERSION}.tar.gz) -set(VULKAN_VERSION v1.2.198) +set(VULKAN_VERSION v1.3.270) set(VULKAN_HEADERS_VERSION ${VULKAN_VERSION}) set(VULKAN_HEADERS_URI https://github.com/KhronosGroup/Vulkan-Headers/archive/refs/tags/${VULKAN_HEADERS_VERSION}.tar.gz) -set(VULKAN_HEADERS_HASH 64fe73e887c963ad546bfc7f9505fa1d) +set(VULKAN_HEADERS_HASH 805bde4c23197b86334cee5c2cf69d8e) set(VULKAN_HEADERS_HASH_TYPE MD5) set(VULKAN_HEADERS_FILE Vulkan-Headers-${VULKAN_HEADERS_VERSION}.tar.gz) set(VULKAN_LOADER_VERSION ${VULKAN_VERSION}) set(VULKAN_LOADER_URI https://github.com/KhronosGroup/Vulkan-Loader/archive/refs/tags/${VULKAN_LOADER_VERSION}.tar.gz) -set(VULKAN_LOADER_HASH 015170a74f648fd2b41e209b6bf1ebc4) +set(VULKAN_LOADER_HASH 6903f9d285afcd1a167ec7c46cbabd49) set(VULKAN_LOADER_HASH_TYPE MD5) set(VULKAN_LOADER_FILE Vulkan-Loader-${VULKAN_LOADER_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/xml2.cmake b/build_files/build_environment/cmake/xml2.cmake index a150731f1da..2c95b89a9e2 100644 --- a/build_files/build_environment/cmake/xml2.cmake +++ b/build_files/build_environment/cmake/xml2.cmake @@ -2,44 +2,23 @@ # # SPDX-License-Identifier: GPL-2.0-or-later -if(WIN32) - set(XML2_EXTRA_ARGS - -DLIBXML2_WITH_ZLIB=OFF - -DLIBXML2_WITH_LZMA=OFF - -DLIBXML2_WITH_PYTHON=OFF - -DLIBXML2_WITH_ICONV=OFF - -DLIBXML2_WITH_TESTS=OFF - -DLIBXML2_WITH_PROGRAMS=OFF - -DBUILD_SHARED_LIBS=OFF - ) - ExternalProject_Add(external_xml2 - URL file://${PACKAGE_DIR}/${XML2_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${XML2_HASH_TYPE}=${XML2_HASH} - CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xml2 ${DEFAULT_CMAKE_FLAGS} ${XML2_EXTRA_ARGS} - PREFIX ${BUILD_DIR}/xml2 - INSTALL_DIR ${LIBDIR}/xml2 - ) -else() - ExternalProject_Add(external_xml2 - URL file://${PACKAGE_DIR}/${XML2_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${XML2_HASH_TYPE}=${XML2_HASH} - PREFIX ${BUILD_DIR}/xml2 - CONFIGURE_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/xml2/src/external_xml2/ && ${CONFIGURE_COMMAND} - --prefix=${LIBDIR}/xml2 - --disable-shared - --enable-static - --with-pic - --with-python=no - --with-lzma=no - --with-zlib=no - --with-iconv=no - BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/xml2/src/external_xml2/ && make -j${MAKE_THREADS} - INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/xml2/src/external_xml2/ && make install - INSTALL_DIR ${LIBDIR}/xml2 - ) -endif() +set(XML2_EXTRA_ARGS + -DLIBXML2_WITH_ZLIB=OFF + -DLIBXML2_WITH_LZMA=OFF + -DLIBXML2_WITH_PYTHON=OFF + -DLIBXML2_WITH_ICONV=OFF + -DLIBXML2_WITH_TESTS=OFF + -DLIBXML2_WITH_PROGRAMS=OFF + -DBUILD_SHARED_LIBS=OFF +) +ExternalProject_Add(external_xml2 + URL file://${PACKAGE_DIR}/${XML2_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${XML2_HASH_TYPE}=${XML2_HASH} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/xml2 ${DEFAULT_CMAKE_FLAGS} ${XML2_EXTRA_ARGS} + PREFIX ${BUILD_DIR}/xml2 + INSTALL_DIR ${LIBDIR}/xml2 +) if(WIN32 AND BUILD_MODE STREQUAL Release) ExternalProject_Add_Step(external_xml2 after_install diff --git a/build_files/build_environment/linux/linux_rocky8_setup.sh b/build_files/build_environment/linux/linux_rocky8_setup.sh index b12b8f7ee06..1870a9aeef1 100644 --- a/build_files/build_environment/linux/linux_rocky8_setup.sh +++ b/build_files/build_environment/linux/linux_rocky8_setup.sh @@ -96,6 +96,10 @@ PACKAGES_FOR_LIBS=( # Required by: `external_mesa`. expat-devel + # Required by: `external_mesa`. + libxshmfence + libxshmfence-devel + # Required by: `external_igc` & `external_osl` as a build-time dependency. bison # Required by: `external_osl` as a build-time dependency. diff --git a/build_files/build_environment/patches/imath_358.diff b/build_files/build_environment/patches/imath_358.diff new file mode 100644 index 00000000000..3abcdc1599c --- /dev/null +++ b/build_files/build_environment/patches/imath_358.diff @@ -0,0 +1,21 @@ +diff --git a/src/Imath/half.h b/src/Imath/half.h +index 84b349ab..828e0d82 100644 +--- a/src/Imath/half.h ++++ b/src/Imath/half.h +@@ -328,8 +328,14 @@ imath_half_to_float (imath_half_bits_t h) + // other compilers may provide count-leading-zeros primitives, + // but we need the community to inform us of the variants + uint32_t lc; +-# if defined(_MSC_VER) && (_M_IX86 || _M_X64) +- lc = __lzcnt (hexpmant); ++# if defined(_MSC_VER) ++ // The direct intrinsic for this is __lznct, but that is not supported ++ // on older x86_64 hardware or ARM. Instead uses the bsr instruction ++ // and one additional subtraction. This assumes hexpmant != 0, for 0 ++ // bsr and lznct would behave differently. ++ unsigned long bsr; ++ _BitScanReverse (&bsr, hexpmant); ++ lc = (31 - bsr); + # elif defined(__GNUC__) || defined(__clang__) + lc = (uint32_t) __builtin_clz (hexpmant); + # else diff --git a/build_files/build_environment/patches/ispc.diff b/build_files/build_environment/patches/ispc.diff index d0c09405603..3025c8b1646 100644 --- a/build_files/build_environment/patches/ispc.diff +++ b/build_files/build_environment/patches/ispc.diff @@ -1,21 +1,6 @@ diff -Naur ispc-1.17.0.org/CMakeLists.txt ispc-1.17.0/CMakeLists.txt --- ispc-1.17.0.org/CMakeLists.txt 2022-01-15 01:35:15 -0700 +++ ispc-1.17.0/CMakeLists.txt 2022-02-12 12:44:24 -0700 -@@ -36,8 +36,12 @@ - cmake_minimum_required(VERSION 3.13) - - if (UNIX) -- set(CMAKE_C_COMPILER "clang") -- set(CMAKE_CXX_COMPILER "clang++") -+ if (NOT CMAKE_C_COMPILER) -+ set(CMAKE_C_COMPILER "clang") -+ endif() -+ if (NOT CMAKE_CXX_COMPILER) -+ set(CMAKE_CXX_COMPILER "clang++") -+ endif() - endif() - - set(PROJECT_NAME ispc) @@ -443,7 +447,7 @@ # Include directories @@ -25,15 +10,15 @@ diff -Naur ispc-1.17.0.org/CMakeLists.txt ispc-1.17.0/CMakeLists.txt ${XE_DEPS_DIR}/include ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_BINARY_DIR}/${CMAKE_CFG_INTDIR}) -@@ -507,7 +511,7 @@ - - # Link against Clang libraries - foreach(clangLib ${CLANG_LIBRARY_LIST}) -- find_library(${clangLib}Path NAMES ${clangLib} HINTS ${LLVM_LIBRARY_DIRS}) -+ find_library(${clangLib}Path NAMES ${clangLib} HINTS ${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIR}) - list(APPEND CLANG_LIBRARY_FULL_PATH_LIST ${${clangLib}Path}) - endforeach() - target_link_libraries(${PROJECT_NAME} ${CLANG_LIBRARY_FULL_PATH_LIST}) +@@ -607,7 +607,7 @@ + NAMES + "${CMAKE_STATIC_LIBRARY_PREFIX}${clangLib}${CMAKE_STATIC_LIBRARY_SUFFIX}" + clang-cpp +- HINTS ${LLVM_LIBRARY_DIRS}) ++ HINTS ${LLVM_LIBRARY_DIRS} ${CLANG_LIBRARY_DIR}) + if (NOT ${${clangLib}Path} IN_LIST CLANG_LIBRARY_FULL_PATH_LIST) + list(APPEND CLANG_LIBRARY_FULL_PATH_LIST ${${clangLib}Path}) + endif() @@ -546,6 +550,29 @@ endif() endif() diff --git a/build_files/build_environment/patches/llvm.diff b/build_files/build_environment/patches/llvm.diff index 5f89816292b..426fe173d37 100644 --- a/build_files/build_environment/patches/llvm.diff +++ b/build_files/build_environment/patches/llvm.diff @@ -1,13 +1,14 @@ ---- a/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:24:26.000000000 +0100 -+++ b/llvm/lib/Support/Unix/Path.inc 2020-02-17 09:26:25.000000000 +0100 -@@ -1200,7 +1200,9 @@ - /// implementation. +diff -Naur ll.org/llvm/lib/Support/Unix/Path.inc ll/llvm/lib/Support/Unix/Path.inc +--- ll.org/llvm/lib/Support/Unix/Path.inc 2023-08-01 06:41:14.360891600 -0600 ++++ ll/llvm/lib/Support/Unix/Path.inc 2023-08-01 07:20:02.063130200 -0600 +@@ -1476,7 +1476,9 @@ std::error_code copy_file(const Twine &From, const Twine &To) { - uint32_t Flag = COPYFILE_DATA; --#if __has_builtin(__builtin_available) && defined(COPYFILE_CLONE) + std::string FromS = From.str(); + std::string ToS = To.str(); +-#if __has_builtin(__builtin_available) + // BLENDER: This optimization makes LLVM not build on older Xcode versions, + // just disable until everyone has new enough Xcode versions. +#if 0 if (__builtin_available(macos 10.12, *)) { - bool IsSymlink; - if (std::error_code Error = is_symlink_file(From, IsSymlink)) + // Optimistically try to use clonefile() and handle errors, rather than + // calling stat() to see if it'll work. diff --git a/build_files/build_environment/patches/materialx.diff b/build_files/build_environment/patches/materialx.diff deleted file mode 100644 index 024d4b6ad74..00000000000 --- a/build_files/build_environment/patches/materialx.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff -Naur orig/source/PyMaterialX/PyBind11/tools/FindPythonLibsNew.cmake external_materialx/source/PyMaterialX/PyBind11/tools/FindPythonLibsNew.cmake ---- orig/source/PyMaterialX/PyBind11/tools/FindPythonLibsNew.cmake 2022-11-04 14:23:29 -0600 -+++ external_materialx/source/PyMaterialX/PyBind11/tools/FindPythonLibsNew.cmake 2022-11-08 11:58:45 -0700 -@@ -181,6 +181,9 @@ - string(REGEX REPLACE "\\\\" "/" PYTHON_SITE_PACKAGES "${PYTHON_SITE_PACKAGES}") - - if(CMAKE_HOST_WIN32) -+ if(PYTHON_EXECUTABLE MATCHES "_d.exe$") -+ set(PYTHON_LIBRARY_SUFFIX ${PYTHON_LIBRARY_SUFFIX}_d) -+ endif() - set(PYTHON_LIBRARY "${PYTHON_PREFIX}/libs/python${PYTHON_LIBRARY_SUFFIX}.lib") - - # when run in a venv, PYTHON_PREFIX points to it. But the libraries remain in the \ No newline at end of file diff --git a/build_files/build_environment/patches/oiio_3984.diff b/build_files/build_environment/patches/oiio_3984.diff deleted file mode 100644 index dd7897c81e1..00000000000 --- a/build_files/build_environment/patches/oiio_3984.diff +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/src/libOpenImageIO/exif.cpp b/src/libOpenImageIO/exif.cpp -index 90eaaec6e9..1fbf04140e 100644 ---- a/src/libOpenImageIO/exif.cpp -+++ b/src/libOpenImageIO/exif.cpp -@@ -1302,6 +1302,8 @@ encode_exif(const ImageSpec& spec, std::vector& blob, - TIFFHeader head; - head.tiff_magic = (endianreq == endian::little) ? 0x4949 : 0x4d4d; - head.tiff_version = 42; -+ if (endianreq != endian::native) -+ swap_endian(&head.tiff_version); - // N.B. need to swap_endian head.tiff_diroff below, once we know the sizes - append(blob, head); - diff --git a/build_files/build_environment/patches/oiio_4044.diff b/build_files/build_environment/patches/oiio_4044.diff new file mode 100644 index 00000000000..49123fc6d2b --- /dev/null +++ b/build_files/build_environment/patches/oiio_4044.diff @@ -0,0 +1,13 @@ +diff --git a/src/png.imageio/pngoutput.cpp b/src/png.imageio/pngoutput.cpp +index cc694f5a..f752ab7d 100644 +--- a/src/png.imageio/pngoutput.cpp ++++ b/src/png.imageio/pngoutput.cpp +@@ -385,7 +385,7 @@ PNGOutput::write_scanlines(int ybegin, int yend, int z, TypeDesc format, + unassoc_scratch.reset(new float[nvals]); + float* floatvals = unassoc_scratch.get(); + // Contiguize and convert to float +- OIIO::convert_image(m_spec.nchannels, m_spec.width, m_spec.height, 1, ++ OIIO::convert_image(m_spec.nchannels, m_spec.width, yend - ybegin, 1, + data, format, xstride, ystride, AutoStride, + floatvals, TypeFloat, AutoStride, AutoStride, + AutoStride); \ No newline at end of file diff --git a/build_files/build_environment/patches/oiio_deadlock.diff b/build_files/build_environment/patches/oiio_deadlock.diff deleted file mode 100644 index cfaa6fdc3bc..00000000000 --- a/build_files/build_environment/patches/oiio_deadlock.diff +++ /dev/null @@ -1,62 +0,0 @@ -diff -Naur orig/src/idiff/idiff.cpp external_openimageio/src/idiff/idiff.cpp ---- orig/src/idiff/idiff.cpp 2023-06-07 07:47:42 -0600 -+++ external_openimageio/src/idiff/idiff.cpp 2023-06-07 09:46:47 -0600 -@@ -399,5 +399,6 @@ - - imagecache->invalidate_all(true); - ImageCache::destroy(imagecache); -+ default_thread_pool()->resize(0); - return ret; - } -diff -Naur orig/src/libutil/thread.cpp external_openimageio/src/libutil/thread.cpp ---- orig/src/libutil/thread.cpp 2023-06-07 07:47:42 -0600 -+++ external_openimageio/src/libutil/thread.cpp 2023-06-07 09:45:39 -0600 -@@ -151,9 +151,10 @@ - this->set_thread(i); - } - } else { // the number of threads is decreased -+ std::vector> terminating_threads; - for (int i = oldNThreads - 1; i >= nThreads; --i) { - *this->flags[i] = true; // this thread will finish -- this->terminating_threads.push_back( -+ terminating_threads.push_back( - std::move(this->threads[i])); - this->threads.erase(this->threads.begin() + i); - } -@@ -162,6 +163,11 @@ - std::unique_lock lock(this->mutex); - this->cv.notify_all(); - } -+ // wait for the terminated threads to finish -+ for (auto& thread : terminating_threads) { -+ if (thread->joinable()) -+ thread->join(); -+ } - this->threads.resize( - nThreads); // safe to delete because the threads are detached - this->flags.resize( -@@ -238,16 +244,10 @@ - if (thread->joinable()) - thread->join(); - } -- // wait for the terminated threads to finish -- for (auto& thread : this->terminating_threads) { -- if (thread->joinable()) -- thread->join(); -- } - // if there were no threads in the pool but some functors in the queue, the functors are not deleted by the threads - // therefore delete them here - this->clear_queue(); - this->threads.clear(); -- this->terminating_threads.clear(); - this->flags.clear(); - } - -@@ -349,7 +349,6 @@ - } - - std::vector> threads; -- std::vector> terminating_threads; - std::vector>> flags; - mutable pvt::ThreadsafeQueue*> q; - std::atomic isDone; diff --git a/build_files/build_environment/patches/opencolorio.diff b/build_files/build_environment/patches/opencolorio.diff deleted file mode 100644 index 278dfe0d857..00000000000 --- a/build_files/build_environment/patches/opencolorio.diff +++ /dev/null @@ -1,28 +0,0 @@ -diff --git a/share/cmake/modules/Findpystring.cmake b/share/cmake/modules/Findpystring.cmake -index 7b894a45..92618215 100644 ---- a/share/cmake/modules/Findpystring.cmake -+++ b/share/cmake/modules/Findpystring.cmake -@@ -113,6 +113,11 @@ if(NOT pystring_FOUND) - -DCMAKE_INSTALL_MESSAGE=${CMAKE_INSTALL_MESSAGE} - -DCMAKE_INSTALL_PREFIX=${_EXT_DIST_ROOT} - -DCMAKE_OBJECT_PATH_MAX=${CMAKE_OBJECT_PATH_MAX} -+ -DCMAKE_OSX_ARCHITECTURES=${CMAKE_OSX_ARCHITECTURES} -+ -DCMAKE_OSX_DEPLOYMENT_TARGET=${CMAKE_OSX_DEPLOYMENT_TARGET} -+ -DCMAKE_OSX_SYSROOT=${CMAKE_OSX_SYSROOT} -+ -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG} -+ -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE} - ) - if(CMAKE_TOOLCHAIN_FILE) - set(pystring_CMAKE_ARGS ---- a/src/OpenColorIO/FileRules.cpp -+++ b/src/OpenColorIO/FileRules.cpp -@@ -7,6 +7,9 @@ - #include - #include - -+/* NOTE: this has been applied up-stream, this edit can be removed after upgrading OpenColorIO. */ -+#include -+ - #include - - #include "CustomKeys.h" diff --git a/build_files/build_environment/patches/openexr_b18905772e.diff b/build_files/build_environment/patches/openexr_b18905772e.diff deleted file mode 100644 index c6e72b65439..00000000000 --- a/build_files/build_environment/patches/openexr_b18905772e.diff +++ /dev/null @@ -1,1023 +0,0 @@ -From b18905772e9dd98658f8a37d16c6e53c7c17adaa Mon Sep 17 00:00:00 2001 -From: Kimball Thurston -Date: Sat, 22 Apr 2023 15:58:43 +1200 -Subject: [PATCH] Change setNumThreads to wait for thread start (#1291) - -Fix Issue #890, issue with windows shutdown when exiting quickly prior to -threads actually starting. We do this by having a data block that is passed -by shared_ptr to the thread to avoid dereferencing a deleted object. - -Further, greatly simplify the ThreadPool code by using atomic shared_ptr -functions instead of trying to manually implement something similar and -otherwise modernizing the thread code. - -Fix a few potential null dereference locations and also fix an issue when -systems are overloaded enabling the TaskGroup destructor to destroy -the semaphore while code is still using it, causing undefined memory -corruption if some other thread immediately allocates that same block - -Originally based on a proposed patch by Dieter De Baets @debaetsd - -Signed-off-by: Kimball Thurston ---- - src/lib/IlmThread/IlmThreadPool.cpp | 740 ++++++++++--------------- - src/lib/IlmThread/IlmThreadSemaphore.h | 8 +- - 2 files changed, 303 insertions(+), 445 deletions(-) - -diff --git a/src/lib/IlmThread/IlmThreadPool.cpp b/src/lib/IlmThread/IlmThreadPool.cpp -index 0ddcf8d52..f4578a510 100644 ---- a/src/lib/IlmThread/IlmThreadPool.cpp -+++ b/src/lib/IlmThread/IlmThreadPool.cpp -@@ -15,12 +15,17 @@ - #include "Iex.h" - - #include -+#include - #include - #include - #include - #include - --using namespace std; -+#if (defined(_WIN32) || defined(_WIN64)) -+# include -+#else -+# include -+#endif - - ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER - -@@ -28,380 +33,301 @@ ILMTHREAD_INTERNAL_NAMESPACE_SOURCE_ENTER - # define ENABLE_THREADING - #endif - --#if defined(__GNU_LIBRARY__) && ( __GLIBC__ < 2 || ( __GLIBC__ == 2 && __GLIBC_MINOR__ < 21 ) ) --# define ENABLE_SEM_DTOR_WORKAROUND --#endif -- --#ifdef ENABLE_THREADING -- --struct TaskGroup::Data -+namespace - { -- Data (); -- ~Data (); -- -- void addTask () ; -- void removeTask (); -- std::atomic numPending; -- Semaphore isEmpty; // used to signal that the taskgroup is empty --#if defined(ENABLE_SEM_DTOR_WORKAROUND) -- // this mutex is also used to lock numPending in the legacy c++ mode... -- std::mutex dtorMutex; // used to work around the glibc bug: -- // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 --#endif --}; - -- --struct ThreadPool::Data -+static inline void -+handleProcessTask (Task* task) - { -- typedef ThreadPoolProvider *TPPointer; -- -- Data (); -- ~Data(); -- Data (const Data&) = delete; -- Data &operator= (const Data&) = delete; -- Data (Data&&) = delete; -- Data &operator= (Data&&) = delete; -- -- struct SafeProvider -+ if (task) - { -- SafeProvider (Data *d, ThreadPoolProvider *p) : _data( d ), _ptr( p ) -- { -- } -- -- ~SafeProvider() -- { -- if ( _data ) -- _data->coalesceProviderUse(); -- } -- SafeProvider (const SafeProvider &o) -- : _data( o._data ), _ptr( o._ptr ) -- { -- if ( _data ) -- _data->bumpProviderUse(); -- } -- SafeProvider &operator= (const SafeProvider &o) -- { -- if ( this != &o ) -- { -- if ( o._data ) -- o._data->bumpProviderUse(); -- if ( _data ) -- _data->coalesceProviderUse(); -- _data = o._data; -- _ptr = o._ptr; -- } -- return *this; -- } -- SafeProvider( SafeProvider &&o ) -- : _data( o._data ), _ptr( o._ptr ) -- { -- o._data = nullptr; -- } -- SafeProvider &operator=( SafeProvider &&o ) -- { -- std::swap( _data, o._data ); -- std::swap( _ptr, o._ptr ); -- return *this; -- } -- -- inline ThreadPoolProvider *get () const -- { -- return _ptr; -- } -- ThreadPoolProvider *operator-> () const -- { -- return get(); -- } -- -- Data *_data; -- ThreadPoolProvider *_ptr; -- }; -- -- // NB: In C++20, there is full support for atomic shared_ptr, but that is not -- // yet in use or finalized. Once stabilized, add appropriate usage here -- inline SafeProvider getProvider (); -- inline void coalesceProviderUse (); -- inline void bumpProviderUse (); -- inline void setProvider (ThreadPoolProvider *p); -- -- std::atomic provUsers; -- std::atomic provider; --}; -- -+ TaskGroup* taskGroup = task->group (); - -+ task->execute (); - --namespace { -+ // kill the task prior to notifying the group -+ // such that any internal reference-based -+ // semantics will be handled prior to -+ // the task group destructor letting it out -+ // of the scope of those references -+ delete task; - --class DefaultWorkerThread; -+ if (taskGroup) taskGroup->finishOneTask (); -+ } -+} - --struct DefaultWorkData -+#ifdef ENABLE_THREADING -+struct DefaultThreadPoolData - { -- Semaphore taskSemaphore; // threads wait on this for ready tasks -- mutable std::mutex taskMutex; // mutual exclusion for the tasks list -- vector tasks; // the list of tasks to execute -+ Semaphore _taskSemaphore; // threads wait on this for ready tasks -+ mutable std::mutex _taskMutex; // mutual exclusion for the tasks list -+ std::vector _tasks; // the list of tasks to execute - -- Semaphore threadSemaphore; // signaled when a thread starts executing -- mutable std::mutex threadMutex; // mutual exclusion for threads list -- vector threads; // the list of all threads -- -- std::atomic hasThreads; -- std::atomic stopping; -+ mutable std::mutex _threadMutex; // mutual exclusion for threads list -+ std::vector _threads; // the list of all threads -+ -+ std::atomic _threadCount; -+ std::atomic _stopping; - - inline bool stopped () const - { -- return stopping.load( std::memory_order_relaxed ); -+ return _stopping.load (std::memory_order_relaxed); - } - -- inline void stop () -+ inline void stop () { _stopping = true; } -+ -+ inline void resetAtomics () - { -- stopping = true; -+ _threadCount = 0; -+ _stopping = false; - } - }; -+#endif - --// --// class WorkerThread --// --class DefaultWorkerThread: public Thread -+} // namespace -+ -+#ifdef ENABLE_THREADING -+ -+struct TaskGroup::Data - { -- public: -+ Data (); -+ ~Data (); -+ Data (const Data&) = delete; -+ Data& operator= (const Data&) = delete; -+ Data (Data&&) = delete; -+ Data& operator= (Data&&) = delete; - -- DefaultWorkerThread (DefaultWorkData* data); -+ void addTask (); -+ void removeTask (); - -- virtual void run (); -- -- private: -+ void waitForEmpty (); - -- DefaultWorkData * _data; -+ std::atomic numPending; -+ std::atomic inFlight; -+ Semaphore isEmpty; // used to signal that the taskgroup is empty - }; - - --DefaultWorkerThread::DefaultWorkerThread (DefaultWorkData* data): -- _data (data) -+struct ThreadPool::Data - { -- start(); --} -- -+ using ProviderPtr = std::shared_ptr; - --void --DefaultWorkerThread::run () --{ -- // -- // Signal that the thread has started executing -- // -+ Data (); -+ ~Data (); -+ Data (const Data&) = delete; -+ Data& operator= (const Data&) = delete; -+ Data (Data&&) = delete; -+ Data& operator= (Data&&) = delete; - -- _data->threadSemaphore.post(); -+ ProviderPtr getProvider () const { return std::atomic_load (&_provider); } - -- while (true) -+ void setProvider (ProviderPtr provider) - { -- // -- // Wait for a task to become available -- // -- -- _data->taskSemaphore.wait(); -- -- { -- std::unique_lock taskLock (_data->taskMutex); -- -- // -- // If there is a task pending, pop off the next task in the FIFO -- // -+ ProviderPtr curp = std::atomic_exchange (&_provider, provider); -+ if (curp && curp != provider) curp->finish (); -+ } - -- if (!_data->tasks.empty()) -- { -- Task* task = _data->tasks.back(); -- _data->tasks.pop_back(); -- // release the mutex while we process -- taskLock.unlock(); -+ std::shared_ptr _provider; -+}; - -- TaskGroup* taskGroup = task->group(); -- task->execute(); - -- delete task; -- -- taskGroup->_data->removeTask (); -- } -- else if (_data->stopped()) -- { -- break; -- } -- } -- } --} - -+namespace { - - // - // class DefaultThreadPoolProvider - // - class DefaultThreadPoolProvider : public ThreadPoolProvider - { -- public: -- DefaultThreadPoolProvider(int count); -- virtual ~DefaultThreadPoolProvider(); -+public: -+ DefaultThreadPoolProvider (int count); -+ DefaultThreadPoolProvider (const DefaultThreadPoolProvider&) = delete; -+ DefaultThreadPoolProvider& -+ operator= (const DefaultThreadPoolProvider&) = delete; -+ DefaultThreadPoolProvider (DefaultThreadPoolProvider&&) = delete; -+ DefaultThreadPoolProvider& operator= (DefaultThreadPoolProvider&&) = delete; -+ ~DefaultThreadPoolProvider () override; -+ -+ int numThreads () const override; -+ void setNumThreads (int count) override; -+ void addTask (Task* task) override; - -- virtual int numThreads() const; -- virtual void setNumThreads(int count); -- virtual void addTask(Task *task); -+ void finish () override; - -- virtual void finish(); -+private: -+ void lockedFinish (); -+ void threadLoop (std::shared_ptr d); - -- private: -- DefaultWorkData _data; -+ std::shared_ptr _data; - }; - - DefaultThreadPoolProvider::DefaultThreadPoolProvider (int count) -+ : _data (std::make_shared ()) - { -- setNumThreads(count); -+ _data->resetAtomics (); -+ setNumThreads (count); - } - - DefaultThreadPoolProvider::~DefaultThreadPoolProvider () --{ -- finish(); --} -+{} - - int - DefaultThreadPoolProvider::numThreads () const - { -- std::lock_guard lock (_data.threadMutex); -- return static_cast (_data.threads.size()); -+ return _data->_threadCount.load (); - } - - void - DefaultThreadPoolProvider::setNumThreads (int count) - { -- // -- // Lock access to thread list and size -- // -+ // since we're a private class, the thread pool won't call us if -+ // we aren't changing size so no need to check that... - -- std::lock_guard lock (_data.threadMutex); -+ std::lock_guard lock (_data->_threadMutex); - -- size_t desired = static_cast(count); -- if (desired > _data.threads.size()) -- { -- // -- // Add more threads -- // -+ size_t curThreads = _data->_threads.size (); -+ size_t nToAdd = static_cast (count); - -- while (_data.threads.size() < desired) -- _data.threads.push_back (new DefaultWorkerThread (&_data)); -- } -- else if ((size_t)count < _data.threads.size()) -+ if (nToAdd < curThreads) - { -- // -- // Wait until all existing threads are finished processing, -- // then delete all threads. -- // -- finish (); -- -- // -- // Add in new threads -- // -- -- while (_data.threads.size() < desired) -- _data.threads.push_back (new DefaultWorkerThread (&_data)); -+ // no easy way to only shutdown the n threads at the end of -+ // the vector (well, really, guaranteeing they are the ones to -+ // be woken up), so just kill all of the threads -+ lockedFinish (); -+ curThreads = 0; - } - -- _data.hasThreads = !(_data.threads.empty()); -+ _data->_threads.resize (nToAdd); -+ for (size_t i = curThreads; i < nToAdd; ++i) -+ { -+ _data->_threads[i] = -+ std::thread (&DefaultThreadPoolProvider::threadLoop, this, _data); -+ } -+ _data->_threadCount = static_cast (_data->_threads.size ()); - } - - void - DefaultThreadPoolProvider::addTask (Task *task) - { -- // -- // Lock the threads, needed to access numThreads -- // -- bool doPush = _data.hasThreads.load( std::memory_order_relaxed ); -- -- if ( doPush ) -+ // the thread pool will kill us and switch to a null provider -+ // if the thread count is set to 0, so we can always -+ // go ahead and lock and assume we have a thread to do the -+ // processing - { -- // -- // Get exclusive access to the tasks queue -- // -+ std::lock_guard taskLock (_data->_taskMutex); - -- { -- std::lock_guard taskLock (_data.taskMutex); -- -- // -- // Push the new task into the FIFO -- // -- _data.tasks.push_back (task); -- } -- - // -- // Signal that we have a new task to process -+ // Push the new task into the FIFO - // -- _data.taskSemaphore.post (); -- } -- else -- { -- // this path shouldn't normally happen since we have the -- // NullThreadPoolProvider, but just in case... -- task->execute (); -- task->group()->_data->removeTask (); -- delete task; -+ _data->_tasks.push_back (task); - } -+ -+ // -+ // Signal that we have a new task to process -+ // -+ _data->_taskSemaphore.post (); - } - - void - DefaultThreadPoolProvider::finish () - { -- _data.stop(); -+ std::lock_guard lock (_data->_threadMutex); -+ -+ lockedFinish (); -+} -+ -+void -+DefaultThreadPoolProvider::lockedFinish () -+{ -+ _data->stop (); - - // - // Signal enough times to allow all threads to stop. - // -- // Wait until all threads have started their run functions. -- // If we do not wait before we destroy the threads then it's -- // possible that the threads have not yet called their run -- // functions. -- // If this happens then the run function will be called off -- // of an invalid object and we will crash, most likely with -- // an error like: "pure virtual method called" -+ // NB: we must do this as many times as we have threads. - // -- -- size_t curT = _data.threads.size(); -+ // If there is still work in the queue, or this call happens "too -+ // quickly", threads will not be waiting on the semaphore, so we -+ // need to ensure the semaphore is at a count equal to the amount -+ // of work left plus the number of threads to ensure exit of a -+ // thread. There can be threads in a few states: -+ // - still starting up (successive calls to setNumThreads) -+ // - in the middle of processing a task / looping -+ // - waiting in the semaphore -+ size_t curT = _data->_threads.size (); - for (size_t i = 0; i != curT; ++i) -- { -- if (_data.threads[i]->joinable()) -- { -- _data.taskSemaphore.post(); -- _data.threadSemaphore.wait(); -- } -- } -+ _data->_taskSemaphore.post (); - - // -- // Join all the threads -+ // We should not need to check joinability, they should all, by -+ // definition, be joinable (assuming normal start) - // - for (size_t i = 0; i != curT; ++i) - { -- if (_data.threads[i]->joinable()) -- _data.threads[i]->join(); -- delete _data.threads[i]; -+ // This isn't quite right in that the thread may have actually -+ // be in an exited / signalled state (needing the -+ // WaitForSingleObject call), and so already have an exit code -+ // (I think, but the docs are vague), but if we don't do the -+ // join, the stl thread seems to then throw an exception. The -+ // join should just return invalid handle and continue, and is -+ // more of a windows bug... except maybe someone needs to work -+ // around it... -+ //# ifdef TEST_FOR_WIN_THREAD_STATUS -+ // -+ // // per OIIO issue #2038, on exit / dll unload, windows may -+ // // kill the thread, double check that it is still active prior -+ // // to joining. -+ // DWORD tstatus; -+ // if (GetExitCodeThread (_threads[i].native_handle (), &tstatus)) -+ // { -+ // if (tstatus != STILL_ACTIVE) { continue; } -+ // } -+ //# endif -+ -+ _data->_threads[i].join (); - } - -- std::lock_guard lk( _data.taskMutex ); -- -- _data.threads.clear(); -- _data.tasks.clear(); -+ _data->_threads.clear (); - -- _data.stopping = false; -+ _data->resetAtomics (); - } - -- --class NullThreadPoolProvider : public ThreadPoolProvider -+void -+DefaultThreadPoolProvider::threadLoop ( -+ std::shared_ptr data) - { -- virtual ~NullThreadPoolProvider() {} -- virtual int numThreads () const { return 0; } -- virtual void setNumThreads (int count) -- { -- } -- virtual void addTask (Task *t) -+ while (true) - { -- t->execute (); -- t->group()->_data->removeTask (); -- delete t; -+ // -+ // Wait for a task to become available -+ // -+ -+ data->_taskSemaphore.wait (); -+ -+ { -+ std::unique_lock taskLock (data->_taskMutex); -+ -+ // -+ // If there is a task pending, pop off the next task in the FIFO -+ // -+ -+ if (!data->_tasks.empty ()) -+ { -+ Task* task = data->_tasks.back (); -+ data->_tasks.pop_back (); -+ -+ // release the mutex while we process -+ taskLock.unlock (); -+ -+ handleProcessTask (task); -+ -+ // do not need to reacquire the lock at all since we -+ // will just loop around, pull any other task -+ } -+ else if (data->stopped ()) { break; } -+ } - } -- virtual void finish () {} --}; -+} - - } //namespace - -@@ -409,81 +335,69 @@ class NullThreadPoolProvider : public ThreadPoolProvider - // struct TaskGroup::Data - // - --TaskGroup::Data::Data () : numPending (0), isEmpty (1) --{ -- // empty --} -+TaskGroup::Data::Data () : numPending (0), inFlight (0), isEmpty (1) -+{} - - - TaskGroup::Data::~Data () -+{} -+ -+void -+TaskGroup::Data::waitForEmpty () - { - // - // A TaskGroup acts like an "inverted" semaphore: if the count -- // is above 0 then waiting on the taskgroup will block. This -+ // is above 0 then waiting on the taskgroup will block. The - // destructor waits until the taskgroup is empty before returning. - // - - isEmpty.wait (); - --#ifdef ENABLE_SEM_DTOR_WORKAROUND -- // Update: this was fixed in v. 2.2.21, so this ifdef checks for that -- // -- // Alas, given the current bug in glibc we need a secondary -- // syncronisation primitive here to account for the fact that -- // destructing the isEmpty Semaphore in this thread can cause -- // an error for a separate thread that is issuing the post() call. -- // We are entitled to destruct the semaphore at this point, however, -- // that post() call attempts to access data out of the associated -- // memory *after* it has woken the waiting threads, including this one, -- // potentially leading to invalid memory reads. -- // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 -- -- std::lock_guard lock (dtorMutex); --#endif -+ // pseudo spin to wait for the notifying thread to finish the post -+ // to avoid a premature deletion of the semaphore -+ int count = 0; -+ while (inFlight.load () > 0) -+ { -+ ++count; -+ if (count > 100) -+ { -+ std::this_thread::yield (); -+ count = 0; -+ } -+ } - } - - - void - TaskGroup::Data::addTask () - { -- // -- // in c++11, we use an atomic to protect numPending to avoid the -- // extra lock but for c++98, to add the ability for custom thread -- // pool we add the lock here -- // -- if (numPending++ == 0) -- isEmpty.wait (); -+ inFlight.fetch_add (1); -+ -+ // if we are the first task off the rank, clear the -+ // isEmpty semaphore such that the group will actually pause -+ // until the task finishes -+ if (numPending.fetch_add (1) == 0) { isEmpty.wait (); } - } - - - void - TaskGroup::Data::removeTask () - { -- // Alas, given the current bug in glibc we need a secondary -- // syncronisation primitive here to account for the fact that -- // destructing the isEmpty Semaphore in a separate thread can -- // cause an error. Issuing the post call here the current libc -- // implementation attempts to access memory *after* it has woken -- // waiting threads. -- // Since other threads are entitled to delete the semaphore the -- // access to the memory location can be invalid. -- // http://sources.redhat.com/bugzilla/show_bug.cgi?id=12674 -- // Update: this bug has been fixed, but how do we know which -- // glibc version we're in? -- -- // Further update: -+ // if we are the last task, notify the group we're done -+ if (numPending.fetch_sub (1) == 1) { isEmpty.post (); } -+ -+ // in theory, a background thread could actually finish a task -+ // prior to the next task being added. The fetch_add / fetch_sub -+ // logic between addTask and removeTask are fine to keep the -+ // inverted semaphore straight. All addTask must happen prior to -+ // the TaskGroup destructor. - // -- // we could remove this if it is a new enough glibc, however -- // we've changed the API to enable a custom override of a -- // thread pool. In order to provide safe access to the numPending, -- // we need the lock anyway, except for c++11 or newer -- if (--numPending == 0) -- { --#ifdef ENABLE_SEM_DTOR_WORKAROUND -- std::lock_guard lk (dtorMutex); --#endif -- isEmpty.post (); -- } -+ // But to let the taskgroup thread waiting know we're actually -+ // finished with the last one and finished posting (the semaphore -+ // might wake up the other thread while in the middle of post) so -+ // we don't destroy the semaphore while posting to it, keep a -+ // separate counter that is modified pre / post semaphore -+ inFlight.fetch_sub (1); - } - - -@@ -491,8 +405,7 @@ TaskGroup::Data::removeTask () - // struct ThreadPool::Data - // - --ThreadPool::Data::Data (): -- provUsers (0), provider (NULL) -+ThreadPool::Data::Data () - { - // empty - } -@@ -500,82 +413,7 @@ ThreadPool::Data::Data (): - - ThreadPool::Data::~Data() - { -- ThreadPoolProvider *p = provider.load( std::memory_order_relaxed ); -- p->finish(); -- delete p; --} -- --inline ThreadPool::Data::SafeProvider --ThreadPool::Data::getProvider () --{ -- provUsers.fetch_add( 1, std::memory_order_relaxed ); -- return SafeProvider( this, provider.load( std::memory_order_relaxed ) ); --} -- -- --inline void --ThreadPool::Data::coalesceProviderUse () --{ -- int ov = provUsers.fetch_sub( 1, std::memory_order_relaxed ); -- // ov is the previous value, so one means that now it might be 0 -- if ( ov == 1 ) -- { -- // do we have anything to do here? -- } --} -- -- --inline void --ThreadPool::Data::bumpProviderUse () --{ -- provUsers.fetch_add( 1, std::memory_order_relaxed ); --} -- -- --inline void --ThreadPool::Data::setProvider (ThreadPoolProvider *p) --{ -- ThreadPoolProvider *old = provider.load( std::memory_order_relaxed ); -- // work around older gcc bug just in case -- do -- { -- if ( ! provider.compare_exchange_weak( old, p, std::memory_order_release, std::memory_order_relaxed ) ) -- continue; -- } while (false); // NOSONAR - suppress SonarCloud bug report. -- -- // wait for any other users to finish prior to deleting, given -- // that these are just mostly to query the thread count or push a -- // task to the queue (so fast), just spin... -- // -- // (well, and normally, people don't do this mid stream anyway, so -- // this will be 0 99.999% of the time, but just to be safe) -- // -- while ( provUsers.load( std::memory_order_relaxed ) > 0 ) -- std::this_thread::yield(); -- -- if ( old ) -- { -- old->finish(); -- delete old; -- } -- -- // NB: the shared_ptr mechanism is safer and means we don't have -- // to have the provUsers counter since the shared_ptr keeps that -- // for us. However, gcc 4.8/9 compilers which many people are -- // still using even though it is 2018 forgot to add the shared_ptr -- // functions... once that compiler is fully deprecated, switch to -- // using the below, change provider to a std::shared_ptr and remove -- // provUsers... -- // --// std::shared_ptr newp( p ); --// std::shared_ptr curp = std::atomic_load_explicit( &provider, std::memory_order_relaxed ); --// do --// { --// if ( ! std::atomic_compare_exchange_weak_explicit( &provider, &curp, newp, std::memory_order_release, std::memory_order_relaxed ) ) --// continue; --// } while ( false ); --// if ( curp ) --// curp->finish(); -+ setProvider (nullptr); - } - - #endif // ENABLE_THREADING -@@ -608,7 +446,7 @@ Task::group () - - TaskGroup::TaskGroup (): - #ifdef ENABLE_THREADING -- _data (new Data()) -+ _data (new Data) - #else - _data (nullptr) - #endif -@@ -620,6 +458,7 @@ TaskGroup::TaskGroup (): - TaskGroup::~TaskGroup () - { - #ifdef ENABLE_THREADING -+ _data->waitForEmpty (); - delete _data; - #endif - } -@@ -660,10 +499,7 @@ ThreadPool::ThreadPool (unsigned nthreads): - #endif - { - #ifdef ENABLE_THREADING -- if ( nthreads == 0 ) -- _data->setProvider( new NullThreadPoolProvider ); -- else -- _data->setProvider( new DefaultThreadPoolProvider( int(nthreads) ) ); -+ setNumThreads (static_cast (nthreads)); - #endif - } - -@@ -671,6 +507,8 @@ ThreadPool::ThreadPool (unsigned nthreads): - ThreadPool::~ThreadPool () - { - #ifdef ENABLE_THREADING -+ // ensures any jobs / threads are finished & shutdown -+ _data->setProvider (nullptr); - delete _data; - #endif - } -@@ -680,7 +518,8 @@ int - ThreadPool::numThreads () const - { - #ifdef ENABLE_THREADING -- return _data->getProvider ()->numThreads (); -+ Data::ProviderPtr sp = _data->getProvider (); -+ return (sp) ? sp->numThreads () : 0; - #else - return 0; - #endif -@@ -695,36 +534,30 @@ ThreadPool::setNumThreads (int count) - throw IEX_INTERNAL_NAMESPACE::ArgExc ("Attempt to set the number of threads " - "in a thread pool to a negative value."); - -- bool doReset = false; - { -- Data::SafeProvider sp = _data->getProvider (); -- int curT = sp->numThreads (); -- if ( curT == count ) -- return; -- -- if ( curT == 0 ) -+ Data::ProviderPtr sp = _data->getProvider (); -+ if (sp) - { -- NullThreadPoolProvider *npp = dynamic_cast( sp.get() ); -- if ( npp ) -- doReset = true; -- } -- else if ( count == 0 ) -- { -- DefaultThreadPoolProvider *dpp = dynamic_cast( sp.get() ); -- if ( dpp ) -- doReset = true; -+ bool doReset = false; -+ int curT = sp->numThreads (); -+ if (curT == count) return; -+ -+ if (count != 0) -+ { -+ sp->setNumThreads (count); -+ return; -+ } - } -- if ( ! doReset ) -- sp->setNumThreads( count ); - } - -- if ( doReset ) -- { -- if ( count == 0 ) -- _data->setProvider( new NullThreadPoolProvider ); -- else -- _data->setProvider( new DefaultThreadPoolProvider( count ) ); -- } -+ // either a null provider or a case where we should switch from -+ // a default provider to a null one or vice-versa -+ if (count == 0) -+ _data->setProvider (nullptr); -+ else -+ _data->setProvider ( -+ std::make_shared (count)); -+ - #else - // just blindly ignore - (void)count; -@@ -736,7 +569,8 @@ void - ThreadPool::setThreadProvider (ThreadPoolProvider *provider) - { - #ifdef ENABLE_THREADING -- _data->setProvider (provider); -+ // contract is we take ownership and will free the provider -+ _data->setProvider (Data::ProviderPtr (provider)); - #else - throw IEX_INTERNAL_NAMESPACE::ArgExc ( - "Attempt to set a thread provider on a system with threads" -@@ -748,12 +582,19 @@ ThreadPool::setThreadProvider (ThreadPoolProvider *provider) - void - ThreadPool::addTask (Task* task) - { -+ if (task) -+ { - #ifdef ENABLE_THREADING -- _data->getProvider ()->addTask (task); --#else -- task->execute (); -- delete task; -+ Data::ProviderPtr p = _data->getProvider (); -+ if (p) -+ { -+ p->addTask (task); -+ return; -+ } - #endif -+ -+ handleProcessTask (task); -+ } - } - - -@@ -780,7 +621,24 @@ unsigned - ThreadPool::estimateThreadCountForFileIO () - { - #ifdef ENABLE_THREADING -- return std::thread::hardware_concurrency (); -+ unsigned rv = std::thread::hardware_concurrency (); -+ // hardware concurrency is not required to work -+ if (rv == 0 || -+ rv > static_cast (std::numeric_limits::max ())) -+ { -+ rv = 1; -+# if (defined(_WIN32) || defined(_WIN64)) -+ SYSTEM_INFO si; -+ GetNativeSystemInfo (&si); -+ -+ rv = si.dwNumberOfProcessors; -+# else -+ // linux, bsd, and mac are fine with this -+ // other *nix should be too, right? -+ rv = sysconf (_SC_NPROCESSORS_ONLN); -+# endif -+ } -+ return rv; - #else - return 0; - #endif -diff --git a/src/lib/IlmThread/IlmThreadSemaphore.h b/src/lib/IlmThread/IlmThreadSemaphore.h -index f26e48a09..576968aa6 100644 ---- a/src/lib/IlmThread/IlmThreadSemaphore.h -+++ b/src/lib/IlmThread/IlmThreadSemaphore.h -@@ -64,10 +64,10 @@ class ILMTHREAD_EXPORT_TYPE Semaphore - mutable HANDLE _semaphore; - - #elif ILMTHREAD_THREADING_ENABLED -- // -- // If the platform has threads but no semapohores, -- // then we implement them ourselves using condition variables -- // -+ // -+ // If the platform has threads but no semaphores, -+ // then we implement them ourselves using condition variables -+ // - - struct sema_t - { diff --git a/build_files/build_environment/patches/openexr_deflate_1588.diff b/build_files/build_environment/patches/openexr_deflate_1588.diff new file mode 100644 index 00000000000..7c1fe6b378f --- /dev/null +++ b/build_files/build_environment/patches/openexr_deflate_1588.diff @@ -0,0 +1,140 @@ +diff --git a/openexr_original/cmake/OpenEXRSetup.cmake b/openexr/cmake/OpenEXRSetup.cmake +index 425992d..fa80886 100644 +--- a/openexr_original/cmake/OpenEXRSetup.cmake ++++ b/openexr/cmake/OpenEXRSetup.cmake +@@ -160,71 +160,79 @@ set(OPENEXR_DEFLATE_TAG "v1.18" CACHE STRING "Tag to use for libdeflate source r + if(NOT OPENEXR_FORCE_INTERNAL_DEFLATE) + #TODO: ^^ Release should not clone from main, this is a place holder + set(CMAKE_IGNORE_PATH "${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-src/config;${CMAKE_CURRENT_BINARY_DIR}/_deps/deflate-build/config") +- include(FindPkgConfig) +- pkg_check_modules(deflate IMPORTED_TARGET GLOBAL libdeflate) +- set(CMAKE_IGNORE_PATH) +- if (deflate_FOUND) +- message(STATUS "Using libdeflate from ${deflate_LINK_LIBRARIES}") ++ find_package(libdeflate CONFIG) ++ if(libdeflate_FOUND) ++ message(STATUS "Using libdeflate from ${libdeflate_DIR}") ++ else() ++ include(FindPkgConfig) ++ pkg_check_modules(deflate IMPORTED_TARGET GLOBAL libdeflate) ++ set(CMAKE_IGNORE_PATH) ++ if (deflate_FOUND) ++ message(STATUS "Using libdeflate from ${deflate_LINK_LIBRARIES}") ++ endif() + endif() + endif() + +-if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND) +- if(OPENEXR_FORCE_INTERNAL_DEFLATE) +- message(STATUS "libdeflate forced internal, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") +- else() +- message(STATUS "libdeflate was not found, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") +- endif() +- include(FetchContent) +- FetchContent_Declare(Deflate +- GIT_REPOSITORY "${OPENEXR_DEFLATE_REPO}" +- GIT_TAG "${OPENEXR_DEFLATE_TAG}" +- GIT_SHALLOW ON +- ) ++if(libdeflate_FOUND) ++ set(EXR_DEFLATE_LIB libdeflate::libdeflate_static) ++else() ++ if(NOT TARGET PkgConfig::deflate AND NOT deflate_FOUND) ++ if(OPENEXR_FORCE_INTERNAL_DEFLATE) ++ message(STATUS "libdeflate forced internal, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") ++ else() ++ message(STATUS "libdeflate was not found, installing from ${OPENEXR_DEFLATE_REPO} (${OPENEXR_DEFLATE_TAG})") ++ endif() ++ include(FetchContent) ++ FetchContent_Declare(Deflate ++ GIT_REPOSITORY "${OPENEXR_DEFLATE_REPO}" ++ GIT_TAG "${OPENEXR_DEFLATE_TAG}" ++ GIT_SHALLOW ON ++ ) + +- FetchContent_GetProperties(Deflate) +- if(NOT Deflate_POPULATED) +- FetchContent_Populate(Deflate) +- endif() ++ FetchContent_GetProperties(Deflate) ++ if(NOT Deflate_POPULATED) ++ FetchContent_Populate(Deflate) ++ endif() + +- # Rather than actually compile something, just embed the sources +- # into exrcore. This could in theory cause issues when compiling as +- # a static library into another application which also uses +- # libdeflate but we switch the export symbol to hidden which should +- # hide the symbols when linking... +- set(EXR_DEFLATE_SOURCES +- lib/arm/cpu_features.c +- lib/x86/cpu_features.c +- lib/utils.c +- lib/deflate_compress.c +- lib/deflate_decompress.c +- lib/adler32.c +- lib/zlib_compress.c +- lib/zlib_decompress.c) +- # don't need these +- # lib/crc32.c +- # lib/gzip_compress.c +- # lib/gzip_decompress.c +- file(READ ${deflate_SOURCE_DIR}/lib/lib_common.h DEFLATE_HIDE) +- string(REPLACE "visibility(\"default\")" "visibility(\"hidden\")" DEFLATE_HIDE "${DEFLATE_HIDE}") +- string(REPLACE "__declspec(dllexport)" "/**/" DEFLATE_HIDE "${DEFLATE_HIDE}") +- file(WRITE ${deflate_SOURCE_DIR}/lib/lib_common.h "${DEFLATE_HIDE}") ++ # Rather than actually compile something, just embed the sources ++ # into exrcore. This could in theory cause issues when compiling as ++ # a static library into another application which also uses ++ # libdeflate but we switch the export symbol to hidden which should ++ # hide the symbols when linking... ++ set(EXR_DEFLATE_SOURCES ++ lib/arm/cpu_features.c ++ lib/x86/cpu_features.c ++ lib/utils.c ++ lib/deflate_compress.c ++ lib/deflate_decompress.c ++ lib/adler32.c ++ lib/zlib_compress.c ++ lib/zlib_decompress.c) ++ # don't need these ++ # lib/crc32.c ++ # lib/gzip_compress.c ++ # lib/gzip_decompress.c ++ file(READ ${deflate_SOURCE_DIR}/lib/lib_common.h DEFLATE_HIDE) ++ string(REPLACE "visibility(\"default\")" "visibility(\"hidden\")" DEFLATE_HIDE "${DEFLATE_HIDE}") ++ string(REPLACE "__declspec(dllexport)" "/**/" DEFLATE_HIDE "${DEFLATE_HIDE}") ++ file(WRITE ${deflate_SOURCE_DIR}/lib/lib_common.h "${DEFLATE_HIDE}") + +- # cmake makes fetch content name lowercase for the properties (to deflate) +- list(TRANSFORM EXR_DEFLATE_SOURCES PREPEND ${deflate_SOURCE_DIR}/) +- set(EXR_DEFLATE_INCLUDE_DIR ${deflate_SOURCE_DIR}) +- set(EXR_DEFLATE_LIB) +-else() +- set(EXR_DEFLATE_INCLUDE_DIR) +- set(EXR_DEFLATE_LIB ${deflate_LIBRARIES}) +- # set EXR_DEFATE_LDFLAGS for OpenEXR.pc.in for static build +- if (BUILD_SHARED_LIBS) +- set(EXR_DEFLATE_LDFLAGS "") ++ # cmake makes fetch content name lowercase for the properties (to deflate) ++ list(TRANSFORM EXR_DEFLATE_SOURCES PREPEND ${deflate_SOURCE_DIR}/) ++ set(EXR_DEFLATE_INCLUDE_DIR ${deflate_SOURCE_DIR}) ++ set(EXR_DEFLATE_LIB) + else() +- set(EXR_DEFLATE_LDFLAGS "-l${deflate_LIBRARIES}") ++ set(EXR_DEFLATE_INCLUDE_DIR) ++ set(EXR_DEFLATE_LIB ${deflate_LIBRARIES}) ++ # set EXR_DEFATE_LDFLAGS for OpenEXR.pc.in for static build ++ if (BUILD_SHARED_LIBS) ++ set(EXR_DEFLATE_LDFLAGS "") ++ else() ++ set(EXR_DEFLATE_LDFLAGS "-l${deflate_LIBRARIES}") ++ endif() ++ set(EXR_DEFLATE_SOURCES) + endif() +- set(EXR_DEFLATE_SOURCES) + endif() +- + ####################################### + # Find or install Imath + ####################################### \ No newline at end of file diff --git a/build_files/build_environment/patches/openimageio.diff b/build_files/build_environment/patches/openimageio.diff index f4a4627fa03..50d561dc056 100644 --- a/build_files/build_environment/patches/openimageio.diff +++ b/build_files/build_environment/patches/openimageio.diff @@ -1,7 +1,7 @@ diff -Naur orig/CMakeLists.txt external_openimageio/CMakeLists.txt --- orig/CMakeLists.txt 2020-05-10 21:43:52 -0600 +++ external_openimageio/CMakeLists.txt 2020-05-13 17:03:35 -0600 -@@ -170,7 +170,7 @@ +@@ -237,7 +237,7 @@ add_subdirectory (src/iinfo) add_subdirectory (src/maketx) add_subdirectory (src/oiiotool) @@ -13,7 +13,7 @@ diff -Naur orig/CMakeLists.txt external_openimageio/CMakeLists.txt diff -Naur orig/src/cmake/compiler.cmake external_openimageio/src/cmake/compiler.cmake --- orig/src/cmake/compiler.cmake 2020-05-10 21:43:52 -0600 +++ external_openimageio/src/cmake/compiler.cmake 2020-05-13 17:02:54 -0600 -@@ -172,6 +172,7 @@ +@@ -188,6 +189,7 @@ add_definitions (-D_CRT_NONSTDC_NO_WARNINGS) add_definitions (-D_SCL_SECURE_NO_WARNINGS) add_definitions (-DJAS_WIN_MSVC_BUILD) diff --git a/build_files/build_environment/patches/openvdb.diff b/build_files/build_environment/patches/openvdb.diff index d3f19985815..b231b54afb4 100644 --- a/build_files/build_environment/patches/openvdb.diff +++ b/build_files/build_environment/patches/openvdb.diff @@ -75,40 +75,3 @@ diff -Naur openvdb-8.0.0/openvdb/openvdb/version.rc.in openvdb/openvdb/openvdb/v + + END +END -diff -Naur orig/openvdb/openvdb/tree/ValueAccessor.h openvdb/openvdb/openvdb/tree/ValueAccessor.h ---- orig/openvdb/openvdb/tree/ValueAccessor.h 2022-11-02 13:58:26 -0600 -+++ openvdb/openvdb/openvdb/tree/ValueAccessor.h 2022-11-02 18:55:09 -0600 -@@ -872,7 +872,10 @@ - using LeafNodeType = typename NodeType::LeafNodeType; - using CoordLimits = std::numeric_limits; - -- static_assert(std::is_same::value); -+ // Blender: Technically not an issue in OpenVDB, but USD 21.11 still builds -+ // as C++14 which does not support terse asserts yet. Add a message to -+ // explicitly select the C++14 supported static assert. -+ static_assert(std::is_same::value, "cache item node type is not leaf node type"); - - CacheItem(TreeCacheT& parent) - : mParent(&parent) -diff --git a/nanovdb/nanovdb/NanoVDB.h b/nanovdb/nanovdb/NanoVDB.h -index f7fc304..fde5c47 100644 ---- a/nanovdb/nanovdb/NanoVDB.h -+++ b/nanovdb/nanovdb/NanoVDB.h -@@ -1877,7 +1877,7 @@ __hostdev__ static inline uint32_t FindLowestOn(uint64_t v) - { - NANOVDB_ASSERT(v); - #if (defined(__CUDA_ARCH__) || defined(__HIP__)) && defined(NANOVDB_USE_INTRINSICS) -- return __ffsll(v); -+ return __ffsll(static_cast(v)); - #elif defined(_MSC_VER) && defined(NANOVDB_USE_INTRINSICS) - unsigned long index; - _BitScanForward64(&index, v); -@@ -2592,7 +2592,7 @@ public: - /// - /// @note This method is only defined for IndexGrid = NanoGrid - template -- __hostdev__ typename enable_if::value, uint64_t>::type valueCount() const {return DataType::mData1;} -+ __hostdev__ typename enable_if::value, const uint64_t&>::type valueCount() const {return DataType::mData1;} - - /// @brief Return a const reference to the tree - __hostdev__ const TreeT& tree() const { return *reinterpret_cast(this->treePtr()); } diff --git a/build_files/build_environment/patches/openvdb_1706.diff b/build_files/build_environment/patches/openvdb_1706.diff new file mode 100644 index 00000000000..590a241477a --- /dev/null +++ b/build_files/build_environment/patches/openvdb_1706.diff @@ -0,0 +1,81 @@ +diff --git a/openvdb/openvdb/python/pyGrid.h b/openvdb/openvdb/python/pyGrid.h +index 9249eaf6d..f4c859110 100644 +--- a/openvdb/openvdb/python/pyGrid.h ++++ b/openvdb/openvdb/python/pyGrid.h +@@ -322,7 +322,7 @@ copyToArray(GridType&, const py::object&, py::object) + + #else // if defined(PY_OPENVDB_USE_NUMPY) + +-using ArrayDimVec = std::vector; ++using ArrayDimVec = std::vector; + + // ID numbers for supported value types + enum class DtId { NONE, FLOAT, DOUBLE, BOOL, INT16, INT32, INT64, UINT32, UINT64/*, HALF*/ }; +@@ -768,12 +768,12 @@ template + inline typename GridType::Ptr + meshToLevelSet(py::array_t pointsObj, py::array_t trianglesObj, py::array_t quadsObj, math::Transform::Ptr xform, float halfWidth) + { +- auto validate2DArray = [](py::array array, ssize_t N) { ++ auto validate2DArray = [](py::array array, Py_ssize_t N) { + if (array.ndim() != 2 || array.shape(1) != N) { + std::ostringstream os; + os << "Expected a 2-dimensional numpy.ndarray with shape(1) = "<< N; + os << ", found " << array.ndim() << "-dimensional array with shape = ("; +- for (ssize_t i = 0; i < array.ndim(); ++i) { ++ for (Py_ssize_t i = 0; i < array.ndim(); ++i) { + os << array.shape(i); + if (i != array.ndim() - 1) + os << ", "; +@@ -826,12 +826,12 @@ volumeToQuadMesh(const GridType& grid, double isovalue) + std::vector quads; + tools::volumeToMesh(grid, points, quads, isovalue); + +- std::vector shape = { static_cast(points.size()), 3 }; +- std::vector strides = { 3 * static_cast(sizeof(float)), static_cast(sizeof(float))}; ++ std::vector shape = { static_cast(points.size()), 3 }; ++ std::vector strides = { 3 * static_cast(sizeof(float)), static_cast(sizeof(float))}; + py::array_t pointArrayObj(py::buffer_info(points.data(), sizeof(float), py::format_descriptor::format(), 2, shape, strides)); + +- shape = { static_cast(quads.size()), 4 }; +- strides = { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; ++ shape = { static_cast(quads.size()), 4 }; ++ strides = { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; + py::array_t quadArrayObj(py::buffer_info(quads.data(), sizeof(Index32), py::format_descriptor::format(), 2, shape, strides)); + + return std::make_tuple(pointArrayObj, quadArrayObj); +@@ -857,18 +857,18 @@ volumeToMesh(const GridType& grid, double isovalue, double adaptivity) + // Create a deep copy of the array (because the point vector will be destroyed + // when this function returns). + +- std::vector shape = { static_cast(points.size()), 3 }; +- std::vector strides = { 3 * static_cast(sizeof(float)), static_cast(sizeof(float))}; ++ std::vector shape = { static_cast(points.size()), 3 }; ++ std::vector strides = { 3 * static_cast(sizeof(float)), static_cast(sizeof(float))}; + py::buffer_info pointInfo(points.data(), sizeof(float), py::format_descriptor::format(), 2, shape, strides); + py::array_t pointArray(pointInfo); + +- shape = { static_cast(triangles.size()), 3 }; +- strides = { 3 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; ++ shape = { static_cast(triangles.size()), 3 }; ++ strides = { 3 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; + py::buffer_info triangleInfo(triangles.data(), sizeof(Index32), py::format_descriptor::format(), 2, shape, strides); + py::array_t triangleArray(triangleInfo); + +- shape = { static_cast(quads.size()), 4 }; +- strides = { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; ++ shape = { static_cast(quads.size()), 4 }; ++ strides = { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))}; + py::buffer_info quadInfo(quads.data(), sizeof(Index32), py::format_descriptor::format(), 2, shape, strides); + py::array_t quadArray(quadInfo); + +@@ -1590,8 +1590,8 @@ exportGrid(py::module_ m) + &pyGrid::meshToLevelSet, + py::arg("points"), + #ifdef PY_OPENVDB_USE_NUMPY +- py::arg("triangles")=py::array_t({ 0, 3 }, { 3 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))} ), +- py::arg("quads")=py::array_t({ 0, 4 }, { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))} ), ++ py::arg("triangles")=py::array_t({ 0, 3 }, { 3 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))} ), ++ py::arg("quads")=py::array_t({ 0, 4 }, { 4 * static_cast(sizeof(Index32)), static_cast(sizeof(Index32))} ), + #else + py::arg("triangles")=std::vector(), + py::arg("quads")=std::vector(), diff --git a/build_files/build_environment/patches/openvdb_1733.diff b/build_files/build_environment/patches/openvdb_1733.diff new file mode 100644 index 00000000000..13d3f4d7f44 --- /dev/null +++ b/build_files/build_environment/patches/openvdb_1733.diff @@ -0,0 +1,21 @@ +diff --git a/openvdb/openvdb/math/Half.h b/openvdb/openvdb/math/Half.h +index b8045ba441..ba72b0e6df 100644 +--- a/openvdb/openvdb/math/Half.h ++++ b/openvdb/openvdb/math/Half.h +@@ -342,8 +342,14 @@ imath_half_to_float (imath_half_bits_t h) + // other compilers may provide count-leading-zeros primitives, + // but we need the community to inform us of the variants + uint32_t lc; +-# if defined(_MSC_VER) && (_M_IX86 || _M_X64) +- lc = __lzcnt (hexpmant); ++# if defined(_MSC_VER) ++ // The direct intrinsic for this is __lznct, but that is not supported ++ // on older x86_64 hardware or ARM. Instead uses the bsr instruction ++ // and one additional subtraction. This assumes hexpmant != 0, for 0 ++ // bsr and lznct would behave differently. ++ unsigned long bsr; ++ _BitScanReverse (&bsr, hexpmant); ++ lc = (31 - bsr); + # elif defined(__GNUC__) || defined(__clang__) + lc = (uint32_t) __builtin_clz (hexpmant); + # else diff --git a/build_files/build_environment/patches/osl.diff b/build_files/build_environment/patches/osl.diff index 46539a7d1da..fd7d3354eee 100644 --- a/build_files/build_environment/patches/osl.diff +++ b/build_files/build_environment/patches/osl.diff @@ -1,31 +1,3 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index d527232..5ad6eaa 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -99,6 +99,11 @@ set (OSL_PTX_INSTALL_DIR "${CMAKE_INSTALL_FULL_DATADIR}/${PROJECT_NAME}/ptx" - CACHE STRING "Directory where OptiX PTX files will be installed") - set (CMAKE_DEBUG_POSTFIX "" CACHE STRING "Library naming postfix for Debug builds (e.g., '_debug')") - -+set (USE_OIIO_STATIC ON CACHE BOOL "If OIIO is built static") -+if (USE_OIIO_STATIC) -+ add_definitions ("-DOIIO_STATIC_BUILD=1") -+ add_definitions ("-DOIIO_STATIC_DEFINE=1") -+endif () - - set (OSL_NO_DEFAULT_TEXTURESYSTEM OFF CACHE BOOL "Do not use create a raw OIIO::TextureSystem") - if (OSL_NO_DEFAULT_TEXTURESYSTEM) -diff --git a/src/cmake/externalpackages.cmake b/src/cmake/externalpackages.cmake -index a7e098b..dad11d0 100644 ---- a/src/cmake/externalpackages.cmake -+++ b/src/cmake/externalpackages.cmake -@@ -77,6 +77,7 @@ link_directories ("${Boost_LIBRARY_DIRS}") - - - checked_find_package (ZLIB REQUIRED) # Needed by several packages -+checked_find_package (PNG REQUIRED) # Needed since OIIO needs it - - # IlmBase & OpenEXR - checked_find_package (OpenEXR REQUIRED diff --git a/src/liboslcomp/oslcomp.cpp b/src/liboslcomp/oslcomp.cpp index 8c2e77b..211b8a7 100644 --- a/src/liboslcomp/oslcomp.cpp @@ -44,70 +16,3 @@ index 8c2e77b..211b8a7 100644 #include #include #include -diff --git a/src/liboslexec/llvm_instance.cpp b/src/liboslexec/llvm_instance.cpp -index 8f52546..8c2d0c7 100644 ---- a/src/liboslexec/llvm_instance.cpp -+++ b/src/liboslexec/llvm_instance.cpp -@@ -1363,6 +1363,10 @@ BackendLLVM::run() - #ifdef OSL_LLVM_NO_BITCODE - OSL_ASSERT(!use_rs_bitcode()); - ll.module(ll.new_module("llvm_ops")); -+ if (use_optix()) { -+ ll.module()->setDataLayout("e-i64:64-i128:128-v16:16-v32:32-n16:32:64"); -+ ll.module()->setTargetTriple("nvptx64-nvidia-cuda"); -+ } - #else - if (!use_optix()) { - if (use_rs_bitcode()) { -diff --git a/src/liboslexec/shadingsys.cpp b/src/liboslexec/shadingsys.cpp -index 46e4529..8e86486 100644 ---- a/src/liboslexec/shadingsys.cpp -+++ b/src/liboslexec/shadingsys.cpp -@@ -2121,6 +2121,11 @@ ShadingSystemImpl::getattribute(ShaderGroup* group, string_view name, - return true; - } - -+ if (name == "groupdata_size" && type == TypeDesc::TypeInt) { -+ *(int*)val = (int)group->m_llvm_groupdata_size; -+ return true; -+ } -+ - return false; - } - -diff --git a/src/liboslexec/CMakeLists.txt b/src/liboslexec/CMakeLists.txt -index 6bb0d175..19f13513 100644 ---- a/src/liboslexec/CMakeLists.txt -+++ b/src/liboslexec/CMakeLists.txt -@@ -148,7 +148,9 @@ file (GLOB exec_headers "*.h") - file (GLOB compiler_headers "../liboslcomp/*.h") - - FLEX_BISON ( osolex.l osogram.y oso lib_src exec_headers ) --FLEX_BISON ( ../liboslcomp/osllex.l ../liboslcomp/oslgram.y osl lib_src compiler_headers ) -+if (BUILD_SHARED_LIBS) -+ FLEX_BISON ( ../liboslcomp/osllex.l ../liboslcomp/oslgram.y osl lib_src compiler_headers ) -+endif() - - set ( CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS" ) - -diff --git a/src/include/OSL/mask.h b/src/include/OSL/mask.h -index 24197af..b9275f6 100644 ---- a/src/include/OSL/mask.h -+++ b/src/include/OSL/mask.h -@@ -4,7 +4,6 @@ - - #pragma once - --#include - #include - - #include -@@ -23,6 +22,8 @@ using std::countr_zero; - - #elif OSL_INTEL_CLASSIC_COMPILER_VERSION - -+#include -+ - OSL_FORCEINLINE int popcount(uint32_t x) noexcept { return _mm_popcnt_u32(x);} - OSL_FORCEINLINE int popcount(uint64_t x) noexcept { return _mm_popcnt_u64(x); } - OSL_FORCEINLINE int countr_zero(uint32_t x) noexcept { return _bit_scan_forward(x); } diff --git a/build_files/build_environment/patches/pybind11_4761.diff b/build_files/build_environment/patches/pybind11_4761.diff new file mode 100644 index 00000000000..04fe9109377 --- /dev/null +++ b/build_files/build_environment/patches/pybind11_4761.diff @@ -0,0 +1,113 @@ +diff --git a/tools/FindPythonLibsNew.cmake b/tools/FindPythonLibsNew.cmake +index ce558d4ece..104448597f 100644 +--- a/tools/FindPythonLibsNew.cmake ++++ b/tools/FindPythonLibsNew.cmake +@@ -172,13 +172,20 @@ _pybind11_get_if_undef(_PYTHON_VALUES 0 _PYTHON_VERSION_LIST) + _pybind11_get_if_undef(_PYTHON_VALUES 1 PYTHON_PREFIX) + _pybind11_get_if_undef(_PYTHON_VALUES 2 PYTHON_INCLUDE_DIR) + _pybind11_get_if_undef(_PYTHON_VALUES 3 PYTHON_SITE_PACKAGES) +-_pybind11_get_if_undef(_PYTHON_VALUES 4 PYTHON_MODULE_EXTENSION) + _pybind11_get_if_undef(_PYTHON_VALUES 5 PYTHON_IS_DEBUG) + _pybind11_get_if_undef(_PYTHON_VALUES 6 PYTHON_SIZEOF_VOID_P) + _pybind11_get_if_undef(_PYTHON_VALUES 7 PYTHON_LIBRARY_SUFFIX) + _pybind11_get_if_undef(_PYTHON_VALUES 8 PYTHON_LIBDIR) + _pybind11_get_if_undef(_PYTHON_VALUES 9 PYTHON_MULTIARCH) + ++list(GET _PYTHON_VALUES 4 _PYTHON_MODULE_EXT_SUFFIX) ++if(PYBIND11_PYTHONLIBS_OVERWRITE OR NOT DEFINED PYTHON_MODULE_DEBUG_POSTFIX) ++ get_filename_component(PYTHON_MODULE_DEBUG_POSTFIX "${_PYTHON_MODULE_EXT_SUFFIX}" NAME_WE) ++endif() ++if(PYBIND11_PYTHONLIBS_OVERWRITE OR NOT DEFINED PYTHON_MODULE_EXTENSION) ++ get_filename_component(PYTHON_MODULE_EXTENSION "${_PYTHON_MODULE_EXT_SUFFIX}" EXT) ++endif() ++ + # Make sure the Python has the same pointer-size as the chosen compiler + # Skip if CMAKE_SIZEOF_VOID_P is not defined + # This should be skipped for (non-Apple) cross-compiles (like EMSCRIPTEN) +diff --git a/tools/pybind11NewTools.cmake b/tools/pybind11NewTools.cmake +index 7d7424a790..07bd2f90eb 100644 +--- a/tools/pybind11NewTools.cmake ++++ b/tools/pybind11NewTools.cmake +@@ -95,25 +95,36 @@ endif() + + # Get the suffix - SO is deprecated, should use EXT_SUFFIX, but this is + # required for PyPy3 (as of 7.3.1) +-if(NOT DEFINED PYTHON_MODULE_EXTENSION) ++if(NOT DEFINED PYTHON_MODULE_EXTENSION OR NOT DEFINED PYTHON_MODULE_DEBUG_POSTFIX) + execute_process( + COMMAND + "${${_Python}_EXECUTABLE}" "-c" + "import sys, importlib; s = importlib.import_module('distutils.sysconfig' if sys.version_info < (3, 10) else 'sysconfig'); print(s.get_config_var('EXT_SUFFIX') or s.get_config_var('SO'))" +- OUTPUT_VARIABLE _PYTHON_MODULE_EXTENSION +- ERROR_VARIABLE _PYTHON_MODULE_EXTENSION_ERR ++ OUTPUT_VARIABLE _PYTHON_MODULE_EXT_SUFFIX ++ ERROR_VARIABLE _PYTHON_MODULE_EXT_SUFFIX_ERR + OUTPUT_STRIP_TRAILING_WHITESPACE) + +- if(_PYTHON_MODULE_EXTENSION STREQUAL "") ++ if(_PYTHON_MODULE_EXT_SUFFIX STREQUAL "") + message( + FATAL_ERROR "pybind11 could not query the module file extension, likely the 'distutils'" +- "package is not installed. Full error message:\n${_PYTHON_MODULE_EXTENSION_ERR}") ++ "package is not installed. Full error message:\n${_PYTHON_MODULE_EXT_SUFFIX_ERR}" ++ ) + endif() + + # This needs to be available for the pybind11_extension function +- set(PYTHON_MODULE_EXTENSION +- "${_PYTHON_MODULE_EXTENSION}" +- CACHE INTERNAL "") ++ if(NOT DEFINED PYTHON_MODULE_DEBUG_POSTFIX) ++ get_filename_component(_PYTHON_MODULE_DEBUG_POSTFIX "${_PYTHON_MODULE_EXT_SUFFIX}" NAME_WE) ++ set(PYTHON_MODULE_DEBUG_POSTFIX ++ "${_PYTHON_MODULE_DEBUG_POSTFIX}" ++ CACHE INTERNAL "") ++ endif() ++ ++ if(NOT DEFINED PYTHON_MODULE_EXTENSION) ++ get_filename_component(_PYTHON_MODULE_EXTENSION "${_PYTHON_MODULE_EXT_SUFFIX}" EXT) ++ set(PYTHON_MODULE_EXTENSION ++ "${_PYTHON_MODULE_EXTENSION}" ++ CACHE INTERNAL "") ++ endif() + endif() + + # Python debug libraries expose slightly different objects before 3.8 +@@ -251,6 +262,9 @@ endfunction() + + function(pybind11_extension name) + # The extension is precomputed +- set_target_properties(${name} PROPERTIES PREFIX "" SUFFIX "${PYTHON_MODULE_EXTENSION}") +- ++ set_target_properties( ++ ${name} ++ PROPERTIES PREFIX "" ++ DEBUG_POSTFIX "${PYTHON_MODULE_DEBUG_POSTFIX}" ++ SUFFIX "${PYTHON_MODULE_EXTENSION}") + endfunction() +diff --git a/tools/pybind11Tools.cmake b/tools/pybind11Tools.cmake +index 66ad00a478..874fc39ebb 100644 +--- a/tools/pybind11Tools.cmake ++++ b/tools/pybind11Tools.cmake +@@ -65,6 +65,7 @@ _pybind11_promote_to_cache(PYTHON_INCLUDE_DIRS) + _pybind11_promote_to_cache(PYTHON_LIBRARIES) + _pybind11_promote_to_cache(PYTHON_MODULE_PREFIX) + _pybind11_promote_to_cache(PYTHON_MODULE_EXTENSION) ++_pybind11_promote_to_cache(PYTHON_MODULE_DEBUG_POSTFIX) + _pybind11_promote_to_cache(PYTHON_VERSION_MAJOR) + _pybind11_promote_to_cache(PYTHON_VERSION_MINOR) + _pybind11_promote_to_cache(PYTHON_VERSION) +@@ -148,8 +149,11 @@ endif() + + function(pybind11_extension name) + # The prefix and extension are provided by FindPythonLibsNew.cmake +- set_target_properties(${name} PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" +- SUFFIX "${PYTHON_MODULE_EXTENSION}") ++ set_target_properties( ++ ${name} ++ PROPERTIES PREFIX "${PYTHON_MODULE_PREFIX}" ++ DEBUG_POSTFIX "${PYTHON_MODULE_DEBUG_POSTFIX}" ++ SUFFIX "${PYTHON_MODULE_EXTENSION}") + endfunction() + + # Build a Python extension module: diff --git a/build_files/build_environment/patches/python_apple.diff b/build_files/build_environment/patches/python_apple.diff new file mode 100644 index 00000000000..ff4324be81c --- /dev/null +++ b/build_files/build_environment/patches/python_apple.diff @@ -0,0 +1,49 @@ +diff --git a/setup.py.orig b/setup.py +index a97a755..07ce853 100644 +--- a/setup.py.orig ++++ b/setup.py +@@ -2168,7 +2168,7 @@ + ffi_inc = None + print('Header file {} does not exist'.format(ffi_h)) + if ffi_lib is None and ffi_inc: +- for lib_name in ('ffi', 'ffi_pic'): ++ for lib_name in ('ffi_pic', ): + if (self.compiler.find_library_file(self.lib_dirs, lib_name)): + ffi_lib = lib_name + break +--- a/Modules/posixmodule.c 2022-12-09 21:44:03 ++++ b/Modules/posixmodule.c 2022-12-09 21:39:46 +@@ -10564,10 +10564,15 @@ + Py_BEGIN_ALLOW_THREADS + #ifdef HAVE_MKFIFOAT + if (dir_fd != DEFAULT_DIR_FD) { ++// BLENDER: disable also at compile time for compatibility when linking with older Xcode. ++// https://github.com/python/cpython/issues/97897 ++#ifndef __APPLE__ + if (HAVE_MKFIFOAT_RUNTIME) { + result = mkfifoat(dir_fd, path->narrow, mode); + ++ } else ++#endif ++ { +- } else { + mkfifoat_unavailable = 1; + result = 0; + } +@@ -10638,10 +10633,15 @@ + Py_BEGIN_ALLOW_THREADS + #ifdef HAVE_MKNODAT + if (dir_fd != DEFAULT_DIR_FD) { ++// BLENDER: disable also at compile time for compatibility when linking with older Xcode. ++// https://github.com/python/cpython/issues/97897 ++#ifndef __APPLE__ + if (HAVE_MKNODAT_RUNTIME) { + result = mknodat(dir_fd, path->narrow, mode, device); + ++ } else ++#endif ++ { +- } else { + mknodat_unavailable = 1; + result = 0; + } diff --git a/build_files/build_environment/patches/python_unix.diff b/build_files/build_environment/patches/python_unix.diff index 3969c706758..e310bc9ce34 100644 --- a/build_files/build_environment/patches/python_unix.diff +++ b/build_files/build_environment/patches/python_unix.diff @@ -2,31 +2,6 @@ diff --git a/setup.py.orig b/setup.py index a97a755..07ce853 100644 --- a/setup.py.orig +++ b/setup.py -@@ -1603,13 +1603,13 @@ - version = line.split()[2] - break - if version >= version_req: -- if (self.compiler.find_library_file(self.lib_dirs, 'z')): -+ if (self.compiler.find_library_file(self.lib_dirs, 'z_pic')): - if MACOS: - zlib_extra_link_args = ('-Wl,-search_paths_first',) - else: - zlib_extra_link_args = () - self.add(Extension('zlib', ['zlibmodule.c'], -- libraries=['z'], -+ libraries=['z_pic'], - extra_link_args=zlib_extra_link_args)) - have_zlib = True - else: -@@ -1623,7 +1623,7 @@ - # crc32 if we have it. Otherwise binascii uses its own. - if have_zlib: - extra_compile_args = ['-DUSE_ZLIB_CRC32'] -- libraries = ['z'] -+ libraries = ['z_pic'] - extra_link_args = zlib_extra_link_args - else: - extra_compile_args = [] @@ -2168,7 +2168,7 @@ ffi_inc = None print('Header file {} does not exist'.format(ffi_h)) @@ -36,39 +11,32 @@ index a97a755..07ce853 100644 if (self.compiler.find_library_file(self.lib_dirs, lib_name)): ffi_lib = lib_name break ---- a/Modules/posixmodule.c 2022-12-09 21:44:03 -+++ b/Modules/posixmodule.c 2022-12-09 21:39:46 -@@ -10564,10 +10564,15 @@ - Py_BEGIN_ALLOW_THREADS - #ifdef HAVE_MKFIFOAT - if (dir_fd != DEFAULT_DIR_FD) { -+// BLENDER: disable also at compile time for compatibility when linking with older Xcode. -+// https://github.com/python/cpython/issues/97897 -+#ifndef __APPLE__ - if (HAVE_MKFIFOAT_RUNTIME) { - result = mkfifoat(dir_fd, path->narrow, mode); +--- a/configure 2023-12-10 05:22:18.130767840 +0100 ++++ b/configure 2023-12-10 05:22:05.210521365 +0100 +@@ -11258,7 +11258,7 @@ + #define HAVE_LIBDL 1 + _ACEOF -+ } else -+#endif -+ { -- } else { - mkfifoat_unavailable = 1; - result = 0; - } -@@ -10638,10 +10633,15 @@ - Py_BEGIN_ALLOW_THREADS - #ifdef HAVE_MKNODAT - if (dir_fd != DEFAULT_DIR_FD) { -+// BLENDER: disable also at compile time for compatibility when linking with older Xcode. -+// https://github.com/python/cpython/issues/97897 -+#ifndef __APPLE__ - if (HAVE_MKNODAT_RUNTIME) { - result = mknodat(dir_fd, path->narrow, mode, device); +- LIBS="-ldl $LIBS" ++ LIBS="-ldl -lm $LIBS" + + fi + # Dynamic linking for SunOS/Solaris and SYSV +@@ -23231,7 +23231,7 @@ + save_LIBS=$LIBS + + +- LIBS="$LIBS $OPENSSL_LIBS" ++ LIBS="$OPENSSL_LIBS $LIBS" + CFLAGS="$CFLAGS $OPENSSL_INCLUDES" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH" + +@@ -23292,7 +23292,7 @@ + save_LIBS=$LIBS + + +- LIBS="$LIBS $LIBCRYPTO_LIBS" ++ LIBS="$LIBCRYPTO_LIBS $LIBS" + CFLAGS="$CFLAGS $OPENSSL_INCLUDES" + LDFLAGS="$LDFLAGS $OPENSSL_LDFLAGS $OPENSSL_LDFLAGS_RPATH" -+ } else -+#endif -+ { -- } else { - mknodat_unavailable = 1; - result = 0; - } diff --git a/build_files/build_environment/patches/python_windows.diff b/build_files/build_environment/patches/python_windows.diff index ea9d501c393..7ec2f372eef 100644 --- a/build_files/build_environment/patches/python_windows.diff +++ b/build_files/build_environment/patches/python_windows.diff @@ -20,18 +20,6 @@ +REM %MSBUILD% "%PCBUILD%\openssl.vcxproj" /p:Configuration=Release /p:Platform=ARM64 +REM if errorlevel 1 exit /b -diff -aurw Python-3.10.12/PCbuild/openssl.props external_python/PCbuild/openssl.props ---- Python-3.10.12/PCbuild/openssl.props 2023-06-06 16:30:33 -0600 -+++ external_python/PCbuild/openssl.props 2023-06-20 09:58:57 -0600 -@@ -10,7 +10,7 @@ - - - -- <_DLLSuffix>-1_1 -+ <_DLLSuffix>-3 - <_DLLSuffix Condition="$(Platform) == 'ARM'">$(_DLLSuffix)-arm - <_DLLSuffix Condition="$(Platform) == 'ARM64'">$(_DLLSuffix)-arm64 - diff -aurw Python-3.10.12/PCbuild/openssl.vcxproj external_python/PCbuild/openssl.vcxproj --- Python-3.10.12/PCbuild/openssl.vcxproj 2023-06-06 16:30:33 -0600 +++ external_python/PCbuild/openssl.vcxproj 2023-06-20 08:50:43 -0600 @@ -44,16 +32,3 @@ diff -aurw Python-3.10.12/PCbuild/openssl.vcxproj external_python/PCbuild/openss <_Built Include="$(IntDir)\libcrypto.lib;$(IntDir)\libcrypto-*.dll;$(IntDir)\libcrypto-*.pdb" /> <_Built Include="$(IntDir)\libssl.lib;$(IntDir)\libssl-*.dll;$(IntDir)\libssl-*.pdb" /> <_AppLink Include="$(opensslDir)\ms\applink.c" /> -diff -aurw Python-3.10.12/PCbuild/regen.targets external_python/PCbuild/regen.targets ---- Python-3.10.12/PCbuild/regen.targets 2023-06-06 16:30:33 -0600 -+++ external_python/PCbuild/regen.targets 2023-06-20 09:37:17 -0600 -@@ -89,7 +89,7 @@ - <_LicenseSources Include="$(PySourcePath)LICENSE; - $(PySourcePath)PC\crtlicense.txt; - $(bz2Dir)LICENSE; -- $(opensslOutDir)LICENSE; -+ $(opensslOutDir)LICENSE.txt; - $(libffiDir)LICENSE;" /> - <_LicenseSources Include="$(tcltkDir)tcllicense.terms; - $(tcltkDir)tklicense.terms; - diff --git a/build_files/build_environment/patches/usd.diff b/build_files/build_environment/patches/usd.diff index 39d34160d28..976e58a2e80 100644 --- a/build_files/build_environment/patches/usd.diff +++ b/build_files/build_environment/patches/usd.diff @@ -99,18 +99,3 @@ diff -Naur orig/pxr/usdImaging/CMakeLists.txt external_usd/pxr/usdImaging/CMakeL plugin ) -diff -Naur orig/cmake/macros/Private.cmake external_usd/cmake/macros/Private.cmake ---- orig/cmake/macros/Private.cmake 2022-02-18 14:49:09 -0700 -+++ external_usd/cmake/macros/Private.cmake 2022-08-05 10:42:03 -0600 -@@ -900,8 +900,10 @@ - return() - endif() - -- if (WIN32 AND PXR_USE_DEBUG_PYTHON) -+ if (WIN32 AND PXR_USE_DEBUG_PYTHON AND NOT CMAKE_DEBUG_POSTFIX) - # On Windows when compiling with debug python the library must be named with _d. -+ # Blender: but this can be skipped if CMAKE_DEBUG_POSTFIX is set, it knows -+ # what it is doing and we don't want libraries ending in _d_d.pyd - set(LIBRARY_NAME "_${NAME}_d") - else() - set(LIBRARY_NAME "_${NAME}") diff --git a/build_files/build_environment/patches/usd_hydra.diff b/build_files/build_environment/patches/usd_hydra.diff deleted file mode 100644 index 04dacafdc41..00000000000 --- a/build_files/build_environment/patches/usd_hydra.diff +++ /dev/null @@ -1,37 +0,0 @@ -diff --git a/pxr/usd/usdMtlx/reader.cpp b/pxr/usd/usdMtlx/reader.cpp -index 29e901816..e6fc68b20 100644 ---- a/pxr/usd/usdMtlx/reader.cpp -+++ b/pxr/usd/usdMtlx/reader.cpp -@@ -797,6 +797,15 @@ _NodeGraphBuilder::_CreateInterfaceInputs( - // We deliberately ignore tokens here. - } - -+mx::StringSet _GetStdlibIncludes() { -+ mx::StringSet stdlibIncludes = UsdMtlxGetDocument("")->getReferencedSourceUris(); -+ mx::StringSet normStdlibIncludes; -+ for (std::string const& entry : stdlibIncludes) { -+ normStdlibIncludes.insert(TfNormPath(entry)); -+ } -+ return normStdlibIncludes; -+} -+ - // Returns True if the mtlxNodeDef corresponds to a locally defined custom node - // with an associated nodegraph. - // XXX Locally defined custom nodes without nodegraphs are not supported -@@ -818,13 +827,14 @@ _NodeGraphBuilder::_IsLocalCustomNode(const mx::ConstNodeDefPtr &mtlxNodeDef) - } - // Combine with the nodeDef relative path - nodeDefUri = TfNormPath(fullMtlxPath + nodeDefUri); -+ } else { -+ nodeDefUri = TfNormPath(nodeDefUri); - } - - // This is a locally defined custom node if the absolute path to the - // nodedef is not included in the stdlibDoc. - static mx::StringSet customNodeDefNames; -- static const mx::StringSet stdlibIncludes = -- UsdMtlxGetDocument("")->getReferencedSourceUris(); -+ static const mx::StringSet stdlibIncludes = _GetStdlibIncludes(); - if (stdlibIncludes.find(nodeDefUri) == stdlibIncludes.end()) { - // Check if we already used this custom node - if (std::find(customNodeDefNames.begin(), customNodeDefNames.end(), diff --git a/build_files/build_environment/patches/usd_pull_1965.diff b/build_files/build_environment/patches/usd_pull_1965.diff deleted file mode 100644 index 308ee6cf53a..00000000000 --- a/build_files/build_environment/patches/usd_pull_1965.diff +++ /dev/null @@ -1,106 +0,0 @@ -diff --git a/build_scripts/build_usd.py b/build_scripts/build_usd.py -index cfe243effb..a4bb94eee1 100644 ---- a/build_scripts/build_usd.py -+++ b/build_scripts/build_usd.py -@@ -1415,7 +1415,7 @@ def InstallDraco(context, force, buildArgs): - ############################################################ - # MaterialX - --MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.4.zip" -+MATERIALX_URL = "https://github.com/materialx/MaterialX/archive/v1.38.5.zip" - - def InstallMaterialX(context, force, buildArgs): - with CurrentWorkingDirectory(DownloadURL(MATERIALX_URL, context, force)): -diff --git a/pxr/imaging/hdSt/materialXShaderGen.cpp b/pxr/imaging/hdSt/materialXShaderGen.cpp -index df80ff119f..e4b5f04a73 100644 ---- a/pxr/imaging/hdSt/materialXShaderGen.cpp -+++ b/pxr/imaging/hdSt/materialXShaderGen.cpp -@@ -136,8 +136,7 @@ HdStMaterialXShaderGen::HdStMaterialXShaderGen( - "st" : mxHdInfo.defaultTexcoordName; - - // Register the customized version of the Surface node generator -- registerImplementation("IM_surface_" + GlslShaderGenerator::TARGET, -- HdStMaterialXSurfaceNodeGen::create); -+ registerImplementation("IM_surface_genglsl", HdStMaterialXSurfaceNodeGen::create); - } - - // Based on GlslShaderGenerator::generate() -@@ -273,8 +272,7 @@ HdStMaterialXShaderGen::_EmitMxFunctions( - mx::ShaderStage& mxStage) const - { - // Add global constants and type definitions -- emitLibraryInclude("stdlib/" + mx::GlslShaderGenerator::TARGET -- + "/lib/mx_math.glsl", mxContext, mxStage); -+ emitLibraryInclude("stdlib/genglsl/lib/mx_math.glsl", mxContext, mxStage); - emitLine("#if NUM_LIGHTS > 0", mxStage, false); - emitLine("#define MAX_LIGHT_SOURCES NUM_LIGHTS", mxStage, false); - emitLine("#else", mxStage, false); -@@ -394,16 +392,24 @@ HdStMaterialXShaderGen::_EmitMxFunctions( - emitSpecularEnvironment(mxContext, mxStage); - } - if (shadowing) { -- emitLibraryInclude("pbrlib/" + mx::GlslShaderGenerator::TARGET -- + "/lib/mx_shadow.glsl", mxContext, mxStage); -+ emitLibraryInclude("pbrlib/genglsl/lib/mx_shadow.glsl", mxContext, mxStage); - } - -+#if MATERIALX_MAJOR_VERSION > 1 || \ -+ (MATERIALX_MAJOR_VERSION == 1 && MATERIALX_MINOR_VERSION > 38) || \ -+ (MATERIALX_MAJOR_VERSION == 1 && MATERIALX_MINOR_VERSION == 38 && MATERIALX_BUILD_VERSION > 4) -+ // MaterialX 1.38.5 changes the default transmission method to "refraction". -+ mxContext.getOptions().hwTransmissionRenderMethod = mx::TRANSMISSION_OPACITY; -+ -+ // Emit transmission code -+ emitTransmissionRender(mxContext, mxStage); -+#endif -+ - // Emit directional albedo table code. - if (mxContext.getOptions().hwDirectionalAlbedoMethod == - mx::HwDirectionalAlbedoMethod::DIRECTIONAL_ALBEDO_TABLE || - mxContext.getOptions().hwWriteAlbedoTable) { -- emitLibraryInclude("pbrlib/" + mx::GlslShaderGenerator::TARGET -- + "/lib/mx_table.glsl", mxContext, mxStage); -+ emitLibraryInclude("pbrlib/genglsl/lib/mx_table.glsl", mxContext, mxStage); - emitLineBreak(mxStage); - } - -@@ -421,7 +427,7 @@ HdStMaterialXShaderGen::_EmitMxFunctions( - // Emit uv transform code globally if needed. - if (mxContext.getOptions().hwAmbientOcclusion) { - emitLibraryInclude( -- "stdlib/" + mx::GlslShaderGenerator::TARGET + "/lib/" + -+ "stdlib/genglsl/lib/" + - _tokenSubstitutions[ShaderGenerator::T_FILE_TRANSFORM_UV], - mxContext, mxStage); - } -@@ -490,10 +496,30 @@ HdStMaterialXShaderGen::_EmitMxSurfaceShader( - // closure/shader nodes and need to be emitted first. - emitFunctionCalls(mxGraph, mxContext, mxStage, mx::ShaderNode::Classification::TEXTURE); - -+#if MATERIALX_MAJOR_VERSION == 1 && \ -+ MATERIALX_MINOR_VERSION == 38 && \ -+ MATERIALX_BUILD_VERSION <= 4 - // Emit function calls for all surface shader nodes. - // These will internally emit their closure function calls. - emitFunctionCalls(mxGraph, mxContext, mxStage, mx::ShaderNode::Classification::SHADER | - mx::ShaderNode::Classification::SURFACE); -+#else -+ // Emit function calls for "root" closure/shader nodes. -+ // These will internally emit function calls for any dependent closure nodes upstream. -+ for (mx::ShaderGraphOutputSocket* socket : mxGraph.getOutputSockets()) -+ { -+ if (socket->getConnection()) -+ { -+ const mx::ShaderNode* upstream = socket->getConnection()->getNode(); -+ if (upstream->getParent() == &mxGraph && -+ (upstream->hasClassification(mx::ShaderNode::Classification::CLOSURE) || -+ upstream->hasClassification(mx::ShaderNode::Classification::SHADER))) -+ { -+ emitFunctionCall(*upstream, mxContext, mxStage); -+ } -+ } -+ } -+#endif - } - else - { diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 809d0888166..093a2a16d74 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -329,6 +329,7 @@ endif() if(WITH_CYCLES AND WITH_CYCLES_OSL) find_package(OSL REQUIRED) endif() +add_bundled_libraries(osl/lib) if(WITH_CYCLES AND WITH_CYCLES_EMBREE) find_package(Embree 3.8.0 REQUIRED) diff --git a/build_files/cmake/platform/platform_old_libs_update.cmake b/build_files/cmake/platform/platform_old_libs_update.cmake index cd99ed87afc..70f7ed00f7f 100644 --- a/build_files/cmake/platform/platform_old_libs_update.cmake +++ b/build_files/cmake/platform/platform_old_libs_update.cmake @@ -105,7 +105,7 @@ if(UNIX AND (NOT APPLE) AND LIBDIR AND (EXISTS ${LIBDIR})) unset(_libdir_stale) endif() -# Detect update in 4.1 to shared library OpenImageDenoise. +# Detect update in 4.1 to shared library OpenImageDenoise and OSL. if(UNIX AND DEFINED OPENIMAGEDENOISE_LIBRARY AND OPENIMAGEDENOISE_LIBRARY MATCHES "libOpenImageDenoise.a$" AND @@ -114,3 +114,12 @@ if(UNIX AND message(STATUS "Auto updating CMake configuration for dynamic OpenImageDenoise") unset_cache_variables("^OPENIMAGEDENOISE") endif() + +if(UNIX AND + DEFINED OSL_OSLCOMP_LIBRARY AND + OSL_OSLCOMP_LIBRARY MATCHES "liboslcomp.a$" AND + (EXISTS ${LIBDIR}/osl/lib/liboslcomp.so OR + EXISTS ${LIBDIR}/osl/lib/liboslcomp.dylib)) + message(STATUS "Auto updating CMake configuration for dynamic OpenShadingLanguage") + unset_cache_variables("^OSL_") +endif() diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 46786a48970..4a8443b218a 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -355,6 +355,7 @@ if(WITH_CYCLES AND WITH_CYCLES_OSL) endif() endif() endif() +add_bundled_libraries(osl/lib) if(WITH_CYCLES AND WITH_CYCLES_DEVICE_ONEAPI) set(CYCLES_LEVEL_ZERO ${LIBDIR}/level-zero CACHE PATH "Path to Level Zero installation") diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 56801c4a4cf..cb574b2dfd2 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -553,8 +553,16 @@ if(WITH_JACK) set(JACK_LIBRARIES optimized ${LIBDIR}/jack/lib/libjack.lib debug ${LIBDIR}/jack/lib/libjack_d.lib) endif() -set(_PYTHON_VERSION "3.10") +set(_PYTHON_VERSION "3.11") string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION}) +if(NOT EXISTS ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}) + set(_PYTHON_VERSION "3.10") + string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${_PYTHON_VERSION}) + if(NOT EXISTS ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}) + message(FATAL_ERROR "Missing python libraries! Neither 3.11 nor 3.10 are found in ${LIBDIR}/python") + endif() +endif() + # Python executable is needed as part of the build-process, # note that building without Python is quite unusual. set(PYTHON_EXECUTABLE ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python$<$:_d>.exe) @@ -574,8 +582,6 @@ if(WITH_PYTHON) set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}") set(PYTHON_LIBRARIES debug "${PYTHON_LIBRARY_DEBUG}" optimized "${PYTHON_LIBRARY}" ) endif() -unset(_PYTHON_VERSION) -unset(_PYTHON_VERSION_NO_DOTS) if(NOT WITH_WINDOWS_FIND_MODULES) # even if boost is off, we still need to install the dlls when we use our lib folder since @@ -615,7 +621,7 @@ if(WITH_BOOST) if(NOT Boost_FOUND) warn_hardcoded_paths(BOOST) # This is file new in 3.4 if it does not exist, assume we are building against 3.3 libs - set(BOOST_34_TRIGGER_FILE ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python310-${BOOST_DEBUG_POSTFIX}.lib) + set(BOOST_34_TRIGGER_FILE ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python${_PYTHON_VERSION_NO_DOTS}-${BOOST_DEBUG_POSTFIX}.lib) if(NOT EXISTS ${BOOST_34_TRIGGER_FILE}) set(BOOST_DEBUG_POSTFIX "vc142-mt-gd-x64-${BOOST_VERSION}") set(BOOST_PREFIX "lib") @@ -637,8 +643,8 @@ if(WITH_BOOST) if(EXISTS ${BOOST_34_TRIGGER_FILE}) if(WITH_USD) set(BOOST_PYTHON_LIBRARIES - debug ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python310-${BOOST_DEBUG_POSTFIX}.lib - optimized ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python310-${BOOST_POSTFIX}.lib + debug ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python${_PYTHON_VERSION_NO_DOTS}-${BOOST_DEBUG_POSTFIX}.lib + optimized ${BOOST_LIBPATH}/${BOOST_PREFIX}boost_python${_PYTHON_VERSION_NO_DOTS}-${BOOST_POSTFIX}.lib ) endif() endif() @@ -662,6 +668,8 @@ if(WITH_BOOST) set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB") endif() +unset(_PYTHON_VERSION) +unset(_PYTHON_VERSION_NO_DOTS) windows_find_package(OpenImageIO) if(NOT OpenImageIO_FOUND) diff --git a/source/blender/imbuf/CMakeLists.txt b/source/blender/imbuf/CMakeLists.txt index 62f9310355a..f7c9807ce1f 100644 --- a/source/blender/imbuf/CMakeLists.txt +++ b/source/blender/imbuf/CMakeLists.txt @@ -15,6 +15,7 @@ set(INC set(INC_SYS ${JPEG_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} + ${IMATH_INCLUDE_DIRS} ${OPENIMAGEIO_INCLUDE_DIRS} ) diff --git a/source/creator/CMakeLists.txt b/source/creator/CMakeLists.txt index 67f9af21a89..aadc9c35e73 100644 --- a/source/creator/CMakeLists.txt +++ b/source/creator/CMakeLists.txt @@ -527,6 +527,22 @@ if(WITH_OPENCOLORIO) ) endif() if(WIN32) + if(EXISTS ${LIBDIR}/osl/bin/oslquery.dll) # 4.1+ + windows_install_shared_manifest( + FILES ${LIBDIR}/osl/bin/oslquery.dll + ${LIBDIR}/osl/bin/oslcomp.dll + ${LIBDIR}/osl/bin/oslexec.dll + ${LIBDIR}/osl/bin/oslnoise.dll + RELEASE + ) + windows_install_shared_manifest( + FILES ${LIBDIR}/osl/bin/oslquery_d.dll + ${LIBDIR}/osl/bin/oslcomp_d.dll + ${LIBDIR}/osl/bin/oslexec_d.dll + ${LIBDIR}/osl/bin/oslnoise_d.dll + DEBUG + ) + endif() if(EXISTS ${LIBDIR}/opencolorio/bin/opencolorio_2_2.dll) # 3.5 windows_install_shared_manifest( FILES ${LIBDIR}/opencolorio/bin/opencolorio_2_2.dll @@ -547,6 +563,26 @@ if(WIN32) CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel ) endif() + if(EXISTS ${LIBDIR}/opencolorio/bin/opencolorio_2_3.dll) # 4.1 + windows_install_shared_manifest( + FILES ${LIBDIR}/opencolorio/bin/opencolorio_2_3.dll + RELEASE + ) + windows_install_shared_manifest( + FILES ${LIBDIR}/opencolorio/bin/opencolorio_d_2_3.dll + DEBUG + ) + install( + DIRECTORY ${LIBDIR}/opencolorio/lib/site-packages-debug/PyOpenColorIO + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Debug + ) + install( + DIRECTORY ${LIBDIR}/opencolorio/lib/site-packages/PyOpenColorIO + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + endif() if(EXISTS ${LIBDIR}/OpenImageDenoise/bin/openimagedenoise.dll) # 4.0 windows_install_shared_manifest( FILES @@ -1061,22 +1097,6 @@ elseif(WIN32) DEBUG ) - # This will not exist for 3.4 and earlier lib folders - # to ease the transition, support both 3.4 and 3.5 lib - # folders. - if(EXISTS ${LIBDIR}/openvdb/python/pyopenvdb_d.pyd) - install( - FILES ${LIBDIR}/openvdb/python/pyopenvdb_d.pyd - DESTINATION ${TARGETDIR_VER}/python/lib/site-packages - CONFIGURATIONS Debug - ) - install( - FILES ${LIBDIR}/openvdb/python/pyopenvdb.pyd - DESTINATION ${TARGETDIR_VER}/python/lib/site-packages - CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel - ) - endif() - windows_install_shared_manifest( FILES ${LIBDIR}/materialx/bin/MaterialXCore.dll @@ -1105,6 +1125,18 @@ elseif(WIN32) DEBUG ) endif() + if(EXISTS ${LIBDIR}/materialx/bin/MaterialXGenMsl.dll) # 4.1+ + windows_install_shared_manifest( + FILES + ${LIBDIR}/materialx/bin/MaterialXGenMsl.dll + RELEASE + ) + windows_install_shared_manifest( + FILES + ${LIBDIR}/materialx/bin/MaterialXGenMsl_d.dll + DEBUG + ) + endif() windows_install_shared_manifest( FILES ${LIBDIR}/materialx/bin/MaterialXCore_d.dll @@ -1245,6 +1277,36 @@ elseif(WIN32) ) endif() + # This will not exist for 3.4 and earlier lib folders + # to ease the transition, support both 3.4 and 3.5 lib + # folders. + if(EXISTS ${LIBDIR}/openvdb/python/pyopenvdb_d.pyd) + install( + FILES ${LIBDIR}/openvdb/python/pyopenvdb_d.pyd + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Debug + ) + install( + FILES ${LIBDIR}/openvdb/python/pyopenvdb.pyd + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + endif() + + # this will exist for 4.1 lib folders + if(EXISTS ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd) + install( + FILES ${LIBDIR}/openvdb/python/pyopenvdb_d.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Debug + ) + install( + FILES ${LIBDIR}/openvdb/python/pyopenvdb.cp${_PYTHON_VERSION_NO_DOTS}-win_amd64.pyd + DESTINATION ${TARGETDIR_VER}/python/lib/site-packages + CONFIGURATIONS Release;RelWithDebInfo;MinSizeRel + ) + endif() + # MaterialX python bindings install( DIRECTORY ${LIBDIR}/materialx/python/Release/MaterialX