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