Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrecht Van Lommel <brecht@blender.org>2020-09-04 19:41:10 +0300
committerBrecht Van Lommel <brechtvanlommel@gmail.com>2020-09-04 18:10:50 +0300
commitf04260d8c679851be6a267214daacae44126156f (patch)
tree41ea1fca782f0e1f9fab299fe8d77f3b48a34295 /intern/cycles/cmake
parent417695e4a8bff7927a936797ca01c6461ce0eaf7 (diff)
CMake: refresh building and external library handling of Cycles standalone
* Support precompiled libraries on Linux * Add license headers * Refactoring to deduplicate code Includes work by Ray Molenkamp and Grische for precompiled libraries. Ref D8769
Diffstat (limited to 'intern/cycles/cmake')
-rw-r--r--intern/cycles/cmake/external_libs.cmake549
-rw-r--r--intern/cycles/cmake/macros.cmake353
2 files changed, 821 insertions, 81 deletions
diff --git a/intern/cycles/cmake/external_libs.cmake b/intern/cycles/cmake/external_libs.cmake
index b09f442bd16..e84dc7a1fca 100644
--- a/intern/cycles/cmake/external_libs.cmake
+++ b/intern/cycles/cmake/external_libs.cmake
@@ -1,83 +1,152 @@
+# Copyright 2011-2020 Blender Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+
+###########################################################################
+# Helper macros
###########################################################################
-# Precompiled libraries tips and hints, for find_package().
-if(CYCLES_STANDALONE_REPOSITORY)
- if(APPLE OR WIN32)
- include(precompiled_libs)
- endif()
-endif()
+macro(_set_default variable value)
+ if(NOT ${variable})
+ set(${variable} ${value})
+ endif()
+endmacro()
###########################################################################
-# GLUT
+# Precompiled libraries detection
+#
+# Use precompiled libraries from Blender repository
+###########################################################################
-if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
- set(GLUT_ROOT_PATH ${CYCLES_GLUT})
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(APPLE)
+ set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/darwin")
+ elseif(WIN32)
+ if(CMAKE_CL_64)
+ set(_cycles_lib_dir "${CMAKE_SOURCE_DIR}/../lib/win64_vc15")
+ else()
+ message(FATAL_ERROR "Unsupported Visual Studio Version")
+ endif()
+ else()
+ # Path to a locally compiled libraries.
+ set(LIBDIR_NAME ${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR})
+ string(TOLOWER ${LIBDIR_NAME} LIBDIR_NAME)
+ set(LIBDIR_NATIVE_ABI ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_NAME})
- find_package(GLUT)
- message(STATUS "GLUT_FOUND=${GLUT_FOUND}")
+ # Path to precompiled libraries with known CentOS 7 ABI.
+ set(LIBDIR_CENTOS7_ABI ${CMAKE_SOURCE_DIR}/../lib/linux_centos7_x86_64)
- include_directories(
- SYSTEM
- ${GLUT_INCLUDE_DIR}
- )
-endif()
+ # Choose the best suitable libraries.
+ if(EXISTS ${LIBDIR_NATIVE_ABI})
+ set(_cycles_lib_dir ${LIBDIR_NATIVE_ABI})
+ elseif(EXISTS ${LIBDIR_CENTOS7_ABI})
+ set(_cycles_lib_dir ${LIBDIR_CENTOS7_ABI})
+ set(WITH_CXX11_ABI OFF)
-###########################################################################
-# GLEW
+ if(CMAKE_COMPILER_IS_GNUCC AND
+ CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3)
+ message(FATAL_ERROR "GCC version must be at least 9.3 for precompiled libraries, found ${CMAKE_C_COMPILER_VERSION}")
+ endif()
+ endif()
-# Workaround for unconventional variable name use in Blender.
-if(NOT CYCLES_STANDALONE_REPOSITORY)
- set(GLEW_INCLUDE_DIR "${GLEW_INCLUDE_PATH}")
-endif()
+ # Avoid namespace pollustion.
+ unset(LIBDIR_NATIVE_ABI)
+ unset(LIBDIR_CENTOS7_ABI)
+ endif()
+
+ if(EXISTS ${_cycles_lib_dir})
+ _set_default(BOOST_ROOT "${_cycles_lib_dir}/boost")
+ _set_default(BLOSC_ROOT_DIR "${_cycles_lib_dir}/blosc")
+ _set_default(EMBREE_ROOT_DIR "${_cycles_lib_dir}/embree")
+ _set_default(GLEW_ROOT_DIR "${_cycles_lib_dir}/glew")
+ _set_default(JPEG_ROOT "${_cycles_lib_dir}/jpeg")
+ _set_default(LLVM_ROOT_DIR "${_cycles_lib_dir}/llvm")
+ _set_default(OPENCOLORIO_ROOT_DIR "${_cycles_lib_dir}/opencolorio")
+ _set_default(OPENEXR_ROOT_DIR "${_cycles_lib_dir}/openexr")
+ _set_default(OPENIMAGEDENOISE_ROOT_DIR "${_cycles_lib_dir}/openimagedenoise")
+ _set_default(OPENIMAGEIO_ROOT_DIR "${_cycles_lib_dir}/openimageio")
+ _set_default(OPENJPEG_ROOT_DIR "${_cycles_lib_dir}/openjpeg")
+ _set_default(OPENSUBDIV_ROOT_DIR "${_cycles_lib_dir}/opensubdiv")
+ _set_default(OPENVDB_ROOT_DIR "${_cycles_lib_dir}/openvdb")
+ _set_default(OSL_ROOT_DIR "${_cycles_lib_dir}/osl")
+ _set_default(PNG_ROOT "${_cycles_lib_dir}/png")
+ _set_default(TBB_ROOT_DIR "${_cycles_lib_dir}/tbb")
+ _set_default(TIFF_ROOT "${_cycles_lib_dir}/tiff")
+ _set_default(ZLIB_ROOT "${_cycles_lib_dir}/zlib")
-if(WITH_CYCLES_STANDALONE)
- set(CYCLES_APP_GLEW_LIBRARY ${BLENDER_GLEW_LIBRARIES})
+ # Ignore system libraries
+ set(CMAKE_IGNORE_PATH "${CMAKE_PLATFORM_IMPLICIT_LINK_DIRECTORIES};${CMAKE_SYSTEM_INCLUDE_PATH};${CMAKE_C_IMPLICIT_INCLUDE_DIRECTORIES};${CMAKE_CXX_IMPLICIT_INCLUDE_DIRECTORIES}")
+ else()
+ unset(_cycles_lib_dir)
+ endif()
endif()
###########################################################################
-# CUDA
+# Zlib
+###########################################################################
-if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD)
- find_package(CUDA) # Try to auto locate CUDA toolkit
- if(CUDA_FOUND)
- message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(ZLIB_INCLUDE_DIRS ${_cycles_lib_dir}/zlib/include)
+ set(ZLIB_LIBRARIES ${_cycles_lib_dir}/zlib/lib/libz_st.lib)
+ set(ZLIB_INCLUDE_DIR ${_cycles_lib_dir}/zlib/include)
+ set(ZLIB_LIBRARY ${_cycles_lib_dir}/zlib/lib/libz_st.lib)
+ set(ZLIB_DIR ${_cycles_lib_dir}/zlib)
+ set(ZLIB_FOUND ON)
else()
- message(STATUS "CUDA compiler not found, disabling WITH_CYCLES_CUDA_BINARIES")
- set(WITH_CYCLES_CUDA_BINARIES OFF)
- if(NOT WITH_CUDA_DYNLOAD)
- message(STATUS "Additionally falling back to dynamic CUDA load")
- set(WITH_CUDA_DYNLOAD ON)
- endif()
+ find_package(ZLIB REQUIRED)
endif()
endif()
-# Packages which are being found by Blender when building from inside Blender
-# source code. but which we need to take care of when building Cycles from a
-# standalone repository
+###########################################################################
+# PThreads
+###########################################################################
+
if(CYCLES_STANDALONE_REPOSITORY)
- # PThreads
- # TODO(sergey): Bloody exception, handled in precompiled_libs.cmake.
- if(NOT WIN32)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(PTHREADS_LIBRARIES "${_cycles_lib_dir}/pthreads/lib/pthreadVC3.lib")
+ include_directories("${_cycles_lib_dir}/pthreads/include")
+ else()
set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
find_package(Threads REQUIRED)
set(PTHREADS_LIBRARIES ${CMAKE_THREAD_LIBS_INIT})
endif()
+endif()
- ####
- # OpenGL
+###########################################################################
+# OpenImageIO and image libraries
+###########################################################################
- # TODO(sergey): We currently re-use the same variable name as we use
- # in Blender. Ideally we need to make it CYCLES_GL_LIBRARIES.
- find_package(OpenGL REQUIRED)
- find_package(GLEW REQUIRED)
- list(APPEND BLENDER_GL_LIBRARIES
- "${OPENGL_gl_LIBRARY}"
- "${OPENGL_glu_LIBRARY}"
- "${GLEW_LIBRARY}"
- )
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ add_definitions(
+ # OIIO changed the name of this define in newer versions
+ # we define both, so it would work with both old and new
+ # versions.
+ -DOIIO_STATIC_BUILD
+ -DOIIO_STATIC_DEFINE
+ )
+
+ # Special exceptions for libraries which needs explicit debug version
+ set(OPENIMAGEIO_LIBRARY
+ optimized ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO.lib
+ optimized ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_Util.lib
+ debug ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_d.lib
+ debug ${OPENIMAGEIO_ROOT_DIR}/lib/OpenImageIO_Util_d.lib
+ )
+ endif()
- ####
- # OpenImageIO
find_package(OpenImageIO REQUIRED)
if(OPENIMAGEIO_PUGIXML_FOUND)
set(PUGIXML_INCLUDE_DIR "${OPENIMAGEIO_INCLUDE_DIR/OpenImageIO}")
@@ -86,37 +155,143 @@ if(CYCLES_STANDALONE_REPOSITORY)
find_package(PugiXML REQUIRED)
endif()
- # OIIO usually depends on OpenEXR, so find this library
- # but don't make it required.
- find_package(OpenEXR)
+ # Dependencies
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(OPENJPEG_INCLUDE_DIR ${OPENJPEG}/include/openjpeg-2.3)
+ set(OPENJPEG_LIBRARY ${_cycles_lib_dir}/openjpeg/lib/openjp2${CMAKE_STATIC_LIBRARY_SUFFIX})
+ endif()
- ####
- # OpenShadingLanguage
- if(WITH_CYCLES_OSL)
- find_package(OpenShadingLanguage REQUIRED)
+ find_package(JPEG REQUIRED)
+ find_package(OpenJPEG REQUIRED)
+ find_package(TIFF REQUIRED)
+ find_package(PNG REQUIRED)
+endif()
+
+###########################################################################
+# OpenEXR
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(OPENEXR_IEX_LIBRARY
+ optimized ${OPENEXR_ROOT_DIR}/lib/Iex_s.lib
+ debug ${OPENEXR_ROOT_DIR}/lib/Iex_s_d.lib
+ )
+ set(OPENEXR_HALF_LIBRARY
+ optimized ${OPENEXR_ROOT_DIR}/lib/Half_s.lib
+ debug ${OPENEXR_ROOT_DIR}/lib/Half_s_d.lib
+ )
+ set(OPENEXR_ILMIMF_LIBRARY
+ optimized ${OPENEXR_ROOT_DIR}/lib/IlmImf_s.lib
+ debug ${OPENEXR_ROOT_DIR}/lib/IlmImf_s_d.lib
+ )
+ set(OPENEXR_IMATH_LIBRARY
+ optimized ${OPENEXR_ROOT_DIR}/lib/Imath_s.lib
+ debug ${OPENEXR_ROOT_DIR}/lib/Imath_s_d.lib
+ )
+ set(OPENEXR_ILMTHREAD_LIBRARY
+ optimized ${OPENEXR_ROOT_DIR}/lib/IlmThread_s.lib
+ debug ${OPENEXR_ROOT_DIR}/lib/IlmThread_s_d.lib
+ )
+ endif()
+
+ find_package(OpenEXR REQUIRED)
+endif()
+
+###########################################################################
+# OpenShadingLanguage & LLVM
+###########################################################################
+
+if(WITH_CYCLES_OSL)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ if(EXISTS ${_cycles_lib_dir})
+ set(LLVM_STATIC ON)
+ endif()
+
+ find_package(OSL REQUIRED)
find_package(LLVM REQUIRED)
+
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ # TODO(sergey): On Windows llvm-config doesn't give proper results for the
+ # library names, use hardcoded libraries for now.
+ file(GLOB _llvm_libs_release ${LLVM_ROOT_DIR}/lib/*.lib)
+ file(GLOB _llvm_libs_debug ${LLVM_ROOT_DIR}/debug/lib/*.lib)
+ set(_llvm_libs)
+ foreach(_llvm_lib_path ${_llvm_libs_release})
+ get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
+ list(APPEND _llvm_libs optimized ${_llvm_lib_name})
+ endforeach()
+ foreach(_llvm_lib_path ${_llvm_libs_debug})
+ get_filename_component(_llvm_lib_name ${_llvm_lib_path} ABSOLUTE)
+ list(APPEND _llvm_libs debug ${_llvm_lib_name})
+ endforeach()
+ set(LLVM_LIBRARY ${_llvm_libs})
+ unset(_llvm_lib_name)
+ unset(_llvm_lib_path)
+ unset(_llvm_libs)
+ unset(_llvm_libs_debug)
+ unset(_llvm_libs_release)
+
+ set(OSL_LIBRARIES
+ optimized ${OSL_ROOT_DIR}/lib/oslcomp.lib
+ optimized ${OSL_ROOT_DIR}/lib/oslexec.lib
+ optimized ${OSL_ROOT_DIR}/lib/oslquery.lib
+ optimized ${OSL_ROOT_DIR}/lib/pugixml.lib
+ debug ${OSL_ROOT_DIR}/lib/oslcomp_d.lib
+ debug ${OSL_ROOT_DIR}/lib/oslexec_d.lib
+ debug ${OSL_ROOT_DIR}/lib/oslquery_d.lib
+ debug ${OSL_ROOT_DIR}/lib/pugixml_d.lib
+ )
+ endif()
endif()
+endif()
+
+###########################################################################
+# OpenColorIO
+###########################################################################
- ####
- # OpenColorIO
- if(WITH_OPENCOLORIO)
+if(WITH_CYCLES_OPENCOLORIO)
+ if(CYCLES_STANDALONE_REPOSITORY)
find_package(OpenColorIO REQUIRED)
+ set(WITH_OPENCOLORIO ON)
+
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(OPENCOLORIO_LIBPATH ${_cycles_lib_dir}/opencolorio/lib)
+ set(OPENCOLORIO_LIBRARIES
+ optimized ${OPENCOLORIO_LIBPATH}/OpenColorIO.lib
+ optimized ${OPENCOLORIO_LIBPATH}/tinyxml.lib
+ optimized ${OPENCOLORIO_LIBPATH}/libyaml-cpp.lib
+ debug ${OPENCOLORIO_LIBPATH}/OpencolorIO_d.lib
+ debug ${OPENCOLORIO_LIBPATH}/tinyxml_d.lib
+ debug ${OPENCOLORIO_LIBPATH}/libyaml-cpp_d.lib
+ )
+ endif()
+ endif()
+endif()
+
+###########################################################################
+# Boost
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(EXISTS ${_cycles_lib_dir})
+ if(MSVC)
+ set(Boost_USE_STATIC_RUNTIME OFF)
+ set(Boost_USE_MULTITHREADED ON)
+ set(Boost_USE_STATIC_LIBS ON)
+ else()
+ set(BOOST_LIBRARYDIR ${_cycles_lib_dir}/boost/lib)
+ set(Boost_NO_BOOST_CMAKE ON)
+ set(Boost_NO_SYSTEM_PATHS ON)
+ endif()
endif()
- ####
- # Boost
set(__boost_packages filesystem regex system thread date_time)
if(WITH_CYCLES_NETWORK)
list(APPEND __boost_packages serialization)
endif()
if(WITH_CYCLES_OSL)
- # TODO(sergey): This is because of the way how our precompiled
- # libraries works, could be different for someone's else libs..
- if(APPLE OR MSVC)
- list(APPEND __boost_packages wave)
- elseif(NOT (${OSL_LIBRARY_VERSION_MAJOR} EQUAL "1" AND ${OSL_LIBRARY_VERSION_MINOR} LESS "6"))
- list(APPEND __boost_packages wave)
- endif()
+ list(APPEND __boost_packages wave)
endif()
find_package(Boost 1.48 COMPONENTS ${__boost_packages} REQUIRED)
if(NOT Boost_FOUND)
@@ -131,21 +306,233 @@ if(CYCLES_STANDALONE_REPOSITORY)
set(BOOST_LIBRARIES ${Boost_LIBRARIES})
set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS})
set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB")
+endif()
+
+###########################################################################
+# Embree
+###########################################################################
+
+if(WITH_CYCLES_EMBREE)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(EMBREE_TASKING_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/tasking.lib
+ debug ${EMBREE_ROOT_DIR}/lib/tasking_d.lib
+ )
+ set(EMBREE_EMBREE3_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/embree3.lib
+ debug ${EMBREE_ROOT_DIR}/lib/embree3_d.lib
+ )
+ set(EMBREE_EMBREE_AVX_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/embree_avx.lib
+ debug ${EMBREE_ROOT_DIR}/lib/embree_avx_d.lib
+ )
+ set(EMBREE_EMBREE_AVX2_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/embree_avx2.lib
+ debug ${EMBREE_ROOT_DIR}/lib/embree_avx2_d.lib
+ )
+ set(EMBREE_EMBREE_SSE42_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/embree_sse42.lib
+ debug ${EMBREE_ROOT_DIR}/lib/embree_sse42_d.lib
+ )
+ set(EMBREE_LEXERS_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/lexers.lib
+ debug ${EMBREE_ROOT_DIR}/lib/lexers_d.lib
+ )
+ set(EMBREE_MATH_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/math.lib
+ debug ${EMBREE_ROOT_DIR}/lib/math_d.lib
+ )
+ set(EMBREE_SIMD_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/simd.lib
+ debug ${EMBREE_ROOT_DIR}/lib/simd_d.lib
+ )
+ set(EMBREE_SYS_LIBRARY
+ optimized ${EMBREE_ROOT_DIR}/lib/sys.lib
+ debug ${EMBREE_ROOT_DIR}/lib/sys_d.lib
+ )
+ endif()
- ####
- # Embree
- if(WITH_CYCLES_EMBREE)
find_package(Embree 3.8.0 REQUIRED)
endif()
+endif()
+
+###########################################################################
+# Logging
+###########################################################################
- ####
- # Logging
- if(WITH_CYCLES_LOGGING)
+if(WITH_CYCLES_LOGGING)
+ if(CYCLES_STANDALONE_REPOSITORY)
find_package(Glog REQUIRED)
find_package(Gflags REQUIRED)
endif()
+endif()
+
+###########################################################################
+# OpenSubdiv
+###########################################################################
+
+if(WITH_CYCLES_OPENSUBDIV)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ find_package(OpenSubdiv REQUIRED)
+ set(WITH_OPENSUBDIV ON)
+
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(OPENSUBDIV_LIBRARIES
+ optimized ${OPENSUBDIV_ROOT_DIR}/lib/osdCPU.lib
+ optimized ${OPENSUBDIV_ROOT_DIR}/lib/osdGPU.lib
+ debug ${OPENSUBDIV_ROOT_DIR}/lib/osdCPU_d.lib
+ debug ${OPENSUBDIV_ROOT_DIR}/lib/osdGPU_d.lib
+ )
+ endif()
+ endif()
+endif()
+
+###########################################################################
+# OpenVDB
+###########################################################################
+
+if(WITH_CYCLES_OPENVDB)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(BLOSC_LIBRARY
+ optimized ${BLOSC_ROOT_DIR}/lib/libblosc.lib
+ debug ${BLOSC_ROOT_DIR}/lib/libblosc_d.lib)
+ endif()
+
+ find_package(OpenVDB REQUIRED)
+ find_package(Blosc REQUIRED)
+ set(WITH_OPENVDB ON)
+ set(OPENVDB_DEFINITIONS -DNOMINMAX -D_USE_MATH_DEFINES)
+ endif()
+endif()
+
+###########################################################################
+# OpenImageDenoise
+###########################################################################
+
+if(WITH_CYCLES_OPENIMAGEDENOISE)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ find_package(OpenImageDenoise REQUIRED)
+ set(WITH_OPENIMAGEDENOISE ON)
+
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(OPENIMAGEDENOISE_LIBRARIES
+ optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise.lib
+ optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common.lib
+ optimized ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl.lib
+ debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/OpenImageDenoise_d.lib
+ debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/common_d.lib
+ debug ${OPENIMAGEDENOISE_ROOT_DIR}/lib/dnnl_d.lib)
+ endif()
+
+ endif()
+endif()
+
+###########################################################################
+# TBB
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(TBB_LIBRARY
+ optimized ${TBB_ROOT_DIR}/lib/tbb.lib
+ debug ${TBB_ROOT_DIR}/lib/debug/tbb_debug.lib
+ )
+ endif()
+
+ find_package(TBB REQUIRED)
+endif()
+
+###########################################################################
+# GLEW
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ set(GLEW_LIBRARY "${_cycles_lib_dir}/opengl/lib/glew.lib")
+ set(GLEW_INCLUDE_DIR "${_cycles_lib_dir}/opengl/include")
+ add_definitions(-DGLEW_STATIC)
+ endif()
+
+ find_package(GLEW REQUIRED)
+else()
+ # Workaround for unconventional variable name use in Blender.
+ set(GLEW_INCLUDE_DIR "${GLEW_INCLUDE_PATH}")
+endif()
+
+###########################################################################
+# System Libraries
+###########################################################################
+
+# Detect system libraries again
+if(EXISTS ${_cycles_lib_dir})
+ unset(CMAKE_IGNORE_PATH)
+endif()
+
+###########################################################################
+# OpenGL
+###########################################################################
+
+if(CYCLES_STANDALONE_REPOSITORY)
+ if(NOT DEFINED OpenGL_GL_PREFERENCE)
+ set(OpenGL_GL_PREFERENCE "LEGACY")
+ endif()
+
+ find_package(OpenGL REQUIRED)
- unset(_lib_DIR)
+ set(CYCLES_GL_LIBRARIES
+ ${OPENGL_gl_LIBRARY}
+ ${OPENGL_glu_LIBRARY}
+ ${GLEW_LIBRARY}
+ )
else()
- set(LLVM_LIBRARIES ${LLVM_LIBRARY})
+ set(CYCLES_GL_LIBRARIES
+ bf_intern_glew_mx
+ ${BLENDER_GL_LIBRARIES}
+ ${BLENDER_GLEW_LIBRARIES})
+endif()
+
+###########################################################################
+# GLUT
+###########################################################################
+
+if(WITH_CYCLES_STANDALONE AND WITH_CYCLES_STANDALONE_GUI)
+ if(MSVC AND EXISTS ${_cycles_lib_dir})
+ add_definitions(-DFREEGLUT_STATIC -DFREEGLUT_LIB_PRAGMAS=0)
+ set(GLUT_LIBRARIES "${_cycles_lib_dir}/opengl/lib/freeglut_static.lib")
+ set(GLUT_INCLUDE_DIR "${_cycles_lib_dir}/opengl/include")
+ else()
+ find_package(GLUT)
+
+ if(NOT GLUT_FOUND)
+ set(WITH_CYCLES_STANDALONE_GUI OFF)
+ message(STATUS "GLUT not found, disabling Cycles standalone GUI")
+ endif()
+ endif()
+
+ include_directories(
+ SYSTEM
+ ${GLUT_INCLUDE_DIR}
+ )
+endif()
+
+###########################################################################
+# CUDA
+###########################################################################
+
+if(WITH_CYCLES_CUDA_BINARIES OR NOT WITH_CUDA_DYNLOAD)
+ find_package(CUDA) # Try to auto locate CUDA toolkit
+ if(CUDA_FOUND)
+ message(STATUS "CUDA nvcc = ${CUDA_NVCC_EXECUTABLE}")
+ else()
+ message(STATUS "CUDA compiler not found, disabling WITH_CYCLES_CUDA_BINARIES")
+ set(WITH_CYCLES_CUDA_BINARIES OFF)
+ if(NOT WITH_CUDA_DYNLOAD)
+ message(STATUS "Additionally falling back to dynamic CUDA load")
+ set(WITH_CUDA_DYNLOAD ON)
+ endif()
+ endif()
endif()
+
+unset(_cycles_lib_dir)
diff --git a/intern/cycles/cmake/macros.cmake b/intern/cycles/cmake/macros.cmake
index 13328a8b6bf..1a2a730a665 100644
--- a/intern/cycles/cmake/macros.cmake
+++ b/intern/cycles/cmake/macros.cmake
@@ -1,3 +1,245 @@
+# Copyright 2011-2020 Blender Foundation
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+macro(ADD_CHECK_CXX_COMPILER_FLAG
+ _CXXFLAGS
+ _CACHE_VAR
+ _FLAG)
+
+ include(CheckCXXCompilerFlag)
+
+ CHECK_CXX_COMPILER_FLAG("${_FLAG}" "${_CACHE_VAR}")
+ if(${_CACHE_VAR})
+ # message(STATUS "Using CXXFLAG: ${_FLAG}")
+ set(${_CXXFLAGS} "${${_CXXFLAGS}} ${_FLAG}")
+ else()
+ message(STATUS "Unsupported CXXFLAG: ${_FLAG}")
+ endif()
+endmacro()
+
+# pair of macros to allow libraries to be specify files to install, but to
+# only install them at the end so the directories don't get cleared with
+# the files in them. used by cycles to install addon.
+macro(delayed_install
+ base
+ files
+ destination)
+
+ foreach(f ${files})
+ if(IS_ABSOLUTE ${f})
+ set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${f})
+ else()
+ set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_FILES ${base}/${f})
+ endif()
+ set_property(GLOBAL APPEND PROPERTY DELAYED_INSTALL_DESTINATIONS ${destination})
+ endforeach()
+endmacro()
+
+# note this is a function instead of a macro so that ${BUILD_TYPE} in targetdir
+# does not get expanded in calling but is preserved
+function(delayed_do_install
+ targetdir)
+
+ get_property(files GLOBAL PROPERTY DELAYED_INSTALL_FILES)
+ get_property(destinations GLOBAL PROPERTY DELAYED_INSTALL_DESTINATIONS)
+
+ if(files)
+ list(LENGTH files n)
+ math(EXPR n "${n}-1")
+
+ foreach(i RANGE ${n})
+ list(GET files ${i} f)
+ list(GET destinations ${i} d)
+ install(FILES ${f} DESTINATION ${targetdir}/${d})
+ endforeach()
+ endif()
+endfunction()
+
+macro(remove_cc_flag
+ flag)
+
+ string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS "${CMAKE_C_FLAGS}")
+ string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}")
+ string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}")
+ string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_MINSIZEREL "${CMAKE_C_FLAGS_MINSIZEREL}")
+ string(REGEX REPLACE ${flag} "" CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO}")
+
+ string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}")
+ string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}")
+ string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}")
+ string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_MINSIZEREL "${CMAKE_CXX_FLAGS_MINSIZEREL}")
+ string(REGEX REPLACE ${flag} "" CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO}")
+
+endmacro()
+
+macro(remove_extra_strict_flags)
+ if(CMAKE_COMPILER_IS_GNUCC)
+ remove_cc_flag("-Wunused-parameter")
+ endif()
+
+ if(CMAKE_C_COMPILER_ID MATCHES "Clang")
+ remove_cc_flag("-Wunused-parameter")
+ endif()
+
+ if(MSVC)
+ # TODO
+ endif()
+endmacro()
+
+macro(TEST_UNORDERED_MAP_SUPPORT)
+ # - Detect unordered_map availability
+ # Test if a valid implementation of unordered_map exists
+ # and define the include path
+ # This module defines
+ # HAVE_UNORDERED_MAP, whether unordered_map implementation was found
+ #
+ # HAVE_STD_UNORDERED_MAP_HEADER, <unordered_map.h> was found
+ # HAVE_UNORDERED_MAP_IN_STD_NAMESPACE, unordered_map is in namespace std
+ # HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE, unordered_map is in namespace std::tr1
+ #
+ # UNORDERED_MAP_INCLUDE_PREFIX, include path prefix for unordered_map, if found
+ # UNORDERED_MAP_NAMESPACE, namespace for unordered_map, if found
+
+ include(CheckIncludeFileCXX)
+ CHECK_INCLUDE_FILE_CXX("unordered_map" HAVE_STD_UNORDERED_MAP_HEADER)
+ if(HAVE_STD_UNORDERED_MAP_HEADER)
+ # Even so we've found unordered_map header file it doesn't
+ # mean unordered_map and unordered_set will be declared in
+ # std namespace.
+ #
+ # Namely, MSVC 2008 have unordered_map header which declares
+ # unordered_map class in std::tr1 namespace. In order to support
+ # this, we do extra check to see which exactly namespace is
+ # to be used.
+
+ include(CheckCXXSourceCompiles)
+ CHECK_CXX_SOURCE_COMPILES("#include <unordered_map>
+ int main() {
+ std::unordered_map<int, int> map;
+ return 0;
+ }"
+ HAVE_UNORDERED_MAP_IN_STD_NAMESPACE)
+ if(HAVE_UNORDERED_MAP_IN_STD_NAMESPACE)
+ message(STATUS "Found unordered_map/set in std namespace.")
+
+ set(HAVE_UNORDERED_MAP "TRUE")
+ set(UNORDERED_MAP_INCLUDE_PREFIX "")
+ set(UNORDERED_MAP_NAMESPACE "std")
+ else()
+ CHECK_CXX_SOURCE_COMPILES("#include <unordered_map>
+ int main() {
+ std::tr1::unordered_map<int, int> map;
+ return 0;
+ }"
+ HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
+ if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
+ message(STATUS "Found unordered_map/set in std::tr1 namespace.")
+
+ set(HAVE_UNORDERED_MAP "TRUE")
+ set(UNORDERED_MAP_INCLUDE_PREFIX "")
+ set(UNORDERED_MAP_NAMESPACE "std::tr1")
+ else()
+ message(STATUS "Found <unordered_map> but cannot find either std::unordered_map "
+ "or std::tr1::unordered_map.")
+ endif()
+ endif()
+ else()
+ CHECK_INCLUDE_FILE_CXX("tr1/unordered_map" HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
+ if(HAVE_UNORDERED_MAP_IN_TR1_NAMESPACE)
+ message(STATUS "Found unordered_map/set in std::tr1 namespace.")
+
+ set(HAVE_UNORDERED_MAP "TRUE")
+ set(UNORDERED_MAP_INCLUDE_PREFIX "tr1")
+ set(UNORDERED_MAP_NAMESPACE "std::tr1")
+ else()
+ message(STATUS "Unable to find <unordered_map> or <tr1/unordered_map>. ")
+ endif()
+ endif()
+endmacro()
+
+macro(TEST_SHARED_PTR_SUPPORT)
+ # This check are coming from Ceres library.
+ #
+ # Find shared pointer header and namespace.
+ #
+ # This module defines the following variables:
+ #
+ # SHARED_PTR_FOUND: TRUE if shared_ptr found.
+ # SHARED_PTR_TR1_MEMORY_HEADER: True if <tr1/memory> header is to be used
+ # for the shared_ptr object, otherwise use <memory>.
+ # SHARED_PTR_TR1_NAMESPACE: TRUE if shared_ptr is defined in std::tr1 namespace,
+ # otherwise it's assumed to be defined in std namespace.
+
+ include(CheckIncludeFileCXX)
+ set(SHARED_PTR_FOUND FALSE)
+ CHECK_INCLUDE_FILE_CXX(memory HAVE_STD_MEMORY_HEADER)
+ if(HAVE_STD_MEMORY_HEADER)
+ # Finding the memory header doesn't mean that shared_ptr is in std
+ # namespace.
+ #
+ # In particular, MSVC 2008 has shared_ptr declared in std::tr1. In
+ # order to support this, we do an extra check to see which namespace
+ # should be used.
+ include(CheckCXXSourceCompiles)
+ CHECK_CXX_SOURCE_COMPILES("#include <memory>
+ int main() {
+ std::shared_ptr<int> int_ptr;
+ return 0;
+ }"
+ HAVE_SHARED_PTR_IN_STD_NAMESPACE)
+
+ if(HAVE_SHARED_PTR_IN_STD_NAMESPACE)
+ message("-- Found shared_ptr in std namespace using <memory> header.")
+ set(SHARED_PTR_FOUND TRUE)
+ else()
+ CHECK_CXX_SOURCE_COMPILES("#include <memory>
+ int main() {
+ std::tr1::shared_ptr<int> int_ptr;
+ return 0;
+ }"
+ HAVE_SHARED_PTR_IN_TR1_NAMESPACE)
+ if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE)
+ message("-- Found shared_ptr in std::tr1 namespace using <memory> header.")
+ set(SHARED_PTR_TR1_NAMESPACE TRUE)
+ set(SHARED_PTR_FOUND TRUE)
+ endif()
+ endif()
+ endif()
+
+ if(NOT SHARED_PTR_FOUND)
+ # Further, gcc defines shared_ptr in std::tr1 namespace and
+ # <tr1/memory> is to be included for this. And what makes things
+ # even more tricky is that gcc does have <memory> header, so
+ # all the checks above wouldn't find shared_ptr.
+ CHECK_INCLUDE_FILE_CXX("tr1/memory" HAVE_TR1_MEMORY_HEADER)
+ if(HAVE_TR1_MEMORY_HEADER)
+ CHECK_CXX_SOURCE_COMPILES("#include <tr1/memory>
+ int main() {
+ std::tr1::shared_ptr<int> int_ptr;
+ return 0;
+ }"
+ HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER)
+ if(HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER)
+ message("-- Found shared_ptr in std::tr1 namespace using <tr1/memory> header.")
+ set(SHARED_PTR_TR1_MEMORY_HEADER TRUE)
+ set(SHARED_PTR_TR1_NAMESPACE TRUE)
+ set(SHARED_PTR_FOUND TRUE)
+ endif()
+ endif()
+ endif()
+endmacro()
+
function(cycles_set_solution_folder target)
if(WINDOWS_USE_VISUAL_STUDIO_FOLDERS)
get_filename_component(folderdir ${CMAKE_CURRENT_SOURCE_DIR} DIRECTORY)
@@ -69,3 +311,114 @@ macro(cycles_add_library target library_deps)
cycles_set_solution_folder(${target})
endmacro()
+
+# Cycles library dependencies common to all executables
+
+macro(cycles_link_directories)
+ if(WITH_OPENCOLORIO)
+ link_directories(${OPENCOLORIO_LIBPATH})
+ endif()
+ if(WITH_OPENVDB)
+ link_directories(${OPENVDB_LIBPATH} ${BLOSC_LIBPATH})
+ endif()
+ if(WITH_OPENSUBDIV)
+ link_directories(${OPENSUBDIV_LIBPATH})
+ endif()
+ if(WITH_OPENIMAGEDENOISE)
+ link_directories(${OPENIMAGEDENOISE_LIBPATH})
+ endif()
+
+ link_directories(
+ ${OPENIMAGEIO_LIBPATH}
+ ${BOOST_LIBPATH}
+ ${PNG_LIBPATH}
+ ${JPEG_LIBPATH}
+ ${ZLIB_LIBPATH}
+ ${TIFF_LIBPATH}
+ ${OPENEXR_LIBPATH}
+ ${OPENJPEG_LIBPATH}
+ )
+endmacro()
+
+macro(cycles_target_link_libraries target)
+ if(WITH_CYCLES_LOGGING)
+ target_link_libraries(${target} ${GLOG_LIBRARIES} ${GFLAGS_LIBRARIES})
+ endif()
+ if(WITH_CYCLES_OSL)
+ target_link_libraries(${target} ${OSL_LIBRARIES} ${LLVM_LIBRARY})
+ endif()
+ if(WITH_CYCLES_EMBREE)
+ target_link_libraries(${target} ${EMBREE_LIBRARIES})
+ endif()
+ if(WITH_OPENSUBDIV)
+ target_link_libraries(${target} ${OPENSUBDIV_LIBRARIES})
+ endif()
+ if(WITH_OPENCOLORIO)
+ target_link_libraries(${target} ${OPENCOLORIO_LIBRARIES})
+ endif()
+ if(WITH_OPENVDB)
+ target_link_libraries(${target} ${OPENVDB_LIBRARIES} ${BLOSC_LIBRARIES})
+ endif()
+ if(WITH_OPENIMAGEDENOISE)
+ target_link_libraries(${target} ${OPENIMAGEDENOISE_LIBRARIES})
+ endif()
+ target_link_libraries(
+ ${target}
+ ${OPENIMAGEIO_LIBRARIES}
+ ${PNG_LIBRARIES}
+ ${JPEG_LIBRARIES}
+ ${TIFF_LIBRARY}
+ ${OPENJPEG_LIBRARIES}
+ ${OPENEXR_LIBRARIES}
+ ${OPENEXR_LIBRARIES} # For circular dependencies between libs.
+ ${PUGIXML_LIBRARIES}
+ ${BOOST_LIBRARIES}
+ ${ZLIB_LIBRARIES}
+ ${CMAKE_DL_LIBS}
+ ${PTHREADS_LIBRARIES}
+ ${PLATFORM_LINKLIBS}
+ )
+
+ if(WITH_CUDA_DYNLOAD)
+ target_link_libraries(${target} extern_cuew)
+ else()
+ target_link_libraries(${target} ${CUDA_CUDA_LIBRARY})
+ endif()
+
+ if(CYCLES_STANDALONE_REPOSITORY)
+ target_link_libraries(${target} extern_numaapi)
+ else()
+ target_link_libraries(${target} bf_intern_numaapi)
+ endif()
+
+ if(UNIX)
+ if(CYCLES_STANDALONE_REPOSITORY)
+ target_link_libraries(${target} extern_libc_compat)
+ else()
+ target_link_libraries(${target} bf_intern_libc_compat)
+ endif()
+ endif()
+
+ if(NOT CYCLES_STANDALONE_REPOSITORY)
+ target_link_libraries(${target} bf_intern_guardedalloc)
+ endif()
+endmacro()
+
+macro(cycles_install_libraries target)
+ # Copy DLLs for dynamically linked libraries.
+ if(WIN32)
+ if(CMAKE_BUILD_TYPE STREQUAL "Debug")
+ install(
+ FILES
+ ${TBB_ROOT_DIR}/lib/debug/tbb_debug${CMAKE_SHARED_LIBRARY_SUFFIX}
+ ${OPENVDB_ROOT_DIR}/bin/openvdb_d${CMAKE_SHARED_LIBRARY_SUFFIX}
+ DESTINATION $<TARGET_FILE_DIR:${target}>)
+ else()
+ install(
+ FILES
+ ${TBB_ROOT_DIR}/lib/tbb${CMAKE_SHARED_LIBRARY_SUFFIX}
+ ${OPENVDB_ROOT_DIR}/bin/openvdb${CMAKE_SHARED_LIBRARY_SUFFIX}
+ DESTINATION $<TARGET_FILE_DIR:${target}>)
+ endif()
+ endif()
+endmacro()