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