# ======================================================================= # WARNING WARNING WARNING WARNING WARNING WARNING # ======================================================================= # Remember to put on SAFETY GOGGLES before looking at this file. You # are most certainly not expected to read or understand any of it. # ======================================================================= # # This CMake file is responsible for compiling dependency libraries and # setting up suitable compiler flags for various platforms. You do not # need to read or change anything in this file; see CMakeLists.txt in # the main Nori folder instead. include(CheckCXXCompilerFlag) if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/openexr/OpenEXR") message(FATAL_ERROR "The Nori dependencies are missing! " "You probably did not clone the project with --recursive. It is possible to recover " "by calling \"git submodule update --init --recursive\"") endif() # Set a default build configuration (Release) if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) message(STATUS "Setting build type to 'Release' as none was specified.") set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build." FORCE) set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug" "Release" "MinSizeRel" "RelWithDebInfo") endif() string(TOUPPER "${CMAKE_BUILD_TYPE}" U_CMAKE_BUILD_TYPE) # Enable folders for projects in Visual Studio if (CMAKE_GENERATOR MATCHES "Visual Studio") set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif() if (APPLE) set(CMAKE_MACOSX_RPATH ON) endif() if (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") CHECK_CXX_COMPILER_FLAG("-std=c++14" HAS_CPP14_FLAG) CHECK_CXX_COMPILER_FLAG("-std=c++11" HAS_CPP11_FLAG) if (HAS_CPP14_FLAG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14") elseif (HAS_CPP11_FLAG) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") else() message(FATAL_ERROR "Unsupported compiler -- Nori requires C++11 support!") endif() # Prefer libc++ in conjunction with Clang if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") CHECK_CXX_COMPILER_FLAG("-stdlib=libc++" HAS_LIBCPP) if (HAS_LIBCPP) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++ -D_LIBCPP_VERSION") set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -stdlib=libc++") set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -stdlib=libc++") message(STATUS "Nori: using libc++.") else() message(WARNING "libc++ is recommended in conjunction with clang. Please insteall the libc++ development headers, provided e.g. by the packages 'libc++-dev' and 'libc++abi-dev' on Debian/Ubuntu.") endif() endif() # Enable link time optimization and set the default symbol # visibility to hidden (very important to obtain small binaries) if (NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) # Default symbol visibility set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fvisibility=hidden") endif() # Disable specific GCC 7 warnings if (CMAKE_COMPILER_IS_GNUCC AND CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 7.0) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-deprecated-declarations -Wno-misleading-indentation -Wformat-truncation=0 -Wno-int-in-bool-context -Wimplicit-fallthrough=0") endif() endif() # Sanitize build environment for static build with C++11 if (MSVC) # Disable annoying secure CRT warnings set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D_CRT_SECURE_NO_WARNINGS") # We'll select the TBB library ourselves set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /D__TBB_NO_IMPLICIT_LINKAGE") # Parallel build on MSVC (all targets) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") if (NOT CMAKE_SIZEOF_VOID_P EQUAL 8) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /arch:SSE2") # Disable Eigen vectorization for Windows 32 bit builds (issues with unaligned access segfaults) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DEIGEN_DONT_ALIGN") endif() # Static build set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO) foreach(CompilerFlag ${CompilerFlags}) string(REPLACE "/MD" "/MT" ${CompilerFlag} "${${CompilerFlag}}") endforeach() endif() if (WIN32) # Build zlib (only on Windows) set(ZLIB_BUILD_STATIC_LIBS ON CACHE BOOL " " FORCE) set(ZLIB_BUILD_SHARED_LIBS OFF CACHE BOOL " " FORCE) add_subdirectory(zlib) set(ZLIB_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/zlib" CACHE PATH " " FORCE) if (CMAKE_GENERATOR STREQUAL "Ninja") set(ZLIB_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/zlib/zlibstatic.lib" CACHE FILEPATH " " FORCE) else() set(ZLIB_LIBRARY "${CMAKE_CURRENT_BINARY_DIR}/zlib/$/zlibstatic.lib" CACHE FILEPATH " " FORCE) endif() set_property(TARGET zlibstatic PROPERTY FOLDER "dependencies") include_directories(${ZLIB_INCLUDE_DIR} "${CMAKE_CURRENT_BINARY_DIR}/zlib") endif() # Build OpenER set(ILMBASE_BUILD_SHARED_LIBS OFF CACHE BOOL " " FORCE) set(OPENEXR_BUILD_SHARED_LIBS OFF CACHE BOOL " " FORCE) set(ILMBASE_NAMESPACE_VERSIONING OFF CACHE BOOL " " FORCE) set(OPENEXR_NAMESPACE_VERSIONING OFF CACHE BOOL " " FORCE) add_subdirectory(openexr) set_property(TARGET IexMath eLut toFloat b44ExpLogTable dwaLookups IlmThread Half Iex Imath IlmImf PROPERTY FOLDER "dependencies") # Build Thread Building Blocks (main shared libraries only) set(TBB_BUILD_SHARED OFF CACHE BOOL " " FORCE) set(TBB_BUILD_STATIC ON CACHE BOOL " " FORCE) set(TBB_BUILD_TBBMALLOC OFF CACHE BOOL " " FORCE) set(TBB_BUILD_TBBMALLOC_PROXY OFF CACHE BOOL " " FORCE) set(TBB_BUILD_TESTS OFF CACHE BOOL " " FORCE) add_subdirectory(tbb) set_property(TARGET tbb_static tbb_def_files PROPERTY FOLDER "dependencies") if (APPLE) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGL_SILENCE_DEPRECATION=1") endif() # Build NanoGUI # Use OpenGL backend for UI. In the future, this can be removed to use Metal on MacOS set(NANOGUI_BACKEND "OpenGL" CACHE BOOL " " FORCE) set(NANOGUI_BUILD_EXAMPLES OFF CACHE BOOL " " FORCE) set(NANOGUI_BUILD_SHARED OFF CACHE BOOL " " FORCE) set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL " " FORCE) add_subdirectory(nanogui) set_property(TARGET glfw glfw_objects nanogui PROPERTY FOLDER "dependencies") # Build the pugixml parser add_library(pugixml STATIC pugixml/src/pugixml.cpp) set_property(TARGET pugixml PROPERTY LIBRARY_OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/pugixml") set_property(TARGET pugixml PROPERTY FOLDER "dependencies") set(OPENEXR_INCLUDE_DIRS ${CMAKE_CURRENT_SOURCE_DIR}/openexr/IlmBase/Imath ${CMAKE_CURRENT_SOURCE_DIR}/openexr/IlmBase/Iex ${CMAKE_CURRENT_SOURCE_DIR}/openexr/IlmBase/Half ${CMAKE_CURRENT_SOURCE_DIR}/openexr/OpenEXR/IlmImf ${CMAKE_CURRENT_BINARY_DIR}/openexr/OpenEXR/config ${CMAKE_CURRENT_BINARY_DIR}/openexr/IlmBase/config) set(PCG32_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/pcg32) set(TFM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tinyformat) set(HYPOTHESIS_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/hypothesis) set(GLFW_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nanogui/ext/glfw/include) set(GLEW_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nanogui/ext/glew/include) set(NANOVG_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nanogui/ext/nanovg/src) set(STB_IMAGE_WRITE_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nanogui/ext/nanovg/example) set(NANOGUI_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/nanogui/include) set(EIGEN_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/eigen) set(TBB_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/tbb/include) set(FILESYSTEM_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/filesystem) set(PUGIXML_INCLUDE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/pugixml/src) # Compile remainder of the codebase with compiler warnings turned on if(MSVC) if(CMAKE_CXX_FLAGS MATCHES "/W[0-4]") string(REGEX REPLACE "/W[0-4]" "/W4" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") else() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /W4") endif() elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU") # Re-enable disabled warnings # if(CMAKE_CXX_FLAGS MATCHES "-Wno-[^ ]+") # string(REGEX REPLACE "-Wno-[^ ]+" "" CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS}") # endif() set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -Wno-unused-parameter") if (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-gnu-anonymous-struct -Wno-c99-extensions -Wno-nested-anon-types -Wno-deprecated-register") endif() endif() set(CompilerFlags CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO COMPILE_DEFINITIONS U_CMAKE_BUILD_TYPE CMAKE_MACOSX_RPATH OPENEXR_INCLUDE_DIRS PCG32_INCLUDE_DIR TFM_INCLUDE_DIR HYPOTHESIS_INCLUDE_DIR GLFW_INCLUDE_DIR GLEW_INCLUDE_DIR NANOVG_INCLUDE_DIR NANOGUI_EXTRA_INCS NANOGUI_EXTRA_DEFS NANOGUI_EXTRA_LIBS NANOGUI_INCLUDE_DIR EIGEN_INCLUDE_DIR STB_IMAGE_WRITE_INCLUDE_DIR TBB_INCLUDE_DIR FILESYSTEM_INCLUDE_DIR PUGIXML_INCLUDE_DIR ) foreach(CompilerFlag ${CompilerFlags}) set(${CompilerFlag} "${${CompilerFlag}}" PARENT_SCOPE) endforeach()