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