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