diff options
Diffstat (limited to 'build_files')
59 files changed, 1997 insertions, 622 deletions
diff --git a/build_files/build_environment/CMakeLists.txt b/build_files/build_environment/CMakeLists.txt index 1cf63f2d332..ee8a9a26c53 100644 --- a/build_files/build_environment/CMakeLists.txt +++ b/build_files/build_environment/CMakeLists.txt @@ -29,10 +29,12 @@ cmake_minimum_required(VERSION 3.5) include(ExternalProject) include(cmake/check_software.cmake) -include(cmake/versions.cmake) include(cmake/options.cmake) +# versions.cmake needs to be included after options.cmake due to the BLENDER_PLATFORM_ARM variable being needed. +include(cmake/versions.cmake) include(cmake/boost_build_options.cmake) include(cmake/download.cmake) +include(cmake/macros.cmake) if(ENABLE_MINGW64) include(cmake/setup_mingw64.cmake) @@ -51,8 +53,8 @@ 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/glew.cmake) include(cmake/alembic.cmake) include(cmake/opensubdiv.cmake) include(cmake/sdl.cmake) @@ -96,6 +98,15 @@ include(cmake/fmt.cmake) include(cmake/robinmap.cmake) if(NOT APPLE) include(cmake/xr_openxr.cmake) + if(NOT WIN32 OR BUILD_MODE STREQUAL Release) + include(cmake/dpcpp.cmake) + include(cmake/dpcpp_deps.cmake) + endif() + if(NOT WIN32) + include(cmake/igc.cmake) + include(cmake/gmmlib.cmake) + include(cmake/ocloc.cmake) + endif() endif() # OpenColorIO and dependencies. @@ -128,6 +139,7 @@ if(NOT WIN32 OR ENABLE_MINGW64) include(cmake/vpx.cmake) include(cmake/x264.cmake) include(cmake/xvidcore.cmake) + include(cmake/aom.cmake) include(cmake/ffmpeg.cmake) include(cmake/fftw.cmake) include(cmake/sndfile.cmake) diff --git a/build_files/build_environment/cmake/alembic.cmake b/build_files/build_environment/cmake/alembic.cmake index 484a7849ace..8b049e9e206 100644 --- a/build_files/build_environment/cmake/alembic.cmake +++ b/build_files/build_environment/cmake/alembic.cmake @@ -42,4 +42,5 @@ endif() add_dependencies( external_alembic external_openexr + external_imath ) diff --git a/build_files/build_environment/cmake/aom.cmake b/build_files/build_environment/cmake/aom.cmake new file mode 100644 index 00000000000..9f64439771f --- /dev/null +++ b/build_files/build_environment/cmake/aom.cmake @@ -0,0 +1,45 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +if(WIN32) + # The default generator on windows is msbuild, which we do not + # want to use for this dep, as needs to build with mingw + set(AOM_GENERATOR "Ninja") + # The default flags are full of MSVC options given this will be + # building with mingw, it'll have an unhappy time with that and + # we need to clear them out. + set(AOM_CMAKE_FLAGS ) + # CMake will correctly identify phreads being available, however + # we do not want to use them, as that gains a dependency on + # libpthreadswin.dll which we do not want. when pthreads is not + # available oam will use a pthreads emulation layer using win32 threads + set(AOM_EXTRA_ARGS_WIN32 -DCMAKE_HAVE_PTHREAD_H=OFF) +else() + set(AOM_GENERATOR "Unix Makefiles") + set(AOM_CMAKE_FLAGS ${DEFAULT_CMAKE_FLAGS}) +endif() + +set(AOM_EXTRA_ARGS + -DENABLE_TESTDATA=OFF + -DENABLE_TESTS=OFF + -DENABLE_TOOLS=OFF + -DENABLE_EXAMPLES=OFF + ${AOM_EXTRA_ARGS_WIN32} +) + +# This is slightly different from all other deps in the way that +# aom uses cmake as a build system, but still needs the environment setup +# to include perl so we manually setup the environment and call +# cmake directly for the configure, build and install commands. + +ExternalProject_Add(external_aom + URL file://${PACKAGE_DIR}/${AOM_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${AOM_HASH_TYPE}=${AOM_HASH} + PREFIX ${BUILD_DIR}/aom + CONFIGURE_COMMAND ${CONFIGURE_ENV} && + cd ${BUILD_DIR}/aom/src/external_aom-build/ && + ${CMAKE_COMMAND} -G "${AOM_GENERATOR}" -DCMAKE_INSTALL_PREFIX=${LIBDIR}/aom ${AOM_CMAKE_FLAGS} ${AOM_EXTRA_ARGS} ${BUILD_DIR}/aom/src/external_aom/ + BUILD_COMMAND ${CMAKE_COMMAND} --build . + INSTALL_COMMAND ${CMAKE_COMMAND} --build . --target install + INSTALL_DIR ${LIBDIR}/aom +) diff --git a/build_files/build_environment/cmake/check_software.cmake b/build_files/build_environment/cmake/check_software.cmake index 2a1aaef0bee..cc8fead6f81 100644 --- a/build_files/build_environment/cmake/check_software.cmake +++ b/build_files/build_environment/cmake/check_software.cmake @@ -12,21 +12,13 @@ if(UNIX) automake bison ${_libtoolize_name} + meson + ninja pkg-config tclsh yasm ) - if(NOT APPLE) - set(_required_software - ${_required_software} - - # Needed for Mesa. - meson - ninja - ) - endif() - foreach(_software ${_required_software}) find_program(_software_find NAMES ${_software}) if(NOT _software_find) @@ -56,11 +48,8 @@ if(UNIX) "On Debian and Ubuntu:\n" " apt install autoconf automake libtool yasm tcl ninja-build meson python3-mako\n" "\n" - "On macOS Intel (with homebrew):\n" - " brew install autoconf automake bison libtool pkg-config yasm\n" - "\n" - "On macOS ARM (with homebrew):\n" - " brew install autoconf automake bison flex libtool pkg-config yasm\n" + "On macOS (with homebrew):\n" + " brew install autoconf automake bison flex libtool meson ninja pkg-config yasm\n" "\n" "Other platforms:\n" " Install equivalent packages.\n") diff --git a/build_files/build_environment/cmake/download.cmake b/build_files/build_environment/cmake/download.cmake index 81e7f7ab3fe..6f0dd80ea6a 100644 --- a/build_files/build_environment/cmake/download.cmake +++ b/build_files/build_environment/cmake/download.cmake @@ -36,7 +36,7 @@ download_source(BLOSC) download_source(PTHREADS) download_source(OPENEXR) download_source(FREETYPE) -download_source(GLEW) +download_source(EPOXY) download_source(FREEGLUT) download_source(ALEMBIC) download_source(OPENSUBDIV) @@ -94,6 +94,7 @@ download_source(GMP) download_source(POTRACE) download_source(HARU) download_source(ZSTD) +download_source(SSE2NEON) download_source(FLEX) download_source(BROTLI) download_source(FMT) @@ -101,3 +102,19 @@ download_source(ROBINMAP) download_source(IMATH) download_source(PYSTRING) download_source(LEVEL_ZERO) +download_source(DPCPP) +download_source(VCINTRINSICS) +download_source(OPENCLHEADERS) +download_source(ICDLOADER) +download_source(MP11) +download_source(SPIRV_HEADERS) +download_source(IGC) +download_source(IGC_LLVM) +download_source(IGC_OPENCL_CLANG) +download_source(IGC_VCINTRINSICS) +download_source(IGC_SPIRV_HEADERS) +download_source(IGC_SPIRV_TOOLS) +download_source(IGC_SPIRV_TRANSLATOR) +download_source(GMMLIB) +download_source(OCLOC) +download_source(AOM) diff --git a/build_files/build_environment/cmake/dpcpp.cmake b/build_files/build_environment/cmake/dpcpp.cmake new file mode 100644 index 00000000000..3c3fe201073 --- /dev/null +++ b/build_files/build_environment/cmake/dpcpp.cmake @@ -0,0 +1,109 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + + +if(WIN32) + set(LLVM_GENERATOR "Ninja") +else() + set(LLVM_GENERATOR "Unix Makefiles") +endif() + +set(DPCPP_CONFIGURE_ARGS + # When external deps dpcpp needs are not found it will automatically + # download the during the configure stage using FetchContent. Given + # we need to keep an archive of all source used during build for compliance + # reasons it CANNOT download anything we do not know about. By setting + # this property to ON, all downloads are disabled, and we will have to + # provide the missing deps some other way, a build error beats a compliance + # violation + --cmake-opt FETCHCONTENT_FULLY_DISCONNECTED=ON +) +set(DPCPP_SOURCE_ROOT ${BUILD_DIR}/dpcpp/src/external_dpcpp/) +set(DPCPP_EXTRA_ARGS + # When external deps dpcpp needs are not found it will automatically + # download the during the configure stage using FetchContent. Given + # we need to keep an archive of all source used during build for compliance + # reasons it CANNOT download anything we do not know about. By setting + # this property to ON, all downloads are disabled, and we will have to + # provide the missing deps some other way, a build or configure error + # beats a compliance violation + -DFETCHCONTENT_FULLY_DISCONNECTED=ON + -DLLVMGenXIntrinsics_SOURCE_DIR=${BUILD_DIR}/vcintrinsics/src/external_vcintrinsics/ + -DOpenCL_HEADERS=file://${PACKAGE_DIR}/${OPENCLHEADERS_FILE} + -DOpenCL_LIBRARY_SRC=file://${PACKAGE_DIR}/${ICDLOADER_FILE} + -DBOOST_MP11_SOURCE_DIR=${BUILD_DIR}/mp11/src/external_mp11/ + -DLEVEL_ZERO_LIBRARY=${LIBDIR}/level-zero/lib/${LIBPREFIX}ze_loader${SHAREDLIBEXT} + -DLEVEL_ZERO_INCLUDE_DIR=${LIBDIR}/level-zero/include + -DLLVM_EXTERNAL_SPIRV_HEADERS_SOURCE_DIR=${BUILD_DIR}/spirvheaders/src/external_spirvheaders/ + # Below here is copied from an invocation of buildbot/config.py + -DLLVM_ENABLE_ASSERTIONS=ON + -DLLVM_TARGETS_TO_BUILD=X86 + -DLLVM_EXTERNAL_PROJECTS=sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw + -DLLVM_EXTERNAL_SYCL_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/sycl + -DLLVM_EXTERNAL_LLVM_SPIRV_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/llvm-spirv + -DLLVM_EXTERNAL_XPTI_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xpti + -DXPTI_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xpti + -DLLVM_EXTERNAL_XPTIFW_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/xptifw + -DLLVM_EXTERNAL_LIBDEVICE_SOURCE_DIR=${DPCPP_SOURCE_ROOT}/libdevice + -DLLVM_ENABLE_PROJECTS=clang^^sycl^^llvm-spirv^^opencl^^libdevice^^xpti^^xptifw + -DLIBCLC_TARGETS_TO_BUILD= + -DLIBCLC_GENERATE_REMANGLED_VARIANTS=OFF + -DSYCL_BUILD_PI_HIP_PLATFORM=AMD + -DLLVM_BUILD_TOOLS=ON + -DSYCL_ENABLE_WERROR=OFF + -DSYCL_INCLUDE_TESTS=ON + -DLLVM_ENABLE_DOXYGEN=OFF + -DLLVM_ENABLE_SPHINX=OFF + -DBUILD_SHARED_LIBS=OFF + -DSYCL_ENABLE_XPTI_TRACING=ON + -DLLVM_ENABLE_LLD=OFF + -DXPTI_ENABLE_WERROR=OFF + -DSYCL_CLANG_EXTRA_FLAGS= + -DSYCL_ENABLE_PLUGINS=level_zero + -DCMAKE_INSTALL_RPATH=\$ORIGIN + -DPython3_ROOT_DIR=${LIBDIR}/python/ + -DPython3_EXECUTABLE=${PYTHON_BINARY} + -DPYTHON_EXECUTABLE=${PYTHON_BINARY} + -DLLDB_ENABLE_CURSES=OFF + -DLLVM_ENABLE_TERMINFO=OFF +) + +if(WIN32) + list(APPEND DPCPP_EXTRA_ARGS -DPython3_FIND_REGISTRY=NEVER) +endif() + +ExternalProject_Add(external_dpcpp + URL file://${PACKAGE_DIR}/${DPCPP_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${DPCPP_HASH_TYPE}=${DPCPP_HASH} + PREFIX ${BUILD_DIR}/dpcpp + CMAKE_GENERATOR ${LLVM_GENERATOR} + SOURCE_SUBDIR llvm + LIST_SEPARATOR ^^ + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/dpcpp ${DEFAULT_CMAKE_FLAGS} ${DPCPP_EXTRA_ARGS} + #CONFIGURE_COMMAND ${PYTHON_BINARY} ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/configure.py ${DPCPP_CONFIGURE_ARGS} + #BUILD_COMMAND echo "." #${PYTHON_BINARY} ${BUILD_DIR}/dpcpp/src/external_dpcpp/buildbot/compile.py + INSTALL_COMMAND ${CMAKE_COMMAND} --build . -- deploy-sycl-toolchain + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/dpcpp/src/external_dpcpp < ${PATCH_DIR}/dpcpp.diff + INSTALL_DIR ${LIBDIR}/dpcpp +) + +add_dependencies( + external_dpcpp + external_python + external_python_site_packages + external_vcintrinsics + external_openclheaders + external_icdloader + external_mp11 + external_level-zero + external_spirvheaders +) + +if(BUILD_MODE STREQUAL Release AND WIN32) + ExternalProject_Add_Step(external_dpcpp after_install + COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang-cl.exe + COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang-cpp.exe + COMMAND ${CMAKE_COMMAND} -E rm -f ${LIBDIR}/dpcpp/bin/clang.exe + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/dpcpp ${HARVEST_TARGET}/dpcpp + ) +endif() diff --git a/build_files/build_environment/cmake/dpcpp_deps.cmake b/build_files/build_environment/cmake/dpcpp_deps.cmake new file mode 100644 index 00000000000..e66006993f6 --- /dev/null +++ b/build_files/build_environment/cmake/dpcpp_deps.cmake @@ -0,0 +1,61 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# These are build time requirements for dpcpp +# We only have to unpack these dpcpp will build +# them. + +ExternalProject_Add(external_vcintrinsics + URL file://${PACKAGE_DIR}/${VCINTRINSICS_FILE} + URL_HASH ${VCINTRINSICS_HASH_TYPE}=${VCINTRINSICS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/vcintrinsics + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +# opencl headers do not have to be unpacked, dpcpp will do it +# but it wouldn't hurt to do it anyway as an opertunity to validate +# the hash is correct. +ExternalProject_Add(external_openclheaders + URL file://${PACKAGE_DIR}/${OPENCLHEADERS_FILE} + URL_HASH ${OPENCLHEADERS_HASH_TYPE}=${OPENCLHEADERS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/openclheaders + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +# icdloader does not have to be unpacked, dpcpp will do it +# but it wouldn't hurt to do it anyway as an opertunity to validate +# the hash is correct. +ExternalProject_Add(external_icdloader + URL file://${PACKAGE_DIR}/${ICDLOADER_FILE} + URL_HASH ${ICDLOADER_HASH_TYPE}=${ICDLOADER_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/icdloader + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +ExternalProject_Add(external_mp11 + URL file://${PACKAGE_DIR}/${MP11_FILE} + URL_HASH ${MP11_HASH_TYPE}=${MP11_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/mp11 + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) + +ExternalProject_Add(external_spirvheaders + URL file://${PACKAGE_DIR}/${SPIRV_HEADERS_FILE} + URL_HASH ${SPIRV_HEADERS_HASH_TYPE}=${SPIRV_HEADERS_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/spirvheaders + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . +) diff --git a/build_files/build_environment/cmake/embree.cmake b/build_files/build_environment/cmake/embree.cmake index 2eafc729111..8c689cf000b 100644 --- a/build_files/build_environment/cmake/embree.cmake +++ b/build_files/build_environment/cmake/embree.cmake @@ -10,18 +10,12 @@ set(EMBREE_EXTRA_ARGS -DEMBREE_RAY_MASK=ON -DEMBREE_FILTER_FUNCTION=ON -DEMBREE_BACKFACE_CULLING=OFF - -DEMBREE_MAX_ISA=AVX2 -DEMBREE_TASKING_SYSTEM=TBB -DEMBREE_TBB_ROOT=${LIBDIR}/tbb -DTBB_ROOT=${LIBDIR}/tbb - -DTBB_STATIC_LIB=${TBB_STATIC_LIBRARY} ) -if(BLENDER_PLATFORM_ARM) - set(EMBREE_EXTRA_ARGS - ${EMBREE_EXTRA_ARGS} - -DEMBREE_MAX_ISA=NEON) -else() +if (NOT BLENDER_PLATFORM_ARM) set(EMBREE_EXTRA_ARGS ${EMBREE_EXTRA_ARGS} -DEMBREE_MAX_ISA=AVX2) @@ -30,23 +24,10 @@ endif() if(TBB_STATIC_LIBRARY) set(EMBREE_EXTRA_ARGS ${EMBREE_EXTRA_ARGS} - -DEMBREE_TBB_LIBRARY_NAME=tbb_static - -DEMBREE_TBBMALLOC_LIBRARY_NAME=tbbmalloc_static + -DEMBREE_TBB_COMPONENT=tbb_static ) endif() -if(WIN32) - set(EMBREE_BUILD_DIR ${BUILD_MODE}/) - if(BUILD_MODE STREQUAL Debug) - list(APPEND EMBREE_EXTRA_ARGS - -DEMBREE_TBBMALLOC_LIBRARY_NAME=tbbmalloc_debug - -DEMBREE_TBB_LIBRARY_NAME=tbb_debug - ) - endif() -else() - set(EMBREE_BUILD_DIR) -endif() - ExternalProject_Add(external_embree URL file://${PACKAGE_DIR}/${EMBREE_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} diff --git a/build_files/build_environment/cmake/epoxy.cmake b/build_files/build_environment/cmake/epoxy.cmake new file mode 100644 index 00000000000..4cd9158f2ac --- /dev/null +++ b/build_files/build_environment/cmake/epoxy.cmake @@ -0,0 +1,25 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +if(WIN32) + set(EPOXY_LIB_TYPE shared) +else() + set(EPOXY_LIB_TYPE static) +endif() +ExternalProject_Add(external_epoxy + URL file://${PACKAGE_DIR}/${EPOXY_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${EPOXY_HASH_TYPE}=${EPOXY_HASH} + PREFIX ${BUILD_DIR}/epoxy + PATCH_COMMAND ${PATCH_CMD} -p 1 -N -d ${BUILD_DIR}/epoxy/src/external_epoxy/ < ${PATCH_DIR}/epoxy.diff + CONFIGURE_COMMAND ${CONFIGURE_ENV} && meson setup --prefix ${LIBDIR}/epoxy --default-library ${EPOXY_LIB_TYPE} --libdir lib ${BUILD_DIR}/epoxy/src/external_epoxy-build ${BUILD_DIR}/epoxy/src/external_epoxy -Dtests=false + BUILD_COMMAND ninja + INSTALL_COMMAND ninja install +) + +if(BUILD_MODE STREQUAL Release AND WIN32) + ExternalProject_Add_Step(external_epoxy after_install + COMMAND ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/epoxy/include ${HARVEST_TARGET}/epoxy/include + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/epoxy/bin/epoxy-0.dll ${HARVEST_TARGET}/epoxy/bin/epoxy-0.dll + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/epoxy/lib/epoxy.lib ${HARVEST_TARGET}/epoxy/lib/epoxy.lib + DEPENDEES install + ) +endif() diff --git a/build_files/build_environment/cmake/ffmpeg.cmake b/build_files/build_environment/cmake/ffmpeg.cmake index 4cf96ee2fcb..7730607c514 100644 --- a/build_files/build_environment/cmake/ffmpeg.cmake +++ b/build_files/build_environment/cmake/ffmpeg.cmake @@ -1,9 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-or-later -set(FFMPEG_CFLAGS "-I${mingw_LIBDIR}/lame/include -I${mingw_LIBDIR}/openjpeg/include/ -I${mingw_LIBDIR}/ogg/include -I${mingw_LIBDIR}/vorbis/include -I${mingw_LIBDIR}/theora/include -I${mingw_LIBDIR}/opus/include -I${mingw_LIBDIR}/vpx/include -I${mingw_LIBDIR}/x264/include -I${mingw_LIBDIR}/xvidcore/include -I${mingw_LIBDIR}/zlib/include") -set(FFMPEG_LDFLAGS "-L${mingw_LIBDIR}/lame/lib -L${mingw_LIBDIR}/openjpeg/lib -L${mingw_LIBDIR}/ogg/lib -L${mingw_LIBDIR}/vorbis/lib -L${mingw_LIBDIR}/theora/lib -L${mingw_LIBDIR}/opus/lib -L${mingw_LIBDIR}/vpx/lib -L${mingw_LIBDIR}/x264/lib -L${mingw_LIBDIR}/xvidcore/lib -L${mingw_LIBDIR}/zlib/lib") +set(FFMPEG_CFLAGS "-I${mingw_LIBDIR}/lame/include -I${mingw_LIBDIR}/openjpeg/include/ -I${mingw_LIBDIR}/ogg/include -I${mingw_LIBDIR}/vorbis/include -I${mingw_LIBDIR}/theora/include -I${mingw_LIBDIR}/opus/include -I${mingw_LIBDIR}/vpx/include -I${mingw_LIBDIR}/x264/include -I${mingw_LIBDIR}/xvidcore/include -I${mingw_LIBDIR}/zlib/include -I${mingw_LIBDIR}/aom/include") +set(FFMPEG_LDFLAGS "-L${mingw_LIBDIR}/lame/lib -L${mingw_LIBDIR}/openjpeg/lib -L${mingw_LIBDIR}/ogg/lib -L${mingw_LIBDIR}/vorbis/lib -L${mingw_LIBDIR}/theora/lib -L${mingw_LIBDIR}/opus/lib -L${mingw_LIBDIR}/vpx/lib -L${mingw_LIBDIR}/x264/lib -L${mingw_LIBDIR}/xvidcore/lib -L${mingw_LIBDIR}/zlib/lib -L${mingw_LIBDIR}/aom/lib") set(FFMPEG_EXTRA_FLAGS --pkg-config-flags=--static --extra-cflags=${FFMPEG_CFLAGS} --extra-ldflags=${FFMPEG_LDFLAGS}) -set(FFMPEG_ENV PKG_CONFIG_PATH=${mingw_LIBDIR}/openjpeg/lib/pkgconfig:${mingw_LIBDIR}/x264/lib/pkgconfig:${mingw_LIBDIR}/vorbis/lib/pkgconfig:${mingw_LIBDIR}/ogg/lib/pkgconfig:${mingw_LIBDIR}:${mingw_LIBDIR}/vpx/lib/pkgconfig:${mingw_LIBDIR}/theora/lib/pkgconfig:${mingw_LIBDIR}/openjpeg/lib/pkgconfig:${mingw_LIBDIR}/opus/lib/pkgconfig:) +set(FFMPEG_ENV PKG_CONFIG_PATH=${mingw_LIBDIR}/openjpeg/lib/pkgconfig:${mingw_LIBDIR}/x264/lib/pkgconfig:${mingw_LIBDIR}/vorbis/lib/pkgconfig:${mingw_LIBDIR}/ogg/lib/pkgconfig:${mingw_LIBDIR}:${mingw_LIBDIR}/vpx/lib/pkgconfig:${mingw_LIBDIR}/theora/lib/pkgconfig:${mingw_LIBDIR}/openjpeg/lib/pkgconfig:${mingw_LIBDIR}/opus/lib/pkgconfig:${mingw_LIBDIR}/aom/lib/pkgconfig:) if(WIN32) set(FFMPEG_ENV set ${FFMPEG_ENV} &&) @@ -79,6 +79,7 @@ ExternalProject_Add(external_ffmpeg --disable-librtmp --enable-libx264 --enable-libxvid + --enable-libaom --disable-libopencore-amrnb --disable-libopencore-amrwb --disable-libdc1394 @@ -125,6 +126,7 @@ add_dependencies( external_vorbis external_ogg external_lame + external_aom ) if(WIN32) add_dependencies( diff --git a/build_files/build_environment/cmake/glew.cmake b/build_files/build_environment/cmake/glew.cmake deleted file mode 100644 index 0745ad01533..00000000000 --- a/build_files/build_environment/cmake/glew.cmake +++ /dev/null @@ -1,16 +0,0 @@ -# SPDX-License-Identifier: GPL-2.0-or-later - -set(GLEW_EXTRA_ARGS - -DBUILD_UTILS=Off - -DBUILD_SHARED_LIBS=Off -) - -ExternalProject_Add(external_glew - URL file://${PACKAGE_DIR}/${GLEW_FILE} - DOWNLOAD_DIR ${DOWNLOAD_DIR} - URL_HASH ${GLEW_HASH_TYPE}=${GLEW_HASH} - PATCH_COMMAND COMMAND ${CMAKE_COMMAND} -E copy ${PATCH_DIR}/cmakelists_glew.txt ${BUILD_DIR}/glew/src/external_glew/CMakeLists.txt - PREFIX ${BUILD_DIR}/glew - CMAKE_ARGS -DCMAKE_POSITION_INDEPENDENT_CODE=ON -DCMAKE_INSTALL_PREFIX=${LIBDIR}/glew ${DEFAULT_CMAKE_FLAGS} ${GLEW_EXTRA_ARGS} - INSTALL_DIR ${LIBDIR}/glew -) diff --git a/build_files/build_environment/cmake/gmmlib.cmake b/build_files/build_environment/cmake/gmmlib.cmake new file mode 100644 index 00000000000..c46f5c8943d --- /dev/null +++ b/build_files/build_environment/cmake/gmmlib.cmake @@ -0,0 +1,13 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +set(GMMLIB_EXTRA_ARGS +) + +ExternalProject_Add(external_gmmlib + URL file://${PACKAGE_DIR}/${GMMLIB_FILE} + URL_HASH ${GMMLIB_HASH_TYPE}=${GMMLIB_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/gmmlib + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/gmmlib ${DEFAULT_CMAKE_FLAGS} ${GMMLIB_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/gmmlib +) diff --git a/build_files/build_environment/cmake/harvest.cmake b/build_files/build_environment/cmake/harvest.cmake index aeaa6fbd2b5..6ed98398fde 100644 --- a/build_files/build_environment/cmake/harvest.cmake +++ b/build_files/build_environment/cmake/harvest.cmake @@ -22,12 +22,6 @@ if(BUILD_MODE STREQUAL Release) # 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/ && - # glew-> opengl - ${CMAKE_COMMAND} -E copy ${LIBDIR}/glew/lib/libglew32.lib ${HARVEST_TARGET}/opengl/lib/glew.lib && - ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/glew/include/ ${HARVEST_TARGET}/opengl/include/ && - # tiff - ${CMAKE_COMMAND} -E copy ${LIBDIR}/tiff/lib/tiff.lib ${HARVEST_TARGET}/tiff/lib/libtiff.lib && - ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/tiff/include/ ${HARVEST_TARGET}/tiff/include/ DEPENDS ) endif() @@ -46,7 +40,8 @@ function(harvest from to) install( FILES ${LIBDIR}/${from} DESTINATION ${HARVEST_TARGET}/${dirpath} - RENAME ${filename}) + RENAME ${filename} + ) else() install( DIRECTORY ${LIBDIR}/${from}/ @@ -56,7 +51,8 @@ function(harvest from to) PATTERN "pkgconfig" EXCLUDE PATTERN "cmake" EXCLUDE PATTERN "__pycache__" EXCLUDE - PATTERN "tests" EXCLUDE) + PATTERN "tests" EXCLUDE + ) endif() endfunction() @@ -76,8 +72,8 @@ harvest(fftw3/lib fftw3/lib "*.a") harvest(flac/lib sndfile/lib "libFLAC.a") harvest(freetype/include freetype/include "*.h") harvest(freetype/lib/libfreetype2ST.a freetype/lib/libfreetype.a) -harvest(glew/include glew/include "*.h") -harvest(glew/lib glew/lib "*.a") +harvest(epoxy/include epoxy/include "*.h") +harvest(epoxy/lib epoxy/lib "*.a") harvest(gmp/include gmp/include "*.h") harvest(gmp/lib gmp/lib "*.a") harvest(jemalloc/include jemalloc/include "*.h") @@ -177,6 +173,7 @@ harvest(opus/lib ffmpeg/lib "*.a") harvest(vpx/lib ffmpeg/lib "*.a") harvest(x264/lib ffmpeg/lib "*.a") harvest(xvidcore/lib ffmpeg/lib "*.a") +harvest(aom/lib ffmpeg/lib "*.a") harvest(webp/lib webp/lib "*.a") harvest(webp/include webp/include "*.h") harvest(usd/include usd/include "*.h") @@ -192,6 +189,10 @@ harvest(zstd/lib zstd/lib "*.a") if(UNIX AND NOT APPLE) harvest(libglu/lib mesa/lib "*.so*") harvest(mesa/lib64 mesa/lib "*.so*") -endif() + + harvest(dpcpp dpcpp "*") + harvest(igc dpcpp/lib/igc "*") + harvest(ocloc dpcpp/lib/ocloc "*") + endif() endif() diff --git a/build_files/build_environment/cmake/igc.cmake b/build_files/build_environment/cmake/igc.cmake new file mode 100644 index 00000000000..3b488a77b3f --- /dev/null +++ b/build_files/build_environment/cmake/igc.cmake @@ -0,0 +1,126 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +unpack_only(igc_vcintrinsics) +unpack_only(igc_spirv_headers) +unpack_only(igc_spirv_tools) + +# +# igc_opencl_clang contains patches that need to be applied +# to external_igc_llvm and igc_spirv_translator, we unpack +# igc_opencl_clang first, then have the patch stages of +# external_igc_llvm and igc_spirv_translator apply them. +# + +ExternalProject_Add(external_igc_opencl_clang + URL file://${PACKAGE_DIR}/${IGC_OPENCL_CLANG_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_OPENCL_CLANG_HASH_TYPE}=${IGC_OPENCL_CLANG_HASH} + PREFIX ${BUILD_DIR}/igc_opencl_clang + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ < ${PATCH_DIR}/igc_opencl_clang.diff +) + +set(IGC_OPENCL_CLANG_PATCH_DIR ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/patches) +set(IGC_LLVM_SOURCE_DIR ${BUILD_DIR}/igc_llvm/src/external_igc_llvm) +set(IGC_SPIRV_TRANSLATOR_SOURCE_DIR ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator) + +ExternalProject_Add(external_igc_llvm + URL file://${PACKAGE_DIR}/${IGC_LLVM_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_LLVM_HASH_TYPE}=${IGC_LLVM_HASH} + PREFIX ${BUILD_DIR}/igc_llvm + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0001-OpenCL-3.0-support.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0002-Remove-__IMAGE_SUPPORT__-macro-for-SPIR.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0003-Avoid-calling-ParseCommandLineOptions-in-BackendUtil.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0004-OpenCL-support-cl_ext_float_atomics.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/clang/0005-OpenCL-Add-cl_khr_integer_dot_product.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/llvm/0001-Memory-leak-fix-for-Managed-Static-Mutex.patch && + ${PATCH_CMD} -p 1 -d ${IGC_LLVM_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/llvm/0002-Remove-repo-name-in-LLVM-IR.patch +) +add_dependencies( + external_igc_llvm + external_igc_opencl_clang +) + +ExternalProject_Add(external_igc_spirv_translator + URL file://${PACKAGE_DIR}/${IGC_SPIRV_TRANSLATOR_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_SPIRV_TRANSLATOR_HASH_TYPE}=${IGC_SPIRV_TRANSLATOR_HASH} + PREFIX ${BUILD_DIR}/igc_spirv_translator + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + PATCH_COMMAND ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0001-update-SPIR-V-headers-for-SPV_INTEL_split_barrier.patch && + ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0002-Add-support-for-split-barriers-extension-SPV_INTEL_s.patch && + ${PATCH_CMD} -p 1 -d ${IGC_SPIRV_TRANSLATOR_SOURCE_DIR} < ${IGC_OPENCL_CLANG_PATCH_DIR}/spirv/0003-Support-cl_bf16_conversions.patch +) +add_dependencies( + external_igc_spirv_translator + external_igc_opencl_clang +) + +if(WIN32) + set(IGC_GENERATOR "Ninja") + set(IGC_TARGET Windows64) +else() + set(IGC_GENERATOR "Unix Makefiles") + set(IGC_TARGET Linux64) +endif() + +set(IGC_EXTRA_ARGS + -DIGC_OPTION__ARCHITECTURE_TARGET=${IGC_TARGET} + -DIGC_OPTION__ARCHITECTURE_HOST=${IGC_TARGET} +) + +if(UNIX AND NOT APPLE) + list(APPEND IGC_EXTRA_ARGS + -DFLEX_EXECUTABLE=${LIBDIR}/flex/bin/flex + -DFLEX_INCLUDE_DIR=${LIBDIR}/flex/include + ) +endif() + +ExternalProject_Add(external_igc + URL file://${PACKAGE_DIR}/${IGC_FILE} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${IGC_HASH_TYPE}=${IGC_HASH} + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/igc ${DEFAULT_CMAKE_FLAGS} ${IGC_EXTRA_ARGS} + + # IGC is pretty set in its way where sub projects ought to live, for some it offers + # hooks to supply alternatives folders, other are just hardocded with no way to configure + # we symlink everything here, since it's less work than trying to convince the cmake + # scripts to accept alternative locations. + # + PATCH_COMMAND ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_llvm/src/external_igc_llvm/ ${BUILD_DIR}/igc/src/llvm-project && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_opencl_clang/src/external_igc_opencl_clang/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/opencl-clang && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_translator/src/external_igc_spirv_translator/ ${BUILD_DIR}/igc/src/llvm-project/llvm/projects/llvm-spirv && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_tools/src/external_igc_spirv_tools/ ${BUILD_DIR}/igc/src/SPIRV-Tools && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_spirv_headers/src/external_igc_spirv_headers/ ${BUILD_DIR}/igc/src/SPIRV-Headers && + ${CMAKE_COMMAND} -E create_symlink ${BUILD_DIR}/igc_vcintrinsics/src/external_igc_vcintrinsics/ ${BUILD_DIR}/igc/src/vc-intrinsics + PREFIX ${BUILD_DIR}/igc + INSTALL_DIR ${LIBDIR}/igc + INSTALL_COMMAND ${CMAKE_COMMAND} --install . --strip + CMAKE_GENERATOR ${IGC_GENERATOR} +) + +add_dependencies( + external_igc + external_igc_vcintrinsics + external_igc_llvm + external_igc_opencl_clang + external_igc_vcintrinsics + external_igc_spirv_headers + external_igc_spirv_tools + external_igc_spirv_translator +) + +if(UNIX AND NOT APPLE) + add_dependencies( + external_igc + external_flex + ) +endif() diff --git a/build_files/build_environment/cmake/ispc.cmake b/build_files/build_environment/cmake/ispc.cmake index 160088bc16f..c2dbedca55f 100644 --- a/build_files/build_environment/cmake/ispc.cmake +++ b/build_files/build_environment/cmake/ispc.cmake @@ -6,6 +6,7 @@ if(WIN32) -DBISON_EXECUTABLE=${LIBDIR}/flexbison/win_bison.exe -DM4_EXECUTABLE=${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/m4.exe -DARM_ENABLED=Off + -DPython3_FIND_REGISTRY=NEVER ) elseif(APPLE) # Use bison and flex installed via Homebrew. @@ -27,7 +28,7 @@ elseif(UNIX) set(ISPC_EXTRA_ARGS_UNIX -DCMAKE_C_COMPILER=${LIBDIR}/llvm/bin/clang -DCMAKE_CXX_COMPILER=${LIBDIR}/llvm/bin/clang++ - -DARM_ENABLED=Off + -DARM_ENABLED=${BLENDER_PLATFORM_ARM} -DFLEX_EXECUTABLE=${LIBDIR}/flex/bin/flex ) endif() @@ -43,6 +44,8 @@ set(ISPC_EXTRA_ARGS -DISPC_INCLUDE_TESTS=Off -DCLANG_LIBRARY_DIR=${LIBDIR}/llvm/lib -DCLANG_INCLUDE_DIRS=${LIBDIR}/llvm/include + -DPython3_ROOT_DIR=${LIBDIR}/python/ + -DPython3_EXECUTABLE=${PYTHON_BINARY} ${ISPC_EXTRA_ARGS_WIN} ${ISPC_EXTRA_ARGS_APPLE} ${ISPC_EXTRA_ARGS_UNIX} @@ -61,6 +64,7 @@ ExternalProject_Add(external_ispc add_dependencies( external_ispc ll + external_python ) if(WIN32) diff --git a/build_files/build_environment/cmake/llvm.cmake b/build_files/build_environment/cmake/llvm.cmake index df4cd8b71e9..e4ddc7db846 100644 --- a/build_files/build_environment/cmake/llvm.cmake +++ b/build_files/build_environment/cmake/llvm.cmake @@ -82,4 +82,3 @@ add_dependencies( ll external_python ) - diff --git a/build_files/build_environment/cmake/macros.cmake b/build_files/build_environment/cmake/macros.cmake new file mode 100644 index 00000000000..82fc151a038 --- /dev/null +++ b/build_files/build_environment/cmake/macros.cmake @@ -0,0 +1,18 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +# shorthand to only unpack a certain dependency +macro(unpack_only name) + string(TOUPPER ${name} UPPER_NAME) + set(TARGET_FILE ${${UPPER_NAME}_FILE}) + set(TARGET_HASH_TYPE ${${UPPER_NAME}_HASH_TYPE}) + set(TARGET_HASH ${${UPPER_NAME}_HASH}) + ExternalProject_Add(external_${name} + URL file://${PACKAGE_DIR}/${TARGET_FILE} + URL_HASH ${TARGET_HASH_TYPE}=${TARGET_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/${name} + CONFIGURE_COMMAND echo . + BUILD_COMMAND echo . + INSTALL_COMMAND echo . + ) +endmacro() diff --git a/build_files/build_environment/cmake/ocloc.cmake b/build_files/build_environment/cmake/ocloc.cmake new file mode 100644 index 00000000000..f686d2dd4fc --- /dev/null +++ b/build_files/build_environment/cmake/ocloc.cmake @@ -0,0 +1,24 @@ +# SPDX-License-Identifier: GPL-2.0-or-later + +set(OCLOC_EXTRA_ARGS + -DNEO_SKIP_UNIT_TESTS=1 + -DNEO_BUILD_WITH_OCL=0 + -DBUILD_WITH_L0=0 + -DIGC_DIR=${LIBDIR}/igc + -DGMM_DIR=${LIBDIR}/gmmlib +) + +ExternalProject_Add(external_ocloc + URL file://${PACKAGE_DIR}/${OCLOC_FILE} + URL_HASH ${OCLOC_HASH_TYPE}=${OCLOC_HASH} + DOWNLOAD_DIR ${DOWNLOAD_DIR} + PREFIX ${BUILD_DIR}/ocloc + CMAKE_ARGS -DCMAKE_INSTALL_PREFIX=${LIBDIR}/ocloc ${DEFAULT_CMAKE_FLAGS} ${OCLOC_EXTRA_ARGS} + INSTALL_DIR ${LIBDIR}/ocloc +) + +add_dependencies( + external_ocloc + external_igc + external_gmmlib +) diff --git a/build_files/build_environment/cmake/openimagedenoise.cmake b/build_files/build_environment/cmake/openimagedenoise.cmake index 3612e91a690..14a730d69b6 100644 --- a/build_files/build_environment/cmake/openimagedenoise.cmake +++ b/build_files/build_environment/cmake/openimagedenoise.cmake @@ -9,6 +9,7 @@ set(OIDN_EXTRA_ARGS -DOIDN_STATIC_RUNTIME=OFF -DISPC_EXECUTABLE=${LIBDIR}/ispc/bin/ispc -DOIDN_FILTER_RTLIGHTMAP=OFF + -DPYTHON_EXECUTABLE=${PYTHON_BINARY} ) if(WIN32) @@ -38,6 +39,7 @@ add_dependencies( external_openimagedenoise external_tbb external_ispc + external_python ) if(WIN32) diff --git a/build_files/build_environment/cmake/openimageio.cmake b/build_files/build_environment/cmake/openimageio.cmake index b7d7ce689a4..26881488039 100644 --- a/build_files/build_environment/cmake/openimageio.cmake +++ b/build_files/build_environment/cmake/openimageio.cmake @@ -18,9 +18,15 @@ if(WIN32) set(PNG_LIBNAME libpng16_static${LIBEXT}) set(OIIO_SIMD_FLAGS -DUSE_SIMD=sse2) set(OPENJPEG_POSTFIX _msvc) + if(BUILD_MODE STREQUAL Debug) + set(TIFF_POSTFIX d) + else() + set(TIFF_POSTFIX) + endif() else() set(PNG_LIBNAME libpng${LIBEXT}) set(OIIO_SIMD_FLAGS) + set(TIFF_POSTFIX) endif() if(MSVC) @@ -65,7 +71,7 @@ set(OPENIMAGEIO_EXTRA_ARGS -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include -DPNG_LIBRARY=${LIBDIR}/png/lib/${PNG_LIBNAME} -DPNG_PNG_INCLUDE_DIR=${LIBDIR}/png/include - -DTIFF_LIBRARY=${LIBDIR}/tiff/lib/${LIBPREFIX}tiff${LIBEXT} + -DTIFF_LIBRARY=${LIBDIR}/tiff/lib/${LIBPREFIX}tiff${TIFF_POSTFIX}${LIBEXT} -DTIFF_INCLUDE_DIR=${LIBDIR}/tiff/include -DJPEG_LIBRARY=${LIBDIR}/jpeg/lib/${JPEG_LIBRARY} -DJPEG_INCLUDE_DIR=${LIBDIR}/jpeg/include diff --git a/build_files/build_environment/cmake/options.cmake b/build_files/build_environment/cmake/options.cmake index 7b9529068f4..9015ef9ac7c 100644 --- a/build_files/build_environment/cmake/options.cmake +++ b/build_files/build_environment/cmake/options.cmake @@ -38,6 +38,7 @@ message("BUILD_DIR = ${BUILD_DIR}") if(WIN32) set(PATCH_CMD ${DOWNLOAD_DIR}/mingw/mingw64/msys/1.0/bin/patch.exe) set(LIBEXT ".lib") + set(SHAREDLIBEXT ".lib") set(LIBPREFIX "") # For OIIO and OSL @@ -96,6 +97,7 @@ if(WIN32) else() set(PATCH_CMD patch) set(LIBEXT ".a") + set(SHAREDLIBEXT ".so") set(LIBPREFIX "lib") if(APPLE) diff --git a/build_files/build_environment/cmake/python.cmake b/build_files/build_environment/cmake/python.cmake index 3f45333ed3d..8fed10e9d72 100644 --- a/build_files/build_environment/cmake/python.cmake +++ b/build_files/build_environment/cmake/python.cmake @@ -27,6 +27,7 @@ if(WIN32) PREFIX ${BUILD_DIR}/python CONFIGURE_COMMAND "" BUILD_COMMAND cd ${BUILD_DIR}/python/src/external_python/pcbuild/ && set IncludeTkinter=false && call build.bat -e -p x64 -c ${BUILD_MODE} + PATCH_COMMAND ${PATCH_CMD} --verbose -p1 -d ${BUILD_DIR}/python/src/external_python < ${PATCH_DIR}/python_windows.diff INSTALL_COMMAND ${PYTHON_BINARY_INTERNAL} ${PYTHON_SRC}/PC/layout/main.py -b ${PYTHON_SRC}/PCbuild/amd64 -s ${PYTHON_SRC} -t ${PYTHON_SRC}/tmp/ --include-stable --include-pip --include-dev --include-launchers --include-venv --include-symbols ${PYTHON_EXTRA_INSTLAL_FLAGS} --copy ${LIBDIR}/python ) diff --git a/build_files/build_environment/cmake/sse2neon.cmake b/build_files/build_environment/cmake/sse2neon.cmake index 2216ad43d59..07fe1ac6f39 100644 --- a/build_files/build_environment/cmake/sse2neon.cmake +++ b/build_files/build_environment/cmake/sse2neon.cmake @@ -1,9 +1,9 @@ # SPDX-License-Identifier: GPL-2.0-or-later ExternalProject_Add(external_sse2neon - GIT_REPOSITORY ${SSE2NEON_GIT} - GIT_TAG ${SSE2NEON_GIT_HASH} + URL file://${PACKAGE_DIR}/${SSE2NEON_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} + URL_HASH ${SSE2NEON_HASH_TYPE}=${SSE2NEON_HASH} PREFIX ${BUILD_DIR}/sse2neon CONFIGURE_COMMAND echo sse2neon - Nothing to configure BUILD_COMMAND echo sse2neon - nothing to build diff --git a/build_files/build_environment/cmake/tiff.cmake b/build_files/build_environment/cmake/tiff.cmake index bd495df2a4c..1f8e9442ae5 100644 --- a/build_files/build_environment/cmake/tiff.cmake +++ b/build_files/build_environment/cmake/tiff.cmake @@ -3,6 +3,8 @@ set(TIFF_EXTRA_ARGS -DZLIB_LIBRARY=${LIBDIR}/zlib/lib/${ZLIB_LIBRARY} -DZLIB_INCLUDE_DIR=${LIBDIR}/zlib/include + -DJPEG_LIBRARY=${LIBDIR}/jpeg/lib/${JPEG_LIBRARY} + -DJPEG_INCLUDE_DIR=${LIBDIR}/jpeg/include -DPNG_STATIC=ON -DBUILD_SHARED_LIBS=OFF -Dlzma=OFF @@ -24,10 +26,12 @@ add_dependencies( external_tiff external_zlib ) - -if(WIN32 AND BUILD_MODE STREQUAL Debug) - ExternalProject_Add_Step(external_tiff after_install - COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tiff/lib/tiffd${LIBEXT} ${LIBDIR}/tiff/lib/tiff${LIBEXT} - DEPENDEES install - ) +if(WIN32) + if(BUILD_MODE STREQUAL Release) + ExternalProject_Add_Step(external_tiff after_install + COMMAND ${CMAKE_COMMAND} -E copy ${LIBDIR}/tiff/lib/tiff.lib ${HARVEST_TARGET}/tiff/lib/libtiff.lib && + ${CMAKE_COMMAND} -E copy_directory ${LIBDIR}/tiff/include/ ${HARVEST_TARGET}/tiff/include/ + DEPENDEES install + ) + endif() endif() diff --git a/build_files/build_environment/cmake/versions.cmake b/build_files/build_environment/cmake/versions.cmake index 550be86b6b6..95425300923 100644 --- a/build_files/build_environment/cmake/versions.cmake +++ b/build_files/build_environment/cmake/versions.cmake @@ -45,15 +45,15 @@ set(PTHREADS_HASH f3bf81bb395840b3446197bcf4ecd653) set(PTHREADS_HASH_TYPE MD5) set(PTHREADS_FILE pthreads4w-code-${PTHREADS_VERSION}.zip) -set(OPENEXR_VERSION 3.1.4) +set(OPENEXR_VERSION 3.1.5) set(OPENEXR_URI https://github.com/AcademySoftwareFoundation/openexr/archive/v${OPENEXR_VERSION}.tar.gz) -set(OPENEXR_HASH e990be1ff765797bc2d93a8060e1c1f2) +set(OPENEXR_HASH a92f38eedd43e56c0af56d4852506886) set(OPENEXR_HASH_TYPE MD5) set(OPENEXR_FILE openexr-${OPENEXR_VERSION}.tar.gz) -set(IMATH_VERSION 3.1.4) +set(IMATH_VERSION 3.1.5) set(IMATH_URI https://github.com/AcademySoftwareFoundation/Imath/archive/v${OPENEXR_VERSION}.tar.gz) -set(IMATH_HASH fddf14ec73e12c34e74c3c175e311a3f) +set(IMATH_HASH dd375574276c54872b7b3d54053baff0) set(IMATH_HASH_TYPE MD5) set(IMATH_FILE imath-${IMATH_VERSION}.tar.gz) @@ -80,11 +80,11 @@ set(FREETYPE_HASH bd4e3b007474319909a6b79d50908e85) set(FREETYPE_HASH_TYPE MD5) set(FREETYPE_FILE freetype-${FREETYPE_VERSION}.tar.gz) -set(GLEW_VERSION 1.13.0) -set(GLEW_URI http://prdownloads.sourceforge.net/glew/glew/${GLEW_VERSION}/glew-${GLEW_VERSION}.tgz) -set(GLEW_HASH 7cbada3166d2aadfc4169c4283701066) -set(GLEW_HASH_TYPE MD5) -set(GLEW_FILE glew-${GLEW_VERSION}.tgz) +set(EPOXY_VERSION 1.5.10) +set(EPOXY_URI https://github.com/anholt/libepoxy/archive/refs/tags/${EPOXY_VERSION}.tar.gz) +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) @@ -147,7 +147,7 @@ set(OPENIMAGEIO_HASH de45fb38501c4581062b522b53b6141c) set(OPENIMAGEIO_HASH_TYPE MD5) set(OPENIMAGEIO_FILE OpenImageIO-${OPENIMAGEIO_VERSION}.tar.gz) -# 8.0.0 is currently oiio's preferred vesion although never versions may be available. +# 8.0.0 is currently oiio's preferred version although never versions may be available. # the preferred version can be found in oiio's externalpackages.cmake set(FMT_VERSION 8.0.0) set(FMT_URI https://github.com/fmtlib/fmt/archive/refs/tags/${FMT_VERSION}.tar.gz) @@ -155,7 +155,7 @@ set(FMT_HASH 7bce0e9e022e586b178b150002e7c2339994e3c2bbe44027e9abb0d60f9cce83) set(FMT_HASH_TYPE SHA256) set(FMT_FILE fmt-${FMT_VERSION}.tar.gz) -# 0.6.2 is currently oiio's preferred vesion although never versions may be available. +# 0.6.2 is currently oiio's preferred version although never versions may be available. # the preferred version can be found in oiio's externalpackages.cmake set(ROBINMAP_VERSION v0.6.2) set(ROBINMAP_URI https://github.com/Tessil/robin-map/archive/refs/tags/${ROBINMAP_VERSION}.tar.gz) @@ -163,9 +163,9 @@ set(ROBINMAP_HASH c08ec4b1bf1c85eb0d6432244a6a89862229da1cb834f3f90fba8dc35d8c8e set(ROBINMAP_HASH_TYPE SHA256) set(ROBINMAP_FILE robinmap-${ROBINMAP_VERSION}.tar.gz) -set(TIFF_VERSION 4.3.0) +set(TIFF_VERSION 4.4.0) set(TIFF_URI http://download.osgeo.org/libtiff/tiff-${TIFF_VERSION}.tar.gz) -set(TIFF_HASH 0a2e4744d1426a8fc8211c0cdbc3a1b3) +set(TIFF_HASH 376f17f189e9d02280dfe709b2b2bbea) set(TIFF_HASH_TYPE MD5) set(TIFF_FILE tiff-${TIFF_VERSION}.tar.gz) @@ -410,9 +410,9 @@ set(SQLITE_HASH fb558c49ee21a837713c4f1e7e413309aabdd9c7) set(SQLITE_HASH_TYPE SHA1) set(SQLITE_FILE sqlite-src-3240000.zip) -set(EMBREE_VERSION 3.13.3) +set(EMBREE_VERSION 3.13.4) set(EMBREE_URI https://github.com/embree/embree/archive/v${EMBREE_VERSION}.zip) -set(EMBREE_HASH f62766ba54e48a2f327c3a22596e7133) +set(EMBREE_HASH 52d0be294d6c88ba7a6c9e046796e7be) set(EMBREE_HASH_TYPE MD5) set(EMBREE_FILE embree-v${EMBREE_VERSION}.zip) @@ -488,8 +488,11 @@ set(ZSTD_HASH 5194fbfa781fcf45b98c5e849651aa7b3b0a008c6b72d4a0db760f3002291e94) set(ZSTD_HASH_TYPE SHA256) set(ZSTD_FILE zstd-${ZSTD_VERSION}.tar.gz) -set(SSE2NEON_GIT https://github.com/DLTcollab/sse2neon.git) -set(SSE2NEON_GIT_HASH fe5ff00bb8d19b327714a3c290f3e2ce81ba3525) +set(SSE2NEON_VERSION fe5ff00bb8d19b327714a3c290f3e2ce81ba3525) +set(SSE2NEON_URI https://github.com/DLTcollab/sse2neon/archive/${SSE2NEON_VERSION}.tar.gz) +set(SSE2NEON_HASH 0780253525d299c31775ef95853698d03db9c7739942af8570000f4a25a5d605) +set(SSE2NEON_HASH_TYPE SHA256) +set(SSE2NEON_FILE sse2neon-${SSE2NEON_VERSION}.tar.gz) set(BROTLI_VERSION v1.0.9) set(BROTLI_URI https://github.com/google/brotli/archive/refs/tags/${BROTLI_VERSION}.tar.gz) @@ -502,3 +505,140 @@ set(LEVEL_ZERO_URI https://github.com/oneapi-src/level-zero/archive/refs/tags/${ set(LEVEL_ZERO_HASH c39bb05a8e5898aa6c444e1704105b93d3f1888b9c333f8e7e73825ffbfb2617) set(LEVEL_ZERO_HASH_TYPE SHA256) set(LEVEL_ZERO_FILE level-zero-${LEVEL_ZERO_VERSION}.tar.gz) + +set(DPCPP_VERSION 20220812) +set(DPCPP_URI https://github.com/intel/llvm/archive/refs/tags/sycl-nightly/${DPCPP_VERSION}.tar.gz) +set(DPCPP_HASH 0e3c95346c295f5cf80f3a42d80b1c49481955898530242636ddc002627248d6) +set(DPCPP_HASH_TYPE SHA256) +set(DPCPP_FILE DPCPP-${DPCPP_VERSION}.tar.gz) + +######################## +### DPCPP DEPS BEGIN ### +######################## +# The following deps are build time requirements for dpcpp, when possible +# the source in the dpcpp source tree for the version chosen is documented +# by each dep, these will only have to be downloaded and unpacked, dpcpp +# will take care of building them, unpack is being done in dpcpp_deps.cmake + +# Source llvm/lib/SYCLLowerIR/CMakeLists.txt +set(VCINTRINSICS_VERSION 984bb27baacce6ee5c716c2e64845f2a1928025b) +set(VCINTRINSICS_URI https://github.com/intel/vc-intrinsics/archive/${VCINTRINSICS_VERSION}.tar.gz) +set(VCINTRINSICS_HASH abea415a15a0dd11fdc94dee8fb462910f2548311b787e02f42509789e1b0d7b) +set(VCINTRINSICS_HASH_TYPE SHA256) +set(VCINTRINSICS_FILE vc-intrinsics-${VCINTRINSICS_VERSION}.tar.gz) + +# Source opencl/CMakeLists.txt +set(OPENCLHEADERS_VERSION dcd5bede6859d26833cd85f0d6bbcee7382dc9b3) +set(OPENCLHEADERS_URI https://github.com/KhronosGroup/OpenCL-Headers/archive/${OPENCLHEADERS_VERSION}.tar.gz) +set(OPENCLHEADERS_HASH ca8090359654e94f2c41e946b7e9d826253d795ae809ce7c83a7d3c859624693) +set(OPENCLHEADERS_HASH_TYPE SHA256) +set(OPENCLHEADERS_FILE opencl_headers-${OPENCLHEADERS_VERSION}.tar.gz) + +# Source opencl/CMakeLists.txt +set(ICDLOADER_VERSION aec3952654832211636fc4af613710f80e203b0a) +set(ICDLOADER_URI https://github.com/KhronosGroup/OpenCL-ICD-Loader/archive/${ICDLOADER_VERSION}.tar.gz) +set(ICDLOADER_HASH e1880551d67bd8dc31d13de63b94bbfd6b1f315b6145dad1ffcd159b89bda93c) +set(ICDLOADER_HASH_TYPE SHA256) +set(ICDLOADER_FILE icdloader-${ICDLOADER_VERSION}.tar.gz) + +# Source sycl/cmake/modules/AddBoostMp11Headers.cmake +# Using external MP11 here, getting AddBoostMp11Headers.cmake to recognize +# our copy in boost directly was more trouble than it was worth. +set(MP11_VERSION 7bc4e1ae9b36ec8ee635c3629b59ec525bbe82b9) +set(MP11_URI https://github.com/boostorg/mp11/archive/${MP11_VERSION}.tar.gz) +set(MP11_HASH 071ee2bd3952ec89882edb3af25dd1816f6b61723f66e42eea32f4d02ceef426) +set(MP11_HASH_TYPE SHA256) +set(MP11_FILE mp11-${MP11_VERSION}.tar.gz) + +# Source llvm-spirv/CMakeLists.txt (repo) +# Source llvm-spirv/spirv-headers-tag.conf (hash) +set(SPIRV_HEADERS_VERSION 36c0c1596225e728bd49abb7ef56a3953e7ed468) +set(SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/${SPIRV_HEADERS_VERSION}.tar.gz) +set(SPIRV_HEADERS_HASH 7a5c89633f8740456fe8adee052033e134476d267411d1336c0cb1e587a9229a) +set(SPIRV_HEADERS_HASH_TYPE SHA256) +set(SPIRV_HEADERS_FILE SPIR-V-Headers-${SPIRV_HEADERS_VERSION}.tar.gz) + +###################### +### DPCPP DEPS END ### +###################### + +########################################## +### Intel Graphics Compiler DEPS BEGIN ### +########################################## +# The following deps are build time requirements for the intel graphics +# compiler, the versions used are taken from the following location +# https://github.com/intel/intel-graphics-compiler/releases + +set(IGC_VERSION 1.0.11222) +set(IGC_URI https://github.com/intel/intel-graphics-compiler/archive/refs/tags/igc-${IGC_VERSION}.tar.gz) +set(IGC_HASH d92f0608dcbb52690855685f9447282e5c09c0ba98ae35fabf114fcf8b1e9fcf) +set(IGC_HASH_TYPE SHA256) +set(IGC_FILE igc-${IGC_VERSION}.tar.gz) + +set(IGC_LLVM_VERSION llvmorg-11.1.0) +set(IGC_LLVM_URI https://github.com/llvm/llvm-project/archive/refs/tags/${IGC_LLVM_VERSION}.tar.gz) +set(IGC_LLVM_HASH 53a0719f3f4b0388013cfffd7b10c7d5682eece1929a9553c722348d1f866e79) +set(IGC_LLVM_HASH_TYPE SHA256) +set(IGC_LLVM_FILE ${IGC_LLVM_VERSION}.tar.gz) + +# WARNING WARNING WARNING +# +# IGC_OPENCL_CLANG contains patches for some of its dependencies. +# +# Whenever IGC_OPENCL_CLANG_VERSION changes, one *MUST* inspect +# IGC_OPENCL_CLANG's patches folder and update igc.cmake to account for +# any added or removed patches. +# +# WARNING WARNING WARNING + +set(IGC_OPENCL_CLANG_VERSION bbdd1587f577397a105c900be114b56755d1f7dc) +set(IGC_OPENCL_CLANG_URI https://github.com/intel/opencl-clang/archive/${IGC_OPENCL_CLANG_VERSION}.tar.gz) +set(IGC_OPENCL_CLANG_HASH d08315f1b0d8a6fef33de2b3e6aa7356534c324910634962c72523d970773efc) +set(IGC_OPENCL_CLANG_HASH_TYPE SHA256) +set(IGC_OPENCL_CLANG_FILE opencl-clang-${IGC_OPENCL_CLANG_VERSION}.tar.gz) + +set(IGC_VCINTRINSICS_VERSION v0.4.0) +set(IGC_VCINTRINSICS_URI https://github.com/intel/vc-intrinsics/archive/refs/tags/${IGC_VCINTRINSICS_VERSION}.tar.gz) +set(IGC_VCINTRINSICS_HASH c8b92682ad5031cf9d5b82a40e7d5c0e763cd9278660adbcaa69aab988e4b589) +set(IGC_VCINTRINSICS_HASH_TYPE SHA256) +set(IGC_VCINTRINSICS_FILE vc-intrinsics-${IGC_VCINTRINSICS_VERSION}.tar.gz) + +set(IGC_SPIRV_HEADERS_VERSION sdk-1.3.204.1) +set(IGC_SPIRV_HEADERS_URI https://github.com/KhronosGroup/SPIRV-Headers/archive/refs/tags/${IGC_SPIRV_HEADERS_VERSION}.tar.gz) +set(IGC_SPIRV_HEADERS_HASH 262864053968c217d45b24b89044a7736a32361894743dd6cfe788df258c746c) +set(IGC_SPIRV_HEADERS_HASH_TYPE SHA256) +set(IGC_SPIRV_HEADERS_FILE SPIR-V-Headers-${IGC_SPIRV_HEADERS_VERSION}.tar.gz) + +set(IGC_SPIRV_TOOLS_VERSION sdk-1.3.204.1) +set(IGC_SPIRV_TOOLS_URI https://github.com/KhronosGroup/SPIRV-Tools/archive/refs/tags/${IGC_SPIRV_TOOLS_VERSION}.tar.gz) +set(IGC_SPIRV_TOOLS_HASH 6e19900e948944243024aedd0a201baf3854b377b9cc7a386553bc103b087335) +set(IGC_SPIRV_TOOLS_HASH_TYPE SHA256) +set(IGC_SPIRV_TOOLS_FILE SPIR-V-Tools-${IGC_SPIRV_TOOLS_VERSION}.tar.gz) + +set(IGC_SPIRV_TRANSLATOR_VERSION 99420daab98998a7e36858befac9c5ed109d4920) +set(IGC_SPIRV_TRANSLATOR_URI https://github.com/KhronosGroup/SPIRV-LLVM-Translator/archive/${IGC_SPIRV_TRANSLATOR_VERSION}.tar.gz) +set(IGC_SPIRV_TRANSLATOR_HASH 77dfb4ddb6bfb993535562c02ddea23f0a0d1c5a0258c1afe7e27c894ff783a8) +set(IGC_SPIRV_TRANSLATOR_HASH_TYPE SHA256) +set(IGC_SPIRV_TRANSLATOR_FILE SPIR-V-Translator-${IGC_SPIRV_TRANSLATOR_VERSION}.tar.gz) + +######################################## +### Intel Graphics Compiler DEPS END ### +######################################## + +set(GMMLIB_VERSION intel-gmmlib-22.1.2) +set(GMMLIB_URI https://github.com/intel/gmmlib/archive/refs/tags/${GMMLIB_VERSION}.tar.gz) +set(GMMLIB_HASH 3b9a6d5e7e3f5748b3d0a2fb0e980ae943907fece0980bd9c0508e71c838e334) +set(GMMLIB_HASH_TYPE SHA256) +set(GMMLIB_FILE ${GMMLIB_VERSION}.tar.gz) + +set(OCLOC_VERSION 22.20.23198) +set(OCLOC_URI https://github.com/intel/compute-runtime/archive/refs/tags/${OCLOC_VERSION}.tar.gz) +set(OCLOC_HASH ab22b8bf2560a57fdd3def0e35a62ca75991406f959c0263abb00cd6cd9ae998) +set(OCLOC_HASH_TYPE SHA256) +set(OCLOC_FILE ocloc-${OCLOC_VERSION}.tar.gz) + +set(AOM_VERSION 3.4.0) +set(AOM_URI https://storage.googleapis.com/aom-releases/libaom-${AOM_VERSION}.tar.gz) +set(AOM_HASH bd754b58c3fa69f3ffd29da77de591bd9c26970e3b18537951336d6c0252e354) +set(AOM_HASH_TYPE SHA256) +set(AOM_FILE libaom-${AOM_VERSION}.tar.gz) diff --git a/build_files/build_environment/cmake/vpx.cmake b/build_files/build_environment/cmake/vpx.cmake index ba17acad80f..111e93e79e1 100644 --- a/build_files/build_environment/cmake/vpx.cmake +++ b/build_files/build_environment/cmake/vpx.cmake @@ -1,11 +1,13 @@ # SPDX-License-Identifier: GPL-2.0-or-later if(WIN32) - if("${CMAKE_SIZEOF_VOID_P}" EQUAL "8") - set(VPX_EXTRA_FLAGS --target=x86_64-win64-gcc --disable-multithread) - else() - set(VPX_EXTRA_FLAGS --target=x86-win32-gcc --disable-multithread) - endif() + # VPX is determined to use pthreads which it will tell ffmpeg to dynamically + # link, which is not something we're super into distribution wise. However + # if it cannot find pthread.h it'll happily provide a pthread emulation + # layer using win32 threads. So all this patch does is make it not find + # pthead.h + set(VPX_PATCH ${PATCH_CMD} -p 1 -d ${BUILD_DIR}/vpx/src/external_vpx < ${PATCH_DIR}/vpx_windows.diff) + set(VPX_EXTRA_FLAGS --target=x86_64-win64-gcc ) else() if(APPLE) if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") @@ -18,6 +20,16 @@ else() endif() endif() +if(NOT BLENDER_PLATFORM_ARM) + list(APPEND VPX_EXTRA_FLAGS + --enable-sse4_1 + --enable-sse3 + --enable-ssse3 + --enable-avx + --enable-avx2 + ) +endif() + ExternalProject_Add(external_vpx URL file://${PACKAGE_DIR}/${VPX_FILE} DOWNLOAD_DIR ${DOWNLOAD_DIR} @@ -30,11 +42,6 @@ ExternalProject_Add(external_vpx --enable-static --disable-install-bins --disable-install-srcs - --disable-sse4_1 - --disable-sse3 - --disable-ssse3 - --disable-avx - --disable-avx2 --disable-unit-tests --disable-examples --enable-vp8 @@ -42,6 +49,7 @@ ExternalProject_Add(external_vpx ${VPX_EXTRA_FLAGS} BUILD_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && make -j${MAKE_THREADS} INSTALL_COMMAND ${CONFIGURE_ENV} && cd ${BUILD_DIR}/vpx/src/external_vpx/ && make install + PATCH_COMMAND ${VPX_PATCH} INSTALL_DIR ${LIBDIR}/vpx ) diff --git a/build_files/build_environment/install_deps.sh b/build_files/build_environment/install_deps.sh index 81db928a477..287a7a0c962 100755 --- a/build_files/build_environment/install_deps.sh +++ b/build_files/build_environment/install_deps.sh @@ -136,7 +136,7 @@ ARGUMENTS_INFO="\"COMMAND LINE ARGUMENTS: Build and install the OpenImageDenoise libraries. --with-nanovdb - Build and install the NanoVDB branch of OpenVDB (instead of official release of OpenVDB). + Build and install NanoVDB together with OpenVDB. --with-jack Install the jack libraries. @@ -385,7 +385,7 @@ CLANG_FORMAT_VERSION="10.0" CLANG_FORMAT_VERSION_MIN="6.0" CLANG_FORMAT_VERSION_MEX="14.0" -PYTHON_VERSION="3.10.2" +PYTHON_VERSION="3.10.6" PYTHON_VERSION_SHORT="3.10" PYTHON_VERSION_MIN="3.10" PYTHON_VERSION_MEX="3.12" @@ -425,7 +425,7 @@ PYTHON_ZSTANDARD_VERSION_MIN="0.15.2" PYTHON_ZSTANDARD_VERSION_MEX="0.20.0" PYTHON_ZSTANDARD_NAME="zstandard" -PYTHON_NUMPY_VERSION="1.22.0" +PYTHON_NUMPY_VERSION="1.23.2" PYTHON_NUMPY_VERSION_MIN="1.14" PYTHON_NUMPY_VERSION_MEX="2.0" PYTHON_NUMPY_NAME="numpy" @@ -453,8 +453,8 @@ PYTHON_MODULES_PIP=( ) -BOOST_VERSION="1.78.0" -BOOST_VERSION_SHORT="1.78" +BOOST_VERSION="1.80.0" +BOOST_VERSION_SHORT="1.80" BOOST_VERSION_MIN="1.49" BOOST_VERSION_MEX="2.0" BOOST_FORCE_BUILD=false @@ -465,7 +465,7 @@ TBB_VERSION="2020" TBB_VERSION_SHORT="2020" TBB_VERSION_UPDATE="_U3" # Used for source packages... TBB_VERSION_MIN="2018" -TBB_VERSION_MEX="2022" +TBB_VERSION_MEX="2021" # 2021 introduces 'oneTBB', which has lots of compatibility breakage with previous versions TBB_FORCE_BUILD=false TBB_FORCE_REBUILD=false TBB_SKIP=false @@ -478,7 +478,7 @@ OCIO_FORCE_BUILD=false OCIO_FORCE_REBUILD=false OCIO_SKIP=false -IMATH_VERSION="3.1.4" +IMATH_VERSION="3.1.5" IMATH_VERSION_SHORT="3.1" IMATH_VERSION_MIN="3.0" IMATH_VERSION_MEX="4.0" @@ -487,7 +487,7 @@ IMATH_FORCE_REBUILD=false IMATH_SKIP=false _with_built_imath=false -OPENEXR_VERSION="3.1.4" +OPENEXR_VERSION="3.1.5" OPENEXR_VERSION_SHORT="3.1" OPENEXR_VERSION_MIN="3.0" OPENEXR_VERSION_MEX="4.0" @@ -496,7 +496,7 @@ OPENEXR_FORCE_REBUILD=false OPENEXR_SKIP=false _with_built_openexr=false -OIIO_VERSION="2.3.13.0" +OIIO_VERSION="2.3.18.0" OIIO_VERSION_SHORT="2.3" OIIO_VERSION_MIN="2.1.12" OIIO_VERSION_MEX="2.4.0" @@ -534,10 +534,10 @@ OSD_SKIP=false # OpenVDB needs to be compiled for now OPENVDB_BLOSC_VERSION="1.21.1" -OPENVDB_VERSION="9.0.0" -OPENVDB_VERSION_SHORT="9.0" +OPENVDB_VERSION="9.1.0" +OPENVDB_VERSION_SHORT="9.1" OPENVDB_VERSION_MIN="9.0" -OPENVDB_VERSION_MEX="9.1" +OPENVDB_VERSION_MEX="9.2" OPENVDB_FORCE_BUILD=false OPENVDB_FORCE_REBUILD=false OPENVDB_SKIP=false @@ -567,7 +567,7 @@ OPENCOLLADA_FORCE_BUILD=false OPENCOLLADA_FORCE_REBUILD=false OPENCOLLADA_SKIP=false -EMBREE_VERSION="3.13.3" +EMBREE_VERSION="3.13.4" EMBREE_VERSION_SHORT="3.13" EMBREE_VERSION_MIN="3.13" EMBREE_VERSION_MEX="4.0" @@ -627,6 +627,9 @@ WEBP_DEV="" VPX_USE=false VPX_VERSION_MIN=0.9.7 VPX_DEV="" +AOM_USE=false +AOM_VERSION_MIN=3.3.0 +AOM_DEV="" OPUS_USE=false OPUS_VERSION_MIN=1.1.1 OPUS_DEV="" @@ -635,9 +638,6 @@ MP3LAME_DEV="" OPENJPEG_USE=false OPENJPEG_DEV="" -# Whether to use system GLEW or not (OpenSubDiv needs recent glew to work). -NO_SYSTEM_GLEW=false - # Switch to english language, else some things (like check_package_DEB()) won't work! LANG_BACK=$LANG LANG="" @@ -1193,7 +1193,7 @@ Those libraries should be available as packages in all recent distributions (opt * libx11, libxcursor, libxi, libxrandr, libxinerama (and other libx... as needed). * libwayland-client0, libwayland-cursor0, libwayland-egl1, libxkbcommon0, libdbus-1-3, libegl1 (Wayland) * libsqlite3, libzstd, libbz2, libssl, libfftw3, libxml2, libtinyxml, yasm, libyaml-cpp, flex. - * libsdl2, libglew, libpugixml, libpotrace, [libgmp], [libglewmx], fontconfig, [libharu/libhpdf].\"" + * libsdl2, libepoxy, libpugixml, libpotrace, [libgmp], fontconfig, [libharu/libhpdf].\"" DEPS_SPECIFIC_INFO="\"BUILDABLE DEPENDENCIES: @@ -1212,7 +1212,7 @@ You may also want to build them yourself (optional ones are [between brackets]): ** [NumPy $PYTHON_NUMPY_VERSION] (use pip). * Boost $BOOST_VERSION (from $BOOST_SOURCE, modules: $BOOST_BUILD_MODULES). * TBB $TBB_VERSION (from $TBB_SOURCE). - * [FFMpeg $FFMPEG_VERSION (needs libvorbis, libogg, libtheora, libx264, libmp3lame, libxvidcore, libvpx, libwebp, ...)] (from $FFMPEG_SOURCE). + * [FFMpeg $FFMPEG_VERSION (needs libvorbis, libogg, libtheora, libx264, libmp3lame, libxvidcore, libvpx, libaom, libwebp, ...)] (from $FFMPEG_SOURCE). * [OpenColorIO $OCIO_VERSION] (from $OCIO_SOURCE). * Imath $IMATH_VERSION (from $IMATH_SOURCE). * OpenEXR $OPENEXR_VERSION (from $OPENEXR_SOURCE). @@ -1687,7 +1687,7 @@ compile_TBB() { fi # To be changed each time we make edits that would modify the compiled result! - tbb_magic=0 + tbb_magic=1 _init_tbb # Force having own builds for the dependencies. @@ -2696,14 +2696,13 @@ compile_OSD() { mkdir build cd build + cmake_d="-D CMAKE_BUILD_TYPE=Release" if [ -d $INST/tbb ]; then - cmake_d="$cmake_d $cmake_d -D TBB_LOCATION=$INST/tbb" + cmake_d="$cmake_d -D TBB_LOCATION=$INST/tbb" fi - cmake_d="-D CMAKE_BUILD_TYPE=Release" cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" - # ptex is only needed when nicholas bishop is ready cmake_d="$cmake_d -D NO_PTEX=1" - cmake_d="$cmake_d -D NO_CLEW=1 -D NO_CUDA=1 -D NO_OPENCL=1" + cmake_d="$cmake_d -D NO_CLEW=1 -D NO_CUDA=1 -D NO_OPENCL=1 -D NO_GLEW=1" # maya plugin, docs, tutorials, regression tests and examples are not needed cmake_d="$cmake_d -D NO_MAYA=1 -D NO_DOC=1 -D NO_TUTORIALS=1 -D NO_REGRESSION=1 -DNO_EXAMPLES=1" @@ -2920,6 +2919,10 @@ compile_OPENVDB() { cmake_d="$cmake_d -D CMAKE_INSTALL_PREFIX=$_inst" cmake_d="$cmake_d -D USE_STATIC_DEPENDENCIES=OFF" cmake_d="$cmake_d -D OPENVDB_BUILD_BINARIES=OFF" + # Unfortunately OpenVDB currently forces using recent oneTBB over older versions when it finds it, + # even when TBB_ROOT is specified. So have to prevent any check for system library - + # in the hope it will not break in some other cases. + cmake_d="$cmake_d -D DISABLE_CMAKE_SEARCH_PATHS=ON" if [ "$WITH_NANOVDB" = true ]; then cmake_d="$cmake_d -D USE_NANOVDB=ON" @@ -2932,7 +2935,6 @@ compile_OPENVDB() { cmake_d="$cmake_d -D Boost_USE_MULTITHREADED=ON" cmake_d="$cmake_d -D Boost_NO_SYSTEM_PATHS=ON" cmake_d="$cmake_d -D Boost_NO_BOOST_CMAKE=ON" - cmake_d="$cmake_d -D Boost_NO_BOOST_CMAKE=ON" fi if [ -d $INST/tbb ]; then cmake_d="$cmake_d -D TBB_ROOT=$INST/tbb" @@ -3004,7 +3006,7 @@ compile_ALEMBIC() { fi # To be changed each time we make edits that would modify the compiled result! - alembic_magic=2 + alembic_magic=3 _init_alembic # Force having own builds for the dependencies. @@ -3052,7 +3054,7 @@ compile_ALEMBIC() { fi if [ "$_with_built_openexr" = true ]; then cmake_d="$cmake_d -D USE_ARNOLD=OFF" - cmake_d="$cmake_d -D USE_BINARIES=OFF" + cmake_d="$cmake_d -D USE_BINARIES=ON" # Tests use some Alembic binaries... cmake_d="$cmake_d -D USE_EXAMPLES=OFF" cmake_d="$cmake_d -D USE_HDF5=OFF" cmake_d="$cmake_d -D USE_MAYA=OFF" @@ -3196,7 +3198,7 @@ _init_opencollada() { _inst_shortcut=$INST/opencollada } -_update_deps_collada() { +_update_deps_opencollada() { : } @@ -3326,7 +3328,7 @@ compile_Embree() { fi # To be changed each time we make edits that would modify the compiled results! - embree_magic=10 + embree_magic=11 _init_embree # Force having own builds for the dependencies. @@ -3386,7 +3388,7 @@ compile_Embree() { cmake_d="$cmake_d -D EMBREE_TASKING_SYSTEM=TBB" if [ -d $INST/tbb ]; then - make_d="$make_d EMBREE_TBB_ROOT=$INST/tbb" + cmake_d="$cmake_d -D EMBREE_TBB_ROOT=$INST/tbb" fi cmake $cmake_d ../ @@ -3525,7 +3527,7 @@ compile_OIDN() { install_ISPC # To be changed each time we make edits that would modify the compiled results! - oidn_magic=9 + oidn_magic=10 _init_oidn # Force having own builds for the dependencies. @@ -3581,7 +3583,7 @@ compile_OIDN() { cmake_d="$cmake_d -D ISPC_DIR_HINT=$_ispc_path_bin" if [ -d $INST/tbb ]; then - make_d="$make_d TBB_ROOT=$INST/tbb" + cmake_d="$cmake_d -D TBB_ROOT=$INST/tbb" fi cmake $cmake_d ../ @@ -3638,7 +3640,7 @@ compile_FFmpeg() { fi # To be changed each time we make edits that would modify the compiled result! - ffmpeg_magic=5 + ffmpeg_magic=6 _init_ffmpeg # Force having own builds for the dependencies. @@ -3691,6 +3693,10 @@ compile_FFmpeg() { extra="$extra --enable-libvpx" fi + if [ "$AOM_USE" = true ]; then + extra="$extra --enable-libaom" + fi + if [ "$WEBP_USE" = true ]; then extra="$extra --enable-libwebp" fi @@ -4059,10 +4065,9 @@ install_DEB() { libxcursor-dev libxi-dev wget libsqlite3-dev libxrandr-dev libxinerama-dev \ libwayland-dev wayland-protocols libegl-dev libxkbcommon-dev libdbus-1-dev linux-libc-dev \ libbz2-dev libncurses5-dev libssl-dev liblzma-dev libreadline-dev \ - libopenal-dev libglew-dev yasm \ + libopenal-dev libepoxy-dev yasm \ libsdl2-dev libfftw3-dev patch bzip2 libxml2-dev libtinyxml-dev libjemalloc-dev \ libgmp-dev libpugixml-dev libpotrace-dev libhpdf-dev libzstd-dev libpystring-dev" - # libglewmx-dev (broken in deb testing currently...) VORBIS_USE=true OGG_USE=true @@ -4145,33 +4150,37 @@ install_DEB() { WEBP_USE=true fi - if [ "$WITH_ALL" = true ]; then - XVID_DEV="libxvidcore-dev" - check_package_DEB $XVID_DEV - if [ $? -eq 0 ]; then - XVID_USE=true - fi + XVID_DEV="libxvidcore-dev" + check_package_DEB $XVID_DEV + if [ $? -eq 0 ]; then + XVID_USE=true + fi - MP3LAME_DEV="libmp3lame-dev" - check_package_DEB $MP3LAME_DEV - if [ $? -eq 0 ]; then - MP3LAME_USE=true - fi + MP3LAME_DEV="libmp3lame-dev" + check_package_DEB $MP3LAME_DEV + if [ $? -eq 0 ]; then + MP3LAME_USE=true + fi - VPX_DEV="libvpx-dev" - check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN - if [ $? -eq 0 ]; then - VPX_USE=true - fi + VPX_DEV="libvpx-dev" + check_package_version_ge_DEB $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + VPX_USE=true + fi - OPUS_DEV="libopus-dev" - check_package_version_ge_DEB $OPUS_DEV $OPUS_VERSION_MIN - if [ $? -eq 0 ]; then - OPUS_USE=true - fi + AOM_DEV="libaom-dev" + check_package_version_ge_DEB $AOM_DEV $AOM_VERSION_MIN + if [ $? -eq 0 ]; then + AOM_USE=true + fi + + OPUS_DEV="libopus-dev" + check_package_version_ge_DEB $OPUS_DEV $OPUS_VERSION_MIN + if [ $? -eq 0 ]; then + OPUS_USE=true fi - # Check cmake/glew versions and disable features for older distros. + # Check cmake version and disable features for older distros. # This is so Blender can at least compile. PRINT "" _cmake=`get_package_version_DEB cmake` @@ -4189,28 +4198,6 @@ install_DEB() { fi PRINT "" - _glew=`get_package_version_DEB libglew-dev` - if [ -z $_glew ]; then - # Stupid virtual package in Ubuntu 12.04 doesn't show version number... - _glew=`apt-cache showpkg libglew-dev|tail -n1|awk '{print $2}'|sed 's/-.*//'` - fi - version_ge $_glew "1.9.0" - if [ $? -eq 1 ]; then - version_ge $_glew "1.7.0" - if [ $? -eq 1 ]; then - WARNING "OpenSubdiv disabled because GLEW-$_glew is not enough" - WARNING "Blender will not use system GLEW library" - OSD_SKIP=true - NO_SYSTEM_GLEW=true - else - WARNING "OpenSubdiv will compile with GLEW-$_glew but with limited capability" - WARNING "Blender will not use system GLEW library" - NO_SYSTEM_GLEW=true - fi - fi - - - PRINT "" _do_compile_python=false if [ "$PYTHON_SKIP" = true ]; then WARNING "Skipping Python installation, as requested..." @@ -4573,6 +4560,9 @@ install_DEB() { if [ "$VPX_USE" = true ]; then _packages="$_packages $VPX_DEV" fi + if [ "$AOM_USE" = true ]; then + _packages="$_packages $AOM_DEV" + fi if [ "$OPUS_USE" = true ]; then _packages="$_packages $OPUS_DEV" fi @@ -4785,7 +4775,7 @@ install_RPM() { libX11-devel libXi-devel libXcursor-devel libXrandr-devel libXinerama-devel \ wayland-devel wayland-protocols-devel mesa-libEGL-devel libxkbcommon-devel dbus-devel kernel-headers \ wget ncurses-devel readline-devel $OPENJPEG_DEV openal-soft-devel \ - glew-devel yasm patch \ + libepoxy-devel yasm patch \ libxml2-devel yaml-cpp-devel tinyxml-devel jemalloc-devel \ gmp-devel pugixml-devel potrace-devel libharu-devel libzstd-devel pystring-devel" @@ -4873,21 +4863,27 @@ install_RPM() { WEBP_USE=true fi - if [ "$WITH_ALL" = true ]; then - VPX_DEV="libvpx-devel" - check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN - if [ $? -eq 0 ]; then - VPX_USE=true - fi + VPX_DEV="libvpx-devel" + check_package_version_ge_RPM $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + VPX_USE=true + fi + + AOM_DEV="libaom-devel" + check_package_version_ge_RPM $AOM_DEV $AOM_VERSION_MIN + if [ $? -eq 0 ]; then + AOM_USE=true + fi + OPUS_DEV="libopus-devel" + check_package_version_ge_RPM $OPUS_DEV $OPUS_VERSION_MIN + if [ $? -eq 0 ]; then + OPUS_USE=true + fi + + if [ "$WITH_ALL" = true ]; then PRINT "" install_packages_RPM libspnav-devel - - OPUS_DEV="libopus-devel" - check_package_version_ge_RPM $OPUS_DEV $OPUS_VERSION_MIN - if [ $? -eq 0 ]; then - OPUS_USE=true - fi fi PRINT "" @@ -5272,6 +5268,9 @@ install_RPM() { if [ "$VPX_USE" = true ]; then _packages="$_packages $VPX_DEV" fi + if [ "$AOM_USE" = true ]; then + _packages="$_packages $AOM_DEV" + fi if [ "$OPUS_USE" = true ]; then _packages="$_packages $OPUS_DEV" fi @@ -5416,7 +5415,7 @@ install_ARCH() { fi _packages="$BASE_DEVEL git cmake fontconfig flex \ - libxi libxcursor libxrandr libxinerama glew libpng libtiff wget openal \ + libxi libxcursor libxrandr libxinerama libepoxy libpng libtiff wget openal \ $OPENJPEG_DEV yasm sdl2 fftw \ libxml2 yaml-cpp tinyxml python-requests jemalloc gmp potrace pugixml libharu \ zstd pystring" @@ -5461,30 +5460,34 @@ install_ARCH() { WEBP_USE=true fi - if [ "$WITH_ALL" = true ]; then - XVID_DEV="xvidcore" - check_package_ARCH $XVID_DEV - if [ $? -eq 0 ]; then - XVID_USE=true - fi + XVID_DEV="xvidcore" + check_package_ARCH $XVID_DEV + if [ $? -eq 0 ]; then + XVID_USE=true + fi - MP3LAME_DEV="lame" - check_package_ARCH $MP3LAME_DEV - if [ $? -eq 0 ]; then - MP3LAME_USE=true - fi + MP3LAME_DEV="lame" + check_package_ARCH $MP3LAME_DEV + if [ $? -eq 0 ]; then + MP3LAME_USE=true + fi - VPX_DEV="libvpx" - check_package_version_ge_ARCH $VPX_DEV $VPX_VERSION_MIN - if [ $? -eq 0 ]; then - VPX_USE=true - fi + VPX_DEV="libvpx" + check_package_version_ge_ARCH $VPX_DEV $VPX_VERSION_MIN + if [ $? -eq 0 ]; then + VPX_USE=true + fi - OPUS_DEV="opus" - check_package_version_ge_ARCH $OPUS_DEV $OPUS_VERSION_MIN - if [ $? -eq 0 ]; then - OPUS_USE=true - fi + AOM_DEV="libaom" + check_package_version_ge_ARCH $AOM_DEV $AOM_VERSION_MIN + if [ $? -eq 0 ]; then + AOM_USE=true + fi + + OPUS_DEV="opus" + check_package_version_ge_ARCH $OPUS_DEV $OPUS_VERSION_MIN + if [ $? -eq 0 ]; then + OPUS_USE=true fi @@ -5862,6 +5865,9 @@ install_ARCH() { if [ "$VPX_USE" = true ]; then _packages="$_packages $VPX_DEV" fi + if [ "$AOM_USE" = true ]; then + _packages="$_packages $AOM_DEV" + fi if [ "$OPUS_USE" = true ]; then _packages="$_packages $OPUS_DEV" fi @@ -6212,7 +6218,7 @@ print_info() { fi if [ -d $INST/nanovdb ]; then _1="-D WITH_NANOVDB=ON" - _2="-D NANOVDB_ROOT_DIR=$INST/nanovdb" + _2="-D NANOVDB_ROOT_DIR=$INST/openvdb" PRINT " $_1" PRINT " $_2" _buildargs="$_buildargs $_1 $_2" @@ -6290,12 +6296,6 @@ print_info() { fi fi - if [ "$NO_SYSTEM_GLEW" = true ]; then - _1="-D WITH_SYSTEM_GLEW=OFF" - PRINT " $_1" - _buildargs="$_buildargs $_1" - fi - if [ "$FFMPEG_SKIP" = false ]; then _1="-D WITH_CODEC_FFMPEG=ON" PRINT " $_1" diff --git a/build_files/build_environment/patches/cmakelists_glew.txt b/build_files/build_environment/patches/cmakelists_glew.txt deleted file mode 100644 index ec36d4bde63..00000000000 --- a/build_files/build_environment/patches/cmakelists_glew.txt +++ /dev/null @@ -1,2 +0,0 @@ -cmake_minimum_required (VERSION 2.4) -add_subdirectory(build/cmake)
\ No newline at end of file diff --git a/build_files/build_environment/patches/dpcpp.diff b/build_files/build_environment/patches/dpcpp.diff new file mode 100644 index 00000000000..4a65a6c6cf0 --- /dev/null +++ b/build_files/build_environment/patches/dpcpp.diff @@ -0,0 +1,36 @@ +diff -Naur llvm-sycl-nightly-20220501.orig\opencl/CMakeLists.txt llvm-sycl-nightly-20220501\opencl/CMakeLists.txt +--- llvm-sycl-nightly-20220501.orig/opencl/CMakeLists.txt 2022-04-29 13:47:11 -0600 ++++ llvm-sycl-nightly-20220501/opencl/CMakeLists.txt 2022-05-21 15:25:06 -0600 +@@ -11,6 +11,11 @@ + ) + endif() + ++# Blender code below is determined to use FetchContent_Declare ++# temporarily allow it (but feed it our downloaded tarball ++# in the OpenCL_HEADERS variable ++set(FETCHCONTENT_FULLY_DISCONNECTED OFF) ++ + # Repo URLs + + set(OCL_HEADERS_REPO +@@ -77,5 +82,6 @@ + + FetchContent_MakeAvailable(ocl-icd) + add_library(OpenCL-ICD ALIAS OpenCL) ++set(FETCHCONTENT_FULLY_DISCONNECTED ON) + + add_subdirectory(opencl-aot) +diff -Naur llvm-sycl-nightly-20220208.orig/libdevice/cmake/modules/SYCLLibdevice.cmake llvm-sycl-nightly-20220208/libdevice/cmake/modules/SYCLLibdevice.cmake +--- llvm-sycl-nightly-20220208.orig/libdevice/cmake/modules/SYCLLibdevice.cmake 2022-02-08 09:17:24 -0700 ++++ llvm-sycl-nightly-20220208/libdevice/cmake/modules/SYCLLibdevice.cmake 2022-05-24 11:35:51 -0600 +@@ -36,7 +36,9 @@ + add_custom_target(libsycldevice-obj) + add_custom_target(libsycldevice-spv) + +-add_custom_target(libsycldevice DEPENDS ++# Blender: add ALL here otherwise this target will not build ++# and cause an error due to missing files during the install phase. ++add_custom_target(libsycldevice ALL DEPENDS + libsycldevice-obj + libsycldevice-spv) + diff --git a/build_files/build_environment/patches/embree.diff b/build_files/build_environment/patches/embree.diff index e83d754a465..e448fe5ee2e 100644 --- a/build_files/build_environment/patches/embree.diff +++ b/build_files/build_environment/patches/embree.diff @@ -1,30 +1,37 @@ -diff -Naur orig/common/sys/platform.h external_embree/common/sys/platform.h ---- orig/common/sys/platform.h 2020-05-13 23:08:53 -0600 -+++ external_embree/common/sys/platform.h 2020-06-13 17:40:26 -0600 -@@ -84,8 +84,8 @@ - //////////////////////////////////////////////////////////////////////////////// +diff -Naur org/kernels/rtcore_config.h.in embree-3.13.4/kernels/rtcore_config.h.in +--- org/kernels/rtcore_config.h.in 2022-06-14 22:13:52 -0600 ++++ embree-3.13.4/kernels/rtcore_config.h.in 2022-06-24 15:20:12 -0600 +@@ -14,6 +14,7 @@ + #cmakedefine01 EMBREE_MIN_WIDTH + #define RTC_MIN_WIDTH EMBREE_MIN_WIDTH + ++#cmakedefine EMBREE_STATIC_LIB + #cmakedefine EMBREE_API_NAMESPACE + + #if defined(EMBREE_API_NAMESPACE) +diff --git a/kernels/CMakeLists.txt b/kernels/CMakeLists.txt +index 7c2f43d..106b1d5 100644 +--- a/kernels/CMakeLists.txt ++++ b/kernels/CMakeLists.txt +@@ -201,6 +201,12 @@ embree_files(EMBREE_LIBRARY_FILES_AVX512 ${AVX512}) + #message("AVX2: ${EMBREE_LIBRARY_FILES_AVX2}") + #message("AVX512: ${EMBREE_LIBRARY_FILES_AVX512}") - #ifdef __WIN32__ --#define dll_export __declspec(dllexport) --#define dll_import __declspec(dllimport) -+#define dll_export -+#define dll_import - #else - #define dll_export __attribute__ ((visibility ("default"))) - #define dll_import -diff --git orig/common/tasking/CMakeLists.txt external_embree/common/tasking/CMakeLists.txt ---- orig/common/tasking/CMakeLists.txt -+++ external_embree/common/tasking/CMakeLists.txt -@@ -27,7 +27,11 @@ - else() - # If not found try getting older TBB via module (FindTBB.cmake) - unset(TBB_DIR CACHE) -- find_package(TBB 4.1 REQUIRED tbb) -+ if (TBB_STATIC_LIB) -+ find_package(TBB 4.1 REQUIRED tbb_static) -+ else() -+ find_package(TBB 4.1 REQUIRED tbb) -+ endif() - if (TBB_FOUND) - TARGET_LINK_LIBRARIES(tasking PUBLIC TBB) - TARGET_INCLUDE_DIRECTORIES(tasking PUBLIC "${TBB_INCLUDE_DIRS}") ++# Bundle Neon2x into the main static library. ++IF(EMBREE_ISA_NEON2X AND EMBREE_STATIC_LIB) ++ LIST(APPEND EMBREE_LIBRARY_FILES ${EMBREE_LIBRARY_FILES_AVX2}) ++ LIST(REMOVE_DUPLICATES EMBREE_LIBRARY_FILES) ++ENDIF() ++ + # replaces all .cpp files with a dummy file that includes that .cpp file + # this is to work around an ICC name mangling issue related to lambda functions under windows + MACRO (CreateISADummyFiles list isa) +@@ -277,7 +283,7 @@ IF (EMBREE_ISA_AVX AND EMBREE_LIBRARY_FILES_AVX) + ENDIF() + ENDIF() + +-IF (EMBREE_ISA_AVX2 AND EMBREE_LIBRARY_FILES_AVX2) ++IF (EMBREE_ISA_AVX2 AND EMBREE_LIBRARY_FILES_AVX2 AND NOT (EMBREE_ISA_NEON2X AND EMBREE_STATIC_LIB)) + DISABLE_STACK_PROTECTOR_FOR_INTERSECTORS(${EMBREE_LIBRARY_FILES_AVX2}) + ADD_LIBRARY(embree_avx2 STATIC ${EMBREE_LIBRARY_FILES_AVX2}) + TARGET_LINK_LIBRARIES(embree_avx2 PRIVATE tasking) diff --git a/build_files/build_environment/patches/epoxy.diff b/build_files/build_environment/patches/epoxy.diff new file mode 100644 index 00000000000..b0c3d7ea1dc --- /dev/null +++ b/build_files/build_environment/patches/epoxy.diff @@ -0,0 +1,19 @@ +--- a/src/dispatch_wgl.c 2022-08-04 17:45:13.144924705 +0200 ++++ b/src/dispatch_wgl.c 2022-08-04 17:45:47.657482971 +0200 +@@ -78,6 +78,8 @@ + if (!first_context_current) { + first_context_current = true; + } else { ++ /* BLENDER: disable slow dispatch table switching. */ ++#if 0 + if (!already_switched_to_dispatch_table) { + already_switched_to_dispatch_table = true; + gl_switch_to_dispatch_table(); +@@ -86,6 +88,7 @@ + + gl_init_dispatch_table(); + wgl_init_dispatch_table(); ++#endif + } + } + diff --git a/build_files/build_environment/patches/igc_opencl_clang.diff b/build_files/build_environment/patches/igc_opencl_clang.diff new file mode 100644 index 00000000000..adc592dd8b2 --- /dev/null +++ b/build_files/build_environment/patches/igc_opencl_clang.diff @@ -0,0 +1,44 @@ +diff -Naur external_igc_opencl_clang.orig/CMakeLists.txt external_igc_opencl_clang/CMakeLists.txt +--- external_igc_opencl_clang.orig/CMakeLists.txt 2022-03-16 05:51:10 -0600 ++++ external_igc_opencl_clang/CMakeLists.txt 2022-05-23 10:40:09 -0600 +@@ -126,22 +126,24 @@ + ) + endif() + +- +- set(SPIRV_BASE_REVISION llvm_release_110) +- set(TARGET_BRANCH "ocl-open-110") +- get_filename_component(LLVM_MONOREPO_DIR ${LLVM_SOURCE_DIR} DIRECTORY) +- set(LLVM_PATCHES_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/patches/llvm +- ${CMAKE_CURRENT_SOURCE_DIR}/patches/clang) +- apply_patches(${LLVM_MONOREPO_DIR} +- "${LLVM_PATCHES_DIRS}" +- ${LLVM_BASE_REVISION} +- ${TARGET_BRANCH} +- ret) +- apply_patches(${SPIRV_SOURCE_DIR} +- ${CMAKE_CURRENT_SOURCE_DIR}/patches/spirv +- ${SPIRV_BASE_REVISION} +- ${TARGET_BRANCH} +- ret) ++ # ++ # Blender: Why apply these manually in igc.cmake ++ # ++ #set(SPIRV_BASE_REVISION llvm_release_110) ++ #set(TARGET_BRANCH "ocl-open-110") ++ #get_filename_component(LLVM_MONOREPO_DIR ${LLVM_SOURCE_DIR} DIRECTORY) ++ #set(LLVM_PATCHES_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/patches/llvm ++ # ${CMAKE_CURRENT_SOURCE_DIR}/patches/clang) ++ #apply_patches(${LLVM_MONOREPO_DIR} ++ # "${LLVM_PATCHES_DIRS}" ++ # ${LLVM_BASE_REVISION} ++ # ${TARGET_BRANCH} ++ # ret) ++ #apply_patches(${SPIRV_SOURCE_DIR} ++ # ${CMAKE_CURRENT_SOURCE_DIR}/patches/spirv ++ # ${SPIRV_BASE_REVISION} ++ # ${TARGET_BRANCH} ++ # ret) + endif(NOT USE_PREBUILT_LLVM) + + # diff --git a/build_files/build_environment/patches/python_windows.diff b/build_files/build_environment/patches/python_windows.diff new file mode 100644 index 00000000000..f9c89a90fde --- /dev/null +++ b/build_files/build_environment/patches/python_windows.diff @@ -0,0 +1,24 @@ +diff -Naur orig/PCbuild/get_externals.bat Python-3.10.2/PCbuild/get_externals.bat +--- orig/PCbuild/get_externals.bat 2022-01-13 11:52:14 -0700 ++++ Python-3.10.2/PCbuild/get_externals.bat 2022-08-17 11:24:42 -0600 +@@ -51,7 +51,7 @@ + echo.Fetching external libraries... + + set libraries= +-set libraries=%libraries% bzip2-1.0.6 ++set libraries=%libraries% bzip2-1.0.8 + if NOT "%IncludeLibffiSrc%"=="false" set libraries=%libraries% libffi-3.3.0 + if NOT "%IncludeSSLSrc%"=="false" set libraries=%libraries% openssl-1.1.1m + set libraries=%libraries% sqlite-3.35.5.0 + diff -Naur orig/PCbuild/python.props external_python/PCbuild/python.props +--- orig/PCbuild/python.props 2022-01-13 11:52:14 -0700 ++++ external_python/PCbuild/python.props 2022-08-17 11:38:38 -0600 +@@ -58,7 +58,7 @@ + <ExternalsDir Condition="$(ExternalsDir) == ''">$([System.IO.Path]::GetFullPath(`$(PySourcePath)externals`))</ExternalsDir> + <ExternalsDir Condition="!HasTrailingSlash($(ExternalsDir))">$(ExternalsDir)\</ExternalsDir> + <sqlite3Dir>$(ExternalsDir)sqlite-3.35.5.0\</sqlite3Dir> +- <bz2Dir>$(ExternalsDir)bzip2-1.0.6\</bz2Dir> ++ <bz2Dir>$(ExternalsDir)bzip2-1.0.8\</bz2Dir> + <lzmaDir>$(ExternalsDir)xz-5.2.2\</lzmaDir> + <libffiDir>$(ExternalsDir)libffi-3.3.0\</libffiDir> + <libffiOutDir>$(ExternalsDir)libffi-3.3.0\$(ArchName)\</libffiOutDir> diff --git a/build_files/build_environment/patches/vpx_windows.diff b/build_files/build_environment/patches/vpx_windows.diff new file mode 100644 index 00000000000..13e3b06d95d --- /dev/null +++ b/build_files/build_environment/patches/vpx_windows.diff @@ -0,0 +1,11 @@ +diff -Naur orig/configure external_vpx/configure +--- orig/configure 2022-07-06 09:22:04 -0600 ++++ external_vpx/configure 2022-07-06 09:24:12 -0600 +@@ -270,7 +270,6 @@ + HAVE_LIST=" + ${ARCH_EXT_LIST} + vpx_ports +- pthread_h + unistd_h + " + EXPERIMENT_LIST=" diff --git a/build_files/cmake/Modules/FindEpoxy.cmake b/build_files/cmake/Modules/FindEpoxy.cmake new file mode 100644 index 00000000000..7cd26e45398 --- /dev/null +++ b/build_files/cmake/Modules/FindEpoxy.cmake @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2022 Blender Foundation. + +# This module defines +# Epoxy_INCLUDE_DIRS, where to find epoxy/gl.h +# Epoxy_LIBRARY, where to find the epoxy library. +# Epoxy_ROOT_DIR, The base directory to search for epoxy. +# This can also be an environment variable. +# Epoxy_FOUND, If false, do not try to use epoxy. + +IF(NOT EPOXY_ROOT_DIR AND NOT $ENV{EPOXY_ROOT_DIR} STREQUAL "") + SET(EPOXY_ROOT_DIR $ENV{EPOXY_ROOT_DIR}) +ENDIF() + +FIND_PATH(Epoxy_INCLUDE_DIR + NAMES + epoxy/gl.h + HINTS + ${EPOXY_ROOT_DIR} + PATH_SUFFIXES + include +) + +FIND_LIBRARY(Epoxy_LIBRARY + NAMES + epoxy + HINTS + ${EPOXY_ROOT_DIR} + PATH_SUFFIXES + lib64 lib +) + +# handle the QUIETLY and REQUIRED arguments and set Epoxy_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(Epoxy DEFAULT_MSG + Epoxy_LIBRARY Epoxy_INCLUDE_DIR) + +IF(Epoxy_FOUND) + SET(Epoxy_INCLUDE_DIRS ${Epoxy_INCLUDE_DIR}) + SET(Epoxy_LIBRARIES ${Epoxy_LIBRARY}) +ENDIF() + +MARK_AS_ADVANCED( + Epoxy_INCLUDE_DIR + Epoxy_LIBRARY +) diff --git a/build_files/cmake/Modules/FindGLEW.cmake b/build_files/cmake/Modules/FindGLEW.cmake deleted file mode 100644 index 33b989ec49e..00000000000 --- a/build_files/cmake/Modules/FindGLEW.cmake +++ /dev/null @@ -1,58 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright 2014 Blender Foundation. - -# - Find GLEW library -# Find the native Glew includes and library -# This module defines -# GLEW_INCLUDE_DIRS, where to find glew.h, Set when -# GLEW_INCLUDE_DIR is found. -# GLEW_ROOT_DIR, The base directory to search for Glew. -# This can also be an environment variable. -# GLEW_FOUND, If false, do not try to use Glew. -# -# also defined, -# GLEW_LIBRARY, where to find the Glew library. - -# If GLEW_ROOT_DIR was defined in the environment, use it. -IF(NOT GLEW_ROOT_DIR AND NOT $ENV{GLEW_ROOT_DIR} STREQUAL "") - SET(GLEW_ROOT_DIR $ENV{GLEW_ROOT_DIR}) -ENDIF() - -SET(_glew_SEARCH_DIRS - ${GLEW_ROOT_DIR} -) - -FIND_PATH(GLEW_INCLUDE_DIR - NAMES - GL/glew.h - HINTS - ${_glew_SEARCH_DIRS} - PATH_SUFFIXES - include -) - -FIND_LIBRARY(GLEW_LIBRARY - NAMES - GLEW - HINTS - ${_glew_SEARCH_DIRS} - PATH_SUFFIXES - lib64 lib - ) - -# handle the QUIETLY and REQUIRED arguments and set GLEW_FOUND to TRUE if -# all listed variables are TRUE -INCLUDE(FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS(GLEW DEFAULT_MSG - GLEW_LIBRARY GLEW_INCLUDE_DIR) - -IF(GLEW_FOUND) - SET(GLEW_INCLUDE_DIRS ${GLEW_INCLUDE_DIR}) -ENDIF() - -MARK_AS_ADVANCED( - GLEW_INCLUDE_DIR - GLEW_LIBRARY -) - -UNSET(_glew_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindLevelZero.cmake b/build_files/cmake/Modules/FindLevelZero.cmake new file mode 100644 index 00000000000..a60d8ba9978 --- /dev/null +++ b/build_files/cmake/Modules/FindLevelZero.cmake @@ -0,0 +1,56 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2021-2022 Intel Corporation + +# - Find Level Zero library +# Find Level Zero headers and libraries needed by oneAPI implementation +# This module defines +# LEVEL_ZERO_LIBRARY, libraries to link against in order to use L0. +# LEVEL_ZERO_INCLUDE_DIR, directories where L0 headers can be found. +# LEVEL_ZERO_ROOT_DIR, The base directory to search for L0 files. +# This can also be an environment variable. +# LEVEL_ZERO_FOUND, If false, then don't try to use L0. + +IF(NOT LEVEL_ZERO_ROOT_DIR AND NOT $ENV{LEVEL_ZERO_ROOT_DIR} STREQUAL "") + SET(LEVEL_ZERO_ROOT_DIR $ENV{LEVEL_ZERO_ROOT_DIR}) +ENDIF() + +SET(_level_zero_search_dirs + ${LEVEL_ZERO_ROOT_DIR} + /usr/lib + /usr/local/lib +) + +FIND_LIBRARY(_LEVEL_ZERO_LIBRARY + NAMES + ze_loader + HINTS + ${_level_zero_search_dirs} + PATH_SUFFIXES + lib64 lib +) + +FIND_PATH(_LEVEL_ZERO_INCLUDE_DIR + NAMES + level_zero/ze_api.h + HINTS + ${_level_zero_search_dirs} + PATH_SUFFIXES + include +) + +INCLUDE(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LevelZero DEFAULT_MSG _LEVEL_ZERO_LIBRARY _LEVEL_ZERO_INCLUDE_DIR) + +IF(LevelZero_FOUND) + SET(LEVEL_ZERO_LIBRARY ${_LEVEL_ZERO_LIBRARY}) + SET(LEVEL_ZERO_INCLUDE_DIR ${_LEVEL_ZERO_INCLUDE_DIR} ${_LEVEL_ZERO_INCLUDE_PARENT_DIR}) + SET(LEVEL_ZERO_FOUND TRUE) +ELSE() + SET(LEVEL_ZERO_FOUND FALSE) +ENDIF() + +MARK_AS_ADVANCED( + LEVEL_ZERO_LIBRARY + LEVEL_ZERO_INCLUDE_DIR +) diff --git a/build_files/cmake/Modules/FindLibEpoxy.cmake b/build_files/cmake/Modules/FindLibEpoxy.cmake new file mode 100644 index 00000000000..1da52f95f68 --- /dev/null +++ b/build_files/cmake/Modules/FindLibEpoxy.cmake @@ -0,0 +1,47 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2022 Blender Foundation. + +# This module defines +# LibEpoxy_INCLUDE_DIRS, where to find epoxy/gl.h +# LibEpoxy_LIBRARY, where to find the epoxy library. +# LibEpoxy_ROOT_DIR, The base directory to search for libepoxy. +# This can also be an environment variable. +# LibEpoxy_FOUND, If false, do not try to use libepoxy. + +IF(NOT EPOXY_ROOT_DIR AND NOT $ENV{EPOXY_ROOT_DIR} STREQUAL "") + SET(EPOXY_ROOT_DIR $ENV{EPOXY_ROOT_DIR}) +ENDIF() + +FIND_PATH(LibEpoxy_INCLUDE_DIR + NAMES + epoxy/gl.h + HINTS + ${EPOXY_ROOT_DIR} + PATH_SUFFIXES + include +) + +FIND_LIBRARY(LibEpoxy_LIBRARY + NAMES + epoxy + HINTS + ${EPOXY_ROOT_DIR} + PATH_SUFFIXES + lib64 lib +) + +# handle the QUIETLY and REQUIRED arguments and set LibEpoxy_FOUND to TRUE if +# all listed variables are TRUE +INCLUDE(FindPackageHandleStandardArgs) +FIND_PACKAGE_HANDLE_STANDARD_ARGS(LibEpoxy DEFAULT_MSG + LibEpoxy_LIBRARY LibEpoxy_INCLUDE_DIR) + +IF(LibEpoxy_FOUND) + SET(LibEpoxy_INCLUDE_DIRS ${LibEpoxy_INCLUDE_DIR}) + SET(LibEpoxy_LIBRARIES ${LibEpoxy_LIBRARY}) +ENDIF() + +MARK_AS_ADVANCED( + LibEpoxy_INCLUDE_DIR + LibEpoxy_LIBRARY +) diff --git a/build_files/cmake/Modules/FindOpenGLES.cmake b/build_files/cmake/Modules/FindOpenGLES.cmake deleted file mode 100644 index 5e82984bed6..00000000000 --- a/build_files/cmake/Modules/FindOpenGLES.cmake +++ /dev/null @@ -1,80 +0,0 @@ -# SPDX-License-Identifier: BSD-3-Clause -# Copyright 2014 Blender Foundation. - -# - Try to find OpenGLES -# Once done this will define -# -# OPENGLES_FOUND - system has OpenGLES and EGL -# OPENGL_EGL_FOUND - system has EGL -# OPENGLES_INCLUDE_DIR - the GLES include directory -# OPENGLES_LIBRARY - the GLES library -# OPENGLES_EGL_INCLUDE_DIR - the EGL include directory -# OPENGLES_EGL_LIBRARY - the EGL library -# OPENGLES_LIBRARIES - all libraries needed for OpenGLES -# OPENGLES_INCLUDES - all includes needed for OpenGLES - -# If OPENGLES_ROOT_DIR was defined in the environment, use it. -IF(NOT OPENGLES_ROOT_DIR AND NOT $ENV{OPENGLES_ROOT_DIR} STREQUAL "") - SET(OPENGLES_ROOT_DIR $ENV{OPENGLES_ROOT_DIR}) -ENDIF() - -SET(_opengles_SEARCH_DIRS - ${OPENGLES_ROOT_DIR} -) - -FIND_PATH(OPENGLES_INCLUDE_DIR - NAMES - GLES2/gl2.h - HINTS - ${_opengles_SEARCH_DIRS} -) - -FIND_LIBRARY(OPENGLES_LIBRARY - NAMES - GLESv2 - PATHS - ${_opengles_SEARCH_DIRS} - PATH_SUFFIXES - lib64 lib -) - -FIND_PATH(OPENGLES_EGL_INCLUDE_DIR - NAMES - EGL/egl.h - HINTS - ${_opengles_SEARCH_DIRS} -) - -FIND_LIBRARY(OPENGLES_EGL_LIBRARY - NAMES - EGL - HINTS - ${_opengles_SEARCH_DIRS} - PATH_SUFFIXES - lib64 lib -) - -IF(OPENGLES_EGL_LIBRARY AND OPENGLES_EGL_INCLUDE_DIR) - SET(OPENGL_EGL_FOUND "YES") -ELSE() - SET(OPENGL_EGL_FOUND "NO") -ENDIF() - -IF(OPENGLES_LIBRARY AND OPENGLES_INCLUDE_DIR AND - OPENGLES_EGL_LIBRARY AND OPENGLES_EGL_INCLUDE_DIR) - SET(OPENGLES_LIBRARIES ${OPENGLES_LIBRARY} ${OPENGLES_LIBRARIES} - ${OPENGLES_EGL_LIBRARY}) - SET(OPENGLES_INCLUDES ${OPENGLES_INCLUDE_DIR} ${OPENGLES_EGL_INCLUDE_DIR}) - SET(OPENGLES_FOUND "YES") -ELSE() - SET(OPENGLES_FOUND "NO") -ENDIF() - -MARK_AS_ADVANCED( - OPENGLES_EGL_INCLUDE_DIR - OPENGLES_EGL_LIBRARY - OPENGLES_LIBRARY - OPENGLES_INCLUDE_DIR -) - -UNSET(_opengles_SEARCH_DIRS) diff --git a/build_files/cmake/Modules/FindPythonLibsUnix.cmake b/build_files/cmake/Modules/FindPythonLibsUnix.cmake index 1e88621303f..0afe1299330 100644 --- a/build_files/cmake/Modules/FindPythonLibsUnix.cmake +++ b/build_files/cmake/Modules/FindPythonLibsUnix.cmake @@ -34,11 +34,17 @@ SET(PYTHON_VERSION 3.10 CACHE STRING "Python Version (major and minor only)") MARK_AS_ADVANCED(PYTHON_VERSION) -# See: http://docs.python.org/extending/embedding.html#linking-requirements -# for why this is needed -SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic" CACHE STRING "Linker flags for python") -MARK_AS_ADVANCED(PYTHON_LINKFLAGS) - +if(APPLE) + if(WITH_PYTHON_MODULE) + set(PYTHON_LINKFLAGS "-undefined dynamic_lookup") + else() + set(PYTHON_LINKFLAGS) + endif() +else() + # See: http://docs.python.org/extending/embedding.html#linking-requirements + SET(PYTHON_LINKFLAGS "-Xlinker -export-dynamic" CACHE STRING "Linker flags for python") + MARK_AS_ADVANCED(PYTHON_LINKFLAGS) +endif() # if the user passes these defines as args, we don't want to overwrite SET(_IS_INC_DEF OFF) diff --git a/build_files/cmake/Modules/FindSYCL.cmake b/build_files/cmake/Modules/FindSYCL.cmake new file mode 100644 index 00000000000..ac90cbfbe43 --- /dev/null +++ b/build_files/cmake/Modules/FindSYCL.cmake @@ -0,0 +1,88 @@ +# SPDX-License-Identifier: BSD-3-Clause +# Copyright 2021-2022 Intel Corporation + +# - Find SYCL library +# Find the native SYCL header and libraries needed by oneAPI implementation +# This module defines +# SYCL_COMPILER, compiler which will be used for compilation of SYCL code +# SYCL_LIBRARY, libraries to link against in order to use SYCL. +# SYCL_INCLUDE_DIR, directories where SYCL headers can be found +# SYCL_ROOT_DIR, The base directory to search for SYCL files. +# This can also be an environment variable. +# SYCL_FOUND, If false, then don't try to use SYCL. + +IF(NOT SYCL_ROOT_DIR AND NOT $ENV{SYCL_ROOT_DIR} STREQUAL "") + SET(SYCL_ROOT_DIR $ENV{SYCL_ROOT_DIR}) +ENDIF() + +SET(_sycl_search_dirs + ${SYCL_ROOT_DIR} + /usr/lib + /usr/local/lib + /opt/intel/oneapi/compiler/latest/linux/ + C:/Program\ Files\ \(x86\)/Intel/oneAPI/compiler/latest/windows +) + +# Find DPC++ compiler. +# Since the compiler name is possibly conflicting with the system-wide +# CLang start with looking for either dpcpp or clang binary in the given +# list of search paths only. If that fails, try to look for a system-wide +# dpcpp binary. +FIND_PROGRAM(SYCL_COMPILER + NAMES + dpcpp + clang++ + HINTS + ${_sycl_search_dirs} + PATH_SUFFIXES + bin + NO_CMAKE_FIND_ROOT_PATH + NAMES_PER_DIR +) + +# NOTE: No clang++ here so that we do not pick up a system-wide CLang +# compiler. +if(NOT SYCL_COMPILER) + FIND_PROGRAM(SYCL_COMPILER + NAMES + dpcpp + HINTS + ${_sycl_search_dirs} + PATH_SUFFIXES + bin + ) +endif() + +FIND_LIBRARY(SYCL_LIBRARY + NAMES + sycl + HINTS + ${_sycl_search_dirs} + PATH_SUFFIXES + lib64 lib +) + +FIND_PATH(SYCL_INCLUDE_DIR + NAMES + CL/sycl.hpp + HINTS + ${_sycl_search_dirs} + PATH_SUFFIXES + include + include/sycl +) + +INCLUDE(FindPackageHandleStandardArgs) + +FIND_PACKAGE_HANDLE_STANDARD_ARGS(SYCL DEFAULT_MSG SYCL_LIBRARY SYCL_INCLUDE_DIR) + +IF(SYCL_FOUND) + get_filename_component(_SYCL_INCLUDE_PARENT_DIR ${SYCL_INCLUDE_DIR} DIRECTORY) + SET(SYCL_INCLUDE_DIR ${SYCL_INCLUDE_DIR} ${_SYCL_INCLUDE_PARENT_DIR}) +ELSE() + SET(SYCL_SYCL_FOUND FALSE) +ENDIF() + +MARK_AS_ADVANCED( + _SYCL_INCLUDE_PARENT_DIR +) diff --git a/build_files/cmake/Modules/GTest.cmake b/build_files/cmake/Modules/GTest.cmake index a38550958fd..5c7fabdcff7 100644 --- a/build_files/cmake/Modules/GTest.cmake +++ b/build_files/cmake/Modules/GTest.cmake @@ -268,7 +268,8 @@ same as the Google Test name (i.e. ``suite.testcase``); see also cmake_policy(PUSH) cmake_policy(SET CMP0057 NEW) # if IN_LIST -#------------------------------------------------------------------------------ +# ----------------------------------------------------------------------------- + function(gtest_add_tests) if(ARGC LESS 1) diff --git a/build_files/cmake/cmake_static_check_cppcheck.py b/build_files/cmake/cmake_static_check_cppcheck.py index 79f9498ce2e..d9271ff8268 100644 --- a/build_files/cmake/cmake_static_check_cppcheck.py +++ b/build_files/cmake/cmake_static_check_cppcheck.py @@ -10,40 +10,77 @@ import tempfile from typing import ( Any, List, + Tuple, ) +USE_VERBOSE = (os.environ.get("VERBOSE", None) is not None) +# Could make configurable. +USE_VERBOSE_PROGRESS = True -USE_QUIET = (os.environ.get("QUIET", None) is not None) +CHECKER_BIN = "cppcheck" CHECKER_IGNORE_PREFIX = [ "extern", ] -CHECKER_BIN = "cppcheck" +CHECKER_EXCLUDE_SOURCE_FILES = set(os.path.join(*f.split("/")) for f in ( + # These files hang (taking longer than 5min with v2.8.2 at time of writing). + # All other files process in under around 10seconds. + "source/blender/editors/space_text/text_format_pov.c", + "source/blender/editors/space_text/text_format_pov_ini.c", +)) CHECKER_ARGS = [ - # not sure why this is needed, but it is. - "-I" + os.path.join(project_source_info.SOURCE_DIR, "extern", "glew", "include"), - "--suppress=*:%s/extern/glew/include/GL/glew.h:241" % project_source_info.SOURCE_DIR, - "--max-configs=1", # speeds up execution - # "--check-config", # when includes are missing - "--enable=all", # if you want sixty hundred pedantic suggestions + # Speed up execution. + # As Blender has many defines, the total number of configurations is large making execution unreasonably slow. + # This could be increased but do so with care. + "--max-configs=1", + + # Enable this when includes are missing. + # "--check-config", + + # Shows many pedantic issues, some are quite useful. + "--enable=all", + + # Also shows useful messages, even if some are false-positives. + "--inconclusive", # Quiet output, otherwise all defines/includes are printed (overly verbose). # Only enable this for troubleshooting (if defines are not set as expected for example). - "--quiet", + *(() if USE_VERBOSE else ("--quiet",)) # NOTE: `--cppcheck-build-dir=<dir>` is added later as a temporary directory. ] -if USE_QUIET: - CHECKER_ARGS.append("--quiet") + +def source_info_filter( + source_info: List[Tuple[str, List[str], List[str]]], +) -> List[Tuple[str, List[str], List[str]]]: + source_dir = project_source_info.SOURCE_DIR + if not source_dir.endswith(os.sep): + source_dir += os.sep + source_info_result = [] + for i, item in enumerate(source_info): + c = item[0] + if c.startswith(source_dir): + c_relative = c[len(source_dir):] + if c_relative in CHECKER_EXCLUDE_SOURCE_FILES: + CHECKER_EXCLUDE_SOURCE_FILES.remove(c_relative) + continue + source_info_result.append(item) + if CHECKER_EXCLUDE_SOURCE_FILES: + sys.stderr.write("Error: exclude file(s) are missing: %r\n" % list(sorted(CHECKER_EXCLUDE_SOURCE_FILES))) + sys.exit(1) + return source_info_result def cppcheck() -> None: source_info = project_source_info.build_info(ignore_prefix_list=CHECKER_IGNORE_PREFIX) source_defines = project_source_info.build_defines_as_args() + # Apply exclusion. + source_info = source_info_filter(source_info) + check_commands = [] for c, inc_dirs, defs in source_info: cmd = ( @@ -60,7 +97,7 @@ def cppcheck() -> None: process_functions = [] def my_process(i: int, c: str, cmd: List[str]) -> subprocess.Popen[Any]: - if not USE_QUIET: + if USE_VERBOSE_PROGRESS: percent = 100.0 * (i / len(check_commands)) percent_str = "[" + ("%.2f]" % percent).rjust(7) + " %:" diff --git a/build_files/cmake/config/blender_full.cmake b/build_files/cmake/config/blender_full.cmake index e09577ac802..27577a9fbf7 100644 --- a/build_files/cmake/config/blender_full.cmake +++ b/build_files/cmake/config/blender_full.cmake @@ -13,7 +13,7 @@ set(WITH_BULLET ON CACHE BOOL "" FORCE) set(WITH_CODEC_AVI ON CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG ON CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE ON CACHE BOOL "" FORCE) -set(WITH_COMPOSITOR ON CACHE BOOL "" FORCE) +set(WITH_COMPOSITOR_CPU ON CACHE BOOL "" FORCE) set(WITH_CYCLES ON CACHE BOOL "" FORCE) set(WITH_CYCLES_EMBREE ON CACHE BOOL "" FORCE) set(WITH_CYCLES_OSL ON CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_lite.cmake b/build_files/cmake/config/blender_lite.cmake index 5ce344d39e8..38997e2139b 100644 --- a/build_files/cmake/config/blender_lite.cmake +++ b/build_files/cmake/config/blender_lite.cmake @@ -7,8 +7,6 @@ # cmake -C../blender/build_files/cmake/config/blender_lite.cmake ../blender # -set(WITH_INSTALL_PORTABLE ON CACHE BOOL "" FORCE) - set(WITH_ALEMBIC OFF CACHE BOOL "" FORCE) set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE) set(WITH_BLENDER_THUMBNAILER OFF CACHE BOOL "" FORCE) @@ -18,7 +16,7 @@ set(WITH_BULLET OFF CACHE BOOL "" FORCE) set(WITH_CODEC_AVI OFF CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) -set(WITH_COMPOSITOR OFF CACHE BOOL "" FORCE) +set(WITH_COMPOSITOR_CPU OFF CACHE BOOL "" FORCE) set(WITH_COREAUDIO OFF CACHE BOOL "" FORCE) set(WITH_CYCLES OFF CACHE BOOL "" FORCE) set(WITH_DRACO OFF CACHE BOOL "" FORCE) @@ -35,6 +33,7 @@ set(WITH_IMAGE_OPENEXR OFF CACHE BOOL "" FORCE) set(WITH_IMAGE_OPENJPEG OFF CACHE BOOL "" FORCE) set(WITH_IMAGE_TIFF OFF CACHE BOOL "" FORCE) set(WITH_IMAGE_WEBP OFF CACHE BOOL "" FORCE) +set(WITH_INPUT_IME OFF CACHE BOOL "" FORCE) set(WITH_INPUT_NDOF OFF CACHE BOOL "" FORCE) set(WITH_INTERNATIONAL OFF CACHE BOOL "" FORCE) set(WITH_IO_STL OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/config/blender_release.cmake b/build_files/cmake/config/blender_release.cmake index 8ece5eec39e..793d1cb0853 100644 --- a/build_files/cmake/config/blender_release.cmake +++ b/build_files/cmake/config/blender_release.cmake @@ -14,7 +14,7 @@ set(WITH_BULLET ON CACHE BOOL "" FORCE) set(WITH_CODEC_AVI ON CACHE BOOL "" FORCE) set(WITH_CODEC_FFMPEG ON CACHE BOOL "" FORCE) set(WITH_CODEC_SNDFILE ON CACHE BOOL "" FORCE) -set(WITH_COMPOSITOR ON CACHE BOOL "" FORCE) +set(WITH_COMPOSITOR_CPU ON CACHE BOOL "" FORCE) set(WITH_CYCLES ON CACHE BOOL "" FORCE) set(WITH_CYCLES_EMBREE ON CACHE BOOL "" FORCE) set(WITH_CYCLES_OSL ON CACHE BOOL "" FORCE) @@ -70,7 +70,7 @@ if(NOT WIN32) set(WITH_JACK ON CACHE BOOL "" FORCE) endif() if(WIN32) - set(WITH_WASAPI ON CACHE BOOL "" FORCE) + set(WITH_WASAPI ON CACHE BOOL "" FORCE) endif() if(UNIX AND NOT APPLE) set(WITH_DOC_MANPAGE ON CACHE BOOL "" FORCE) @@ -86,4 +86,6 @@ if(NOT APPLE) set(WITH_CYCLES_CUDA_BINARIES ON CACHE BOOL "" FORCE) set(WITH_CYCLES_CUBIN_COMPILER OFF CACHE BOOL "" FORCE) set(WITH_CYCLES_HIP_BINARIES ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_DEVICE_ONEAPI ON CACHE BOOL "" FORCE) + set(WITH_CYCLES_ONEAPI_BINARIES ON CACHE BOOL "" FORCE) endif() diff --git a/build_files/cmake/config/bpy_module.cmake b/build_files/cmake/config/bpy_module.cmake index c4be5c2e61f..7bd5c3fc1a1 100644 --- a/build_files/cmake/config/bpy_module.cmake +++ b/build_files/cmake/config/bpy_module.cmake @@ -8,41 +8,81 @@ set(WITH_PYTHON_MODULE ON CACHE BOOL "" FORCE) -# install into the systems python dir -set(WITH_INSTALL_PORTABLE OFF CACHE BOOL "" FORCE) -# no point int copying python into python +# ----------------------------------------------------------------------------- +# Installation Configuration. +# +# NOTE: `WITH_INSTALL_PORTABLE` always defaults to ON when building as a Python module and +# isn't set here as it makes changing the setting impractical. +# Python-developers could prefer either ON/OFF depending on their usage: +# +# - When using the system's Python, disabling will install into their `site-packages`, +# allowing them to run Python from any directory and `import bpy`. +# - When using Blender's bundled Python in `./../lib/` it will install there +# which isn't especially useful as it requires running Python from this directory too. +# +# So default `WITH_INSTALL_PORTABLE` to ON, and developers who don't use Python from `./../lib/` +# can disable it if they wish to install into their systems Python. + +# There is no point in copying python into Python. set(WITH_PYTHON_INSTALL OFF CACHE BOOL "" FORCE) -# disable audio, its possible some devs may want this but for now disable -# so the python module doesn't hold the audio device and loads quickly. +# Depends on Python install, do this to quiet warning. +set(WITH_DRACO OFF CACHE BOOL "" FORCE) + +if(WIN32) + set(WITH_WINDOWS_BUNDLE_CRT OFF CACHE BOOL "" FORCE) +endif() + + +# ----------------------------------------------------------------------------- +# Library Compatibility. + +# JEMALLOC does not work with `dlopen()` of Python modules: +# https://github.com/jemalloc/jemalloc/issues/1237 +set(WITH_MEM_JEMALLOC OFF CACHE BOOL "" FORCE) + + +# ----------------------------------------------------------------------------- +# Application Support. + +# Not useful to include with the Python module. +# Although a way to extract this from Python could be handle, +# this would be better exposed directly via the Python API. +set(WITH_BLENDER_THUMBNAILER OFF CACHE BOOL "" FORCE) + + +# ----------------------------------------------------------------------------- +# Audio Support. + +# Disable audio, its possible some developers may want this but for now disable +# so the Python module doesn't hold the audio device and loads quickly. set(WITH_AUDASPACE OFF CACHE BOOL "" FORCE) -set(WITH_CODEC_FFMPEG OFF CACHE BOOL "" FORCE) -set(WITH_CODEC_SNDFILE OFF CACHE BOOL "" FORCE) -set(WITH_COREAUDIO OFF CACHE BOOL "" FORCE) set(WITH_JACK OFF CACHE BOOL "" FORCE) set(WITH_OPENAL OFF CACHE BOOL "" FORCE) -set(WITH_PULSEAUDIO OFF CACHE BOOL "" FORCE) set(WITH_SDL OFF CACHE BOOL "" FORCE) -set(WITH_WASAPI OFF CACHE BOOL "" FORCE) +if(UNIX AND NOT APPLE) + set(WITH_PULSEAUDIO OFF CACHE BOOL "" FORCE) +endif() +if(WIN32) + set(WITH_WASAPI OFF CACHE BOOL "" FORCE) +endif() +if(APPLE) + set(WITH_COREAUDIO OFF CACHE BOOL "" FORCE) +endif() + -# other features which are not especially useful as a python module -set(WITH_ALEMBIC OFF CACHE BOOL "" FORCE) -set(WITH_BULLET OFF CACHE BOOL "" FORCE) +# ----------------------------------------------------------------------------- +# Input Device Support. + +# Other features which are not especially useful as a python module. set(WITH_INPUT_NDOF OFF CACHE BOOL "" FORCE) -set(WITH_INTERNATIONAL OFF CACHE BOOL "" FORCE) -set(WITH_NANOVDB OFF CACHE BOOL "" FORCE) -set(WITH_OPENCOLLADA OFF CACHE BOOL "" FORCE) -set(WITH_OPENVDB OFF CACHE BOOL "" FORCE) -set(WITH_X11_XINPUT OFF CACHE BOOL "" FORCE) +if(WIN32 OR APPLE) + set(WITH_INPUT_IME OFF CACHE BOOL "" FORCE) +endif() -# Depends on Python install, do this to quiet warning. -set(WITH_DRACO OFF CACHE BOOL "" FORCE) -# Jemalloc does not work with dlopen() of Python modules: -# https://github.com/jemalloc/jemalloc/issues/1237 -set(WITH_MEM_JEMALLOC OFF CACHE BOOL "" FORCE) +# ----------------------------------------------------------------------------- +# Language Support. -if(WIN32) - set(WITH_WINDOWS_BUNDLE_CRT OFF CACHE BOOL "" FORCE) -endif() +set(WITH_INTERNATIONAL OFF CACHE BOOL "" FORCE) diff --git a/build_files/cmake/have_features.cmake b/build_files/cmake/have_features.cmake new file mode 100644 index 00000000000..dc3b61849ea --- /dev/null +++ b/build_files/cmake/have_features.cmake @@ -0,0 +1,33 @@ +# SPDX-License-Identifier: GPL-2.0-or-later +# Copyright 2022 Blender Foundation. All rights reserved. + +# This file is used to test the system for headers & symbols. +# Variables should use the `HAVE_` prefix. +# Defines should use the same name as the CMAKE variable. + +include(CheckSymbolExists) + +# Used for: `intern/guardedalloc/intern/mallocn_intern.h`. +# Function `malloc_stats` is only available on GLIBC, +# so check that before defining `HAVE_MALLOC_STATS`. +check_symbol_exists(malloc_stats "malloc.h" HAVE_MALLOC_STATS_H) + +# Used for: `source/creator/creator_signals.c`. +# The function `feenableexcept` is not present non-GLIBC systems, +# hence we need to check if it's available in the `fenv.h` file. +set(HAVE_FEENABLEEXCEPT OFF) +if(CMAKE_SYSTEM_NAME STREQUAL "Linux") + check_symbol_exists(feenableexcept "fenv.h" HAVE_FEENABLEEXCEPT) +endif() + +# Used for: `source/blender/blenlib/intern/system.c`. +# `execinfo` is not available on non-GLIBC systems (at least not on MUSL-LIBC), +# so check the presence of the header before including it and using the it for back-trace. +set(HAVE_EXECINFO_H OFF) +if(NOT MSVC) + include(CheckIncludeFiles) + check_include_files("execinfo.h" HAVE_EXECINFO_H) + if(HAVE_EXECINFO_H) + add_definitions(-DHAVE_EXECINFO_H) + endif() +endif() diff --git a/build_files/cmake/macros.cmake b/build_files/cmake/macros.cmake index 5508e8f2104..093106fc4dc 100644 --- a/build_files/cmake/macros.cmake +++ b/build_files/cmake/macros.cmake @@ -418,6 +418,13 @@ function(blender_add_test_lib library_deps ) + # Not currently supported for Python module due to different required + # Python link flags. + if(WITH_PYTHON_MODULE) + add_custom_target(${name}) + return() + endif() + add_cc_flags_custom_test(${name} PARENT_SCOPE) # Otherwise external projects will produce warnings that we cannot fix. @@ -464,6 +471,13 @@ function(blender_add_test_executable library_deps ) + # Not currently supported for Python module due to different required + # Python link flags. + if(WITH_PYTHON_MODULE) + add_custom_target(${name}) + return() + endif() + add_cc_flags_custom_test(${name} PARENT_SCOPE) ## Otherwise external projects will produce warnings that we cannot fix. @@ -1208,16 +1222,8 @@ endmacro() macro(without_system_libs_begin) set(CMAKE_IGNORE_PATH "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES};${CMAKE_SYSTEM_INCLUDE_PATH};${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES};${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}") - if(APPLE) - # Avoid searching for headers in frameworks (like Mono), and libraries in LIBDIR. - set(CMAKE_FIND_FRAMEWORK NEVER) - endif() endmacro() macro(without_system_libs_end) unset(CMAKE_IGNORE_PATH) - if(APPLE) - # FIRST is the default. - set(CMAKE_FIND_FRAMEWORK FIRST) - endif() endmacro() diff --git a/build_files/cmake/platform/platform_apple.cmake b/build_files/cmake/platform/platform_apple.cmake index 32b10625590..f2a8bd42a3e 100644 --- a/build_files/cmake/platform/platform_apple.cmake +++ b/build_files/cmake/platform/platform_apple.cmake @@ -21,9 +21,25 @@ function(print_found_status endif() endfunction() +# Utility to install precompiled shared libraries. +macro(add_bundled_libraries library) + if(EXISTS ${LIBDIR}) + set(_library_dir ${LIBDIR}/${library}/lib) + file(GLOB _all_library_versions ${_library_dir}/*\.dylib*) + list(APPEND PLATFORM_BUNDLED_LIBRARIES ${_all_library_versions}) + list(APPEND PLATFORM_BUNDLED_LIBRARY_DIRS ${_library_dir}) + unset(_all_library_versions) + unset(_library_dir) + endif() +endmacro() + # ------------------------------------------------------------------------ # Find system provided libraries. +# Avoid searching for headers since this would otherwise override our lib +# directory as well as PYTHON_ROOT_DIR. +set(CMAKE_FIND_FRAMEWORK NEVER) + # Find system ZLIB, not the pre-compiled one supplied with OpenCollada. set(ZLIB_ROOT /usr) find_package(ZLIB REQUIRED) @@ -63,6 +79,11 @@ if(NOT EXISTS "${LIBDIR}/") message(FATAL_ERROR "Mac OSX requires pre-compiled libs at: '${LIBDIR}'") endif() +# Optionally use system Python if PYTHON_ROOT_DIR is specified. +if(WITH_PYTHON AND (WITH_PYTHON_MODULE AND PYTHON_ROOT_DIR)) + find_package(PythonLibsUnix REQUIRED) +endif() + # Prefer lib directory paths file(GLOB LIB_SUBDIRS ${LIBDIR}/*) set(CMAKE_PREFIX_PATH ${LIB_SUBDIRS}) @@ -111,34 +132,8 @@ if(WITH_CODEC_SNDFILE) unset(_sndfile_VORBISENC_LIBRARY) endif() -if(WITH_PYTHON) - # Use precompiled libraries by default. - set(PYTHON_VERSION 3.10) - if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) - # Normally cached but not since we include them with blender. - set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}") - set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}") - set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}.a) - set(PYTHON_LIBPATH "${LIBDIR}/python/lib/python${PYTHON_VERSION}") - else() - # Module must be compiled against Python framework. - set(_py_framework "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}") - set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}") - set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}") - set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}") - unset(_py_framework) - endif() - - # uncached vars - set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}") - set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}") - - # needed for Audaspace, numpy is installed into python site-packages - set(PYTHON_NUMPY_INCLUDE_DIRS "${PYTHON_LIBPATH}/site-packages/numpy/core/include") - - if(NOT EXISTS "${PYTHON_EXECUTABLE}") - message(FATAL_ERROR "Python executable missing: ${PYTHON_EXECUTABLE}") - endif() +if(WITH_PYTHON AND NOT (WITH_PYTHON_MODULE AND PYTHON_ROOT_DIR)) + find_package(PythonLibsUnix REQUIRED) endif() if(WITH_FFTW3) @@ -162,6 +157,9 @@ if(WITH_CODEC_FFMPEG) mp3lame ogg opus swresample swscale theora theoradec theoraenc vorbis vorbisenc vorbisfile vpx x264 xvidcore) + if(EXISTS ${LIBDIR}/ffmpeg/lib/libaom.a) + list(APPEND FFMPEG_FIND_COMPONENTS aom) + endif() find_package(FFmpeg) endif() @@ -198,11 +196,6 @@ if(WITH_JACK) string(APPEND PLATFORM_LINKFLAGS " -F/Library/Frameworks -weak_framework jackmp") endif() -if(WITH_PYTHON_MODULE OR WITH_PYTHON_FRAMEWORK) - # force cmake to link right framework - string(APPEND PLATFORM_LINKFLAGS " /Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/Python") -endif() - if(WITH_OPENCOLLADA) find_package(OpenCOLLADA) find_library(PCRE_LIBRARIES NAMES pcre HINTS ${LIBDIR}/opencollada/lib) @@ -223,6 +216,9 @@ if(WITH_SDL) endif() endif() +set(EPOXY_ROOT_DIR ${LIBDIR}/epoxy) +find_package(Epoxy REQUIRED) + set(PNG_ROOT ${LIBDIR}/png) find_package(PNG REQUIRED) @@ -409,6 +405,7 @@ if(WITH_OPENMP) set(OpenMP_LIBRARY_DIR "${LIBDIR}/openmp/lib/") set(OpenMP_LINKER_FLAGS "-L'${OpenMP_LIBRARY_DIR}' -lomp") set(OpenMP_LIBRARY "${OpenMP_LIBRARY_DIR}/libomp.dylib") + add_bundled_libraries(openmp) endif() endif() @@ -443,6 +440,9 @@ if(EXISTS ${LIBDIR}) without_system_libs_end() endif() +# Restore to default. +set(CMAKE_FIND_FRAMEWORK FIRST) + # --------------------------------------------------------------------- # Set compiler and linker flags. @@ -467,8 +467,9 @@ string(APPEND CMAKE_CXX_FLAGS " -ftemplate-depth=1024") # Avoid conflicts with Luxrender, and other plug-ins that may use the same # libraries as Blender with a different version or build options. +set(PLATFORM_SYMBOLS_MAP ${CMAKE_SOURCE_DIR}/source/creator/symbols_apple.map) string(APPEND PLATFORM_LINKFLAGS - " -Wl,-unexported_symbols_list,'${CMAKE_SOURCE_DIR}/source/creator/osx_locals.map'" + " -Wl,-unexported_symbols_list,'${PLATFORM_SYMBOLS_MAP}'" ) string(APPEND CMAKE_CXX_FLAGS " -stdlib=libc++") @@ -497,17 +498,27 @@ if(WITH_COMPILER_CCACHE) endif() endif() -# For binaries that are built but not installed (also not distributed) (datatoc, -# makesdna, tests, etc.), we add an rpath to the OpenMP library dir through -# CMAKE_BUILD_RPATH. This avoids having to make many copies of the dylib next to each binary. -# -# For the installed Python module and installed Blender executable, CMAKE_INSTALL_RPATH -# is modified to find the dylib in an adjacent folder. Install step puts the libraries there. -set(CMAKE_SKIP_BUILD_RPATH FALSE) -list(APPEND CMAKE_BUILD_RPATH "${OpenMP_LIBRARY_DIR}") +if(WITH_COMPILER_ASAN) + list(APPEND PLATFORM_BUNDLED_LIBRARIES ${COMPILER_ASAN_LIBRARY}) +endif() -set(CMAKE_SKIP_INSTALL_RPATH FALSE) -list(APPEND CMAKE_INSTALL_RPATH "@loader_path/../Resources/${BLENDER_VERSION}/lib") +if(PLATFORM_BUNDLED_LIBRARIES) + # For the installed Python module and installed Blender executable, we set the + # rpath to the location where install step will copy the shared libraries. + set(CMAKE_SKIP_INSTALL_RPATH FALSE) + if(WITH_PYTHON_MODULE) + list(APPEND CMAKE_INSTALL_RPATH "@loader_path/lib") + else() + list(APPEND CMAKE_INSTALL_RPATH "@loader_path/../Resources/lib") + endif() + + # For binaries that are built but not installed (like makesdan or tests), we add + # the original directory of all shared libraries to the rpath. This is needed because + # these can be in different folders, and because the build and install folder may be + # different. + set(CMAKE_SKIP_BUILD_RPATH FALSE) + list(APPEND CMAKE_BUILD_RPATH ${PLATFORM_BUNDLED_LIBRARY_DIRS}) +endif() # Same as `CFBundleIdentifier` in Info.plist. set(CMAKE_XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.blenderfoundation.blender") diff --git a/build_files/cmake/platform/platform_unix.cmake b/build_files/cmake/platform/platform_unix.cmake index 6750c23d548..aceddf7295b 100644 --- a/build_files/cmake/platform/platform_unix.cmake +++ b/build_files/cmake/platform/platform_unix.cmake @@ -16,9 +16,16 @@ if(NOT DEFINED LIBDIR) # Choose the best suitable libraries. if(EXISTS ${LIBDIR_NATIVE_ABI}) set(LIBDIR ${LIBDIR_NATIVE_ABI}) + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND True) elseif(EXISTS ${LIBDIR_CENTOS7_ABI}) set(LIBDIR ${LIBDIR_CENTOS7_ABI}) set(WITH_CXX11_ABI OFF) + if(WITH_MEM_JEMALLOC) + # jemalloc provides malloc hooks. + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND False) + else() + set(WITH_LIBC_MALLOC_HOOK_WORKAROUND True) + endif() if(CMAKE_COMPILER_IS_GNUCC AND CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3) @@ -38,9 +45,15 @@ if(EXISTS ${LIBDIR}) message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}") file(GLOB LIB_SUBDIRS ${LIBDIR}/*) + # Ignore Mesa software OpenGL libraries, they are not intended to be # linked against but to optionally override at runtime. list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/mesa) + + # Ignore DPC++ as it contains its own copy of LLVM/CLang which we do + # not need to be ever discovered for the Blender linking. + list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/dpcpp) + # NOTE: Make sure "proper" compiled zlib comes first before the one # which is a part of OpenCollada. They have different ABI, and we # do need to use the official one. @@ -75,6 +88,15 @@ macro(find_package_wrapper) endif() endmacro() +# Utility to install precompiled shared libraries. +macro(add_bundled_libraries library) + if(EXISTS ${LIBDIR}) + file(GLOB _all_library_versions ${LIBDIR}/${library}/lib/*\.so*) + list(APPEND PLATFORM_BUNDLED_LIBRARIES ${_all_library_versions}) + unset(_all_library_versions) + endif() +endmacro() + # ---------------------------------------------------------------------------- # Precompiled Libraries # @@ -89,6 +111,19 @@ find_package_wrapper(JPEG REQUIRED) find_package_wrapper(PNG REQUIRED) find_package_wrapper(ZLIB REQUIRED) find_package_wrapper(Zstd REQUIRED) +find_package_wrapper(Epoxy REQUIRED) + +function(check_freetype_for_brotli) + include(CheckSymbolExists) + set(CMAKE_REQUIRED_INCLUDES ${FREETYPE_INCLUDE_DIRS}) + check_symbol_exists(FT_CONFIG_OPTION_USE_BROTLI "freetype/config/ftconfig.h" HAVE_BROTLI) + unset(CMAKE_REQUIRED_INCLUDES) + if(NOT HAVE_BROTLI) + unset(HAVE_BROTLI CACHE) + message(FATAL_ERROR "Freetype needs to be compiled with brotli support!") + endif() + unset(HAVE_BROTLI CACHE) +endfunction() if(NOT WITH_SYSTEM_FREETYPE) # FreeType compiled with Brotli compression for woff2. @@ -104,17 +139,42 @@ if(NOT WITH_SYSTEM_FREETYPE) # ${BROTLI_LIBRARIES} # ) endif() + check_freetype_for_brotli() endif() if(WITH_PYTHON) - # No way to set py35, remove for now. - # find_package(PythonLibs) + # This could be used, see: D14954 for details. + # `find_package(PythonLibs)` - # Use our own instead, since without py is such a rare case, - # require this package - # XXX Linking errors with debian static python :/ -# find_package_wrapper(PythonLibsUnix REQUIRED) + # Use our own instead, since without Python is such a rare case, + # require this package. + # XXX: Linking errors with Debian static Python (sigh). + # find_package_wrapper(PythonLibsUnix REQUIRED) find_package(PythonLibsUnix REQUIRED) + + if(WITH_PYTHON_MODULE AND NOT WITH_INSTALL_PORTABLE) + # Installing into `site-packages`, warn when installing into `./../lib/` + # which script authors almost certainly don't want. + if(EXISTS ${LIBDIR}) + cmake_path(IS_PREFIX LIBDIR "${PYTHON_SITE_PACKAGES}" NORMALIZE _is_prefix) + if(_is_prefix) + message(WARNING " +Building Blender with the following configuration: + - WITH_PYTHON_MODULE=ON + - WITH_INSTALL_PORTABLE=OFF + - LIBDIR=\"${LIBDIR}\" + - PYTHON_SITE_PACKAGES=\"${PYTHON_SITE_PACKAGES}\" +In this case you may want to either: + - Use the system Python's site-packages, see: + python -c \"import site; print(site.getsitepackages()[0])\" + - Set WITH_INSTALL_PORTABLE=ON to create a stand-alone \"bpy\" module + which you will need to ensure is in Python's module search path. +Proceeding with PYTHON_SITE_PACKAGES install target, you have been warned!" + ) + endif() + unset(_is_prefix) + endif() + endif() endif() if(WITH_IMAGE_OPENEXR) @@ -196,6 +256,9 @@ if(WITH_CODEC_FFMPEG) vpx x264 xvidcore) + if(EXISTS ${LIBDIR}/ffmpeg/lib/libaom.a) + list(APPEND FFMPEG_FIND_COMPONENTS aom) + endif() elseif(FFMPEG) # Old cache variable used for root dir, convert to new standard. set(FFMPEG_ROOT_DIR ${FFMPEG}) @@ -271,6 +334,18 @@ if(WITH_CYCLES AND WITH_CYCLES_OSL) endif() endif() +if(WITH_CYCLES_DEVICE_ONEAPI) + set(CYCLES_LEVEL_ZERO ${LIBDIR}/level-zero CACHE PATH "Path to Level Zero installation") + if(EXISTS ${CYCLES_LEVEL_ZERO} AND NOT LEVEL_ZERO_ROOT_DIR) + set(LEVEL_ZERO_ROOT_DIR ${CYCLES_LEVEL_ZERO}) + endif() + + set(CYCLES_SYCL ${LIBDIR}/dpcpp CACHE PATH "Path to DPC++ and SYCL installation") + if(EXISTS ${CYCLES_SYCL} AND NOT SYCL_ROOT_DIR) + set(SYCL_ROOT_DIR ${CYCLES_SYCL}) + endif() +endif() + if(WITH_OPENVDB) find_package_wrapper(OpenVDB) find_package_wrapper(Blosc) @@ -566,6 +641,7 @@ if(WITH_SYSTEM_FREETYPE) if(NOT FREETYPE_FOUND) message(FATAL_ERROR "Failed finding system FreeType version!") endif() + check_freetype_for_brotli() endif() if(WITH_LZO AND WITH_SYSTEM_LZO) @@ -608,22 +684,93 @@ endif() if(WITH_GHOST_WAYLAND) find_package(PkgConfig) - pkg_check_modules(wayland-client REQUIRED wayland-client>=1.12) - pkg_check_modules(wayland-egl REQUIRED wayland-egl) - pkg_check_modules(wayland-scanner REQUIRED wayland-scanner) - pkg_check_modules(xkbcommon REQUIRED xkbcommon) - pkg_check_modules(wayland-cursor REQUIRED wayland-cursor) - pkg_check_modules(dbus REQUIRED dbus-1) - - set(WITH_GL_EGL ON) - - list(APPEND PLATFORM_LINKLIBS - ${wayland-client_LINK_LIBRARIES} - ${wayland-egl_LINK_LIBRARIES} - ${xkbcommon_LINK_LIBRARIES} - ${wayland-cursor_LINK_LIBRARIES} - ${dbus_LINK_LIBRARIES} - ) + pkg_check_modules(wayland-client wayland-client>=1.12) + pkg_check_modules(wayland-egl wayland-egl) + pkg_check_modules(wayland-scanner wayland-scanner) + pkg_check_modules(xkbcommon xkbcommon) + pkg_check_modules(wayland-cursor wayland-cursor) + pkg_check_modules(wayland-protocols wayland-protocols>=1.15) + + if(${wayland-protocols_FOUND}) + pkg_get_variable(WAYLAND_PROTOCOLS_DIR wayland-protocols pkgdatadir) + else() + # CentOS 7 packages have too old a version, a newer version exist in the + # precompiled libraries. + find_path(WAYLAND_PROTOCOLS_DIR + NAMES unstable/xdg-decoration/xdg-decoration-unstable-v1.xml + PATH_SUFFIXES share/wayland-protocols + PATHS ${LIBDIR}/wayland-protocols + ) + + if(EXISTS ${WAYLAND_PROTOCOLS_DIR}) + set(wayland-protocols_FOUND ON) + endif() + endif() + + if (NOT ${wayland-client_FOUND}) + message(STATUS "wayland-client not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + if (NOT ${wayland-egl_FOUND}) + message(STATUS "wayland-egl not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + if (NOT ${wayland-scanner_FOUND}) + message(STATUS "wayland-scanner not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + if (NOT ${wayland-cursor_FOUND}) + message(STATUS "wayland-cursor not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + if (NOT ${wayland-protocols_FOUND}) + message(STATUS "wayland-protocols not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + if (NOT ${xkbcommon_FOUND}) + message(STATUS "xkbcommon not found, disabling WITH_GHOST_WAYLAND") + set(WITH_GHOST_WAYLAND OFF) + endif() + + if(WITH_GHOST_WAYLAND) + if(WITH_GHOST_WAYLAND_DBUS) + pkg_check_modules(dbus REQUIRED dbus-1) + endif() + + if(WITH_GHOST_WAYLAND_LIBDECOR) + pkg_check_modules(libdecor REQUIRED libdecor-0>=0.1) + endif() + + list(APPEND PLATFORM_LINKLIBS + ${xkbcommon_LINK_LIBRARIES} + ) + + if(NOT WITH_GHOST_WAYLAND_DYNLOAD) + list(APPEND PLATFORM_LINKLIBS + ${wayland-client_LINK_LIBRARIES} + ${wayland-egl_LINK_LIBRARIES} + ${wayland-cursor_LINK_LIBRARIES} + ) + endif() + + if(WITH_GHOST_WAYLAND_DBUS) + list(APPEND PLATFORM_LINKLIBS + ${dbus_LINK_LIBRARIES} + ) + add_definitions(-DWITH_GHOST_WAYLAND_DBUS) + endif() + + if(WITH_GHOST_WAYLAND_LIBDECOR) + if(NOT WITH_GHOST_WAYLAND_DYNLOAD) + list(APPEND PLATFORM_LINKLIBS + ${libdecor_LIBRARIES} + ) + endif() + add_definitions(-DWITH_GHOST_WAYLAND_LIBDECOR) + endif() + + pkg_get_variable(WAYLAND_SCANNER wayland-scanner wayland_scanner) + endif() endif() if(WITH_GHOST_X11) @@ -743,7 +890,8 @@ if(CMAKE_COMPILER_IS_GNUCC) "The mold linker could not find the directory containing the linker command " "(typically " "\"${MOLD_PREFIX}/libexec/mold/ld\") or " - "\"${MOLD_PREFIX}/lib/mold/ld\") using system linker.") + "\"${MOLD_PREFIX}/lib/mold/ld\") using system linker." + ) set(WITH_LINKER_MOLD OFF) endif() unset(MOLD_PREFIX) @@ -842,8 +990,9 @@ unset(_IS_LINKER_DEFAULT) # Avoid conflicts with Mesa llvmpipe, Luxrender, and other plug-ins that may # use the same libraries as Blender with a different version or build options. +set(PLATFORM_SYMBOLS_MAP ${CMAKE_SOURCE_DIR}/source/creator/symbols_unix.map) set(PLATFORM_LINKFLAGS - "${PLATFORM_LINKFLAGS} -Wl,--version-script='${CMAKE_SOURCE_DIR}/source/creator/blender.map'" + "${PLATFORM_LINKFLAGS} -Wl,--version-script='${PLATFORM_SYMBOLS_MAP}'" ) # Don't use position independent executable for portable install since file @@ -881,7 +1030,8 @@ function(CONFIGURE_ATOMIC_LIB_IF_NEEDED) int main(int argc, char **argv) { std::atomic<uint64_t> uint64; uint64++; return 0; - }") + }" + ) include(CheckCXXSourceCompiles) check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITHOUT_LIBATOMIC) @@ -893,6 +1043,7 @@ function(CONFIGURE_ATOMIC_LIB_IF_NEEDED) set(CMAKE_REQUIRED_LIBRARIES atomic) check_cxx_source_compiles("${_source}" ATOMIC_OPS_WITH_LIBATOMIC) + unset(CMAKE_REQUIRED_LIBRARIES) if(ATOMIC_OPS_WITH_LIBATOMIC) set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -latomic" PARENT_SCOPE) @@ -906,3 +1057,16 @@ function(CONFIGURE_ATOMIC_LIB_IF_NEEDED) endfunction() CONFIGURE_ATOMIC_LIB_IF_NEEDED() + +if(PLATFORM_BUNDLED_LIBRARIES) + # For the installed Python module and installed Blender executable, we set the + # rpath to the relative path where the install step will copy the shared libraries. + set(CMAKE_SKIP_INSTALL_RPATH FALSE) + list(APPEND CMAKE_INSTALL_RPATH $ORIGIN/lib) + + # For executables that are built but not installed (mainly tests) we set an absolute + # rpath to the lib folder. This is needed because these can be in different folders, + # and because the build and install folder may be different. + set(CMAKE_SKIP_BUILD_RPATH FALSE) + list(APPEND CMAKE_BUILD_RPATH $ORIGIN/lib ${CMAKE_INSTALL_PREFIX_WITH_CONFIG}/lib) +endif() diff --git a/build_files/cmake/platform/platform_win32.cmake b/build_files/cmake/platform/platform_win32.cmake index 40c25abd585..dd5d04d7c92 100644 --- a/build_files/cmake/platform/platform_win32.cmake +++ b/build_files/cmake/platform/platform_win32.cmake @@ -146,7 +146,7 @@ endif() if(WITH_COMPILER_ASAN AND MSVC AND NOT MSVC_CLANG) if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28.29828) #set a flag so we don't have to do this comparison all the time - SET(MSVC_ASAN ON) + set(MSVC_ASAN ON) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /fsanitize=address") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /fsanitize=address") string(APPEND CMAKE_EXE_LINKER_FLAGS_DEBUG " /INCREMENTAL:NO") @@ -185,20 +185,20 @@ endif() if(WITH_WINDOWS_SCCACHE) - set(CMAKE_C_COMPILER_LAUNCHER sccache) - set(CMAKE_CXX_COMPILER_LAUNCHER sccache) + set(CMAKE_C_COMPILER_LAUNCHER sccache) + set(CMAKE_CXX_COMPILER_LAUNCHER sccache) + set(SYMBOL_FORMAT /Z7) + set(SYMBOL_FORMAT_RELEASE /Z7) +else() + unset(CMAKE_C_COMPILER_LAUNCHER) + unset(CMAKE_CXX_COMPILER_LAUNCHER) + if(MSVC_ASAN) set(SYMBOL_FORMAT /Z7) set(SYMBOL_FORMAT_RELEASE /Z7) -else() - unset(CMAKE_C_COMPILER_LAUNCHER) - unset(CMAKE_CXX_COMPILER_LAUNCHER) - if(MSVC_ASAN) - set(SYMBOL_FORMAT /Z7) - set(SYMBOL_FORMAT_RELEASE /Z7) - else() - set(SYMBOL_FORMAT /ZI) - set(SYMBOL_FORMAT_RELEASE /Zi) - endif() + else() + set(SYMBOL_FORMAT /ZI) + set(SYMBOL_FORMAT_RELEASE /Zi) + endif() endif() if(WITH_WINDOWS_PDB) @@ -323,6 +323,13 @@ if(NOT JPEG_FOUND) set(JPEG_LIBRARIES ${LIBDIR}/jpeg/lib/libjpeg.lib) endif() +set(EPOXY_ROOT_DIR ${LIBDIR}/epoxy) +windows_find_package(Epoxy REQUIRED) +if(NOT EPOXY_FOUND) + set(Epoxy_INCLUDE_DIRS ${LIBDIR}/epoxy/include) + set(Epoxy_LIBRARIES ${LIBDIR}/epoxy/lib/epoxy.lib) +endif() + set(PTHREADS_INCLUDE_DIRS ${LIBDIR}/pthreads/include) set(PTHREADS_LIBRARIES ${LIBDIR}/pthreads/lib/pthreadVC3.lib) @@ -416,7 +423,7 @@ if(WITH_CODEC_FFMPEG) ${LIBDIR}/ffmpeg/lib/avdevice.lib ${LIBDIR}/ffmpeg/lib/avutil.lib ${LIBDIR}/ffmpeg/lib/swscale.lib - ) + ) endif() endif() @@ -497,12 +504,16 @@ if(WITH_JACK) endif() if(WITH_PYTHON) - set(PYTHON_VERSION 3.10) # CACHE STRING) + # Cache version for make_bpy_wheel.py to detect. + unset(PYTHON_VERSION CACHE) + set(PYTHON_VERSION "3.10" CACHE STRING "Python version") string(REPLACE "." "" _PYTHON_VERSION_NO_DOTS ${PYTHON_VERSION}) set(PYTHON_LIBRARY ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}.lib) set(PYTHON_LIBRARY_DEBUG ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/libs/python${_PYTHON_VERSION_NO_DOTS}_d.lib) + set(PYTHON_EXECUTABLE ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/bin/python$<$<CONFIG:Debug>:_d>.exe) + set(PYTHON_INCLUDE_DIR ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/include) set(PYTHON_NUMPY_INCLUDE_DIRS ${LIBDIR}/python/${_PYTHON_VERSION_NO_DOTS}/lib/site-packages/numpy/core/include) set(NUMPY_FOUND ON) @@ -565,12 +576,14 @@ if(WITH_BOOST) if(WITH_CYCLES AND WITH_CYCLES_OSL) set(BOOST_LIBRARIES ${BOOST_LIBRARIES} optimized ${BOOST_LIBPATH}/libboost_wave-${BOOST_POSTFIX} - debug ${BOOST_LIBPATH}/libboost_wave-${BOOST_DEBUG_POSTFIX}) + debug ${BOOST_LIBPATH}/libboost_wave-${BOOST_DEBUG_POSTFIX} + ) endif() if(WITH_INTERNATIONAL) set(BOOST_LIBRARIES ${BOOST_LIBRARIES} optimized ${BOOST_LIBPATH}/libboost_locale-${BOOST_POSTFIX} - debug ${BOOST_LIBPATH}/libboost_locale-${BOOST_DEBUG_POSTFIX}) + debug ${BOOST_LIBPATH}/libboost_locale-${BOOST_DEBUG_POSTFIX} + ) endif() else() # we found boost using find_package set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS}) @@ -677,7 +690,8 @@ if(WITH_OPENIMAGEDENOISE) optimized ${OPENIMAGEDENOISE_LIBPATH}/dnnl.lib debug ${OPENIMAGEDENOISE_LIBPATH}/OpenImageDenoise_d.lib debug ${OPENIMAGEDENOISE_LIBPATH}/common_d.lib - debug ${OPENIMAGEDENOISE_LIBPATH}/dnnl_d.lib) + debug ${OPENIMAGEDENOISE_LIBPATH}/dnnl_d.lib + ) set(OPENIMAGEDENOISE_DEFINITIONS) endif() @@ -832,7 +846,8 @@ if(WITH_CYCLES AND WITH_CYCLES_EMBREE) debug ${LIBDIR}/embree/lib/math_d.lib debug ${LIBDIR}/embree/lib/simd_d.lib debug ${LIBDIR}/embree/lib/sys_d.lib - debug ${LIBDIR}/embree/lib/tasking_d.lib) + debug ${LIBDIR}/embree/lib/tasking_d.lib + ) endif() endif() @@ -950,3 +965,6 @@ endif() set(ZSTD_INCLUDE_DIRS ${LIBDIR}/zstd/include) set(ZSTD_LIBRARIES ${LIBDIR}/zstd/lib/zstd_static.lib) + +set(LEVEL_ZERO_ROOT_DIR ${LIBDIR}/level_zero) +set(SYCL_ROOT_DIR ${LIBDIR}/dpcpp) diff --git a/build_files/cmake/platform/platform_win32_bundle_crt.cmake b/build_files/cmake/platform/platform_win32_bundle_crt.cmake index f5dd0c8c7bc..f197498d97b 100644 --- a/build_files/cmake/platform/platform_win32_bundle_crt.cmake +++ b/build_files/cmake/platform/platform_win32_bundle_crt.cmake @@ -3,20 +3,22 @@ # First generate the manifest for tests since it will not need the dependency on the CRT. configure_file(${CMAKE_SOURCE_DIR}/release/windows/manifest/blender.exe.manifest.in ${CMAKE_CURRENT_BINARY_DIR}/tests.exe.manifest @ONLY) -if(WITH_WINDOWS_BUNDLE_CRT) - set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) - set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) - set(CMAKE_INSTALL_OPENMP_LIBRARIES ${WITH_OPENMP}) - - # This sometimes can change when updates are installed and the compiler version - # changes, so test if it exists and if not, give InstallRequiredSystemLibraries - # another chance to figure out the path. - if(MSVC_REDIST_DIR AND NOT EXISTS "${MSVC_REDIST_DIR}") - unset(MSVC_REDIST_DIR CACHE) - endif() +# Always detect system libraries, since they are also used by oneAPI. +# But don't always install them, only for WITH_WINDOWS_BUNDLE_CRT=ON. +set(CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS_SKIP TRUE) +set(CMAKE_INSTALL_UCRT_LIBRARIES TRUE) +set(CMAKE_INSTALL_OPENMP_LIBRARIES ${WITH_OPENMP}) + +# This sometimes can change when updates are installed and the compiler version +# changes, so test if it exists and if not, give InstallRequiredSystemLibraries +# another chance to figure out the path. +if(MSVC_REDIST_DIR AND NOT EXISTS "${MSVC_REDIST_DIR}") + unset(MSVC_REDIST_DIR CACHE) +endif() - include(InstallRequiredSystemLibraries) +include(InstallRequiredSystemLibraries) +if(WITH_WINDOWS_BUNDLE_CRT) # ucrtbase(d).dll cannot be in the manifest, due to the way windows 10 handles # redirects for this dll, for details see T88813. foreach(lib ${CMAKE_INSTALL_SYSTEM_RUNTIME_LIBS}) diff --git a/build_files/cmake/project_source_info.py b/build_files/cmake/project_source_info.py index a544f5733f0..f29d068044c 100644 --- a/build_files/cmake/project_source_info.py +++ b/build_files/cmake/project_source_info.py @@ -30,6 +30,8 @@ from typing import ( cast, ) +import shlex + SOURCE_DIR = join(dirname(__file__), "..", "..") SOURCE_DIR = normpath(SOURCE_DIR) @@ -160,7 +162,7 @@ def build_info( for c in compilers: args = args.replace(c, fake_compiler) - args = args.split() + args = shlex.split(args) # end # remove compiler diff --git a/build_files/config/pipeline_config.yaml b/build_files/config/pipeline_config.yaml index 8222f2ff0b9..82cd009ea95 100644 --- a/build_files/config/pipeline_config.yaml +++ b/build_files/config/pipeline_config.yaml @@ -54,6 +54,8 @@ buildbot: version: '10.1.243' cuda11: version: '11.4.1' + hip: + version: '5.2.21440' optix: version: '7.3.0' cmake: diff --git a/build_files/utils/make_bpy_wheel.py b/build_files/utils/make_bpy_wheel.py new file mode 100755 index 00000000000..900868ea3d7 --- /dev/null +++ b/build_files/utils/make_bpy_wheel.py @@ -0,0 +1,220 @@ +#!/usr/bin/env python3 +# SPDX-License-Identifier: GPL-2.0-or-later + +""" +Make Python wheel package (`*.whl`) file from Blender built with 'WITH_PYTHON_MODULE' enabled. + +Example +======= + +If the "bpy" module was build on Linux using the command: + + make bpy lite + +The command to package it as a wheel is: + + ./build_files/utils/make_bpy_wheel.py ../build_linux_bpy_lite/bin --output-dir=./ + +This will create a `*.whl` file in the current directory. +""" + +import argparse +import make_utils +import os +import re +import platform +import string +import setuptools # type: ignore +import sys + +from typing import ( + Generator, + List, + Optional, + Sequence, + Tuple, +) + + +# ------------------------------------------------------------------------------ +# Generic Functions + +def find_dominating_file( + path: str, + search: Sequence[str], +) -> str: + while True: + for d in search: + if os.path.exists(os.path.join(path, d)): + return os.path.join(path, d) + path_next = os.path.normpath(os.path.join(path, "..")) + if path == path_next: + break + path = path_next + return "" + + +# ------------------------------------------------------------------------------ +# CMake Cache Access + +def cmake_cache_var_iter(filepath_cmake_cache: str) -> Generator[Tuple[str, str, str], None, None]: + import re + re_cache = re.compile(r"([A-Za-z0-9_\-]+)?:?([A-Za-z0-9_\-]+)?=(.*)$") + with open(filepath_cmake_cache, "r", encoding="utf-8") as cache_file: + for l in cache_file: + match = re_cache.match(l.strip()) + if match is not None: + var, type_, val = match.groups() + yield (var, type_ or "", val) + + +def cmake_cache_var(filepath_cmake_cache: str, var: str) -> Optional[str]: + for var_iter, type_iter, value_iter in cmake_cache_var_iter(filepath_cmake_cache): + if var == var_iter: + return value_iter + return None + + +def cmake_cache_var_or_exit(filepath_cmake_cache: str, var: str) -> str: + value = cmake_cache_var(filepath_cmake_cache, var) + if value is None: + sys.stderr.write("Unable to find %r in %r, abort!\n" % (var, filepath_cmake_cache)) + sys.exit(1) + return value + + +# ------------------------------------------------------------------------------ +# Argument Parser + +def argparse_create() -> argparse.ArgumentParser: + parser = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument( + "install_dir", + metavar='INSTALL_DIR', + type=str, + help="The installation directory containing the \"bpy\" package.", + ) + parser.add_argument( + "--build-dir", + metavar='BUILD_DIR', + default=None, + help="The build directory containing 'CMakeCache.txt' (search parent directories of INSTALL_DIR when omitted).", + required=False, + ) + parser.add_argument( + "--output-dir", + metavar='OUTPUT_DIR', + default=None, + help="The destination directory for the '*.whl' file (use INSTALL_DIR when omitted).", + required=False, + ) + + return parser + + +# ------------------------------------------------------------------------------ +# Main Function + +def main() -> None: + + # Parse arguments. + args = argparse_create().parse_args() + + install_dir = os.path.abspath(args.install_dir) + output_dir = os.path.abspath(args.output_dir) if args.output_dir else install_dir + + if args.build_dir: + build_dir = os.path.abspath(args.build_dir) + filepath_cmake_cache = os.path.join(build_dir, "CMakeCache.txt") + del build_dir + if not os.path.exists(filepath_cmake_cache): + sys.stderr.write("File not found %r, abort!\n" % filepath_cmake_cache) + sys.exit(1) + else: + filepath_cmake_cache = find_dominating_file(install_dir, ("CMakeCache.txt",)) + if not filepath_cmake_cache: + # Should never fail. + sys.stderr.write("Unable to find CMakeCache.txt in or above %r, abort!\n" % install_dir) + sys.exit(1) + + # Get the major and minor Python version. + python_version = cmake_cache_var_or_exit(filepath_cmake_cache, "PYTHON_VERSION") + python_version_number = ( + tuple(int("".join(c for c in digit if c in string.digits)) for digit in python_version.split(".")) + + # Support version without a minor version "3" (add zero). + tuple((0, 0, 0)) + ) + python_version_str = "%d.%d" % python_version_number[:2] + + # Get Blender version. + blender_version_str = str(make_utils.parse_blender_version()) + + # Set platform tag following conventions. + if sys.platform == "darwin": + target = cmake_cache_var_or_exit(filepath_cmake_cache, "CMAKE_OSX_DEPLOYMENT_TARGET").split(".") + machine = cmake_cache_var_or_exit(filepath_cmake_cache, "CMAKE_OSX_ARCHITECTURES") + platform_tag = "macosx_%d_%d_%s" % (int(target[0]), int(target[1]), machine) + elif sys.platform == "win32": + platform_tag = "win_%s" % (platform.machine().lower()) + elif sys.platform == "linux": + glibc = os.confstr("CS_GNU_LIBC_VERSION") + if glibc is None: + sys.stderr.write("Unable to find \"CS_GNU_LIBC_VERSION\", abort!\n") + sys.exit(1) + glibc = "%s_%s" % tuple(glibc.split()[1].split(".")[:2]) + platform_tag = "manylinux_%s_%s" % (glibc, platform.machine().lower()) + else: + sys.stderr.write("Unsupported platform: %s, abort!\n" % (sys.platform)) + sys.exit(1) + + os.chdir(install_dir) + + # Include all files recursively. + def package_files(root_dir: str) -> List[str]: + paths = [] + for path, dirs, files in os.walk(root_dir): + paths += [os.path.join("..", path, f) for f in files] + return paths + + # Ensure this wheel is marked platform specific. + class BinaryDistribution(setuptools.dist.Distribution): # type: ignore + def has_ext_modules(self) -> bool: + return True + + # Build wheel. + sys.argv = [sys.argv[0], "bdist_wheel"] + + setuptools.setup( + name="bpy", + version=blender_version_str, + install_requires=["cython", "numpy", "requests", "zstandard"], + python_requires="==%d.%d.*" % (python_version_number[0], python_version_number[1]), + packages=["bpy"], + package_data={"": package_files("bpy")}, + distclass=BinaryDistribution, + options={"bdist_wheel": {"plat_name": platform_tag}}, + + description="Blender as a Python module", + license="GPL-3.0", + author="Blender Foundation", + author_email="bf-committers@blender.org", + url="https://www.blender.org" + ) + + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + # Move wheel to output directory. + dist_dir = os.path.join(install_dir, "dist") + for f in os.listdir(dist_dir): + if f.endswith(".whl"): + # No apparent way to override this ABI version with setuptools, so rename. + sys_py = "cp%d%d" % (sys.version_info.major, sys.version_info.minor) + blender_py = "cp%d%d" % (python_version_number[0], python_version_number[1]) + renamed_f = f.replace(sys_py, blender_py) + + os.rename(os.path.join(dist_dir, f), os.path.join(output_dir, renamed_f)) + + +if __name__ == "__main__": + main() diff --git a/build_files/utils/make_source_archive.py b/build_files/utils/make_source_archive.py index befd6d84534..71fe7788b90 100755 --- a/build_files/utils/make_source_archive.py +++ b/build_files/utils/make_source_archive.py @@ -2,7 +2,7 @@ # SPDX-License-Identifier: GPL-2.0-or-later import argparse -import dataclasses +import make_utils import os import re import subprocess @@ -19,6 +19,8 @@ from typing import Iterable, TextIO, Optional, Any, Union SKIP_NAMES = { ".gitignore", ".gitmodules", + ".gitattributes", + ".git-blame-ignore-revs", ".arcconfig", ".svn", } @@ -50,7 +52,7 @@ def main() -> None: print(f"Output dir: {curdir}") - version = parse_blender_version(blender_srcdir) + version = make_utils.parse_blender_version() tarball = tarball_path(curdir, version, cli_args) manifest = manifest_path(tarball) packages_dir = packages_path(curdir, cli_args) @@ -62,53 +64,7 @@ def main() -> None: print("Done!") -@dataclasses.dataclass -class BlenderVersion: - version: int # 293 for 2.93.1 - patch: int # 1 for 2.93.1 - cycle: str # 'alpha', 'beta', 'release', maybe others. - - @property - def is_release(self) -> bool: - return self.cycle == "release" - - def __str__(self) -> str: - """Convert to version string. - - >>> str(BlenderVersion(293, 1, "alpha")) - '2.93.1-alpha' - >>> str(BlenderVersion(327, 0, "release")) - '3.27.0' - """ - version_major = self.version // 100 - version_minor = self.version % 100 - as_string = f"{version_major}.{version_minor}.{self.patch}" - if self.is_release: - return as_string - return f"{as_string}-{self.cycle}" - - -def parse_blender_version(blender_srcdir: Path) -> BlenderVersion: - version_path = blender_srcdir / "source/blender/blenkernel/BKE_blender_version.h" - - version_info = {} - line_re = re.compile(r"^#define (BLENDER_VERSION[A-Z_]*)\s+([0-9a-z]+)$") - - with version_path.open(encoding="utf-8") as version_file: - for line in version_file: - match = line_re.match(line.strip()) - if not match: - continue - version_info[match.group(1)] = match.group(2) - - return BlenderVersion( - int(version_info["BLENDER_VERSION"]), - int(version_info["BLENDER_VERSION_PATCH"]), - version_info["BLENDER_VERSION_CYCLE"], - ) - - -def tarball_path(output_dir: Path, version: BlenderVersion, cli_args: Any) -> Path: +def tarball_path(output_dir: Path, version: make_utils.BlenderVersion, cli_args: Any) -> Path: extra = "" if cli_args.include_packages: extra = "-with-libraries" @@ -148,7 +104,7 @@ def packages_path(current_directory: Path, cli_args: Any) -> Optional[Path]: def create_manifest( - version: BlenderVersion, + version: make_utils.BlenderVersion, outpath: Path, blender_srcdir: Path, packages_dir: Optional[Path], @@ -170,9 +126,9 @@ def main_files_to_manifest(blender_srcdir: Path, outfile: TextIO) -> None: def submodules_to_manifest( - blender_srcdir: Path, version: BlenderVersion, outfile: TextIO + blender_srcdir: Path, version: make_utils.BlenderVersion, outfile: TextIO ) -> None: - skip_addon_contrib = version.is_release + skip_addon_contrib = version.is_release() assert not blender_srcdir.is_absolute() for line in git_command("-C", blender_srcdir, "submodule"): @@ -200,7 +156,11 @@ def packages_to_manifest(outfile: TextIO, packages_dir: Path) -> None: def create_tarball( - version: BlenderVersion, tarball: Path, manifest: Path, blender_srcdir: Path, packages_dir: Optional[Path] + version: make_utils.BlenderVersion, + tarball: Path, + manifest: Path, + blender_srcdir: Path, + packages_dir: Optional[Path], ) -> None: print(f'Creating archive: "{tarball}" ...', end="", flush=True) command = ["tar"] diff --git a/build_files/utils/make_update.py b/build_files/utils/make_update.py index bf140812ebb..254cccda301 100755 --- a/build_files/utils/make_update.py +++ b/build_files/utils/make_update.py @@ -110,6 +110,9 @@ def svn_update(args, release_version): if not make_utils.command_missing(args.svn_command): call(svn_non_interactive + ["cleanup", lib_dirpath]) continue + elif dirname.startswith("."): + # Temporary paths such as ".mypy_cache" will report a warning, skip hidden directories. + continue svn_dirpath = os.path.join(dirpath, ".svn") svn_root_dirpath = os.path.join(lib_dirpath, ".svn") diff --git a/build_files/utils/make_utils.py b/build_files/utils/make_utils.py index e4c676474b5..564930617ff 100755 --- a/build_files/utils/make_utils.py +++ b/build_files/utils/make_utils.py @@ -9,9 +9,15 @@ import re import shutil import subprocess import sys +from pathlib import Path +from typing import ( + Sequence, + Optional, +) -def call(cmd, exit_on_error=True, silent=False): + +def call(cmd: Sequence[str], exit_on_error: bool = True, silent: bool = False) -> int: if not silent: print(" ".join(cmd)) @@ -29,7 +35,7 @@ def call(cmd, exit_on_error=True, silent=False): return retcode -def check_output(cmd, exit_on_error=True): +def check_output(cmd: Sequence[str], exit_on_error: bool = True) -> str: # Flush to ensure correct order output on Windows. sys.stdout.flush() sys.stderr.flush() @@ -46,14 +52,14 @@ def check_output(cmd, exit_on_error=True): return output.strip() -def git_branch_exists(git_command, branch): +def git_branch_exists(git_command: str, branch: str) -> bool: return ( call([git_command, "rev-parse", "--verify", branch], exit_on_error=False, silent=True) == 0 or call([git_command, "rev-parse", "--verify", "remotes/origin/" + branch], exit_on_error=False, silent=True) == 0 ) -def git_branch(git_command): +def git_branch(git_command: str) -> str: # Get current branch name. try: branch = subprocess.check_output([git_command, "rev-parse", "--abbrev-ref", "HEAD"]) @@ -64,7 +70,7 @@ def git_branch(git_command): return branch.strip().decode('utf8') -def git_tag(git_command): +def git_tag(git_command: str) -> Optional[str]: # Get current tag name. try: tag = subprocess.check_output([git_command, "describe", "--exact-match"], stderr=subprocess.STDOUT) @@ -74,18 +80,19 @@ def git_tag(git_command): return tag.strip().decode('utf8') -def git_branch_release_version(branch, tag): - release_version = re.search("^blender-v(.*)-release$", branch) - if release_version: - release_version = release_version.group(1) +def git_branch_release_version(branch: str, tag: str) -> Optional[str]: + re_match = re.search("^blender-v(.*)-release$", branch) + release_version = None + if re_match: + release_version = re_match.group(1) elif tag: - release_version = re.search(r"^v([0-9]*\.[0-9]*).*", tag) - if release_version: - release_version = release_version.group(1) + re_match = re.search(r"^v([0-9]*\.[0-9]*).*", tag) + if re_match: + release_version = re_match.group(1) return release_version -def svn_libraries_base_url(release_version, branch=None): +def svn_libraries_base_url(release_version: Optional[str], branch: Optional[str] = None) -> str: if release_version: svn_branch = "tags/blender-" + release_version + "-release" elif branch: @@ -95,9 +102,58 @@ def svn_libraries_base_url(release_version, branch=None): return "https://svn.blender.org/svnroot/bf-blender/" + svn_branch + "/lib/" -def command_missing(command): +def command_missing(command: str) -> bool: # Support running with Python 2 for macOS if sys.version_info >= (3, 0): return shutil.which(command) is None else: return False + + +class BlenderVersion: + def __init__(self, version: int, patch: int, cycle: str): + # 293 for 2.93.1 + self.version = version + # 1 for 2.93.1 + self.patch = patch + # 'alpha', 'beta', 'release', maybe others. + self.cycle = cycle + + def is_release(self) -> bool: + return self.cycle == "release" + + def __str__(self) -> str: + """Convert to version string. + + >>> str(BlenderVersion(293, 1, "alpha")) + '2.93.1-alpha' + >>> str(BlenderVersion(327, 0, "release")) + '3.27.0' + """ + version_major = self.version // 100 + version_minor = self.version % 100 + as_string = f"{version_major}.{version_minor}.{self.patch}" + if self.is_release(): + return as_string + return f"{as_string}-{self.cycle}" + + +def parse_blender_version() -> BlenderVersion: + blender_srcdir = Path(__file__).absolute().parent.parent.parent + version_path = blender_srcdir / "source/blender/blenkernel/BKE_blender_version.h" + + version_info = {} + line_re = re.compile(r"^#define (BLENDER_VERSION[A-Z_]*)\s+([0-9a-z]+)$") + + with version_path.open(encoding="utf-8") as version_file: + for line in version_file: + match = line_re.match(line.strip()) + if not match: + continue + version_info[match.group(1)] = match.group(2) + + return BlenderVersion( + int(version_info["BLENDER_VERSION"]), + int(version_info["BLENDER_VERSION_PATCH"]), + version_info["BLENDER_VERSION_CYCLE"], + ) |