1# ***** BEGIN GPL LICENSE BLOCK ***** 2# 3# This program is free software; you can redistribute it and/or 4# modify it under the terms of the GNU General Public License 5# as published by the Free Software Foundation; either version 2 6# of the License, or (at your option) any later version. 7# 8# This program is distributed in the hope that it will be useful, 9# but WITHOUT ANY WARRANTY; without even the implied warranty of 10# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11# GNU General Public License for more details. 12# 13# You should have received a copy of the GNU General Public License 14# along with this program; if not, write to the Free Software Foundation, 15# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. 16# 17# The Original Code is Copyright (C) 2016, Blender Foundation 18# All rights reserved. 19# ***** END GPL LICENSE BLOCK ***** 20 21# Libraries configuration for Apple. 22 23if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") 24 set(MACOSX_DEPLOYMENT_TARGET 11.00) 25else() 26 set(MACOSX_DEPLOYMENT_TARGET 10.13) 27endif() 28 29macro(find_package_wrapper) 30# do nothing, just satisfy the macro 31endmacro() 32 33function(print_found_status 34 lib_name 35 lib_path 36 ) 37 38 if(FIRST_RUN) 39 if(lib_path) 40 message(STATUS "Found ${lib_name}: ${lib_path}") 41 else() 42 message(WARNING "Could NOT find ${lib_name}") 43 endif() 44 endif() 45endfunction() 46 47# ------------------------------------------------------------------------ 48# Find system provided libraries. 49 50# Find system ZLIB, not the pre-compiled one supplied with OpenCollada. 51set(ZLIB_ROOT /usr) 52find_package(ZLIB REQUIRED) 53find_package(BZip2 REQUIRED) 54list(APPEND ZLIB_LIBRARIES ${BZIP2_LIBRARIES}) 55 56if(WITH_OPENAL) 57 find_package(OpenAL) 58 if(NOT OPENAL_FOUND) 59 set(WITH_OPENAL OFF) 60 endif() 61endif() 62 63if(WITH_JACK) 64 find_library(JACK_FRAMEWORK 65 NAMES jackmp 66 ) 67 if(NOT JACK_FRAMEWORK) 68 set(WITH_JACK OFF) 69 else() 70 set(JACK_INCLUDE_DIRS ${JACK_FRAMEWORK}/headers) 71 endif() 72endif() 73 74if(NOT DEFINED LIBDIR) 75 set(LIBDIR ${CMAKE_SOURCE_DIR}/../lib/darwin) 76 # Prefer lib directory paths 77 file(GLOB LIB_SUBDIRS ${LIBDIR}/*) 78 set(CMAKE_PREFIX_PATH ${LIB_SUBDIRS}) 79else() 80 message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}") 81endif() 82if(NOT EXISTS "${LIBDIR}/") 83 message(FATAL_ERROR "Mac OSX requires pre-compiled libs at: '${LIBDIR}'") 84endif() 85 86# ------------------------------------------------------------------------- 87# Find precompiled libraries, and avoid system or user-installed ones. 88 89if(EXISTS ${LIBDIR}) 90 without_system_libs_begin() 91endif() 92 93if(WITH_ALEMBIC) 94 find_package(Alembic) 95endif() 96 97if(WITH_USD) 98 find_package(USD) 99 if(NOT USD_FOUND) 100 set(WITH_USD OFF) 101 endif() 102endif() 103 104if(WITH_OPENSUBDIV) 105 find_package(OpenSubdiv) 106endif() 107 108if(WITH_CODEC_SNDFILE) 109 find_package(SndFile) 110 find_library(_sndfile_FLAC_LIBRARY NAMES flac HINTS ${LIBDIR}/sndfile/lib) 111 find_library(_sndfile_OGG_LIBRARY NAMES ogg HINTS ${LIBDIR}/ffmpeg/lib) 112 find_library(_sndfile_VORBIS_LIBRARY NAMES vorbis HINTS ${LIBDIR}/ffmpeg/lib) 113 find_library(_sndfile_VORBISENC_LIBRARY NAMES vorbisenc HINTS ${LIBDIR}/ffmpeg/lib) 114 list(APPEND LIBSNDFILE_LIBRARIES 115 ${_sndfile_FLAC_LIBRARY} 116 ${_sndfile_OGG_LIBRARY} 117 ${_sndfile_VORBIS_LIBRARY} 118 ${_sndfile_VORBISENC_LIBRARY} 119 ) 120 121 print_found_status("SndFile libraries" "${LIBSNDFILE_LIBRARIES}") 122 unset(_sndfile_FLAC_LIBRARY) 123 unset(_sndfile_OGG_LIBRARY) 124 unset(_sndfile_VORBIS_LIBRARY) 125 unset(_sndfile_VORBISENC_LIBRARY) 126endif() 127 128if(WITH_PYTHON) 129 # we use precompiled libraries for py 3.7 and up by default 130 set(PYTHON_VERSION 3.7) 131 if(NOT WITH_PYTHON_MODULE AND NOT WITH_PYTHON_FRAMEWORK) 132 # normally cached but not since we include them with blender 133 set(PYTHON_INCLUDE_DIR "${LIBDIR}/python/include/python${PYTHON_VERSION}m") 134 set(PYTHON_EXECUTABLE "${LIBDIR}/python/bin/python${PYTHON_VERSION}m") 135 set(PYTHON_LIBRARY ${LIBDIR}/python/lib/libpython${PYTHON_VERSION}m.a) 136 set(PYTHON_LIBPATH "${LIBDIR}/python/lib/python${PYTHON_VERSION}") 137 # set(PYTHON_LINKFLAGS "-u _PyMac_Error") # won't build with this enabled 138 else() 139 # module must be compiled against Python framework 140 set(_py_framework "/Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}") 141 142 set(PYTHON_INCLUDE_DIR "${_py_framework}/include/python${PYTHON_VERSION}m") 143 set(PYTHON_EXECUTABLE "${_py_framework}/bin/python${PYTHON_VERSION}m") 144 set(PYTHON_LIBPATH "${_py_framework}/lib/python${PYTHON_VERSION}/config-${PYTHON_VERSION}m") 145 # set(PYTHON_LIBRARY python${PYTHON_VERSION}) 146 # set(PYTHON_LINKFLAGS "-u _PyMac_Error -framework Python") # won't build with this enabled 147 148 unset(_py_framework) 149 endif() 150 151 # uncached vars 152 set(PYTHON_INCLUDE_DIRS "${PYTHON_INCLUDE_DIR}") 153 set(PYTHON_LIBRARIES "${PYTHON_LIBRARY}") 154 155 # needed for Audaspace, numpy is installed into python site-packages 156 set(PYTHON_NUMPY_INCLUDE_DIRS "${PYTHON_LIBPATH}/site-packages/numpy/core/include") 157 158 if(NOT EXISTS "${PYTHON_EXECUTABLE}") 159 message(FATAL_ERROR "Python executable missing: ${PYTHON_EXECUTABLE}") 160 endif() 161endif() 162 163if(WITH_FFTW3) 164 find_package(Fftw3) 165endif() 166 167find_package(Freetype REQUIRED) 168 169if(WITH_IMAGE_OPENEXR) 170 find_package(OpenEXR) 171endif() 172 173if(WITH_CODEC_FFMPEG) 174 set(FFMPEG_FIND_COMPONENTS 175 avcodec avdevice avformat avutil 176 mp3lame ogg opus swresample swscale 177 theora theoradec theoraenc vorbis vorbisenc 178 vorbisfile vpx x264 xvidcore) 179 find_package(FFmpeg) 180endif() 181 182if(WITH_IMAGE_OPENJPEG OR WITH_CODEC_FFMPEG) 183 # use openjpeg from libdir that is linked into ffmpeg 184 find_package(OpenJPEG) 185endif() 186 187find_library(SYSTEMSTUBS_LIBRARY 188 NAMES 189 SystemStubs 190 PATHS 191) 192mark_as_advanced(SYSTEMSTUBS_LIBRARY) 193if(SYSTEMSTUBS_LIBRARY) 194 list(APPEND PLATFORM_LINKLIBS SystemStubs) 195endif() 196 197set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -pipe -funsigned-char -fno-strict-aliasing") 198set(PLATFORM_LINKFLAGS 199 "-fexceptions -framework CoreServices -framework Foundation -framework IOKit -framework AppKit -framework Cocoa -framework Carbon -framework AudioUnit -framework AudioToolbox -framework CoreAudio -framework Metal -framework QuartzCore" 200) 201 202list(APPEND PLATFORM_LINKLIBS c++) 203 204if(WITH_JACK) 205 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -F/Library/Frameworks -weak_framework jackmp") 206endif() 207 208if(WITH_PYTHON_MODULE OR WITH_PYTHON_FRAMEWORK) 209 # force cmake to link right framework 210 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} /Library/Frameworks/Python.framework/Versions/${PYTHON_VERSION}/Python") 211endif() 212 213if(WITH_OPENCOLLADA) 214 find_package(OpenCOLLADA) 215 find_library(PCRE_LIBRARIES NAMES pcre HINTS ${LIBDIR}/opencollada/lib) 216 find_library(XML2_LIBRARIES NAMES xml2 HINTS ${LIBDIR}/opencollada/lib) 217 print_found_status("PCRE" "${PCRE_LIBRARIES}") 218 print_found_status("XML2" "${XML2_LIBRARIES}") 219endif() 220 221if(WITH_SDL) 222 find_package(SDL2) 223 set(SDL_INCLUDE_DIR ${SDL2_INCLUDE_DIRS}) 224 set(SDL_LIBRARY ${SDL2_LIBRARIES}) 225 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -framework ForceFeedback") 226endif() 227 228set(PNG_ROOT ${LIBDIR}/png) 229find_package(PNG REQUIRED) 230 231set(JPEG_ROOT ${LIBDIR}/jpeg) 232find_package(JPEG REQUIRED) 233 234if(WITH_IMAGE_TIFF) 235 set(TIFF_ROOT ${LIBDIR}/tiff) 236 find_package(TIFF) 237 if(NOT TIFF_FOUND) 238 message(WARNING "TIFF not found, disabling WITH_IMAGE_TIFF") 239 set(WITH_IMAGE_TIFF OFF) 240 endif() 241endif() 242 243if(WITH_BOOST) 244 set(Boost_NO_BOOST_CMAKE ON) 245 set(BOOST_ROOT ${LIBDIR}/boost) 246 set(Boost_NO_SYSTEM_PATHS ON) 247 set(_boost_FIND_COMPONENTS date_time filesystem regex system thread wave) 248 if(WITH_INTERNATIONAL) 249 list(APPEND _boost_FIND_COMPONENTS locale) 250 endif() 251 if(WITH_CYCLES_NETWORK) 252 list(APPEND _boost_FIND_COMPONENTS serialization) 253 endif() 254 if(WITH_OPENVDB) 255 list(APPEND _boost_FIND_COMPONENTS iostreams) 256 endif() 257 find_package(Boost COMPONENTS ${_boost_FIND_COMPONENTS}) 258 259 set(BOOST_LIBRARIES ${Boost_LIBRARIES}) 260 set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS}) 261 set(BOOST_DEFINITIONS) 262 263 mark_as_advanced(Boost_LIBRARIES) 264 mark_as_advanced(Boost_INCLUDE_DIRS) 265 unset(_boost_FIND_COMPONENTS) 266endif() 267 268if(WITH_INTERNATIONAL OR WITH_CODEC_FFMPEG) 269 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -liconv") # boost_locale and ffmpeg needs it ! 270endif() 271 272if(WITH_OPENIMAGEIO) 273 find_package(OpenImageIO) 274 list(APPEND OPENIMAGEIO_LIBRARIES 275 ${PNG_LIBRARIES} 276 ${JPEG_LIBRARIES} 277 ${TIFF_LIBRARY} 278 ${OPENEXR_LIBRARIES} 279 ${OPENJPEG_LIBRARIES} 280 ${ZLIB_LIBRARIES} 281 ) 282 set(OPENIMAGEIO_DEFINITIONS "-DOIIO_STATIC_BUILD") 283 set(OPENIMAGEIO_IDIFF "${LIBDIR}/openimageio/bin/idiff") 284endif() 285 286if(WITH_OPENCOLORIO) 287 find_package(OpenColorIO) 288endif() 289 290if(WITH_OPENVDB) 291 find_package(OpenVDB) 292 find_library(BLOSC_LIBRARIES NAMES blosc HINTS ${LIBDIR}/openvdb/lib) 293 print_found_status("Blosc" "${BLOSC_LIBRARIES}") 294 list(APPEND OPENVDB_LIBRARIES ${BLOSC_LIBRARIES}) 295 set(OPENVDB_DEFINITIONS) 296endif() 297 298if(WITH_NANOVDB) 299 set(NANOVDB ${LIBDIR}/nanovdb) 300 set(NANOVDB_INCLUDE_DIR ${NANOVDB}/include) 301endif() 302 303if(WITH_LLVM) 304 find_package(LLVM) 305 if(NOT LLVM_FOUND) 306 message(FATAL_ERROR "LLVM not found.") 307 endif() 308endif() 309 310if(WITH_CYCLES_OSL) 311 set(CYCLES_OSL ${LIBDIR}/osl) 312 313 find_library(OSL_LIB_EXEC NAMES oslexec PATHS ${CYCLES_OSL}/lib) 314 find_library(OSL_LIB_COMP NAMES oslcomp PATHS ${CYCLES_OSL}/lib) 315 find_library(OSL_LIB_QUERY NAMES oslquery PATHS ${CYCLES_OSL}/lib) 316 # WARNING! depends on correct order of OSL libs linking 317 list(APPEND OSL_LIBRARIES ${OSL_LIB_COMP} -force_load ${OSL_LIB_EXEC} ${OSL_LIB_QUERY}) 318 find_path(OSL_INCLUDE_DIR OSL/oslclosure.h PATHS ${CYCLES_OSL}/include) 319 find_program(OSL_COMPILER NAMES oslc PATHS ${CYCLES_OSL}/bin) 320 find_path(OSL_SHADER_DIR NAMES stdosl.h PATHS ${CYCLES_OSL}/shaders) 321 322 if(OSL_INCLUDE_DIR AND OSL_LIBRARIES AND OSL_COMPILER AND OSL_SHADER_DIR) 323 set(OSL_FOUND TRUE) 324 else() 325 message(STATUS "OSL not found") 326 set(WITH_CYCLES_OSL OFF) 327 endif() 328endif() 329 330if("${CMAKE_OSX_ARCHITECTURES}" STREQUAL "arm64") 331 set(WITH_CYCLES_EMBREE OFF) 332 set(WITH_OPENIMAGEDENOISE OFF) 333 set(WITH_CPU_SSE OFF) 334endif() 335 336if(WITH_CYCLES_EMBREE) 337 find_package(Embree 3.8.0 REQUIRED) 338 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -Xlinker -stack_size -Xlinker 0x100000") 339 340 # Embree static library linking can mix up SSE and AVX symbols, causing 341 # crashes on macOS systems with older CPUs that don't have AVX. Using 342 # force load avoids that. The Embree shared library does not suffer from 343 # this problem, precisely because linking a shared library uses force load. 344 set(_embree_libraries_force_load) 345 foreach(_embree_library ${EMBREE_LIBRARIES}) 346 list(APPEND _embree_libraries_force_load "-Wl,-force_load,${_embree_library}") 347 endforeach() 348 set(EMBREE_LIBRARIES ${_embree_libraries_force_load}) 349endif() 350 351if(WITH_OPENIMAGEDENOISE) 352 find_package(OpenImageDenoise) 353 354 if(NOT OPENIMAGEDENOISE_FOUND) 355 set(WITH_OPENIMAGEDENOISE OFF) 356 message(STATUS "OpenImageDenoise not found") 357 endif() 358endif() 359 360if(WITH_TBB) 361 find_package(TBB) 362endif() 363 364if(WITH_POTRACE) 365 find_package(Potrace) 366 if(NOT POTRACE_FOUND) 367 message(WARNING "potrace not found, disabling WITH_POTRACE") 368 set(WITH_POTRACE OFF) 369 endif() 370endif() 371 372# CMake FindOpenMP doesn't know about AppleClang before 3.12, so provide custom flags. 373if(WITH_OPENMP) 374 if(CMAKE_C_COMPILER_ID MATCHES "Clang" AND CMAKE_C_COMPILER_VERSION VERSION_GREATER_EQUAL "7.0") 375 # Use OpenMP from our precompiled libraries. 376 message(STATUS "Using ${LIBDIR}/openmp for OpenMP") 377 set(OPENMP_CUSTOM ON) 378 set(OPENMP_FOUND ON) 379 set(OpenMP_C_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") 380 set(OpenMP_CXX_FLAGS "-Xclang -fopenmp -I'${LIBDIR}/openmp/include'") 381 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -L'${LIBDIR}/openmp/lib' -lomp") 382 383 # Copy libomp.dylib to allow executables like datatoc and tests to work. 384 # `@executable_path/../Resources/lib/` is a default dylib search path. 385 # For single config generator datatoc, tests etc. 386 execute_process( 387 COMMAND mkdir -p ${CMAKE_BINARY_DIR}/Resources/lib 388 COMMAND cp -p ${LIBDIR}/openmp/lib/libomp.dylib ${CMAKE_BINARY_DIR}/Resources/lib/libomp.dylib 389 ) 390 # For multi-config generator datatoc, etc. 391 execute_process( 392 COMMAND mkdir -p ${CMAKE_BINARY_DIR}/bin/Resources/lib 393 COMMAND cp -p ${LIBDIR}/openmp/lib/libomp.dylib ${CMAKE_BINARY_DIR}/bin/Resources/lib/libomp.dylib 394 ) 395 # For multi-config generator tests. 396 execute_process( 397 COMMAND mkdir -p ${CMAKE_BINARY_DIR}/bin/tests/Resources/lib 398 COMMAND cp -p ${LIBDIR}/openmp/lib/libomp.dylib ${CMAKE_BINARY_DIR}/bin/tests/Resources/lib/libomp.dylib 399 ) 400 endif() 401endif() 402 403if(WITH_XR_OPENXR) 404 find_package(XR_OpenXR_SDK) 405 if(NOT XR_OPENXR_SDK_FOUND) 406 message(WARNING "OpenXR-SDK was not found, disabling WITH_XR_OPENXR") 407 set(WITH_XR_OPENXR OFF) 408 endif() 409endif() 410 411if(WITH_GMP) 412 find_package(GMP) 413 if(NOT GMP_FOUND) 414 message(WARNING "GMP not found, disabling WITH_GMP") 415 set(WITH_GMP OFF) 416 endif() 417endif() 418 419if(EXISTS ${LIBDIR}) 420 without_system_libs_end() 421endif() 422 423# --------------------------------------------------------------------- 424# Set compiler and linker flags. 425 426set(EXETYPE MACOSX_BUNDLE) 427 428set(CMAKE_C_FLAGS_DEBUG "-g") 429set(CMAKE_CXX_FLAGS_DEBUG "-g") 430if(CMAKE_OSX_ARCHITECTURES MATCHES "x86_64" OR CMAKE_OSX_ARCHITECTURES MATCHES "i386") 431 set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3") 432 set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic -msse -msse2 -msse3 -mssse3") 433 if(NOT CMAKE_C_COMPILER_ID MATCHES "Clang") 434 set(CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller") 435 set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -ftree-vectorize -fvariable-expansion-in-unroller") 436 endif() 437else() 438 set(CMAKE_C_FLAGS_RELEASE "-O2 -mdynamic-no-pic") 439 set(CMAKE_CXX_FLAGS_RELEASE "-O2 -mdynamic-no-pic") 440endif() 441 442if(${XCODE_VERSION} VERSION_EQUAL 5 OR ${XCODE_VERSION} VERSION_GREATER 5) 443 # Xcode 5 is always using CLANG, which has too low template depth of 128 for libmv 444 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ftemplate-depth=1024") 445endif() 446 447# Avoid conflicts with Luxrender, and other plug-ins that may use the same 448# libraries as Blender with a different version or build options. 449set(PLATFORM_LINKFLAGS 450 "${PLATFORM_LINKFLAGS} -Xlinker -unexported_symbols_list -Xlinker '${CMAKE_SOURCE_DIR}/source/creator/osx_locals.map'" 451) 452 453set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++") 454set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -stdlib=libc++") 455 456# Suppress ranlib "has no symbols" warnings (workaround for T48250) 457set(CMAKE_C_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 458set(CMAKE_CXX_ARCHIVE_CREATE "<CMAKE_AR> Scr <TARGET> <LINK_FLAGS> <OBJECTS>") 459set(CMAKE_C_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 460set(CMAKE_CXX_ARCHIVE_FINISH "<CMAKE_RANLIB> -no_warning_for_no_symbols -c <TARGET>") 461