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 any *nix system including Linux and Unix. 22 23# Detect precompiled library directory 24if(NOT DEFINED LIBDIR) 25 # Path to a locally compiled libraries. 26 set(LIBDIR_NAME ${CMAKE_SYSTEM_NAME}_${CMAKE_SYSTEM_PROCESSOR}) 27 string(TOLOWER ${LIBDIR_NAME} LIBDIR_NAME) 28 set(LIBDIR_NATIVE_ABI ${CMAKE_SOURCE_DIR}/../lib/${LIBDIR_NAME}) 29 30 # Path to precompiled libraries with known CentOS 7 ABI. 31 set(LIBDIR_CENTOS7_ABI ${CMAKE_SOURCE_DIR}/../lib/linux_centos7_x86_64) 32 33 # Choose the best suitable libraries. 34 if(EXISTS ${LIBDIR_NATIVE_ABI}) 35 set(LIBDIR ${LIBDIR_NATIVE_ABI}) 36 elseif(EXISTS ${LIBDIR_CENTOS7_ABI}) 37 set(LIBDIR ${LIBDIR_CENTOS7_ABI}) 38 set(WITH_CXX11_ABI OFF) 39 40 if(CMAKE_COMPILER_IS_GNUCC AND 41 CMAKE_C_COMPILER_VERSION VERSION_LESS 9.3) 42 message(FATAL_ERROR "GCC version must be at least 9.3 for precompiled libraries, found ${CMAKE_C_COMPILER_VERSION}") 43 endif() 44 endif() 45 46 # Avoid namespace pollustion. 47 unset(LIBDIR_NATIVE_ABI) 48 unset(LIBDIR_CENTOS7_ABI) 49endif() 50 51if(EXISTS ${LIBDIR}) 52 message(STATUS "Using pre-compiled LIBDIR: ${LIBDIR}") 53 54 file(GLOB LIB_SUBDIRS ${LIBDIR}/*) 55 # Ignore Mesa software OpenGL libraries, they are not intended to be 56 # linked against but to optionally override at runtime. 57 list(REMOVE_ITEM LIB_SUBDIRS ${LIBDIR}/mesa) 58 # NOTE: Make sure "proper" compiled zlib comes first before the one 59 # which is a part of OpenCollada. They have different ABI, and we 60 # do need to use the official one. 61 set(CMAKE_PREFIX_PATH ${LIBDIR}/zlib ${LIB_SUBDIRS}) 62 set(WITH_STATIC_LIBS ON) 63 # OpenMP usually can't be statically linked into shared libraries, 64 # due to not being compiled with position independent code. 65 if(NOT WITH_PYTHON_MODULE) 66 set(WITH_OPENMP_STATIC ON) 67 endif() 68 set(Boost_NO_BOOST_CMAKE ON) 69 set(BOOST_ROOT ${LIBDIR}/boost) 70 set(BOOST_LIBRARYDIR ${LIBDIR}/boost/lib) 71 set(Boost_NO_SYSTEM_PATHS ON) 72 set(OPENEXR_ROOT_DIR ${LIBDIR}/openexr) 73endif() 74 75if(WITH_STATIC_LIBS) 76 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -static-libstdc++") 77endif() 78 79# Wrapper to prefer static libraries 80macro(find_package_wrapper) 81 if(WITH_STATIC_LIBS) 82 find_package_static(${ARGV}) 83 else() 84 find_package(${ARGV}) 85 endif() 86endmacro() 87 88# ---------------------------------------------------------------------------- 89# Precompiled Libraries 90# 91# These are libraries that may be precompiled. For this we disable searching in 92# the system directories so that we don't accidentally use them instead. 93 94if(EXISTS ${LIBDIR}) 95 without_system_libs_begin() 96endif() 97 98find_package_wrapper(JPEG REQUIRED) 99find_package_wrapper(PNG REQUIRED) 100find_package_wrapper(ZLIB REQUIRED) 101find_package_wrapper(Freetype REQUIRED) 102 103if(WITH_PYTHON) 104 # No way to set py35, remove for now. 105 # find_package(PythonLibs) 106 107 # Use our own instead, since without py is such a rare case, 108 # require this package 109 # XXX Linking errors with debian static python :/ 110# find_package_wrapper(PythonLibsUnix REQUIRED) 111 find_package(PythonLibsUnix REQUIRED) 112endif() 113 114if(WITH_IMAGE_OPENEXR) 115 find_package_wrapper(OpenEXR) # our own module 116 if(NOT OPENEXR_FOUND) 117 set(WITH_IMAGE_OPENEXR OFF) 118 endif() 119endif() 120 121if(WITH_IMAGE_OPENJPEG) 122 find_package_wrapper(OpenJPEG) 123 if(NOT OPENJPEG_FOUND) 124 set(WITH_IMAGE_OPENJPEG OFF) 125 endif() 126endif() 127 128if(WITH_IMAGE_TIFF) 129 # XXX Linking errors with debian static tiff :/ 130# find_package_wrapper(TIFF) 131 find_package(TIFF) 132 if(NOT TIFF_FOUND) 133 set(WITH_IMAGE_TIFF OFF) 134 endif() 135endif() 136 137if(WITH_OPENAL) 138 find_package_wrapper(OpenAL) 139 if(NOT OPENAL_FOUND) 140 set(WITH_OPENAL OFF) 141 endif() 142endif() 143 144if(WITH_SDL) 145 if(WITH_SDL_DYNLOAD) 146 set(SDL_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/extern/sdlew/include/SDL2") 147 set(SDL_LIBRARY) 148 else() 149 find_package_wrapper(SDL2) 150 if(SDL2_FOUND) 151 # Use same names for both versions of SDL until we move to 2.x. 152 set(SDL_INCLUDE_DIR "${SDL2_INCLUDE_DIR}") 153 set(SDL_LIBRARY "${SDL2_LIBRARY}") 154 set(SDL_FOUND "${SDL2_FOUND}") 155 else() 156 find_package_wrapper(SDL) 157 endif() 158 mark_as_advanced( 159 SDL_INCLUDE_DIR 160 SDL_LIBRARY 161 ) 162 # unset(SDLMAIN_LIBRARY CACHE) 163 if(NOT SDL_FOUND) 164 set(WITH_SDL OFF) 165 endif() 166 endif() 167endif() 168 169# Codecs 170if(WITH_CODEC_SNDFILE) 171 find_package_wrapper(SndFile) 172 if(NOT SNDFILE_FOUND) 173 set(WITH_CODEC_SNDFILE OFF) 174 endif() 175endif() 176 177if(WITH_CODEC_FFMPEG) 178 if(EXISTS ${LIBDIR}) 179 # For precompiled lib directory, all ffmpeg dependencies are in the same folder 180 file(GLOB ffmpeg_libs ${LIBDIR}/ffmpeg/lib/*.a ${LIBDIR}/sndfile/lib/*.a) 181 set(FFMPEG ${LIBDIR}/ffmpeg CACHE PATH "FFMPEG Directory") 182 set(FFMPEG_LIBRARIES ${ffmpeg_libs} ${ffmpeg_libs} CACHE STRING "FFMPEG Libraries") 183 else() 184 set(FFMPEG /usr CACHE PATH "FFMPEG Directory") 185 set(FFMPEG_LIBRARIES avformat avcodec avutil avdevice swscale CACHE STRING "FFMPEG Libraries") 186 endif() 187 188 mark_as_advanced(FFMPEG) 189 190 # lame, but until we have proper find module for ffmpeg 191 set(FFMPEG_INCLUDE_DIRS ${FFMPEG}/include) 192 if(EXISTS "${FFMPEG}/include/ffmpeg/") 193 list(APPEND FFMPEG_INCLUDE_DIRS "${FFMPEG}/include/ffmpeg") 194 endif() 195 # end lameness 196 197 mark_as_advanced(FFMPEG_LIBRARIES) 198 set(FFMPEG_LIBPATH ${FFMPEG}/lib) 199endif() 200 201if(WITH_FFTW3) 202 find_package_wrapper(Fftw3) 203 if(NOT FFTW3_FOUND) 204 set(WITH_FFTW3 OFF) 205 endif() 206endif() 207 208if(WITH_OPENCOLLADA) 209 find_package_wrapper(OpenCOLLADA) 210 if(OPENCOLLADA_FOUND) 211 if(WITH_STATIC_LIBS) 212 # PCRE is bundled with OpenCollada without headers, so can't use 213 # find_package reliably to detect it. 214 set(PCRE_LIBRARIES ${LIBDIR}/opencollada/lib/libpcre.a) 215 else() 216 find_package_wrapper(PCRE) 217 endif() 218 find_package_wrapper(XML2) 219 else() 220 set(WITH_OPENCOLLADA OFF) 221 endif() 222endif() 223 224if(WITH_MEM_JEMALLOC) 225 find_package_wrapper(JeMalloc) 226 if(NOT JEMALLOC_FOUND) 227 set(WITH_MEM_JEMALLOC OFF) 228 endif() 229endif() 230 231if(WITH_INPUT_NDOF) 232 find_package_wrapper(Spacenav) 233 if(SPACENAV_FOUND) 234 # use generic names within blenders buildsystem. 235 set(NDOF_INCLUDE_DIRS ${SPACENAV_INCLUDE_DIRS}) 236 set(NDOF_LIBRARIES ${SPACENAV_LIBRARIES}) 237 else() 238 set(WITH_INPUT_NDOF OFF) 239 endif() 240endif() 241 242if(WITH_CYCLES_OSL) 243 set(CYCLES_OSL ${LIBDIR}/osl CACHE PATH "Path to OpenShadingLanguage installation") 244 if(EXISTS ${CYCLES_OSL} AND NOT OSL_ROOT) 245 set(OSL_ROOT ${CYCLES_OSL}) 246 endif() 247 find_package_wrapper(OSL) 248 if(OSL_FOUND) 249 if(${OSL_LIBRARY_VERSION_MAJOR} EQUAL "1" AND ${OSL_LIBRARY_VERSION_MINOR} LESS "6") 250 # Note: --whole-archive is needed to force loading of all symbols in liboslexec, 251 # otherwise LLVM is missing the osl_allocate_closure_component function 252 set(OSL_LIBRARIES 253 ${OSL_OSLCOMP_LIBRARY} 254 -Wl,--whole-archive ${OSL_OSLEXEC_LIBRARY} 255 -Wl,--no-whole-archive ${OSL_OSLQUERY_LIBRARY} 256 ) 257 endif() 258 else() 259 message(STATUS "OSL not found, disabling it from Cycles") 260 set(WITH_CYCLES_OSL OFF) 261 endif() 262endif() 263 264if(WITH_OPENVDB) 265 find_package_wrapper(OpenVDB) 266 find_package_wrapper(Blosc) 267 268 if(NOT OPENVDB_FOUND) 269 set(WITH_OPENVDB OFF) 270 set(WITH_OPENVDB_BLOSC OFF) 271 message(STATUS "OpenVDB not found, disabling it") 272 elseif(NOT BLOSC_FOUND) 273 set(WITH_OPENVDB_BLOSC OFF) 274 message(STATUS "Blosc not found, disabling it for OpenVBD") 275 endif() 276endif() 277 278if(WITH_NANOVDB) 279 find_package_wrapper(NanoVDB) 280 281 if(NOT NANOVDB_FOUND) 282 set(WITH_NANOVDB OFF) 283 message(STATUS "NanoVDB not found, disabling it") 284 endif() 285endif() 286 287if(WITH_ALEMBIC) 288 find_package_wrapper(Alembic) 289 290 if(NOT ALEMBIC_FOUND) 291 set(WITH_ALEMBIC OFF) 292 endif() 293endif() 294 295if(WITH_USD) 296 find_package_wrapper(USD) 297 298 if(NOT USD_FOUND) 299 set(WITH_USD OFF) 300 endif() 301endif() 302 303if(WITH_BOOST) 304 # uses in build instructions to override include and library variables 305 if(NOT BOOST_CUSTOM) 306 if(WITH_STATIC_LIBS) 307 set(Boost_USE_STATIC_LIBS ON) 308 endif() 309 set(Boost_USE_MULTITHREADED ON) 310 set(__boost_packages filesystem regex thread date_time) 311 if(WITH_CYCLES_OSL) 312 if(NOT (${OSL_LIBRARY_VERSION_MAJOR} EQUAL "1" AND ${OSL_LIBRARY_VERSION_MINOR} LESS "6")) 313 list(APPEND __boost_packages wave) 314 else() 315 endif() 316 endif() 317 if(WITH_INTERNATIONAL) 318 list(APPEND __boost_packages locale) 319 endif() 320 if(WITH_CYCLES_NETWORK) 321 list(APPEND __boost_packages serialization) 322 endif() 323 if(WITH_OPENVDB) 324 list(APPEND __boost_packages iostreams) 325 endif() 326 list(APPEND __boost_packages system) 327 find_package(Boost 1.48 COMPONENTS ${__boost_packages}) 328 if(NOT Boost_FOUND) 329 # try to find non-multithreaded if -mt not found, this flag 330 # doesn't matter for us, it has nothing to do with thread 331 # safety, but keep it to not disturb build setups 332 set(Boost_USE_MULTITHREADED OFF) 333 find_package(Boost 1.48 COMPONENTS ${__boost_packages}) 334 endif() 335 unset(__boost_packages) 336 if(Boost_USE_STATIC_LIBS AND WITH_BOOST_ICU) 337 find_package(IcuLinux) 338 endif() 339 mark_as_advanced(Boost_DIR) # why doesn't boost do this? 340 endif() 341 342 set(BOOST_INCLUDE_DIR ${Boost_INCLUDE_DIRS}) 343 set(BOOST_LIBRARIES ${Boost_LIBRARIES}) 344 set(BOOST_LIBPATH ${Boost_LIBRARY_DIRS}) 345 set(BOOST_DEFINITIONS "-DBOOST_ALL_NO_LIB") 346 347 if(Boost_USE_STATIC_LIBS AND WITH_BOOST_ICU) 348 find_package(IcuLinux) 349 list(APPEND BOOST_LIBRARIES ${ICU_LIBRARIES}) 350 endif() 351endif() 352 353if(WITH_OPENIMAGEIO) 354 find_package_wrapper(OpenImageIO) 355 if(NOT OPENIMAGEIO_PUGIXML_FOUND AND WITH_CYCLES_STANDALONE) 356 find_package_wrapper(PugiXML) 357 else() 358 set(PUGIXML_INCLUDE_DIR "${OPENIMAGEIO_INCLUDE_DIR/OpenImageIO}") 359 set(PUGIXML_LIBRARIES "") 360 endif() 361 362 set(OPENIMAGEIO_LIBRARIES 363 ${OPENIMAGEIO_LIBRARIES} 364 ${PNG_LIBRARIES} 365 ${JPEG_LIBRARIES} 366 ${ZLIB_LIBRARIES} 367 ${BOOST_LIBRARIES} 368 ) 369 set(OPENIMAGEIO_LIBPATH) # TODO, remove and reference the absolute path everywhere 370 set(OPENIMAGEIO_DEFINITIONS "") 371 372 if(WITH_IMAGE_TIFF) 373 list(APPEND OPENIMAGEIO_LIBRARIES "${TIFF_LIBRARY}") 374 endif() 375 if(WITH_IMAGE_OPENEXR) 376 list(APPEND OPENIMAGEIO_LIBRARIES "${OPENEXR_LIBRARIES}") 377 endif() 378 379 if(NOT OPENIMAGEIO_FOUND) 380 set(WITH_OPENIMAGEIO OFF) 381 message(STATUS "OpenImageIO not found, disabling WITH_CYCLES") 382 endif() 383endif() 384 385if(WITH_OPENCOLORIO) 386 find_package_wrapper(OpenColorIO) 387 388 set(OPENCOLORIO_LIBRARIES ${OPENCOLORIO_LIBRARIES}) 389 set(OPENCOLORIO_LIBPATH) # TODO, remove and reference the absolute path everywhere 390 set(OPENCOLORIO_DEFINITIONS) 391 392 if(NOT OPENCOLORIO_FOUND) 393 set(WITH_OPENCOLORIO OFF) 394 message(STATUS "OpenColorIO not found") 395 endif() 396endif() 397 398if(WITH_CYCLES_EMBREE) 399 find_package(Embree 3.8.0 REQUIRED) 400endif() 401 402if(WITH_OPENIMAGEDENOISE) 403 find_package_wrapper(OpenImageDenoise) 404 405 if(NOT OPENIMAGEDENOISE_FOUND) 406 set(WITH_OPENIMAGEDENOISE OFF) 407 message(STATUS "OpenImageDenoise not found") 408 endif() 409endif() 410 411if(WITH_LLVM) 412 if(EXISTS ${LIBDIR}) 413 set(LLVM_STATIC ON) 414 endif() 415 416 find_package_wrapper(LLVM) 417 418 # Symbol conflicts with same UTF library used by OpenCollada 419 if(EXISTS ${LIBDIR}) 420 if(WITH_OPENCOLLADA AND (${LLVM_VERSION} VERSION_LESS "4.0.0")) 421 list(REMOVE_ITEM OPENCOLLADA_LIBRARIES ${OPENCOLLADA_UTF_LIBRARY}) 422 endif() 423 endif() 424 425 if(NOT LLVM_FOUND) 426 set(WITH_LLVM OFF) 427 message(STATUS "LLVM not found") 428 endif() 429endif() 430 431if(WITH_OPENSUBDIV) 432 find_package_wrapper(OpenSubdiv) 433 434 set(OPENSUBDIV_LIBRARIES ${OPENSUBDIV_LIBRARIES}) 435 set(OPENSUBDIV_LIBPATH) # TODO, remove and reference the absolute path everywhere 436 437 if(NOT OPENSUBDIV_FOUND) 438 set(WITH_OPENSUBDIV OFF) 439 message(STATUS "OpenSubdiv not found") 440 endif() 441endif() 442 443if(WITH_TBB) 444 find_package_wrapper(TBB) 445endif() 446 447if(WITH_XR_OPENXR) 448 find_package(XR_OpenXR_SDK) 449 if(NOT XR_OPENXR_SDK_FOUND) 450 message(WARNING "OpenXR-SDK not found, disabling WITH_XR_OPENXR") 451 set(WITH_XR_OPENXR OFF) 452 endif() 453endif() 454 455if(WITH_GMP) 456 find_package_wrapper(GMP) 457 if(NOT GMP_FOUND) 458 message(WARNING "GMP not found, disabling WITH_GMP") 459 set(WITH_GMP OFF) 460 endif() 461endif() 462 463if(WITH_POTRACE) 464 find_package_wrapper(Potrace) 465 if(NOT POTRACE_FOUND) 466 message(WARNING "potrace not found, disabling WITH_POTRACE") 467 set(WITH_POTRACE OFF) 468 endif() 469endif() 470 471if(EXISTS ${LIBDIR}) 472 without_system_libs_end() 473endif() 474 475# ---------------------------------------------------------------------------- 476# Build and Link Flags 477 478# OpenSuse needs lutil, ArchLinux not, for now keep, can avoid by using --as-needed 479if(HAIKU) 480 list(APPEND PLATFORM_LINKLIBS -lnetwork) 481else() 482 list(APPEND PLATFORM_LINKLIBS -lutil -lc -lm) 483endif() 484 485find_package(Threads REQUIRED) 486list(APPEND PLATFORM_LINKLIBS ${CMAKE_THREAD_LIBS_INIT}) 487# used by other platforms 488set(PTHREADS_LIBRARIES ${CMAKE_THREAD_LIBS_INIT}) 489 490if(CMAKE_DL_LIBS) 491 list(APPEND PLATFORM_LINKLIBS ${CMAKE_DL_LIBS}) 492endif() 493 494if(CMAKE_SYSTEM_NAME MATCHES "Linux") 495 if(NOT WITH_PYTHON_MODULE) 496 # binreloc is linux only 497 set(BINRELOC_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/binreloc/include) 498 set(WITH_BINRELOC ON) 499 endif() 500endif() 501 502# lfs on glibc, all compilers should use 503add_definitions(-D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE64_SOURCE) 504 505# ---------------------------------------------------------------------------- 506# System Libraries 507# 508# Keep last, so indirectly linked libraries don't override our own pre-compiled libs. 509 510if(WITH_LZO AND WITH_SYSTEM_LZO) 511 find_package_wrapper(LZO) 512 if(NOT LZO_FOUND) 513 message(FATAL_ERROR "Failed finding system LZO version!") 514 endif() 515endif() 516 517if(WITH_SYSTEM_EIGEN3) 518 find_package_wrapper(Eigen3) 519 if(NOT EIGEN3_FOUND) 520 message(FATAL_ERROR "Failed finding system Eigen3 version!") 521 endif() 522endif() 523 524# Jack is intended to use the system library. 525if(WITH_JACK) 526 find_package_wrapper(Jack) 527 if(NOT JACK_FOUND) 528 set(WITH_JACK OFF) 529 endif() 530endif() 531 532# Audio IO 533if(WITH_SYSTEM_AUDASPACE) 534 find_package_wrapper(Audaspace) 535 if(NOT AUDASPACE_FOUND OR NOT AUDASPACE_C_FOUND) 536 message(FATAL_ERROR "Audaspace external library not found!") 537 endif() 538endif() 539 540if(WITH_GHOST_WAYLAND) 541 find_package(PkgConfig) 542 pkg_check_modules(wayland-client REQUIRED wayland-client>=1.12) 543 pkg_check_modules(wayland-egl REQUIRED wayland-egl) 544 pkg_check_modules(wayland-scanner REQUIRED wayland-scanner) 545 pkg_check_modules(xkbcommon REQUIRED xkbcommon) 546 pkg_check_modules(wayland-cursor REQUIRED wayland-cursor) 547 548 set(WITH_GL_EGL ON) 549 550 if(WITH_GHOST_WAYLAND) 551 list(APPEND PLATFORM_LINKLIBS 552 ${wayland-client_LIBRARIES} 553 ${wayland-egl_LIBRARIES} 554 ${xkbcommon_LIBRARIES} 555 ${wayland-cursor_LIBRARIES} 556 ) 557 endif() 558endif() 559 560if(WITH_GHOST_X11) 561 find_package(X11 REQUIRED) 562 563 find_path(X11_XF86keysym_INCLUDE_PATH X11/XF86keysym.h ${X11_INC_SEARCH_PATH}) 564 mark_as_advanced(X11_XF86keysym_INCLUDE_PATH) 565 566 list(APPEND PLATFORM_LINKLIBS ${X11_X11_LIB}) 567 568 if(WITH_X11_XINPUT) 569 if(X11_Xinput_LIB) 570 list(APPEND PLATFORM_LINKLIBS ${X11_Xinput_LIB}) 571 else() 572 message(FATAL_ERROR "LibXi not found. Disable WITH_X11_XINPUT if you 573 want to build without tablet support") 574 endif() 575 endif() 576 577 if(WITH_X11_XF86VMODE) 578 # XXX, why doesn't cmake make this available? 579 find_library(X11_Xxf86vmode_LIB Xxf86vm ${X11_LIB_SEARCH_PATH}) 580 mark_as_advanced(X11_Xxf86vmode_LIB) 581 if(X11_Xxf86vmode_LIB) 582 list(APPEND PLATFORM_LINKLIBS ${X11_Xxf86vmode_LIB}) 583 else() 584 message(FATAL_ERROR "libXxf86vm not found. Disable WITH_X11_XF86VMODE if you 585 want to build without") 586 endif() 587 endif() 588 589 if(WITH_X11_XFIXES) 590 if(X11_Xfixes_LIB) 591 list(APPEND PLATFORM_LINKLIBS ${X11_Xfixes_LIB}) 592 else() 593 message(FATAL_ERROR "libXfixes not found. Disable WITH_X11_XFIXES if you 594 want to build without") 595 endif() 596 endif() 597 598 if(WITH_X11_ALPHA) 599 find_library(X11_Xrender_LIB Xrender ${X11_LIB_SEARCH_PATH}) 600 mark_as_advanced(X11_Xrender_LIB) 601 if(X11_Xrender_LIB) 602 list(APPEND PLATFORM_LINKLIBS ${X11_Xrender_LIB}) 603 else() 604 message(FATAL_ERROR "libXrender not found. Disable WITH_X11_ALPHA if you 605 want to build without") 606 endif() 607 endif() 608 609endif() 610 611# ---------------------------------------------------------------------------- 612# Compilers 613 614# GNU Compiler 615if(CMAKE_COMPILER_IS_GNUCC) 616 set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing") 617 618 # `maybe-uninitialized` is unreliable in release builds, but fine in debug builds. 619 set(GCC_EXTRA_FLAGS_RELEASE "-Wno-maybe-uninitialized") 620 set(CMAKE_C_FLAGS_RELEASE "${GCC_EXTRA_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELEASE}") 621 set(CMAKE_C_FLAGS_RELWITHDEBINFO "${GCC_EXTRA_FLAGS_RELEASE} ${CMAKE_C_FLAGS_RELWITHDEBINFO}") 622 set(CMAKE_CXX_FLAGS_RELEASE "${GCC_EXTRA_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELEASE}") 623 set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${GCC_EXTRA_FLAGS_RELEASE} ${CMAKE_CXX_FLAGS_RELWITHDEBINFO}") 624 unset(GCC_EXTRA_FLAGS_RELEASE) 625 626 if(WITH_LINKER_GOLD) 627 execute_process( 628 COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version 629 ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) 630 if("${LD_VERSION}" MATCHES "GNU gold") 631 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=gold") 632 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=gold") 633 else() 634 message(STATUS "GNU gold linker isn't available, using the default system linker.") 635 endif() 636 unset(LD_VERSION) 637 endif() 638 639 if(WITH_LINKER_LLD) 640 execute_process( 641 COMMAND ${CMAKE_C_COMPILER} -fuse-ld=lld -Wl,--version 642 ERROR_QUIET OUTPUT_VARIABLE LD_VERSION) 643 if("${LD_VERSION}" MATCHES "LLD") 644 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fuse-ld=lld") 645 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fuse-ld=lld") 646 else() 647 message(STATUS "LLD linker isn't available, using the default system linker.") 648 endif() 649 unset(LD_VERSION) 650 endif() 651 652# CLang is the same as GCC for now. 653elseif(CMAKE_C_COMPILER_ID MATCHES "Clang") 654 set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing") 655# Intel C++ Compiler 656elseif(CMAKE_C_COMPILER_ID MATCHES "Intel") 657 # think these next two are broken 658 find_program(XIAR xiar) 659 if(XIAR) 660 set(CMAKE_AR "${XIAR}") 661 endif() 662 mark_as_advanced(XIAR) 663 664 find_program(XILD xild) 665 if(XILD) 666 set(CMAKE_LINKER "${XILD}") 667 endif() 668 mark_as_advanced(XILD) 669 670 set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fp-model precise -prec_div -parallel") 671 set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fp-model precise -prec_div -parallel") 672 673 # set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -diag-enable sc3") 674 set(PLATFORM_CFLAGS "-pipe -fPIC -funsigned-char -fno-strict-aliasing") 675 set(PLATFORM_LINKFLAGS "${PLATFORM_LINKFLAGS} -static-intel") 676endif() 677 678# Avoid conflicts with Mesa llvmpipe, Luxrender, and other plug-ins that may 679# use the same libraries as Blender with a different version or build options. 680set(PLATFORM_LINKFLAGS 681 "${PLATFORM_LINKFLAGS} -Wl,--version-script='${CMAKE_SOURCE_DIR}/source/creator/blender.map'" 682) 683 684# Don't use position independent executable for portable install since file 685# browsers can't properly detect blender as an executable then. Still enabled 686# for non-portable installs as typically used by Linux distributions. 687if(WITH_INSTALL_PORTABLE) 688 set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -no-pie") 689endif() 690