# Copyright (c) 2018, ETH Zurich and UNC Chapel Hill. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions are met: # # * Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # # * Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # # * Neither the name of ETH Zurich and UNC Chapel Hill nor the names of # its contributors may be used to endorse or promote products derived # from this software without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" # AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE # ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS # INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN # CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE # POSSIBILITY OF SUCH DAMAGE. # # Author: Johannes L. Schoenberger (jsch-at-demuc-dot-de) cmake_minimum_required(VERSION 3.0) project(COLMAP) set(COLMAP_VERSION "3.6") set(COLMAP_VERSION_NUMBER "3600") ################################################################################ # Include CMake dependencies ################################################################################ set(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) include(CheckCXXCompilerFlag) # Include helper macros and commands, and allow the included file to override # the CMake policies in this file include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/CMakeHelper.cmake NO_POLICY_SCOPE) ################################################################################ # Options ################################################################################ option(SIMD_ENABLED "Whether to enable SIMD optimizations" ON) option(OPENMP_ENABLED "Whether to enable OpenMP parallelization" ON) option(IPO_ENABLED "Whether to enable interprocedural optimization" ON) option(CUDA_ENABLED "Whether to enable CUDA, if available" ON) option(OPENGL_ENABLED "Whether to enable OpenGL, if available" ON) option(TESTS_ENABLED "Whether to build test binaries" ON) option(PROFILING_ENABLED "Whether to enable google-perftools linker flags" OFF) option(CGAL_ENABLED "Whether to enable the CGAL library" ON) option(BOOST_STATIC "Whether to enable static boost library linker flags" ON) set(CUDA_ARCHS "Auto" CACHE STRING "List of CUDA architectures for which to \ generate code, e.g., Auto, All, Maxwell, Pascal, ...") if(TESTS_ENABLED) enable_testing() endif() if(BOOST_STATIC) set(Boost_USE_STATIC_LIBS ON) else() add_definitions("-DBOOST_TEST_DYN_LINK") endif() ################################################################################ # Find packages ################################################################################ if(OPENMP_ENABLED) find_package(OpenMP QUIET) endif() find_package(Ceres REQUIRED) find_package(Boost REQUIRED COMPONENTS program_options filesystem graph regex system unit_test_framework) find_package(Eigen3 REQUIRED) find_package(FreeImage REQUIRED) find_package(Glog REQUIRED) find_package(OpenGL REQUIRED) find_package(Glew REQUIRED) find_package(Git) find_package(igraph REQUIRED) find_package(RPCLib REQUIRED) if (RPCLIB_FOUND) include_directories(RPCLIB_INCLUDE_DIR) else (RPCLIB_FOUND) message(FATAL_ERROR "RPCLIB not found") endif (RPCLIB_FOUND) # Suitesparse find_package(SuiteSparse REQUIRED) if (SUITESPARSE_FOUND) # On Ubuntu the system install of SuiteSparse (v3.4.0) up to at least # Ubuntu 13.10 cannot be used to link shared libraries. if (BUILD_SHARED_LIBS AND SUITESPARSE_IS_BROKEN_SHARED_LINKING_UBUNTU_SYSTEM_VERSION) message(FATAL_ERROR "You are attempting to build Theia as a shared " "library on Ubuntu using a system package install of SuiteSparse " "3.4.0. This package is broken and does not support the " "construction of shared libraries (you can still build Theia as " "a static library). If you wish to build a shared version of Theia " "you should uninstall the system install of SuiteSparse " "(libsuitesparse-dev) and perform a source install of SuiteSparse " "(we recommend that you use the latest version), " "see http://theia-solver.org/building.html for more information.") endif (BUILD_SHARED_LIBS AND SUITESPARSE_IS_BROKEN_SHARED_LINKING_UBUNTU_SYSTEM_VERSION) message("-- Found SuiteSparse ${SUITESPARSE_VERSION}") add_definitions(-DTHEIA_SUITESPARSE_VERSION="${SUITESPARSE_VERSION}") else (SUITESPARSE_FOUND) # Disable use of SuiteSparse if it cannot be found and continue. message(FATAL_ERROR "Can't find SuiteSparse. This library is required " "for bundle adjustment and for solving convex optimization problems. " "Please set SUITESPARSE_INCLUDE_DIR & SUITESPARSE_LIBRARY") endif (SUITESPARSE_FOUND) ##################################### ############ find gtest ############# ##################################### message("-- Check for gtest") find_package(GTest REQUIRED) if (GTEST_FOUND) message("-- Found GTest: ${GTEST_INCLUDE_DIRS}") set(GTEST_LIBRARIES ${GTEST_MAIN_LIBRARY} ${GTEST_LIBRARY}) message("-- Linked Libraries: ${GTEST_MAIN_LIBRARY} ${GTEST_LIBRARY}") else (GTEST_FOUND) message(FATAL_ERROR "Can't find GTest. Please set GTEST_INCLUDE_DIRS & GTEST_LIBRARIES") endif (GTEST_FOUND) if (CGAL_ENABLED) find_package(CGAL QUIET) endif() set(CUDA_MIN_VERSION "7.0") if(CUDA_ENABLED) find_package(CUDA ${CUDA_MIN_VERSION} QUIET) endif() find_package(Qt5 5.4 REQUIRED COMPONENTS Core OpenGL Widgets) if(Qt5_FOUND) message(STATUS "Found Qt") message(STATUS " Module : ${Qt5Core_DIR}") message(STATUS " Module : ${Qt5OpenGL_DIR}") message(STATUS " Module : ${Qt5Widgets_DIR}") endif() if(CGAL_FOUND) message(STATUS "Found CGAL") message(STATUS " Includes : ${CGAL_INCLUDE_DIRS}") message(STATUS " Libraries : ${CGAL_LIBRARY}") endif() ################################################################################ # Compiler specific configuration ################################################################################ if(CMAKE_BUILD_TYPE) message(STATUS "Build type specified as ${CMAKE_BUILD_TYPE}") else() message(STATUS "Build type not specified, using Release") set(CMAKE_BUILD_TYPE Release) set(IS_DEBUG OFF) endif() if(IS_MSVC) # Some fixes for the Glog library. add_definitions("-DGLOG_NO_ABBREVIATED_SEVERITIES") add_definitions("-DGL_GLEXT_PROTOTYPES") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc") # Enable object level parallel builds in Visual Studio. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} /MP") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /MP") endif() if(IS_GNU) # Hide incorrect warnings for uninitialized Eigen variables under GCC. set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wno-maybe-uninitialized") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-maybe-uninitialized") endif() if(IS_DEBUG) add_definitions("-DEIGEN_INITIALIZE_MATRICES_BY_NAN") endif() if(SIMD_ENABLED) message(STATUS "Enabling SIMD support") else() message(STATUS "Disabling SIMD support") endif() if(OPENMP_ENABLED AND OPENMP_FOUND) message(STATUS "Enabling OpenMP support") add_definitions("-DOPENMP_ENABLED") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") else() message(STATUS "Disabling OpenMP support") endif() if(IPO_ENABLED AND NOT IS_DEBUG AND NOT IS_GNU) message(STATUS "Enabling interprocedural optimization") set_property(DIRECTORY PROPERTY INTERPROCEDURAL_OPTIMIZATION 1) else() message(STATUS "Disabling interprocedural optimization") endif() if(CUDA_FOUND) if(CUDA_ENABLED) add_definitions("-DCUDA_ENABLED") include(${CMAKE_CURRENT_SOURCE_DIR}/cmake/SelectCudaComputeArch.cmake) CUDA_SELECT_NVCC_ARCH_FLAGS(CUDA_ARCH_FLAGS ${CUDA_ARCHS}) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} ${CUDA_ARCH_FLAGS}") # Fix for some combinations of CUDA and GCC (e.g. under Ubuntu 16.04). set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -D_FORCE_INLINES") # Do not show warnings if the architectures are deprecated. set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} -Wno-deprecated-gpu-targets") message(STATUS "Enabling CUDA support (version: ${CUDA_VERSION_STRING}," " archs: ${CUDA_ARCH_FLAGS_readable})") else() set(CUDA_FOUND OFF) message(STATUS "Disabling CUDA support") endif() else() set(CUDA_ENABLED OFF) if(CUDA_VERSION_STRING) message(STATUS "Disabling CUDA support (found version " "${CUDA_VERSION_STRING} but >= ${CUDA_MIN_VERSION} required)") else() message(STATUS "Disabling CUDA support") endif() endif() if(OPENGL_ENABLED) add_definitions("-DOPENGL_ENABLED") message(STATUS "Enabling OpenGL support") else() message(STATUS "Disabling OpenGL support") endif() if(PROFILING_ENABLED) message(STATUS "Enabling profiling support") set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -lprofiler -ltcmalloc") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -lprofiler -ltcmalloc") else() message(STATUS "Disabling profiling support") endif() if(CGAL_FOUND AND CGAL_ENABLED) message(STATUS "Enabling CGAL support") add_definitions("-DCGAL_ENABLED") else() message(STATUS "Disabling CGAL support") set(CGAL_ENABLED OFF) endif() # Qt5 was built with -reduce-relocations. if(Qt5_POSITION_INDEPENDENT_CODE) set(CMAKE_POSITION_INDEPENDENT_CODE ON) if(CUDA_ENABLED AND NOT IS_MSVC) set(CUDA_NVCC_FLAGS "${CUDA_NVCC_FLAGS} --compiler-options -fPIC") endif() endif() # Enable automatic compilation of Qt resource files. set(CMAKE_AUTORCC ON) ################################################################################ # Add sources ################################################################################ # Generate source file with version definitions. include(GenerateVersionDefinitions) set(COLMAP_INCLUDE_DIRS ${Boost_INCLUDE_DIRS} ${EIGEN3_INCLUDE_DIRS} ${SUITESPARSE_INCLUDE_DIRS} ${GLOG_INCLUDE_DIRS} ${GTEST_INCLUDE_DIRS} ${FREEIMAGE_INCLUDE_DIRS} ${CERES_INCLUDE_DIRS} ${IGRAPH_INCLUDE_DIRS} ${GLEW_INCLUDE_DIRS} ${Qt5Core_INCLUDE_DIRS} ${Qt5OpenGL_INCLUDE_DIRS} ${Qt5Widgets_INCLUDE_DIRS} ) set(COLMAP_LINK_DIRS ${Boost_LIBRARY_DIRS} ) set(COLMAP_EXTERNAL_LIBRARIES ${CMAKE_DL_LIBS} ${Boost_FILESYSTEM_LIBRARY} ${Boost_PROGRAM_OPTIONS_LIBRARY} ${Boost_REGEX_LIBRARY} ${Boost_SYSTEM_LIBRARY} ${GLOG_LIBRARIES} ${GTEST_LIBRARIES} ${FREEIMAGE_LIBRARIES} ${CERES_LIBRARIES} ${IGRAPH_LIBRARIES} ${RPCLIB_LIBS} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} ${Qt5Core_LIBRARIES} ${Qt5OpenGL_LIBRARIES} ${Qt5Widgets_LIBRARIES} ) if(CGAL_ENABLED) list(APPEND COLMAP_INCLUDE_DIRS ${CGAL_INCLUDE_DIRS} ${GMP_INCLUDE_DIR}) list(APPEND COLMAP_EXTERNAL_LIBRARIES ${CGAL_LIBRARY} ${GMP_LIBRARIES}) list(APPEND COLMAP_LINK_DIRS ${CGAL_LIBRARIES_DIR}) endif() if(UNIX) list(APPEND COLMAP_EXTERNAL_LIBRARIES pthread) endif() set(COLMAP_INTERNAL_LIBRARIES colmap flann graclus lsd pba sqlite3 sift_gpu vlfeat ) if(CUDA_ENABLED) list(APPEND COLMAP_INTERNAL_LIBRARIES colmap_cuda colmap) endif() set(COLMAP_LIBRARIES ${COLMAP_INTERNAL_LIBRARIES} ${COLMAP_EXTERNAL_LIBRARIES} ) include_directories( lib src ${COLMAP_INCLUDE_DIRS} ) link_directories(${COLMAP_LINK_DIRS}) add_subdirectory(lib) add_subdirectory(src) add_subdirectory(scripts) ################################################################################ # Generate source groups for Visual Studio, XCode, etc. ################################################################################ COLMAP_ADD_SOURCE_DIR(lib/FLANN LIB_FLANN_SRCS *.h *.cpp *.hpp *.cu) COLMAP_ADD_SOURCE_DIR(lib/Graclus LIB_GRACLUS_SRCS *.h *.c) COLMAP_ADD_SOURCE_DIR(lib/LSD LIB_LSD_SRCS *.h *.c) COLMAP_ADD_SOURCE_DIR(lib/PBA LIB_PBA_SRCS *.h *.cpp *.cu) COLMAP_ADD_SOURCE_DIR(lib/SiftGPU LIB_SIFT_GPU_SRCS *.h *.cpp *.cu) COLMAP_ADD_SOURCE_DIR(lib/SQLite LIB_SQLITE_SRCS *.h *.c) COLMAP_ADD_SOURCE_DIR(lib/VLFeat LIB_VLFEAT_SRCS *.h *.c *.tc) COLMAP_ADD_SOURCE_DIR(src/base BASE_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/controllers CONTROLLERS_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/estimators ESTIMATORS_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/exe EXE_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/feature FEATURE_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/optim OPTIM_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/retrieval RETRIEVAL_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/sfm SFM_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/tools TOOLS_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/ui UI_SRCS *.h *.cc) COLMAP_ADD_SOURCE_DIR(src/util UTIL_SRCS *.h *.cc) # Add all of the source files to a regular library target, as using a custom # target does not allow us to set its C++ include directories (and thus # intellisense can't find any of the included files). add_library( ${COLMAP_SRC_ROOT_FOLDER} ${LIB_FLANN_SRCS} ${LIB_GRACLUS_SRCS} ${LIB_LSD_SRCS} ${LIB_PBA_SRCS} ${LIB_SIFT_GPU_SRCS} ${LIB_SQLITE_SRCS} ${LIB_VLFEAT_SRCS} ${BASE_SRCS} ${CONTROLLERS_SRCS} ${ESTIMATORS_SRCS} ${EXE_SRCS} ${FEATURE_SRCS} ${OPTIM_SRCS} ${RETRIEVAL_SRCS} ${SFM_SRCS} ${TOOLS_SRCS} ${UI_SRCS} ${UTIL_SRCS} ) # Prevent the library from being compiled automatically. set_target_properties( ${COLMAP_SRC_ROOT_FOLDER} PROPERTIES EXCLUDE_FROM_ALL 1 EXCLUDE_FROM_DEFAULT_BUILD 1) ################################################################################ # Install and uninstall scripts ################################################################################ # Install header files. install(DIRECTORY src/ DESTINATION include/colmap FILES_MATCHING PATTERN "*.h") install(DIRECTORY lib/ DESTINATION include/colmap/lib FILES_MATCHING REGEX ".*[.]h|.*[.]hpp|.*[.]inl") # Generate and install CMake configuration. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CMakeConfig.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/COLMAPConfig.cmake" @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/COLMAPConfig.cmake" DESTINATION "share/colmap") configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CMakeConfigVersion.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/COLMAPConfigVersion.cmake" @ONLY) install(FILES "${CMAKE_CURRENT_BINARY_DIR}/COLMAPConfigVersion.cmake" DESTINATION "share/colmap") # Install find_package scripts for dependencies. install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/cmake DESTINATION share/colmap FILES_MATCHING PATTERN "Find*.cmake") # Install batch scripts under Windows. if(IS_MSVC) install(FILES "scripts/shell/COLMAP.bat" "scripts/shell/RUN_TESTS.bat" PERMISSIONS OWNER_READ OWNER_WRITE OWNER_EXECUTE GROUP_READ GROUP_EXECUTE WORLD_READ WORLD_EXECUTE DESTINATION "/") endif() # Install application meny entry under Linux/Unix. if(UNIX AND NOT APPLE) install(FILES "doc/COLMAP.desktop" DESTINATION "share/applications") endif() # Configure the uninstallation script. configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/CMakeUninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/CMakeUninstall.cmake" IMMEDIATE @ONLY) add_custom_target(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/CMakeUninstall.cmake) set_target_properties(uninstall PROPERTIES FOLDER ${CMAKE_TARGETS_ROOT_FOLDER})