Fix T65996: metaballs converted to meshes appear to render at an incorrect isosurface.
[blender.git] / CMakeLists.txt
index 052222b..4dd165b 100644 (file)
@@ -558,13 +558,24 @@ if(WIN32)
   set(WINDOWS_CODESIGN_PFX_PASSWORD CACHE STRING  "password for pfx file used for codesigning.")
   mark_as_advanced(WINDOWS_CODESIGN_PFX_PASSWORD)
 
   set(WINDOWS_CODESIGN_PFX_PASSWORD CACHE STRING  "password for pfx file used for codesigning.")
   mark_as_advanced(WINDOWS_CODESIGN_PFX_PASSWORD)
 
-  option(WINDOWS_USE_VISUAL_STUDIO_FOLDERS "Organize the visual studio project according to source folders." ON)
-  mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_FOLDERS)
+  option(WINDOWS_USE_VISUAL_STUDIO_PROJECT_FOLDERS "Organize the visual studio projects according to source folder structure." ON)
+  mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_PROJECT_FOLDERS)
+
+  option(WINDOWS_USE_VISUAL_STUDIO_SOURCE_FOLDERS "Organize the source files in filters matching the source folders." ON)
+  mark_as_advanced(WINDOWS_USE_VISUAL_STUDIO_SOURCE_FOLDERS)
 
   option(WINDOWS_PYTHON_DEBUG "Include the files needed for debugging python scripts with visual studio 2017+." OFF)
   mark_as_advanced(WINDOWS_PYTHON_DEBUG)
 endif()
 
 
   option(WINDOWS_PYTHON_DEBUG "Include the files needed for debugging python scripts with visual studio 2017+." OFF)
   mark_as_advanced(WINDOWS_PYTHON_DEBUG)
 endif()
 
+# The following only works with the Ninja generator in CMake >= 3.0.
+if("${CMAKE_GENERATOR}" MATCHES "Ninja")
+  option(WITH_NINJA_POOL_JOBS
+         "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)."
+         OFF)
+  mark_as_advanced(WITH_NINJA_POOL_JOBS)
+endif()
+
 # avoid using again
 option_defaults_clear()
 
 # avoid using again
 option_defaults_clear()
 
@@ -729,7 +740,7 @@ endif()
 # Auto-enable CUDA dynload if toolkit is not found.
 if(NOT WITH_CUDA_DYNLOAD)
   find_package(CUDA)
 # Auto-enable CUDA dynload if toolkit is not found.
 if(NOT WITH_CUDA_DYNLOAD)
   find_package(CUDA)
-  if (NOT CUDA_FOUND)
+  if(NOT CUDA_FOUND)
     message("CUDA toolkit not found, using dynamic runtime loading of libraries instead")
     set(WITH_CUDA_DYNLOAD ON)
   endif()
     message("CUDA toolkit not found, using dynamic runtime loading of libraries instead")
     set(WITH_CUDA_DYNLOAD ON)
   endif()
@@ -804,13 +815,19 @@ set(PLATFORM_LINKLIBS "")
 set(PLATFORM_LINKFLAGS "")
 set(PLATFORM_LINKFLAGS_DEBUG "")
 
 set(PLATFORM_LINKFLAGS "")
 set(PLATFORM_LINKFLAGS_DEBUG "")
 
-if (NOT CMAKE_BUILD_TYPE MATCHES "Release")
+if(NOT CMAKE_BUILD_TYPE MATCHES "Release")
   if(WITH_COMPILER_ASAN)
     set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COMPILER_ASAN_CFLAGS}")
     set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CFLAGS}")
 
     set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COMPILER_ASAN_CXXFLAGS}")
     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CXXFLAGS}")
   if(WITH_COMPILER_ASAN)
     set(CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} ${COMPILER_ASAN_CFLAGS}")
     set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CFLAGS}")
 
     set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} ${COMPILER_ASAN_CXXFLAGS}")
     set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} ${COMPILER_ASAN_CXXFLAGS}")
+    if(WITH_CYCLES_OSL)
+      # With OSL, Cycles disables rtti in some modules, wich then breaks at linking
+      # when trying to use vptr sanitizer (included into 'undefined' general option).
+      set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-sanitize=vptr")
+      set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} -fno-sanitize=vptr")
+    endif()
     if(MSVC)
       set(COMPILER_ASAN_LINKER_FLAGS "/FUNCTIONPADMIN:6")
     endif()
     if(MSVC)
       set(COMPILER_ASAN_LINKER_FLAGS "/FUNCTIONPADMIN:6")
     endif()
@@ -948,9 +965,9 @@ if(MSVC)
   # for some reason this fails on msvc
   add_definitions(-D__LITTLE_ENDIAN__)
 
   # for some reason this fails on msvc
   add_definitions(-D__LITTLE_ENDIAN__)
 
-# OSX-Note: as we do cross-compiling with specific set architecture,
-# endianess-detection and auto-setting is counterproductive
-# so we just set endianness according CMAKE_OSX_ARCHITECTURES
+  # OSX-Note: as we do cross-compiling with specific set architecture,
+  # endianess-detection and auto-setting is counterproductive
+  # so we just set endianness according CMAKE_OSX_ARCHITECTURES
 
 elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
   add_definitions(-D__LITTLE_ENDIAN__)
 
 elseif(CMAKE_OSX_ARCHITECTURES MATCHES i386 OR CMAKE_OSX_ARCHITECTURES MATCHES x86_64)
   add_definitions(-D__LITTLE_ENDIAN__)
@@ -1280,6 +1297,76 @@ if(WITH_LIBMV)
   set(CERES_DEFINES -DCERES_STD_UNORDERED_MAP)
 endif()
 
   set(CERES_DEFINES -DCERES_STD_UNORDERED_MAP)
 endif()
 
+#-----------------------------------------------------------------------------
+# Extra limits to number of jobs running in parallel for some kind os tasks.
+# Only supported by Ninja build system currently.
+if("${CMAKE_GENERATOR}" MATCHES "Ninja" AND WITH_NINJA_POOL_JOBS)
+  if(NOT NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS AND
+     NOT NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS AND
+     NOT NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
+    # Try to define good default values.
+    # Max mem of heavy cpp files compilation: about 2.5GB
+    # Max mem during linking: about 3.3GB
+    cmake_host_system_information(RESULT _NUM_CORES QUERY NUMBER_OF_LOGICAL_CORES)
+    # Note: this gives mem in MB.
+    cmake_host_system_information(RESULT _TOT_MEM QUERY TOTAL_PHYSICAL_MEMORY)
+
+    # Heuristics... the more cores we have, the more free mem we have to keep for the non-heavy tasks too.
+    if(${_TOT_MEM} LESS 8000 AND ${_NUM_CORES} GREATER 2)
+      set(_compile_heavy_jobs "1")
+    elseif(${_TOT_MEM} LESS 16000 AND ${_NUM_CORES} GREATER 4)
+      set(_compile_heavy_jobs "2")
+    elseif(${_TOT_MEM} LESS 24000 AND ${_NUM_CORES} GREATER 8)
+      set(_compile_heavy_jobs "3")
+    elseif(${_TOT_MEM} LESS 32000 AND ${_NUM_CORES} GREATER 16)
+      set(_compile_heavy_jobs "4")
+    elseif(${_TOT_MEM} LESS 64000 AND ${_NUM_CORES} GREATER 32)
+      set(_compile_heavy_jobs "8")
+    else()
+      set(_compile_heavy_jobs "")
+    endif()
+
+    set(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS "${_compile_heavy_jobs}" CACHE STRING
+        "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)
+    mark_as_advanced(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
+    set(_compile_heavy_jobs)
+
+    # Only set regular compile jobs if we set heavy jobs, otherwise default (using all cores) if fine.
+    if(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
+      math(EXPR _compile_jobs "${_NUM_CORES} - 1")
+    else()
+      set(_compile_jobs "")
+    endif()
+    set(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS "${_compile_jobs}" CACHE STRING
+        "Define the maximum number of concurrent compilation jobs, for ninja build system." FORCE)
+    mark_as_advanced(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS)
+    set(_compile_jobs)
+
+    # In practice, even when there is RAM available, this proves to be quicker than running in parallel
+    # (due to slow disks accesses).
+    set(NINJA_MAX_NUM_PARALLEL_LINK_JOBS "1" CACHE STRING
+        "Define the maximum number of concurrent link jobs, for ninja build system." FORCE)
+    mark_as_advanced(NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
+
+    set(_NUM_CORES)
+    set(_TOT_MEM)
+  endif()
+
+  if(NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS)
+    set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_job_pool=${NINJA_MAX_NUM_PARALLEL_COMPILE_JOBS})
+    set(CMAKE_JOB_POOL_COMPILE compile_job_pool)
+  endif()
+
+  if(NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS)
+    set_property(GLOBAL APPEND PROPERTY JOB_POOLS compile_heavy_job_pool=${NINJA_MAX_NUM_PARALLEL_COMPILE_HEAVY_JOBS})
+  endif()
+
+  if(NINJA_MAX_NUM_PARALLEL_LINK_JOBS)
+    set_property(GLOBAL APPEND PROPERTY JOB_POOLS link_job_pool=${NINJA_MAX_NUM_PARALLEL_LINK_JOBS})
+    set(CMAKE_JOB_POOL_LINK link_job_pool)
+  endif()
+endif()
+
 #-----------------------------------------------------------------------------
 # Extra compile flags
 
 #-----------------------------------------------------------------------------
 # Extra compile flags
 
@@ -1468,6 +1555,7 @@ elseif(CMAKE_C_COMPILER_ID MATCHES "MSVC")
     "/wd4800"  # forcing value to bool 'true' or 'false'
     "/wd4828"  # The file contains a character that is illegal
     "/wd4996"  # identifier was declared deprecated
     "/wd4800"  # forcing value to bool 'true' or 'false'
     "/wd4828"  # The file contains a character that is illegal
     "/wd4996"  # identifier was declared deprecated
+    "/wd4661"  # no suitable definition provided for explicit template instantiation request
     # errors:
     "/we4013"  # 'function' undefined; assuming extern returning int
     "/we4133"  # incompatible pointer types
     # errors:
     "/we4013"  # 'function' undefined; assuming extern returning int
     "/we4133"  # incompatible pointer types
@@ -1615,6 +1703,11 @@ endif()
 add_subdirectory(tests)
 
 
 add_subdirectory(tests)
 
 
+#-----------------------------------------------------------------------------
+# Define 'heavy' submodules (for Ninja builder when using pools).
+setup_heavy_lib_pool()
+
+
 #-----------------------------------------------------------------------------
 # CPack for generating packages
 include(build_files/cmake/packaging.cmake)
 #-----------------------------------------------------------------------------
 # CPack for generating packages
 include(build_files/cmake/packaging.cmake)