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