cmake_minimum_required (VERSION 2.8.3) project(InstantMeshes) option(INSTANT_MESHES_DEV_MODE "Instant meshes developer mode" OFF) 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) if(NOT IS_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui/ext/glfw") message(FATAL_ERROR "The Instant Meshes dependency repositories (NanoGUI, GLFW, etc.) are missing! " "You probably did not clone the project with --recursive. It is possible to recover " "by calling \"git submodule update --init --recursive\"") endif() # Enable folders for projects in Visual Studio if (CMAKE_GENERATOR MATCHES "Visual Studio") set_property(GLOBAL PROPERTY USE_FOLDERS ON) endif() # Sanitize build environment for static build with C++11 if (MSVC) add_definitions (/D "_CRT_SECURE_NO_WARNINGS") add_definitions (/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() elseif(APPLE) # Try to auto-detect a suitable SDK # Commented out for now -- causes a too new SDK to be selected on AppVeyor #execute_process(COMMAND bash -c "xcodebuild -version -sdk | grep MacOSX | grep Path | head -n 1 | cut -f 2 -d ' '" OUTPUT_VARIABLE CMAKE_OSX_SYSROOT) #string(REGEX REPLACE "(\r?\n)+$" "" CMAKE_OSX_SYSROOT "${CMAKE_OSX_SYSROOT}") #string(REGEX REPLACE "^.*X([0-9.]*).sdk$" "\\1" CMAKE_OSX_DEPLOYMENT_TARGET "${CMAKE_OSX_SYSROOT}") endif() # Enable C++11 mode on GCC / Clang if (CMAKE_CXX_COMPILER_ID MATCHES "GNU") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11") elseif (CMAKE_CXX_COMPILER_ID MATCHES "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") endif() # Build NanoGUI set(NANOGUI_BUILD_EXAMPLE OFF CACHE BOOL " " FORCE) set(NANOGUI_BUILD_SHARED OFF CACHE BOOL " " FORCE) set(NANOGUI_BUILD_PYTHON OFF CACHE BOOL " " FORCE) add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui ext_build/nanogui) set_property(TARGET nanogui glfw glfw_objects bin2c PROPERTY FOLDER "dependencies") # Build TBB set(TBB_BUILD_STATIC ON CACHE BOOL " " FORCE) set(TBB_BUILD_SHARED OFF 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(${CMAKE_CURRENT_SOURCE_DIR}/ext/tbb ext_build/tbb) set_property(TARGET tbb_static tbb_def_files PROPERTY FOLDER "dependencies") # Compile instant meshes with various 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") 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") endif() endif() # Header file directories of dependency libraries include_directories( # NanoGUI ${CMAKE_CURRENT_SOURCE_DIR}/ext/nanogui/include # NanoGUI dependencies (Eigen, GLFW, NanoVG, GLAD?) ${NANOGUI_EXTRA_INCS} # Intel Thread Building Blocks ${CMAKE_CURRENT_SOURCE_DIR}/ext/tbb/include # Disjoint set data structure ${CMAKE_CURRENT_SOURCE_DIR}/ext/dset # Parallel stable sort ${CMAKE_CURRENT_SOURCE_DIR}/ext/pss # Pseudorandom number generator ${CMAKE_CURRENT_SOURCE_DIR}/ext/pcg32 # RPLY mesh I/O library ${CMAKE_CURRENT_SOURCE_DIR}/ext/rply # Half precision type ${CMAKE_CURRENT_SOURCE_DIR}/ext/half # Resource file ${CMAKE_CURRENT_BINARY_DIR} ) # Run bin2c on resource files set(PNG_FILES ${CMAKE_CURRENT_SOURCE_DIR}/resources/comb.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/delete_stroke.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/loadmesh.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/scare.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/sing_dir.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/sing_pos.png ${CMAKE_CURRENT_SOURCE_DIR}/resources/instantmeshes.png) file(GLOB FRAG_FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/*.frag") file(GLOB VERT_FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/*.vert") file(GLOB GEO_FILES "${CMAKE_CURRENT_SOURCE_DIR}/resources/*.geo") set(IM_RESOURCES ${PNG_FILES} ${FRAG_FILES} ${VERT_FILES} ${GEO_FILES}) add_custom_command( OUTPUT resources.cpp COMMAND bin2c ARGS resources.cpp resources.h ${IM_RESOURCES} DEPENDS bin2c ${IM_RESOURCES} COMMENT "Running bin2c" PRE_BUILD VERBATIM) if (INSTANT_MESHES_DEV_MODE) add_definitions(-DDEV_MODE) endif() # Resource file (icons etc.) set(EXTRA_SOURCE "") if (APPLE) set(EXTRA_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/resources/im.icns") elseif(WIN32) set(EXTRA_SOURCE "${CMAKE_CURRENT_SOURCE_DIR}/resources/im.rc") endif() add_executable(InstantMeshes MACOSX_BUNDLE resources.cpp src/glutil.h src/glutil.cpp src/widgets.h src/widgets.cpp src/aabb.h src/main.cpp src/common.h src/meshio.h src/meshio.cpp src/normal.h src/normal.cpp src/adjacency.h src/adjacency.cpp src/meshstats.h src/meshstats.cpp src/hierarchy.h src/hierarchy.cpp src/extract.h src/extract.cpp src/viewer.h src/viewer.cpp src/field.h src/field.cpp src/bvh.h src/bvh.cpp src/subdivide.h src/subdivide.cpp src/reorder.h src/reorder.cpp src/serializer.h src/serializer.cpp src/batch.h src/batch.cpp src/smoothcurve.h src/smoothcurve.cpp src/cleanup.h src/cleanup.cpp src/dedge.h src/dedge.cpp ext/rply/rply.c ${EXTRA_SOURCE}) add_definitions(${NANOGUI_EXTRA_DEFS}) target_link_libraries(InstantMeshes tbb_static nanogui ${NANOGUI_EXTRA_LIBS}) set_target_properties(InstantMeshes PROPERTIES OUTPUT_NAME "Instant Meshes") if (WIN32) # Quench some warnings on MSVC if (MSVC) set_source_files_properties(ext/rply/rply.c PROPERTIES COMPILE_FLAGS "/wd4127") endif() elseif (APPLE) # Build an application bundle on OSX set_target_properties(InstantMeshes PROPERTIES MACOSX_BUNDLE_BUNDLE_NAME "Instant Meshes") set_target_properties(InstantMeshes PROPERTIES MACOSX_BUNDLE_BUNDLE_GUI_IDENTIFIER "com.im.InstantMeshes") set_target_properties(InstantMeshes PROPERTIES MACOSX_BUNDLE_ICON_FILE im.icns) set_target_properties(InstantMeshes PROPERTIES MACOSX_BUNDLE_INFO_PLIST ${CMAKE_CURRENT_SOURCE_DIR}/resources/MacOSXBundleInfo.plist.in) set_source_files_properties(resources/im.icns PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") else() # Insulate from a few types of ABI changes by statically linking against libgcc and libstdc++ set_target_properties(InstantMeshes PROPERTIES LINK_FLAGS "-static-libgcc") #set_target_properties(InstantMeshes PROPERTIES LINK_FLAGS "-static-libgcc -static-libstdc++") endif() if (UNIX AND NOT ${U_CMAKE_BUILD_TYPE} MATCHES DEBUG) add_custom_command(TARGET InstantMeshes POST_BUILD COMMAND strip $) endif()