CMake: add WITH_LINKER_LLD option for unix platforms
[blender-staging.git] / CMakeLists.txt
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) 2006, Blender Foundation
18 # All rights reserved.
19 #
20 # ***** END GPL LICENSE BLOCK *****
21
22 #-----------------------------------------------------------------------------
23 # We don't allow in-source builds. This causes no end of troubles because
24 # all out-of-source builds will use the CMakeCache.txt file there and even
25 # build the libs and objects in it.
26
27 if(${CMAKE_SOURCE_DIR} STREQUAL ${CMAKE_BINARY_DIR})
28   if(NOT DEFINED WITH_IN_SOURCE_BUILD)
29     message(FATAL_ERROR
30       "CMake generation for blender is not allowed within the source directory!"
31       "\n Remove \"${CMAKE_SOURCE_DIR}/CMakeCache.txt\" and try again from another folder, e.g.:"
32       "\n "
33       "\n rm CMakeCache.txt"
34       "\n cd .."
35       "\n mkdir cmake-make"
36       "\n cd cmake-make"
37       "\n cmake ../blender"
38       "\n "
39       "\n Alternately define WITH_IN_SOURCE_BUILD to force this option (not recommended!)"
40     )
41   endif()
42 endif()
43
44 cmake_minimum_required(VERSION 3.5)
45
46 # Prever LEGACY OpenGL to eb compatible with all the existing releases and
47 # platforms which don't hare GLVND yet. Only do it if preference was not set
48 # externally.
49 if(NOT DEFINED OpenGL_GL_PREFERENCE)
50   set(OpenGL_GL_PREFERENCE "LEGACY")
51 endif()
52
53 if(NOT EXECUTABLE_OUTPUT_PATH)
54   set(FIRST_RUN TRUE)
55 else()
56   set(FIRST_RUN FALSE)
57 endif()
58
59 # this starts out unset
60 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build_files/cmake/Modules")
61 list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/build_files/cmake/platform")
62
63 # avoid having empty buildtype
64 if(NOT DEFINED CMAKE_BUILD_TYPE_INIT)
65   set(CMAKE_BUILD_TYPE_INIT "Release")
66 endif()
67
68 # Omit superfluous "Up-to-date" messages.
69 if(NOT DEFINED CMAKE_INSTALL_MESSAGE)
70   set(CMAKE_INSTALL_MESSAGE "LAZY")
71 endif()
72
73 # quiet output for Makefiles, 'make -s' helps too
74 # set_property(GLOBAL PROPERTY RULE_MESSAGES OFF)
75
76 # global compile definitions since add_definitions() adds for all.
77 set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS
78   $<$<CONFIG:Debug>:DEBUG;_DEBUG>
79   $<$<CONFIG:Release>:NDEBUG>
80   $<$<CONFIG:MinSizeRel>:NDEBUG>
81   $<$<CONFIG:RelWithDebInfo>:NDEBUG>
82 )
83
84 #-----------------------------------------------------------------------------
85 # Set policy
86
87 # see "cmake --help-policy CMP0003"
88 # So library linking is more sane
89 cmake_policy(SET CMP0003 NEW)
90
91 # So BUILDINFO and BLENDERPATH strings are automatically quoted
92 cmake_policy(SET CMP0005 NEW)
93
94 # So syntax problems are errors
95 cmake_policy(SET CMP0010 NEW)
96
97 # Input directories must have CMakeLists.txt
98 cmake_policy(SET CMP0014 NEW)
99
100 # Silence draco warning on macOS, new policy works fine.
101 if(POLICY CMP0068)
102   cmake_policy(SET CMP0068 NEW)
103 endif()
104
105 #-----------------------------------------------------------------------------
106 # Load some macros.
107 include(build_files/cmake/macros.cmake)
108
109
110 #-----------------------------------------------------------------------------
111 # Initialize project.
112
113 blender_project_hack_pre()
114
115 project(Blender)
116
117 blender_project_hack_post()
118
119 enable_testing()
120
121 #-----------------------------------------------------------------------------
122 # Redirect output files
123
124 set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/bin CACHE INTERNAL "" FORCE)
125 set(LIBRARY_OUTPUT_PATH ${CMAKE_BINARY_DIR}/lib CACHE INTERNAL "" FORCE)
126 if(MSVC)
127   set(TESTS_OUTPUT_DIR ${EXECUTABLE_OUTPUT_PATH}/tests/$<CONFIG>/ CACHE INTERNAL "" FORCE)
128 else()
129   set(TESTS_OUTPUT_DIR ${EXECUTABLE_OUTPUT_PATH}/tests/ CACHE INTERNAL "" FORCE)
130 endif()
131
132 #-----------------------------------------------------------------------------
133 # Set default config options
134
135 get_blender_version()
136
137
138 #-----------------------------------------------------------------------------
139 # Options
140
141 # First platform specific non-cached vars
142 if(UNIX AND NOT (APPLE OR HAIKU))
143   set(WITH_X11 ON)
144 endif()
145
146 # Blender internal features
147 option(WITH_BLENDER "Build blender (disable to build only the blender player)" ON)
148 mark_as_advanced(WITH_BLENDER)
149
150 option(WITH_INTERNATIONAL "Enable I18N (International fonts and text)" ON)
151
152 option(WITH_PYTHON        "Enable Embedded Python API  (only disable for development)" ON)
153 option(WITH_PYTHON_SECURITY "Disables execution of scripts within blend files by default" ON)
154 mark_as_advanced(WITH_PYTHON)  # don't want people disabling this unless they really know what they are doing.
155 mark_as_advanced(WITH_PYTHON_SECURITY)  # some distributions see this as a security issue, rather than have them patch it, make a build option.
156
157 option(WITH_PYTHON_SAFETY "Enable internal API error checking to track invalid data to prevent crash on access (at the expense of some efficiency, only enable for development)." OFF)
158 mark_as_advanced(WITH_PYTHON_SAFETY)
159 option(WITH_PYTHON_MODULE "Enable building as a python module which runs without a user interface, like running regular blender in background mode (experimental, only enable for development), installs to PYTHON_SITE_PACKAGES (or CMAKE_INSTALL_PREFIX if WITH_INSTALL_PORTABLE is enabled)." OFF)
160 if(APPLE)
161   option(WITH_PYTHON_FRAMEWORK "Enable building using the Python available in the framework (OSX only)" OFF)
162 endif()
163
164 option(WITH_BUILDINFO     "Include extra build details (only disable for development & faster builds)" ON)
165 if(${CMAKE_VERSION} VERSION_LESS 2.8.8)
166   # add_library OBJECT arg unsupported
167   set(WITH_BUILDINFO OFF)
168 endif()
169 set(BUILDINFO_OVERRIDE_DATE "" CACHE STRING "Use instead of the current date for reproducible builds (empty string disables this option)")
170 set(BUILDINFO_OVERRIDE_TIME "" CACHE STRING "Use instead of the current time for reproducible builds (empty string disables this option)")
171 set(CPACK_OVERRIDE_PACKAGENAME "" CACHE STRING "Use instead of the standard packagename (empty string disables this option)")
172 mark_as_advanced(CPACK_OVERRIDE_PACKAGENAME)
173 mark_as_advanced(BUILDINFO_OVERRIDE_DATE)
174 mark_as_advanced(BUILDINFO_OVERRIDE_TIME)
175
176 option(WITH_IK_ITASC      "Enable ITASC IK solver (only disable for development & for incompatible C++ compilers)" ON)
177 option(WITH_IK_SOLVER     "Enable Legacy IK solver (only disable for development)" ON)
178 option(WITH_FFTW3         "Enable FFTW3 support (Used for smoke, ocean sim, and audio effects)" ON)
179 option(WITH_BULLET        "Enable Bullet (Physics Engine)" ON)
180 option(WITH_SYSTEM_BULLET "Use the systems bullet library (currently unsupported due to missing features in upstream!)" )
181 mark_as_advanced(WITH_SYSTEM_BULLET)
182 option(WITH_OPENCOLORIO   "Enable OpenColorIO color management" ON)
183 if(APPLE)
184   # There's no OpenXR runtime in sight for macOS, neither is code well
185   # tested there -> disable it by default.
186   option(WITH_XR_OPENXR   "Enable VR features through the OpenXR specification" OFF)
187   mark_as_advanced(WITH_XR_OPENXR)
188 else()
189   option(WITH_XR_OPENXR   "Enable VR features through the OpenXR specification" ON)
190 endif()
191
192 # Compositor
193 option(WITH_COMPOSITOR         "Enable the tile based nodal compositor" ON)
194 option(WITH_OPENIMAGEDENOISE   "Enable the OpenImageDenoise compositing node" ON)
195
196 option(WITH_OPENSUBDIV    "Enable OpenSubdiv for surface subdivision" ON)
197
198 option(WITH_OPENVDB       "Enable features relying on OpenVDB" ON)
199 option(WITH_OPENVDB_BLOSC "Enable blosc compression for OpenVDB, only enable if OpenVDB was built with blosc support" ON)
200 option(WITH_OPENVDB_3_ABI_COMPATIBLE "Assume OpenVDB library has been compiled with version 3 ABI compatibility" OFF)
201 mark_as_advanced(WITH_OPENVDB_3_ABI_COMPATIBLE)
202
203 # GHOST Windowing Library Options
204 option(WITH_GHOST_DEBUG   "Enable debugging output for the GHOST library" OFF)
205 mark_as_advanced(WITH_GHOST_DEBUG)
206
207 option(WITH_GHOST_SDL    "Enable building Blender against SDL for windowing rather than the native APIs" OFF)
208 mark_as_advanced(WITH_GHOST_SDL)
209
210 if(WITH_X11)
211   option(WITH_GHOST_XDND    "Enable drag'n'drop support on X11 using XDND protocol" ON)
212 endif()
213
214 # Misc...
215 option(WITH_HEADLESS      "Build without graphical support (renderfarm, server mode only)" OFF)
216 mark_as_advanced(WITH_HEADLESS)
217
218 option(WITH_QUADRIFLOW    "Build with quadriflow remesher support" ON)
219
220 option(WITH_AUDASPACE    "Build with blenders audio library (only disable if you know what you're doing!)" ON)
221 option(WITH_SYSTEM_AUDASPACE "Build with external audaspace library installed on the system (only enable if you know what you're doing!)" OFF)
222 mark_as_advanced(WITH_AUDASPACE)
223 mark_as_advanced(WITH_SYSTEM_AUDASPACE)
224
225 if(NOT WITH_AUDASPACE)
226   set(WITH_SYSTEM_AUDASPACE OFF)
227 endif()
228
229 option(WITH_OPENMP        "Enable OpenMP (has to be supported by the compiler)" ON)
230 if(UNIX AND NOT APPLE)
231   option(WITH_OPENMP_STATIC "Link OpenMP statically (only used by the release environment)" OFF)
232   mark_as_advanced(WITH_OPENMP_STATIC)
233 endif()
234
235 if(WITH_X11)
236   option(WITH_X11_XINPUT    "Enable X11 Xinput (tablet support and unicode input)"  ON)
237   option(WITH_X11_XF86VMODE "Enable X11 video mode switching"                       ON)
238   option(WITH_X11_XFIXES    "Enable X11 XWayland cursor warping workaround"         ON)
239   option(WITH_X11_ALPHA     "Enable X11 transparent background"                     ON)
240 endif()
241
242 if(UNIX AND NOT APPLE)
243   option(WITH_SYSTEM_GLEW "Use GLEW OpenGL wrapper library provided by the operating system" OFF)
244   option(WITH_SYSTEM_GLES "Use OpenGL ES library provided by the operating system"           ON)
245 else()
246   # not an option for other OS's
247   set(WITH_SYSTEM_GLEW OFF)
248   set(WITH_SYSTEM_GLES OFF)
249 endif()
250
251
252 if(UNIX AND NOT APPLE)
253   option(WITH_SYSTEM_EIGEN3 "Use the systems Eigen3 library" OFF)
254 endif()
255
256
257 # Modifiers
258 option(WITH_MOD_FLUID           "Enable Mantaflow Fluid Simulation Framework" ON)
259 option(WITH_MOD_REMESH          "Enable Remesh Modifier" ON)
260 option(WITH_MOD_OCEANSIM        "Enable Ocean Modifier" ON)
261
262 # Image format support
263 option(WITH_OPENIMAGEIO         "Enable OpenImageIO Support (http://www.openimageio.org)" ON)
264 option(WITH_IMAGE_OPENEXR       "Enable OpenEXR Support (http://www.openexr.com)" ON)
265 option(WITH_IMAGE_OPENJPEG      "Enable OpenJpeg Support (http://www.openjpeg.org)" ON)
266 option(WITH_IMAGE_TIFF          "Enable LibTIFF Support" ON)
267 option(WITH_IMAGE_DDS           "Enable DDS Image Support" ON)
268 option(WITH_IMAGE_CINEON        "Enable CINEON and DPX Image Support" ON)
269 option(WITH_IMAGE_HDR           "Enable HDR Image Support" ON)
270
271 # Audio/Video format support
272 option(WITH_CODEC_AVI           "Enable Blenders own AVI file support (raw/jpeg)" ON)
273 option(WITH_CODEC_FFMPEG        "Enable FFMPeg Support (http://ffmpeg.org)" ON)
274 option(WITH_CODEC_SNDFILE       "Enable libsndfile Support (http://www.mega-nerd.com/libsndfile)" ON)
275
276 # Alembic support
277 option(WITH_ALEMBIC             "Enable Alembic Support" ON)
278 option(WITH_ALEMBIC_HDF5        "Enable Legacy Alembic Support (not officially supported)" OFF)
279
280 # Universal Scene Description support
281 option(WITH_USD                 "Enable Universal Scene Description (USD) Support" OFF)
282
283 # 3D format support
284 # Disable opencollada when we don't have precompiled libs
285 option(WITH_OPENCOLLADA   "Enable OpenCollada Support (http://www.opencollada.org)" ON)
286
287 # Sound output
288 option(WITH_SDL           "Enable SDL for sound and joystick support" ON)
289 option(WITH_OPENAL        "Enable OpenAL Support (http://www.openal.org)" ON)
290 if(NOT WIN32)
291   option(WITH_JACK          "Enable JACK Support (http://www.jackaudio.org)" ON)
292   if(UNIX AND NOT APPLE)
293     option(WITH_JACK_DYNLOAD  "Enable runtime dynamic JACK libraries loading" OFF)
294   endif()
295 endif()
296 if(UNIX AND NOT APPLE)
297   option(WITH_SDL_DYNLOAD  "Enable runtime dynamic SDL libraries loading" OFF)
298 endif()
299
300 # Compression
301 option(WITH_LZO           "Enable fast LZO compression (used for pointcache)" ON)
302 option(WITH_LZMA          "Enable best LZMA compression, (used for pointcache)" ON)
303 if(UNIX AND NOT APPLE)
304   option(WITH_SYSTEM_LZO    "Use the system LZO library" OFF)
305 endif()
306 option(WITH_DRACO         "Enable Draco mesh compression Python module (used for glTF)" ON)
307
308 # Camera/motion tracking
309 option(WITH_LIBMV         "Enable Libmv structure from motion library" ON)
310 option(WITH_LIBMV_SCHUR_SPECIALIZATIONS "Enable fixed-size schur specializations." ON)
311 mark_as_advanced(WITH_LIBMV_SCHUR_SPECIALIZATIONS)
312
313 # Logging/unbit test libraries.
314 option(WITH_SYSTEM_GFLAGS   "Use system-wide Gflags instead of a bundled one" OFF)
315 option(WITH_SYSTEM_GLOG     "Use system-wide Glog instead of a bundled one" OFF)
316 mark_as_advanced(WITH_SYSTEM_GFLAGS)
317 mark_as_advanced(WITH_SYSTEM_GLOG)
318
319 # Freestyle
320 option(WITH_FREESTYLE     "Enable Freestyle (advanced edges rendering)" ON)
321
322 # New object types
323 option(WITH_NEW_OBJECT_TYPES "Enable new hair and pointcloud objects (use for development only, don't save in files)" OFF)
324 mark_as_advanced(WITH_NEW_OBJECT_TYPES)
325
326 # New simulation data block
327 option(WITH_NEW_SIMULATION_TYPE "Enable simulation data block (use for development only, don't save in files)" OFF)
328 mark_as_advanced(WITH_NEW_SIMULATION_TYPE)
329
330 # Misc
331 if(WIN32)
332   option(WITH_INPUT_IME "Enable Input Method Editor (IME) for complex Asian character input" ON)
333 endif()
334 option(WITH_INPUT_NDOF "Enable NDOF input devices (SpaceNavigator and friends)" ON)
335 if(UNIX AND NOT APPLE)
336   option(WITH_INSTALL_PORTABLE "Install redistributeable runtime, otherwise install into CMAKE_INSTALL_PREFIX" ON)
337   option(WITH_STATIC_LIBS "Try to link with static libraries, as much as possible, to make blender more portable across distributions" OFF)
338   if(WITH_STATIC_LIBS)
339     option(WITH_BOOST_ICU "Boost uses ICU library (required for linking with static Boost built with libicu)." OFF)
340     mark_as_advanced(WITH_BOOST_ICU)
341   endif()
342 endif()
343
344 option(WITH_PYTHON_INSTALL       "Copy system python into the blender install folder" ON)
345 if(WIN32 OR APPLE)
346   # Windows and macOS have this bundled with Python libraries.
347 elseif(WITH_PYTHON_INSTALL OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE))
348   set(PYTHON_NUMPY_PATH            "" CACHE PATH "Path to python site-packages or dist-packages containing 'numpy' module")
349   mark_as_advanced(PYTHON_NUMPY_PATH)
350   set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module")
351   mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS)
352 endif()
353 if(WITH_PYTHON_INSTALL)
354   option(WITH_PYTHON_INSTALL_NUMPY "Copy system numpy into the blender install folder"  ON)
355
356   if(UNIX AND NOT APPLE)
357     option(WITH_PYTHON_INSTALL_REQUESTS "Copy system requests into the blender install folder" ON)
358     set(PYTHON_REQUESTS_PATH "" CACHE PATH "Path to python site-packages or dist-packages containing 'requests' module")
359     mark_as_advanced(PYTHON_REQUESTS_PATH)
360   endif()
361 endif()
362
363 option(WITH_CPU_SSE              "Enable SIMD instruction if they're detected on the host machine" ON)
364 mark_as_advanced(WITH_CPU_SSE)
365
366 # Cycles
367 option(WITH_CYCLES                  "Enable Cycles Render Engine" ON)
368 option(WITH_CYCLES_STANDALONE       "Build Cycles standalone application" OFF)
369 option(WITH_CYCLES_STANDALONE_GUI   "Build Cycles standalone with GUI" OFF)
370 option(WITH_CYCLES_OSL              "Build Cycles with OSL support" ON)
371 option(WITH_CYCLES_EMBREE           "Build Cycles with Embree support" OFF)
372 option(WITH_CYCLES_CUDA_BINARIES    "Build Cycles CUDA binaries" OFF)
373 option(WITH_CYCLES_CUBIN_COMPILER   "Build cubins with nvrtc based compiler instead of nvcc" OFF)
374 option(WITH_CYCLES_CUDA_BUILD_SERIAL "Build cubins one after another (useful on machines with limited RAM)" OFF)
375 mark_as_advanced(WITH_CYCLES_CUDA_BUILD_SERIAL)
376 set(CYCLES_CUDA_BINARIES_ARCH sm_30 sm_35 sm_37 sm_50 sm_52 sm_60 sm_61 sm_70 sm_75 CACHE STRING "CUDA architectures to build binaries for")
377 mark_as_advanced(CYCLES_CUDA_BINARIES_ARCH)
378 unset(PLATFORM_DEFAULT)
379 option(WITH_CYCLES_LOGGING  "Build Cycles with logging support" ON)
380 option(WITH_CYCLES_DEBUG    "Build Cycles with extra debug capabilities" OFF)
381 option(WITH_CYCLES_NATIVE_ONLY  "Build Cycles with native kernel only (which fits current CPU, use for development only)" OFF)
382 option(WITH_CYCLES_KERNEL_ASAN  "Build Cycles kernels with address sanitizer when WITH_COMPILER_ASAN is on, even if it's very slow" OFF)
383 mark_as_advanced(WITH_CYCLES_KERNEL_ASAN)
384 mark_as_advanced(WITH_CYCLES_CUBIN_COMPILER)
385 mark_as_advanced(WITH_CYCLES_LOGGING)
386 mark_as_advanced(WITH_CYCLES_DEBUG)
387 mark_as_advanced(WITH_CYCLES_NATIVE_ONLY)
388
389 option(WITH_CYCLES_DEVICE_CUDA              "Enable Cycles CUDA compute support" ON)
390 option(WITH_CYCLES_DEVICE_OPTIX             "Enable Cycles OptiX support" OFF)
391 option(WITH_CYCLES_DEVICE_OPENCL            "Enable Cycles OpenCL compute support" ON)
392 option(WITH_CYCLES_NETWORK              "Enable Cycles compute over network support (EXPERIMENTAL and unfinished)" OFF)
393 mark_as_advanced(WITH_CYCLES_DEVICE_CUDA)
394 mark_as_advanced(WITH_CYCLES_DEVICE_OPENCL)
395 mark_as_advanced(WITH_CYCLES_NETWORK)
396
397 option(WITH_CUDA_DYNLOAD "Dynamically load CUDA libraries at runtime" ON)
398 mark_as_advanced(WITH_CUDA_DYNLOAD)
399
400 # LLVM
401 option(WITH_LLVM                    "Use LLVM" OFF)
402 if(APPLE)
403   option(LLVM_STATIC                  "Link with LLVM static libraries" ON) # we prefer static llvm build on Apple, dyn build possible though
404 else()
405   option(LLVM_STATIC                  "Link with LLVM static libraries" OFF)
406 endif()
407 mark_as_advanced(LLVM_STATIC)
408
409 # disable for now, but plan to support on all platforms eventually
410 option(WITH_MEM_JEMALLOC   "Enable malloc replacement (http://www.canonware.com/jemalloc)" ON)
411 mark_as_advanced(WITH_MEM_JEMALLOC)
412
413 # currently only used for BLI_mempool
414 option(WITH_MEM_VALGRIND "Enable extended valgrind support for better reporting" OFF)
415 mark_as_advanced(WITH_MEM_VALGRIND)
416
417 # Debug
418 option(WITH_CXX_GUARDEDALLOC "Enable GuardedAlloc for C++ memory allocation tracking (only enable for development)" OFF)
419 mark_as_advanced(WITH_CXX_GUARDEDALLOC)
420
421 option(WITH_ASSERT_ABORT "Call abort() when raising an assertion through BLI_assert()" ON)
422 mark_as_advanced(WITH_ASSERT_ABORT)
423
424 option(WITH_BOOST "Enable features depending on boost" ON)
425 option(WITH_TBB   "Enable features depending on TBB (OpenVDB, OpenImageDenoise, sculpt multithreading)" ON)
426
427 # TBB malloc is only supported on for windows currently
428 if(WIN32)
429   option(WITH_TBB_MALLOC_PROXY "Enable the TBB malloc replacement" ON)
430 endif()
431
432 # Unit testsing
433 option(WITH_GTESTS "Enable GTest unit testing" OFF)
434 option(WITH_OPENGL_RENDER_TESTS "Enable OpenGL render related unit testing (Experimental)" OFF)
435 option(WITH_OPENGL_DRAW_TESTS "Enable OpenGL UI drawing related unit testing (Experimental)" OFF)
436 set(TEST_PYTHON_EXE "" CACHE PATH "Python executable to run unit tests")
437 mark_as_advanced(TEST_PYTHON_EXE)
438
439 # Documentation
440 if(UNIX AND NOT APPLE)
441   option(WITH_DOC_MANPAGE "Create a manual page (Unix manpage)" OFF)
442 endif()
443
444
445 # OpenGL
446
447 option(WITH_OPENGL              "When off limits visibility of the opengl headers to just bf_gpu and gawain (temporary option for development purposes)" ON)
448 option(WITH_GLEW_ES             "Switches to experimental copy of GLEW that has support for OpenGL ES. (temporary option for development purposes)" OFF)
449 option(WITH_GL_EGL              "Use the EGL OpenGL system library instead of the platform specific OpenGL system library (CGL, glX, or WGL)"       OFF)
450 option(WITH_GL_PROFILE_ES20     "Support using OpenGL ES 2.0. (through either EGL or the AGL/WGL/XGL 'es20' profile)"                               OFF)
451
452 mark_as_advanced(
453   WITH_OPENGL
454   WITH_GLEW_ES
455   WITH_GL_EGL
456   WITH_GL_PROFILE_ES20
457 )
458
459 if(WIN32)
460   option(WITH_GL_ANGLE "Link with the ANGLE library, an OpenGL ES 2.0 implementation based on Direct3D, instead of the system OpenGL library." OFF)
461   mark_as_advanced(WITH_GL_ANGLE)
462 endif()
463
464 if(WITH_GLEW_ES AND WITH_SYSTEM_GLEW)
465   message(WARNING Ignoring WITH_SYSTEM_GLEW and using WITH_GLEW_ES)
466   set(WITH_SYSTEM_GLEW OFF)
467 endif()
468
469 if(WIN32)
470   getDefaultWindowsPrefixBase(CMAKE_GENERIC_PROGRAM_FILES)
471   set(CPACK_INSTALL_PREFIX ${CMAKE_GENERIC_PROGRAM_FILES}/${})
472 endif()
473
474 # Compiler toolchain
475 if(CMAKE_COMPILER_IS_GNUCC)
476   option(WITH_LINKER_GOLD "Use ld.gold linker which is usually faster than ld.bfd" ON)
477   mark_as_advanced(WITH_LINKER_GOLD)
478   option(WITH_LINKER_LLD "Use ld.lld linker which is usually faster than ld.gold" OFF)
479   mark_as_advanced(WITH_LINKER_LLD)
480 endif()
481
482 if(CMAKE_COMPILER_IS_GNUCC OR CMAKE_C_COMPILER_ID MATCHES "Clang")
483   option(WITH_COMPILER_ASAN "Build and link against address sanitizer (only for Debug & RelWithDebInfo targets)." OFF)
484   mark_as_advanced(WITH_COMPILER_ASAN)
485
486   if(WITH_COMPILER_ASAN)
487     set(_asan_defaults "\
488 -fsanitize=address \
489 -fsanitize=bool \
490 -fsanitize=bounds \
491 -fsanitize=enum \
492 -fsanitize=float-cast-overflow \
493 -fsanitize=float-divide-by-zero \
494 -fsanitize=nonnull-attribute \
495 -fsanitize=returns-nonnull-attribute \
496 -fsanitize=signed-integer-overflow \
497 -fsanitize=undefined \
498 -fsanitize=vla-bound \
499 -fno-sanitize=alignment \
500 ")
501
502     if(NOT MSVC) # not all sanitizers are supported with clang-cl, these two however are very vocal about it
503       set(_asan_defaults "${_asan_defaults} -fsanitize=leak -fsanitize=object-size" )
504     endif()
505     set(COMPILER_ASAN_CFLAGS "${_asan_defaults}" CACHE STRING "C flags for address sanitizer")
506     mark_as_advanced(COMPILER_ASAN_CFLAGS)
507     set(COMPILER_ASAN_CXXFLAGS "${_asan_defaults}" CACHE STRING "C++ flags for address sanitizer")
508     mark_as_advanced(COMPILER_ASAN_CXXFLAGS)
509
510     unset(_asan_defaults)
511
512     if(NOT MSVC)
513       find_library(COMPILER_ASAN_LIBRARY asan ${CMAKE_C_IMPLICIT_LINK_DIRECTORIES})
514     else()
515       find_library(
516         COMPILER_ASAN_LIBRARY NAMES clang_rt.asan-x86_64
517         PATHS
518         [HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/7.0.0/lib/windows
519         [HKEY_LOCAL_MACHINE\\SOFTWARE\\Wow6432Node\\LLVM\\LLVM;]/lib/clang/6.0.0/lib/windows
520       )
521     endif()
522     mark_as_advanced(COMPILER_ASAN_LIBRARY)
523   endif()
524 endif()
525
526 if(WIN32)
527   # Use hardcoded paths or find_package to find externals
528   option(WITH_WINDOWS_FIND_MODULES "Use find_package to locate libraries" OFF)
529   mark_as_advanced(WITH_WINDOWS_FIND_MODULES)
530
531   option(WINDOWS_USE_VISUAL_STUDIO_PROJECT_FOLDERS "Organize the visual studio projects according to source folder structure." ON)
532   mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_PROJECT_FOLDERS)
533
534   option(WINDOWS_USE_VISUAL_STUDIO_SOURCE_FOLDERS "Organize the source files in filters matching the source folders." ON)
535   mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_SOURCE_FOLDERS)
536
537   option(WINDOWS_PYTHON_DEBUG "Include the files needed for debugging python scripts with visual studio 2017+." OFF)
538   mark_as_advanced(WINDOWS_PYTHON_DEBUG)
539
540   option(WITH_WINDOWS_BUNDLE_CRT "Bundle the C runtime for install free distribution." ON)
541   mark_as_advanced(WITH_WINDOWS_BUNDLE_CRT)
542
543   option(WITH_WINDOWS_SCCACHE "Use sccache to speed up builds (Ninja builder only)" OFF)
544   mark_as_advanced(WITH_WINDOWS_SCCACHE)
545
546 endif()
547
548 # The following only works with the Ninja generator in CMake >= 3.0.
549 if("${CMAKE_GENERATOR}" MATCHES "Ninja")
550   option(WITH_NINJA_POOL_JOBS
551          "Enable Ninja pools of jobs, to try to ease building on machines with 16GB of RAM or less (if not yet defined, will try to set best values based on detected machine specifications)."
552          OFF)
553   mark_as_advanced(WITH_NINJA_POOL_JOBS)
554 endif()
555
556 if(UNIX AND NOT APPLE)
557   option(WITH_CXX11_ABI "Use native C++11 ABI of compiler" ON)
558   mark_as_advanced(WITH_CXX11_ABI)
559 endif()
560
561 # Installation process.
562 option(POSTINSTALL_SCRIPT "Run given CMake script after installation process" OFF)
563 mark_as_advanced(POSTINSTALL_SCRIPT)
564
565 # end option(...)
566
567
568
569 # By default we want to install to the directory we are compiling our executables
570 # unless specified otherwise, which we currently do not allow
571 if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
572   if(WIN32)
573     set(CMAKE_INSTALL_PREFIX ${EXECUTABLE_OUTPUT_PATH}/\${BUILD_TYPE} CACHE PATH "default install path" FORCE)
574   elseif(APPLE)
575     set(CMAKE_INSTALL_PREFIX ${EXECUTABLE_OUTPUT_PATH}/\${BUILD_TYPE} CACHE PATH "default install path" FORCE)
576   else()
577     if(WITH_INSTALL_PORTABLE)
578       set(CMAKE_INSTALL_PREFIX ${EXECUTABLE_OUTPUT_PATH} CACHE PATH "default install path" FORCE)
579     endif()
580   endif()
581 endif()
582
583
584
585 # Apple
586
587 if(APPLE)
588   include(platform_apple_xcode)
589 endif()
590
591
592 #-----------------------------------------------------------------------------
593 # Check for conflicting/unsupported configurations
594
595 if(NOT WITH_BLENDER AND NOT WITH_CYCLES_STANDALONE)
596   message(FATAL_ERROR
597     "At least one of WITH_BLENDER or WITH_CYCLES_STANDALONE "
598     "must be enabled, nothing to do!"
599   )
600 endif()
601
602 if(NOT WITH_AUDASPACE)
603   if(WITH_OPENAL)
604     message(WARNING "WITH_OPENAL requires WITH_AUDASPACE which is disabled")
605     set(WITH_OPENAL OFF)
606   endif()
607   if(WITH_JACK)
608     message(WARNING "WITH_JACK requires WITH_AUDASPACE which is disabled")
609     set(WITH_JACK OFF)
610   endif()
611 endif()
612
613 if(NOT WITH_SDL AND WITH_GHOST_SDL)
614   message(FATAL_ERROR "WITH_GHOST_SDL requires WITH_SDL")
615 endif()
616
617 # python module, needs some different options
618 if(WITH_PYTHON_MODULE AND WITH_PYTHON_INSTALL)
619   message(FATAL_ERROR "WITH_PYTHON_MODULE requires WITH_PYTHON_INSTALL to be OFF")
620 endif()
621
622
623 # may as well build python module without a UI
624 if(WITH_PYTHON_MODULE)
625   set(WITH_HEADLESS ON)
626 endif()
627
628 if(NOT WITH_PYTHON)
629   set(WITH_CYCLES OFF)
630   set(WITH_DRACO OFF)
631 endif()
632
633 if(WITH_DRACO AND NOT WITH_PYTHON_INSTALL)
634   message(STATUS "WITH_DRACO requires WITH_PYTHON_INSTALL to be ON, disabling WITH_DRACO for now")
635   set(WITH_DRACO OFF)
636 endif()
637
638 # enable boost for cycles, audaspace or i18n
639 # otherwise if the user disabled
640
641 set_and_warn_dependency(WITH_BOOST WITH_CYCLES         OFF)
642 set_and_warn_dependency(WITH_BOOST WITH_INTERNATIONAL  OFF)
643 set_and_warn_dependency(WITH_BOOST WITH_OPENVDB        OFF)
644 set_and_warn_dependency(WITH_BOOST WITH_OPENCOLORIO    OFF)
645 set_and_warn_dependency(WITH_BOOST WITH_QUADRIFLOW     OFF)
646 set_and_warn_dependency(WITH_BOOST WITH_USD            OFF)
647 set_and_warn_dependency(WITH_BOOST WITH_ALEMBIC        OFF)
648
649 if(WITH_BOOST AND NOT (WITH_CYCLES OR WITH_OPENIMAGEIO OR WITH_INTERNATIONAL OR
650    WITH_OPENVDB OR WITH_OPENCOLORIO OR WITH_USD OR WITH_ALEMBIC))
651   message(STATUS "No dependencies need 'WITH_BOOST' forcing WITH_BOOST=OFF")
652   set(WITH_BOOST OFF)
653 endif()
654
655 set_and_warn_dependency(WITH_TBB WITH_USD               OFF)
656 set_and_warn_dependency(WITH_TBB WITH_OPENIMAGEDENOISE  OFF)
657 set_and_warn_dependency(WITH_TBB WITH_OPENVDB           OFF)
658 set_and_warn_dependency(WITH_TBB WITH_MOD_FLUID         OFF)
659
660 # OpenVDB uses 'half' type from OpenEXR & fails to link without OpenEXR enabled.
661 set_and_warn_dependency(WITH_IMAGE_OPENEXR WITH_OPENVDB OFF)
662
663 # auto enable openimageio for cycles
664 if(WITH_CYCLES)
665   set(WITH_OPENIMAGEIO ON)
666
667   # auto enable llvm for cycles_osl
668   if(WITH_CYCLES_OSL)
669     set(WITH_LLVM ON CACHE BOOL "" FORCE)
670   endif()
671 else()
672   set(WITH_CYCLES_OSL OFF)
673 endif()
674
675 # auto enable openimageio linking dependencies
676 if(WITH_OPENIMAGEIO)
677   set(WITH_IMAGE_OPENEXR ON)
678   set(WITH_IMAGE_TIFF ON)
679 endif()
680
681 # auto enable alembic linking dependencies
682 if(WITH_ALEMBIC)
683   set(WITH_IMAGE_OPENEXR ON)
684 endif()
685
686 # don't store paths to libs for portable distribution
687 if(WITH_INSTALL_PORTABLE)
688   set(CMAKE_SKIP_BUILD_RPATH TRUE)
689 endif()
690
691 if(WITH_GHOST_SDL OR WITH_HEADLESS)
692   set(WITH_X11           OFF)
693   set(WITH_X11_XINPUT    OFF)
694   set(WITH_X11_XF86VMODE OFF)
695   set(WITH_X11_XFIXES    OFF)
696   set(WITH_X11_ALPHA     OFF)
697   set(WITH_GHOST_XDND    OFF)
698   set(WITH_INPUT_IME     OFF)
699   set(WITH_XR_OPENXR     OFF)
700 endif()
701
702 if(WITH_CPU_SSE)
703   TEST_SSE_SUPPORT(COMPILER_SSE_FLAG COMPILER_SSE2_FLAG)
704 else()
705   message(STATUS "SSE and SSE2 optimizations are DISABLED!")
706   set(COMPILER_SSE_FLAG)
707   set(COMPILER_SSE2_FLAG)
708 endif()
709
710 if(WITH_BUILDINFO)
711   find_package(Git)
712   if(NOT GIT_FOUND)
713     message(WARNING "Git was not found, disabling WITH_BUILDINFO")
714     set(WITH_BUILDINFO OFF)
715   endif()
716 endif()
717
718 if(WITH_AUDASPACE)
719   if(NOT WITH_SYSTEM_AUDASPACE)
720     set(AUDASPACE_C_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/extern/audaspace/bindings/C" "${CMAKE_BINARY_DIR}/extern/audaspace")
721     set(AUDASPACE_PY_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/extern/audaspace/bindings")
722   endif()
723 endif()
724
725 # Auto-enable CUDA dynload if toolkit is not found.
726 if(NOT WITH_CUDA_DYNLOAD)
727   find_package(CUDA)
728   if(NOT CUDA_FOUND)
729     message("CUDA toolkit not found, using dynamic runtime loading of libraries instead")
730     set(WITH_CUDA_DYNLOAD ON)
731   endif()
732 endif()
733
734 #-----------------------------------------------------------------------------
735 # Check check if submodules are cloned
736
737 if(WITH_INTERNATIONAL)
738   file(GLOB RESULT "${CMAKE_SOURCE_DIR}/release/datafiles/locale")
739   list(LENGTH RESULT DIR_LEN)
740   if(DIR_LEN EQUAL 0)
741     message(WARNING
742       "Translation path '${CMAKE_SOURCE_DIR}/release/datafiles/locale' is missing, "
743       "This is a 'git submodule', which are known not to work with bridges to other version "
744       "control systems, disabling 'WITH_INTERNATIONAL'."
745     )
746     set(WITH_INTERNATIONAL OFF)
747   endif()
748 endif()
749
750 if(WITH_PYTHON)
751   # While we have this as an '#error' in 'bpy_capi_utils.h',
752   # upgrading Python tends to cause confusion for users who build.
753   # Give the error message early to make this more obvious.
754   #
755   # Do this before main 'platform_*' checks,
756   # because UNIX will search for the old Python paths which may not exist.
757   # giving errors about missing paths before this case is met.
758   if(DEFINED PYTHON_VERSION AND "${PYTHON_VERSION}" VERSION_LESS "3.7")
759     message(FATAL_ERROR "At least Python 3.7 is required to build")
760   endif()
761
762   file(GLOB RESULT "${CMAKE_SOURCE_DIR}/release/scripts/addons")
763   list(LENGTH RESULT DIR_LEN)
764   if(DIR_LEN EQUAL 0)
765     message(WARNING
766       "Addons path '${CMAKE_SOURCE_DIR}/release/scripts/addons' is missing, "
767       "This is a 'git submodule', which are known not to work with bridges to other version "
768       "control systems: * CONTINUING WITHOUT ADDONS *"
769     )
770   endif()
771 endif()
772
773 #-----------------------------------------------------------------------------
774 # Initialize un-cached vars, avoid unused warning
775
776 # linux only, not cached
777 set(WITH_BINRELOC OFF)
778
779 # MACOSX only, set to avoid uninitialized
780 set(EXETYPE "")
781
782 # C/C++ flags
783 set(PLATFORM_CFLAGS)
784
785 # these are added to later on.
786 set(C_WARNINGS)
787 set(CXX_WARNINGS)
788
789 # for gcc -Wno-blah-blah
790 set(C_REMOVE_STRICT_FLAGS)
791 set(CXX_REMOVE_STRICT_FLAGS)
792
793 # libraries to link the binary with passed to target_link_libraries()
794 # known as LLIBS to scons
795 set(PLATFORM_LINKLIBS "")
796
797 # Added to linker flags in setup_liblinks
798 # - CMAKE_EXE_LINKER_FLAGS
799 # - CMAKE_EXE_LINKER_FLAGS_DEBUG
800 set(PLATFORM_LINKFLAGS "")
801 set(PLATFORM_LINKFLAGS_DEBUG "")
802
803 if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
804   if(WITH_COMPILER_ASAN)
805     set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COMPILER_ASAN_CFLAGS}")
806     set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CFLAGS}")
807
808     set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COMPILER_ASAN_CXXFLAGS}")
809     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CXXFLAGS}")
810     if(MSVC)
811       set(COMPILER_ASAN_LINKER_FLAGS "/FUNCTIONPADMIN:6")
812     endif()
813     if(COMPILER_ASAN_LIBRARY)
814       set(PLATFORM_LINKLIBS "${PLATFORM_LINKLIBS};${COMPILER_ASAN_LIBRARY}")
815       set(PLATFORM_LINKFLAGS "${COMPILER_ASAN_LIBRARY} ${COMPILER_ASAN_LINKER_FLAGS}")
816       set(PLATFORM_LINKFLAGS_DEBUG "${COMPILER_ASAN_LIBRARY} ${COMPILER_ASAN_LINKER_FLAGS}")
817     endif()
818   endif()
819 endif()
820
821 # ----------------------------------------------------------------------------
822 # Main Platform Checks
823 #
824 # - UNIX
825 # - WIN32
826 # - APPLE
827
828 if(UNIX AND NOT APPLE)
829   include(platform_unix)
830 elseif(WIN32)
831   include(platform_win32)
832 elseif(APPLE)
833   include(platform_apple)
834 endif()
835
836 #-----------------------------------------------------------------------------
837 # Common.
838
839 if(NOT WITH_FFTW3 AND WITH_MOD_OCEANSIM)
840   message(FATAL_ERROR "WITH_MOD_OCEANSIM requires WITH_FFTW3 to be ON")
841 endif()
842
843 if(WITH_CYCLES)
844   if(NOT WITH_OPENIMAGEIO)
845     message(FATAL_ERROR
846       "Cycles requires WITH_OPENIMAGEIO, the library may not have been found. "
847       "Configure OIIO or disable WITH_CYCLES"
848     )
849   endif()
850   if(NOT WITH_BOOST)
851     message(FATAL_ERROR
852       "Cycles requires WITH_BOOST, the library may not have been found. "
853       "Configure BOOST or disable WITH_CYCLES"
854     )
855   endif()
856
857   if(WITH_CYCLES_OSL)
858     if(NOT WITH_LLVM)
859       message(FATAL_ERROR
860         "Cycles OSL requires WITH_LLVM, the library may not have been found. "
861         "Configure LLVM or disable WITH_CYCLES_OSL"
862       )
863     endif()
864   endif()
865 endif()
866
867 if(WITH_INTERNATIONAL)
868   if(NOT WITH_BOOST)
869     message(FATAL_ERROR
870       "Internationalization requires WITH_BOOST, the library may not have been found. "
871       "Configure BOOST or disable WITH_INTERNATIONAL"
872     )
873   endif()
874 endif()
875
876 # See TEST_SSE_SUPPORT() for how this is defined.
877
878 # Do it globally, SSE2 is required for quite some time now.
879 # Doing it now allows to use SSE/SSE2 in inline headers.
880 if(SUPPORT_SSE_BUILD)
881   set(PLATFORM_CFLAGS " ${COMPILER_SSE_FLAG} ${PLATFORM_CFLAGS}")
882   add_definitions(-D__SSE__ -D__MMX__)
883 endif()
884 if(SUPPORT_SSE2_BUILD)
885   set(PLATFORM_CFLAGS " ${PLATFORM_CFLAGS} ${COMPILER_SSE2_FLAG}")
886   add_definitions(-D__SSE2__)
887   if(NOT SUPPORT_SSE_BUILD) # don't double up
888     add_definitions(-D__MMX__)
889   endif()
890 endif()
891
892
893 # set the endian define
894 if(MSVC)
895   # for some reason this fails on msvc
896   add_definitions(-D__LITTLE_ENDIAN__)
897
898   # OSX-Note: as we do cross-compiling with specific set architecture,
899   # endianess-detection and auto-setting is counterproductive
900   # so we just set endianness according CMAKE_OSX_ARCHITECTURES
901
902 elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
903   add_definitions(-D__LITTLE_ENDIAN__)
904 elseif(CMAKE_OSX_ARCHITECTURES MATCHES ppc OR CMAKE_OSX_ARCHITECTURES MATCHES ppc64)
905   add_definitions(-D__BIG_ENDIAN__)
906
907 else()
908   include(TestBigEndian)
909   test_big_endian(_SYSTEM_BIG_ENDIAN)
910   if(_SYSTEM_BIG_ENDIAN)
911     add_definitions(-D__BIG_ENDIAN__)
912   else()
913     add_definitions(-D__LITTLE_ENDIAN__)
914   endif()
915   unset(_SYSTEM_BIG_ENDIAN)
916 endif()
917 if(WITH_IMAGE_OPENJPEG)
918   # Special handling of Windows platform where openjpeg is always static.
919   if(WIN32)
920     set(OPENJPEG_DEFINES "-DOPJ_STATIC")
921   else()
922     set(OPENJPEG_DEFINES "")
923   endif()
924 endif()
925
926 if(NOT WITH_SYSTEM_EIGEN3)
927   set(EIGEN3_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/Eigen3)
928 endif()
929
930 if(WITH_OPENVDB)
931   list(APPEND OPENVDB_DEFINITIONS -DWITH_OPENVDB)
932
933   if(WITH_OPENVDB_3_ABI_COMPATIBLE)
934     list(APPEND OPENVDB_DEFINITIONS -DOPENVDB_3_ABI_COMPATIBLE)
935   endif()
936
937   list(APPEND OPENVDB_INCLUDE_DIRS
938     ${BOOST_INCLUDE_DIR}
939     ${TBB_INCLUDE_DIRS}
940     ${OPENEXR_INCLUDE_DIRS})
941
942   list(APPEND OPENVDB_LIBRARIES ${OPENEXR_LIBRARIES} ${ZLIB_LIBRARIES})
943
944   if(WITH_OPENVDB_BLOSC)
945     list(APPEND OPENVDB_DEFINITIONS -DWITH_OPENVDB_BLOSC)
946     list(APPEND OPENVDB_LIBRARIES ${BLOSC_LIBRARIES} ${ZLIB_LIBRARIES})
947   endif()
948
949   list(APPEND OPENVDB_LIBRARIES ${BOOST_LIBRARIES} ${TBB_LIBRARIES})
950 endif()
951
952 #-----------------------------------------------------------------------------
953 # Configure OpenGL.
954
955 find_package(OpenGL)
956 blender_include_dirs_sys("${OPENGL_INCLUDE_DIR}")
957
958 if(WITH_OPENGL)
959   add_definitions(-DWITH_OPENGL)
960 endif()
961
962 if(WITH_SYSTEM_GLES)
963   find_package_wrapper(OpenGLES)
964 endif()
965
966 if(WITH_GL_PROFILE_ES20)
967   if(WITH_SYSTEM_GLES)
968     if(NOT OPENGLES_LIBRARY)
969       message(FATAL_ERROR
970         "Unable to find OpenGL ES libraries. "
971         "Install them or disable WITH_SYSTEM_GLES."
972       )
973     endif()
974
975     list(APPEND BLENDER_GL_LIBRARIES "${OPENGLES_LIBRARY}")
976
977   else()
978     set(OPENGLES_LIBRARY "" CACHE FILEPATH "OpenGL ES 2.0 library file")
979     mark_as_advanced(OPENGLES_LIBRARY)
980
981     list(APPEND BLENDER_GL_LIBRARIES "${OPENGLES_LIBRARY}")
982
983     if(NOT OPENGLES_LIBRARY)
984       message(FATAL_ERROR
985         "To compile WITH_GL_EGL you need to set OPENGLES_LIBRARY "
986         "to the file path of an OpenGL ES 2.0 library."
987       )
988     endif()
989
990   endif()
991
992   if(WIN32)
993     # Setup paths to files needed to install and redistribute Windows Blender with OpenGL ES
994
995     set(OPENGLES_DLL "" CACHE FILEPATH "OpenGL ES 2.0 redistributable DLL file")
996     mark_as_advanced(OPENGLES_DLL)
997
998     if(NOT OPENGLES_DLL)
999       message(FATAL_ERROR
1000         "To compile WITH_GL_PROFILE_ES20 you need to set OPENGLES_DLL to the file "
1001         "path of an OpenGL ES 2.0 runtime dynamic link library (DLL)."
1002       )
1003     endif()
1004
1005     if(WITH_GL_ANGLE)
1006       list(APPEND GL_DEFINITIONS -DWITH_ANGLE)
1007
1008       set(D3DCOMPILER_DLL "" CACHE FILEPATH "Direct3D Compiler redistributable DLL file (needed by ANGLE)")
1009
1010       get_filename_component(D3DCOMPILER_FILENAME "${D3DCOMPILER_DLL}" NAME)
1011       list(APPEND GL_DEFINITIONS "-DD3DCOMPILER=\"\\\"${D3DCOMPILER_FILENAME}\\\"\"")
1012
1013       mark_as_advanced(D3DCOMPILER_DLL)
1014
1015       if(D3DCOMPILER_DLL STREQUAL "")
1016         message(FATAL_ERROR
1017           "To compile WITH_GL_ANGLE you need to set D3DCOMPILER_DLL to the file "
1018           "path of a copy of the DirectX redistributable DLL file: D3DCompiler_46.dll"
1019         )
1020       endif()
1021
1022     endif()
1023
1024   endif()
1025
1026 else()
1027   if(OpenGL_GL_PREFERENCE STREQUAL "LEGACY" AND OPENGL_gl_LIBRARY)
1028     list(APPEND BLENDER_GL_LIBRARIES ${OPENGL_gl_LIBRARY})
1029   else()
1030     list(APPEND BLENDER_GL_LIBRARIES ${OPENGL_opengl_LIBRARY} ${OPENGL_glx_LIBRARY})
1031   endif()
1032 endif()
1033
1034 if(WITH_GL_EGL)
1035   find_package(OpenGL REQUIRED EGL)
1036   list(APPEND BLENDER_GL_LIBRARIES OpenGL::EGL)
1037
1038   list(APPEND GL_DEFINITIONS -DWITH_GL_EGL -DGLEW_EGL -DGLEW_INC_EGL)
1039
1040   if(WITH_SYSTEM_GLES)
1041     if(NOT OPENGLES_EGL_LIBRARY)
1042       message(FATAL_ERROR
1043         "Unable to find OpenGL ES libraries. "
1044         "Install them or disable WITH_SYSTEM_GLES."
1045       )
1046     endif()
1047
1048     list(APPEND BLENDER_GL_LIBRARIES ${OPENGLES_EGL_LIBRARY})
1049
1050   else()
1051     set(OPENGLES_EGL_LIBRARY "" CACHE FILEPATH "EGL library file")
1052     mark_as_advanced(OPENGLES_EGL_LIBRARY)
1053
1054     list(APPEND BLENDER_GL_LIBRARIES "${OPENGLES_LIBRARY}" "${OPENGLES_EGL_LIBRARY}")
1055
1056     if(NOT OPENGLES_EGL_LIBRARY)
1057       message(FATAL_ERROR
1058         "To compile WITH_GL_EGL you need to set OPENGLES_EGL_LIBRARY "
1059         "to the file path of an EGL library."
1060       )
1061     endif()
1062
1063   endif()
1064
1065   if(WIN32)
1066     # Setup paths to files needed to install and redistribute Windows Blender with OpenGL ES
1067
1068     set(OPENGLES_EGL_DLL "" CACHE FILEPATH "EGL redistributable DLL file")
1069     mark_as_advanced(OPENGLES_EGL_DLL)
1070
1071     if(NOT OPENGLES_EGL_DLL)
1072       message(FATAL_ERROR
1073         "To compile WITH_GL_EGL you need to set OPENGLES_EGL_DLL "
1074         "to the file path of an EGL runtime dynamic link library (DLL)."
1075       )
1076     endif()
1077
1078   endif()
1079
1080 endif()
1081
1082 if(WITH_GL_PROFILE_ES20)
1083   list(APPEND GL_DEFINITIONS -DWITH_GL_PROFILE_ES20)
1084 else()
1085   list(APPEND GL_DEFINITIONS -DWITH_GL_PROFILE_CORE)
1086 endif()
1087
1088 #-----------------------------------------------------------------------------
1089 # Configure OpenMP.
1090 if(WITH_OPENMP)
1091   if(NOT OPENMP_CUSTOM)
1092     find_package(OpenMP)
1093   endif()
1094
1095   if(OPENMP_FOUND)
1096     if(NOT WITH_OPENMP_STATIC)
1097       set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
1098       set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
1099     else()
1100       # Typically avoid adding flags as defines but we can't
1101       # pass OpenMP flags to the linker for static builds, meaning
1102       # we can't add any OpenMP related flags to CFLAGS variables
1103       # since they're passed to the linker as well.
1104       add_definitions("${OpenMP_C_FLAGS}")
1105
1106       find_library_static(OpenMP_LIBRARIES gomp ${CMAKE_CXX_IMPLICIT_LINK_DIRECTORIES})
1107     endif()
1108   else()
1109     set(WITH_OPENMP OFF)
1110   endif()
1111
1112   mark_as_advanced(
1113     OpenMP_C_FLAGS
1114     OpenMP_CXX_FLAGS
1115   )
1116 endif()
1117
1118 #-----------------------------------------------------------------------------
1119 # Configure GLEW
1120
1121 if(WITH_SYSTEM_GLEW)
1122   find_package(GLEW)
1123
1124   # Note: There is an assumption here that the system GLEW is not a static library.
1125
1126   if(NOT GLEW_FOUND)
1127     message(FATAL_ERROR "GLEW is required to build Blender. Install it or disable WITH_SYSTEM_GLEW.")
1128   endif()
1129
1130   set(GLEW_INCLUDE_PATH "${GLEW_INCLUDE_DIR}")
1131   set(BLENDER_GLEW_LIBRARIES ${GLEW_LIBRARY})
1132 else()
1133   if(WITH_GLEW_ES)
1134     set(GLEW_INCLUDE_PATH "${CMAKE_SOURCE_DIR}/extern/glew-es/include")
1135
1136     list(APPEND GL_DEFINITIONS -DGLEW_STATIC -DWITH_GLEW_ES)
1137
1138     # These definitions remove APIs from glew.h, making GLEW smaller, and catching unguarded API usage
1139     if(WITH_GL_PROFILE_ES20)
1140       list(APPEND GL_DEFINITIONS -DGLEW_ES_ONLY)
1141     else()
1142       # No ES functions are needed
1143       list(APPEND GL_DEFINITIONS -DGLEW_NO_ES)
1144     endif()
1145
1146     if(WITH_GL_PROFILE_ES20)
1147       if(WITH_GL_EGL)
1148         list(APPEND GL_DEFINITIONS -DGLEW_USE_LIB_ES20)
1149       endif()
1150
1151       # ToDo: This is an experiment to eliminate ES 1 symbols,
1152       # GLEW doesn't really properly provide this level of control
1153       # (for example, without modification it eliminates too many symbols)
1154       # so there are lots of modifications to GLEW to make this work,
1155       # and no attempt to make it work beyond Blender at this point.
1156       list(APPEND GL_DEFINITIONS -DGL_ES_VERSION_1_0=0 -DGL_ES_VERSION_CL_1_1=0 -DGL_ES_VERSION_CM_1_1=0)
1157     endif()
1158
1159     set(BLENDER_GLEW_LIBRARIES extern_glew_es bf_intern_glew_mx)
1160
1161   else()
1162     set(GLEW_INCLUDE_PATH "${CMAKE_SOURCE_DIR}/extern/glew/include")
1163
1164     list(APPEND GL_DEFINITIONS -DGLEW_STATIC)
1165
1166     # This won't affect the non-experimental glew library,
1167     # but is used for conditional compilation elsewhere.
1168     list(APPEND GL_DEFINITIONS -DGLEW_NO_ES)
1169
1170     set(BLENDER_GLEW_LIBRARIES extern_glew)
1171
1172   endif()
1173
1174 endif()
1175
1176 list(APPEND GL_DEFINITIONS -DGLEW_NO_GLU)
1177
1178 #-----------------------------------------------------------------------------
1179 # Configure Bullet
1180
1181 if(WITH_BULLET AND WITH_SYSTEM_BULLET)
1182   find_package(Bullet)
1183   if(NOT BULLET_FOUND)
1184     set(WITH_BULLET OFF)
1185   endif()
1186 else()
1187   set(BULLET_INCLUDE_DIRS "${CMAKE_SOURCE_DIR}/extern/bullet2/src")
1188   # set(BULLET_LIBRARIES "")
1189 endif()
1190
1191 #-----------------------------------------------------------------------------
1192 # Configure Python.
1193
1194 if(WITH_PYTHON_MODULE)
1195   add_definitions(-DPy_ENABLE_SHARED)
1196 endif()
1197
1198 #-----------------------------------------------------------------------------
1199 # Configure GLog/GFlags
1200
1201 if(WITH_LIBMV OR WITH_GTESTS OR (WITH_CYCLES AND WITH_CYCLES_LOGGING))
1202   if(WITH_SYSTEM_GFLAGS)
1203     find_package(Gflags)
1204     if(NOT GFLAGS_FOUND)
1205       message(FATAL_ERROR "System wide Gflags is requested but was not found")
1206     endif()
1207     # FindGflags does not define this, and we are not even sure what to use here.
1208     set(GFLAGS_DEFINES)
1209   else()
1210     set(GFLAGS_DEFINES
1211       -DGFLAGS_DLL_DEFINE_FLAG=
1212       -DGFLAGS_DLL_DECLARE_FLAG=
1213       -DGFLAGS_DLL_DECL=
1214     )
1215     set(GFLAGS_NAMESPACE "gflags")
1216     set(GFLAGS_LIBRARIES extern_gflags)
1217     set(GFLAGS_INCLUDE_DIRS "${PROJECT_SOURCE_DIR}/extern/gflags/src")
1218   endif()
1219
1220   if(WITH_SYSTEM_GLOG)
1221     find_package(Glog)
1222     if(NOT GLOG_FOUND)
1223       message(FATAL_ERROR "System wide Glog is requested but was not found")
1224     endif()
1225     # FindGlog does not define this, and we are not even sure what to use here.
1226     set(GLOG_DEFINES)
1227   else()
1228     set(GLOG_DEFINES
1229       -DGOOGLE_GLOG_DLL_DECL=
1230     )
1231     set(GLOG_LIBRARIES extern_glog)
1232     if(WIN32)
1233       set(GLOG_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/glog/src/windows)
1234     else()
1235       set(GLOG_INCLUDE_DIRS ${CMAKE_SOURCE_DIR}/extern/glog/include)
1236     endif()
1237   endif()
1238 endif()
1239
1240 #-----------------------------------------------------------------------------
1241 # Configure Ceres
1242
1243 if(WITH_LIBMV)
1244   # We always have C++11 which includes unordered_map.
1245   set(CERES_DEFINES -DCERES_STD_UNORDERED_MAP)
1246 endif()
1247
1248 #-----------------------------------------------------------------------------
1249 # Extra limits to number of jobs running in parallel for some kind os tasks.
1250 # Only supported by Ninja build system currently.
1251 if("${CMAKE_GENERATOR}" MATCHES "Ninja" AND WITH_NINJA_POOL_JOBS)
1252   if(NOT NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS AND
1253      NOT NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS AND
1254      NOT NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
1255     # Try to define good default values.
1256     # Max mem of heavy cpp files compilation: about 2.5GB
1257     # Max mem during linking: about 3.3GB
1258     cmake_host_system_information(RESULT _NUM_CORES QUERY NUMBER_OF_LOGICAL_CORES)
1259     # Note: this gives mem in MB.
1260     cmake_host_system_information(RESULT _TOT_MEM QUERY TOTAL_PHYSICAL_MEMORY)
1261
1262     # Heuristics... the more cores we have, the more free mem we have to keep for the non-heavy tasks too.
1263     if(${_TOT_MEM} LESS 8000 AND ${_NUM_CORES} GREATER 2)
1264       set(_compile_heavy_jobs "1")
1265     elseif(${_TOT_MEM} LESS 16000 AND ${_NUM_CORES} GREATER 4)
1266       set(_compile_heavy_jobs "2")
1267     elseif(${_TOT_MEM} LESS 24000 AND ${_NUM_CORES} GREATER 8)
1268       set(_compile_heavy_jobs "3")
1269     elseif(${_TOT_MEM} LESS 32000 AND ${_NUM_CORES} GREATER 16)
1270       set(_compile_heavy_jobs "4")
1271     elseif(${_TOT_MEM} LESS 64000 AND ${_NUM_CORES} GREATER 32)
1272       set(_compile_heavy_jobs "8")
1273     else()
1274       set(_compile_heavy_jobs "")
1275     endif()
1276
1277     set(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS "${_compile_heavy_jobs}" CACHE STRING
1278         "Define the maximum number of concurrent heavy compilation jobs, for ninja build system (used for some targets which cpp files can take several GB each during compilation)." FORCE)
1279     mark_as_advanced(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
1280     set(_compile_heavy_jobs)
1281
1282     # Only set regular compile jobs if we set heavy jobs, otherwise default (using all cores) if fine.
1283     if(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
1284       math(EXPR _compile_jobs "${_NUM_CORES} - 1")
1285     else()
1286       set(_compile_jobs "")
1287     endif()
1288     set(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS "${_compile_jobs}" CACHE STRING
1289         "Define the maximum number of concurrent compilation jobs, for ninja build system." FORCE)
1290     mark_as_advanced(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS)
1291     set(_compile_jobs)
1292
1293     # In practice, even when there is RAM available, this proves to be quicker than running in parallel
1294     # (due to slow disks accesses).
1295     set(NINJA_MAX_NUM_PARALLEL_LINK_JOBS "1" CACHE STRING
1296         "Define the maximum number of concurrent link jobs, for ninja build system." FORCE)
1297     mark_as_advanced(NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
1298
1299     set(_NUM_CORES)
1300     set(_TOT_MEM)
1301   endif()
1302
1303   if(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS)
1304     set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS})
1305     set(CMAKE_JOB_POOL_COMPILE compile_job_pool)
1306   endif()
1307
1308   if(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
1309     set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_heavy_job_pool=${NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS})
1310   endif()
1311
1312   if(NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
1313     set_property(GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${NINJA_MAX_NUM_PARALLEL_LINK_JOBS})
1314     set(CMAKE_JOB_POOL_LINK link_job_pool)
1315   endif()
1316 endif()
1317
1318 #-----------------------------------------------------------------------------
1319 # Extra compile flags
1320
1321 if(CMAKE_COMPILER_IS_GNUCC)
1322
1323   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ALL -Wall)
1324   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_CAST_ALIGN -Wcast-align)
1325   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_IMPLICIT_FUNCTION_DECLARATION -Werror=implicit-function-declaration)
1326   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_RETURN_TYPE  -Werror=return-type)
1327   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_VLA -Werror=vla)
1328   # system headers sometimes do this, disable for now, was: -Werror=strict-prototypes
1329   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_STRICT_PROTOTYPES  -Wstrict-prototypes)
1330   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_MISSING_PROTOTYPES -Wmissing-prototypes)
1331   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_CHAR_SUBSCRIPTS -Wno-char-subscripts)
1332   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
1333   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith)
1334   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter)
1335   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_WRITE_STRINGS -Wwrite-strings)
1336   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_LOGICAL_OP -Wlogical-op)
1337   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNDEF -Wundef)
1338   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_INIT_SELF -Winit-self)  # needs -Wuninitialized
1339   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_MISSING_INCLUDE_DIRS -Wmissing-include-dirs)
1340   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_DIV_BY_ZERO -Wno-div-by-zero)
1341   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_TYPE_LIMITS -Wtype-limits)
1342   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_FORMAT_SIGN -Wformat-signedness)
1343   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_RESTRICT -Wrestrict)
1344
1345   # C-only.
1346   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_NULL -Wnonnull)
1347   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ABSOLUTE_VALUE -Wabsolute-value)
1348
1349   # gcc 4.2 gives annoying warnings on every file with this
1350   if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3")
1351     ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNINITIALIZED -Wuninitialized)
1352   endif()
1353
1354   # versions before gcc4.6 give many BLI_math warnings
1355   if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.6")
1356     ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_REDUNDANT_DECLS       -Wredundant-decls)
1357     ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_REDUNDANT_DECLS -Wredundant-decls)
1358   endif()
1359
1360   # versions before gcc4.8 include global name-space.
1361   if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.8")
1362     ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_SHADOW -Wshadow)
1363   endif()
1364
1365   # disable because it gives warnings for printf() & friends.
1366   # ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_DOUBLE_PROMOTION -Wdouble-promotion -Wno-error=double-promotion)
1367
1368   if(NOT APPLE)
1369     ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
1370   endif()
1371
1372   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
1373   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
1374   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare)
1375   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_LOGICAL_OP -Wlogical-op)
1376   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_INIT_SELF -Winit-self)  # needs -Wuninitialized
1377   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_MISSING_INCLUDE_DIRS -Wmissing-include-dirs)
1378   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_DIV_BY_ZERO -Wno-div-by-zero)
1379   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_TYPE_LIMITS -Wtype-limits)
1380   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ERROR_RETURN_TYPE  -Werror=return-type)
1381   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_CHAR_SUBSCRIPTS -Wno-char-subscripts)
1382   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
1383   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_POINTER_ARITH -Wpointer-arith)
1384   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNUSED_PARAMETER -Wunused-parameter)
1385   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_WRITE_STRINGS -Wwrite-strings)
1386   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEF -Wundef)
1387   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_FORMAT_SIGN -Wformat-signedness)
1388   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_RESTRICT -Wrestrict)
1389
1390   # gcc 4.2 gives annoying warnings on every file with this
1391   if(NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "4.3")
1392     ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNINITIALIZED -Wuninitialized)
1393   endif()
1394
1395   # causes too many warnings
1396   if(NOT APPLE)
1397     ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNDEF -Wundef)
1398     ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_MISSING_DECLARATIONS -Wmissing-declarations)
1399   endif()
1400
1401   # Use 'ATTR_FALLTHROUGH' macro to suppress.
1402   if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "7.0"))
1403     ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_IMPLICIT_FALLTHROUGH -Wimplicit-fallthrough=5)
1404     ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_IMPLICIT_FALLTHROUGH -Wimplicit-fallthrough=5)
1405   endif()
1406
1407   # flags to undo strict flags
1408   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_DEPRECATED_DECLARATIONS -Wno-deprecated-declarations)
1409   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_PARAMETER        -Wno-unused-parameter)
1410   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_FUNCTION         -Wno-unused-function)
1411   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_TYPE_LIMITS             -Wno-type-limits)
1412   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_INT_IN_BOOL_CONTEXT     -Wno-int-in-bool-context)
1413   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_FORMAT                  -Wno-format)
1414   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_SWITCH                  -Wno-switch)
1415
1416   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_CLASS_MEMACCESS     -Wno-class-memaccess)
1417   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_COMMENT             -Wno-comment)
1418   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_TYPEDEFS     -Wno-unused-local-typedefs)
1419
1420   if(CMAKE_COMPILER_IS_GNUCC AND (NOT "${CMAKE_C_COMPILER_VERSION}" VERSION_LESS "7.0"))
1421     ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_IMPLICIT_FALLTHROUGH    -Wno-implicit-fallthrough)
1422   endif()
1423
1424   if(NOT APPLE)
1425     ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_ERROR_UNUSED_BUT_SET_VARIABLE -Wno-error=unused-but-set-variable)
1426   endif()
1427
1428 elseif(CMAKE_C_COMPILER_ID MATCHES "Clang")
1429
1430   # strange, clang complains these are not supported, but then uses them.
1431   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ALL -Wall)
1432   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_IMPLICIT_FUNCTION_DECLARATION -Werror=implicit-function-declaration)
1433   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ERROR_RETURN_TYPE  -Werror=return-type)
1434   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_AUTOLOGICAL_COMPARE -Wno-tautological-compare)
1435   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
1436   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_CHAR_SUBSCRIPTS -Wno-char-subscripts)
1437   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_STRICT_PROTOTYPES  -Wstrict-prototypes)
1438   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_MISSING_PROTOTYPES -Wmissing-prototypes)
1439   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_PARAMETER -Wunused-parameter)
1440
1441   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
1442   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_AUTOLOGICAL_COMPARE -Wno-tautological-compare)
1443   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_UNKNOWN_PRAGMAS     -Wno-unknown-pragmas)
1444   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_CHAR_SUBSCRIPTS     -Wno-char-subscripts)
1445   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_OVERLOADED_VIRTUAL  -Wno-overloaded-virtual)  # we get a lot of these, if its a problem a dev needs to look into it.
1446   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE        -Wno-sign-compare)
1447   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF    -Wno-invalid-offsetof)
1448
1449   # gives too many unfixable warnings
1450   # ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_UNUSED_MACROS      -Wunused-macros)
1451   # ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_UNUSED_MACROS          -Wunused-macros)
1452
1453   # flags to undo strict flags
1454   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_PARAMETER -Wno-unused-parameter)
1455   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_VARIABLE  -Wno-unused-variable)
1456   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_MACROS    -Wno-unused-macros)
1457
1458   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_MISSING_VARIABLE_DECLARATIONS -Wno-missing-variable-declarations)
1459   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_INCOMPAT_PTR_DISCARD_QUAL -Wno-incompatible-pointer-types-discards-qualifiers)
1460   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNUSED_FUNCTION -Wno-unused-function)
1461   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_INT_TO_VOID_POINTER_CAST -Wno-int-to-void-pointer-cast)
1462   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_MISSING_PROTOTYPES -Wno-missing-prototypes)
1463   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_DUPLICATE_ENUM -Wno-duplicate-enum)
1464   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_UNDEF -Wno-undef)
1465   ADD_CHECK_C_COMPILER_FLAG(C_REMOVE_STRICT_FLAGS C_WARN_NO_MISSING_NORETURN -Wno-missing-noreturn)
1466
1467   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_PRIVATE_FIELD -Wno-unused-private-field)
1468   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_CXX11_NARROWING -Wno-c++11-narrowing)
1469   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_NON_VIRTUAL_DTOR -Wno-non-virtual-dtor)
1470   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_MACROS -Wno-unused-macros)
1471   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_REORDER -Wno-reorder)
1472   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_COMMENT -Wno-comment)
1473   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNUSED_TYPEDEFS -Wno-unused-local-typedefs)
1474   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_UNDEFINED_VAR_TEMPLATE -Wno-undefined-var-template)
1475   ADD_CHECK_CXX_COMPILER_FLAG(CXX_REMOVE_STRICT_FLAGS CXX_WARN_NO_INSTANTIATION_AFTER_SPECIALIZATION -Wno-instantiation-after-specialization)
1476
1477 elseif(CMAKE_C_COMPILER_ID MATCHES "Intel")
1478
1479   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_ALL -Wall)
1480   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_POINTER_ARITH -Wpointer-arith)
1481   ADD_CHECK_C_COMPILER_FLAG(C_WARNINGS C_WARN_NO_UNKNOWN_PRAGMAS -Wno-unknown-pragmas)
1482
1483   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_ALL -Wall)
1484   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_INVALID_OFFSETOF -Wno-invalid-offsetof)
1485   ADD_CHECK_CXX_COMPILER_FLAG(CXX_WARNINGS CXX_WARN_NO_SIGN_COMPARE -Wno-sign-compare)
1486
1487   # disable numbered, false positives
1488   set(C_WARNINGS "${C_WARNINGS} -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
1489   set(CXX_WARNINGS "${CXX_WARNINGS} -wd188,186,144,913,556,858,597,177,1292,167,279,592,94,2722,3199")
1490 elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
1491   # most msvc warnings are C & C++
1492   set(_WARNINGS
1493     # warning level:
1494     "/W3"
1495     "/w34062"  # switch statement contains 'default' but no 'case' labels
1496     "/w34115"  # 'type' : named type definition in parentheses
1497     "/w34189"  # local variable is initialized but not referenced
1498     # disable:
1499     "/wd4018"  # signed/unsigned mismatch
1500     "/wd4146"  # unary minus operator applied to unsigned type, result still unsigned
1501     "/wd4065"  # switch statement contains 'default' but no 'case' labels
1502     "/wd4127"  # conditional expression is constant
1503     "/wd4181"  # qualifier applied to reference type; ignored
1504     "/wd4200"  # zero-sized array in struct/union
1505     "/wd4244"  # conversion from 'type1' to 'type2', possible loss of data
1506     "/wd4267"  # conversion from 'size_t' to 'type', possible loss of data
1507     "/wd4305"  # truncation from 'type1' to 'type2'
1508     "/wd4800"  # forcing value to bool 'true' or 'false'
1509     "/wd4828"  # The file contains a character that is illegal
1510     "/wd4996"  # identifier was declared deprecated
1511     "/wd4661"  # no suitable definition provided for explicit template instantiation request
1512     # errors:
1513     "/we4013"  # 'function' undefined; assuming extern returning int
1514     "/we4133"  # incompatible pointer types
1515     "/we4431"  # missing type specifier - int assumed
1516   )
1517
1518   if(MSVC_VERSION GREATER_EQUAL 1911)
1519     # see https://docs.microsoft.com/en-us/cpp/error-messages/compiler-warnings/c5038?view=vs-2017
1520     set(_WARNINGS "${_WARNINGS} /w35038") # order of initialization in c++ constructors
1521   endif()
1522
1523   string(REPLACE ";" " " _WARNINGS "${_WARNINGS}")
1524   set(C_WARNINGS "${_WARNINGS}")
1525   set(CXX_WARNINGS "${_WARNINGS}")
1526   unset(_WARNINGS)
1527 endif()
1528
1529 # ensure python header is found since detection can fail, this could happen
1530 # with _any_ library but since we used a fixed python version this tends to
1531 # be most problematic.
1532 if(WITH_PYTHON)
1533   if(NOT EXISTS "${PYTHON_INCLUDE_DIR}/Python.h")
1534     message(FATAL_ERROR
1535       "Missing: \"${PYTHON_INCLUDE_DIR}/Python.h\",\n"
1536       "Set the cache entry 'PYTHON_INCLUDE_DIR' to point "
1537       "to a valid python include path. Containing "
1538       "Python.h for python version \"${PYTHON_VERSION}\""
1539     )
1540   endif()
1541
1542   if(WIN32 OR APPLE)
1543     # Windows and macOS have this bundled with Python libraries.
1544   elseif((WITH_PYTHON_INSTALL AND WITH_PYTHON_INSTALL_NUMPY) OR (WITH_AUDASPACE AND NOT WITH_SYSTEM_AUDASPACE))
1545     if(("${PYTHON_NUMPY_PATH}" STREQUAL "") OR (${PYTHON_NUMPY_PATH} MATCHES NOTFOUND))
1546       find_python_package(numpy)
1547       unset(PYTHON_NUMPY_INCLUDE_DIRS CACHE)
1548       set(PYTHON_NUMPY_INCLUDE_DIRS ${PYTHON_NUMPY_PATH}/numpy/core/include CACHE PATH "Path to the include directory of the numpy module")
1549       mark_as_advanced(PYTHON_NUMPY_INCLUDE_DIRS)
1550     endif()
1551   endif()
1552
1553   if(WIN32 OR APPLE)
1554     # pass, we have this in lib/python/site-packages
1555   elseif(WITH_PYTHON_INSTALL_REQUESTS)
1556     find_python_package(requests)
1557   endif()
1558 endif()
1559
1560 if(MSVC)
1561   # MSVC needs to be tested first, since clang on windows will
1562   # match the compiler test below but clang-cl does not accept -std=c++11
1563   # since it is on by default and cannot be turned off.
1564   #
1565   # Nothing special is needed, C++11 features are available by default.
1566 elseif(
1567   CMAKE_COMPILER_IS_GNUCC OR
1568   CMAKE_C_COMPILER_ID MATCHES "Clang" OR
1569   CMAKE_C_COMPILER_ID MATCHES "Intel"
1570 )
1571   # TODO(sergey): Do we want c++11 or gnu-c++11 here?
1572   set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
1573 else()
1574   message(FATAL_ERROR "Unknown compiler ${CMAKE_C_COMPILER_ID}, can't enable C++11 build")
1575 endif()
1576
1577 # Visual Studio has all standards it supports available by default
1578 # Clang on windows copies this behavior and does not support these switches
1579 if(
1580   CMAKE_COMPILER_IS_GNUCC OR
1581   (CMAKE_C_COMPILER_ID MATCHES "Clang" AND (NOT MSVC)) OR
1582   (CMAKE_C_COMPILER_ID MATCHES "Intel")
1583 )
1584   # Use C11 + GNU extensions, works with GCC, Clang, ICC
1585   set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu11")
1586 endif()
1587
1588 if(UNIX AND NOT APPLE)
1589   if(NOT WITH_CXX11_ABI)
1590     set(PLATFORM_CFLAGS "${PLATFORM_CFLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")
1591   endif()
1592 endif()
1593
1594 # Include warnings first, so its possible to disable them with user defined flags
1595 # eg: -Wno-uninitialized
1596 set(CMAKE_C_FLAGS "${C_WARNINGS} ${CMAKE_C_FLAGS} ${PLATFORM_CFLAGS}")
1597 set(CMAKE_CXX_FLAGS "${CXX_WARNINGS} ${CMAKE_CXX_FLAGS} ${PLATFORM_CFLAGS}")
1598
1599 # defined above, platform specific but shared names
1600 mark_as_advanced(
1601   CYCLES_OSL
1602   OSL_LIB_EXEC
1603   OSL_COMPILER
1604   OSL_LIB_COMP
1605   OSL_LIB_QUERY
1606   OSL_INCLUDE_DIR
1607 )
1608
1609 mark_as_advanced(
1610   LLVM_CONFIG
1611   LLVM_ROOT_DIR
1612   LLVM_LIBRARY
1613   LLVM_VERSION
1614 )
1615
1616 #-------------------------------------------------------------------------------
1617 # Global Defines
1618
1619 # better not set includes here but this debugging option is off by default.
1620 if(WITH_CXX_GUARDEDALLOC)
1621   include_directories(${CMAKE_SOURCE_DIR}/intern/guardedalloc)
1622   add_definitions(-DWITH_CXX_GUARDEDALLOC)
1623 endif()
1624
1625 if(WITH_ASSERT_ABORT)
1626   add_definitions(-DWITH_ASSERT_ABORT)
1627 endif()
1628
1629 # message(STATUS "Using CFLAGS: ${CMAKE_C_FLAGS}")
1630 # message(STATUS "Using CXXFLAGS: ${CMAKE_CXX_FLAGS}")
1631
1632 #-----------------------------------------------------------------------------
1633 # Libraries
1634
1635 if(WITH_GTESTS)
1636   include(GTestTesting)
1637 endif()
1638
1639 if(WITH_BLENDER)
1640   add_subdirectory(intern)
1641   add_subdirectory(extern)
1642
1643   # source after intern and extern to gather all
1644   # internal and external library information first, for test linking
1645   add_subdirectory(source)
1646 elseif(WITH_CYCLES_STANDALONE)
1647   add_subdirectory(intern/cycles)
1648   add_subdirectory(extern/clew)
1649   if(WITH_CUDA_DYNLOAD)
1650     add_subdirectory(extern/cuew)
1651   endif()
1652   if(NOT WITH_SYSTEM_GLEW)
1653     add_subdirectory(extern/glew)
1654   endif()
1655 endif()
1656
1657 #-----------------------------------------------------------------------------
1658 # Blender Application
1659 if(WITH_BLENDER)
1660   add_subdirectory(source/creator)
1661 endif()
1662
1663
1664 #-----------------------------------------------------------------------------
1665 # Testing
1666 add_subdirectory(tests)
1667
1668
1669 #-----------------------------------------------------------------------------
1670 # Define 'heavy' submodules (for Ninja builder when using pools).
1671 setup_heavy_lib_pool()
1672
1673
1674 #-----------------------------------------------------------------------------
1675 # CPack for generating packages
1676 include(build_files/cmake/packaging.cmake)
1677
1678 #-----------------------------------------------------------------------------
1679 # Use dynamic loading for OpenMP
1680 if(WITH_BLENDER)
1681   openmp_delayload(blender)
1682 endif()
1683
1684 #-----------------------------------------------------------------------------
1685 # Print Final Configuration
1686
1687 if(FIRST_RUN)
1688
1689   set(_config_msg "\nBlender Configuration\n=====================")
1690
1691   function(info_cfg_option
1692     _setting
1693     )
1694
1695     set(_msg "  - ${_setting}")
1696     string(LENGTH "${_msg}" _len)
1697     while("32" GREATER "${_len}")
1698       set(_msg "${_msg} ")
1699       math(EXPR _len "${_len} + 1")
1700     endwhile()
1701
1702     set(_config_msg "${_config_msg}\n${_msg}${${_setting}}" PARENT_SCOPE)
1703   endfunction()
1704
1705   function(info_cfg_text
1706     _text
1707     )
1708
1709     set(_config_msg "${_config_msg}\n\n  ${_text}" PARENT_SCOPE)
1710   endfunction()
1711
1712   message(STATUS "C Compiler:   \"${CMAKE_C_COMPILER_ID}\"")
1713   message(STATUS "C++ Compiler: \"${CMAKE_CXX_COMPILER_ID}\"")
1714
1715   info_cfg_text("Build Options:")
1716   info_cfg_option(WITH_BULLET)
1717   info_cfg_option(WITH_IK_SOLVER)
1718   info_cfg_option(WITH_IK_ITASC)
1719   info_cfg_option(WITH_OPENCOLLADA)
1720   info_cfg_option(WITH_FFTW3)
1721   info_cfg_option(WITH_INTERNATIONAL)
1722   info_cfg_option(WITH_INPUT_NDOF)
1723   info_cfg_option(WITH_CYCLES)
1724   info_cfg_option(WITH_FREESTYLE)
1725   info_cfg_option(WITH_OPENCOLORIO)
1726   info_cfg_option(WITH_XR_OPENXR)
1727   info_cfg_option(WITH_OPENIMAGEDENOISE)
1728   info_cfg_option(WITH_OPENVDB)
1729   info_cfg_option(WITH_ALEMBIC)
1730   info_cfg_option(WITH_QUADRIFLOW)
1731   info_cfg_option(WITH_USD)
1732
1733   info_cfg_text("Compiler Options:")
1734   info_cfg_option(WITH_BUILDINFO)
1735   info_cfg_option(WITH_OPENMP)
1736
1737   info_cfg_text("System Options:")
1738   info_cfg_option(WITH_INSTALL_PORTABLE)
1739   info_cfg_option(WITH_X11_ALPHA)
1740   info_cfg_option(WITH_X11_XF86VMODE)
1741   info_cfg_option(WITH_X11_XFIXES)
1742   info_cfg_option(WITH_X11_XINPUT)
1743   info_cfg_option(WITH_MEM_JEMALLOC)
1744   info_cfg_option(WITH_MEM_VALGRIND)
1745   info_cfg_option(WITH_SYSTEM_GLEW)
1746
1747   info_cfg_text("Image Formats:")
1748   info_cfg_option(WITH_OPENIMAGEIO)
1749   info_cfg_option(WITH_IMAGE_CINEON)
1750   info_cfg_option(WITH_IMAGE_DDS)
1751   info_cfg_option(WITH_IMAGE_HDR)
1752   info_cfg_option(WITH_IMAGE_OPENEXR)
1753   info_cfg_option(WITH_IMAGE_OPENJPEG)
1754   info_cfg_option(WITH_IMAGE_TIFF)
1755
1756   info_cfg_text("Audio:")
1757   info_cfg_option(WITH_OPENAL)
1758   info_cfg_option(WITH_SDL)
1759   info_cfg_option(WITH_SDL_DYNLOAD)
1760   info_cfg_option(WITH_JACK)
1761   info_cfg_option(WITH_JACK_DYNLOAD)
1762   info_cfg_option(WITH_CODEC_AVI)
1763   info_cfg_option(WITH_CODEC_FFMPEG)
1764   info_cfg_option(WITH_CODEC_SNDFILE)
1765
1766   info_cfg_text("Compression:")
1767   info_cfg_option(WITH_LZMA)
1768   info_cfg_option(WITH_LZO)
1769
1770   info_cfg_text("Python:")
1771   info_cfg_option(WITH_PYTHON_INSTALL)
1772   info_cfg_option(WITH_PYTHON_INSTALL_NUMPY)
1773   info_cfg_option(WITH_PYTHON_MODULE)
1774   info_cfg_option(WITH_PYTHON_SAFETY)
1775   if(APPLE)
1776     info_cfg_option(WITH_PYTHON_FRAMEWORK)
1777   endif()
1778
1779   info_cfg_text("Modifiers:")
1780   info_cfg_option(WITH_MOD_REMESH)
1781   info_cfg_option(WITH_MOD_FLUID)
1782   info_cfg_option(WITH_MOD_OCEANSIM)
1783
1784   info_cfg_text("OpenGL:")
1785   info_cfg_option(WITH_GLEW_ES)
1786   info_cfg_option(WITH_GL_EGL)
1787   info_cfg_option(WITH_GL_PROFILE_ES20)
1788   if(WIN32)
1789     info_cfg_option(WITH_GL_ANGLE)
1790   endif()
1791
1792   info_cfg_text("")
1793
1794   message("${_config_msg}")
1795 endif()
1796
1797 if(0)
1798   print_all_vars()
1799 endif()