# CMake powered build system for OpenMVS ######################################################################## # # Project-wide settings CMAKE_MINIMUM_REQUIRED(VERSION 3.8.2) IF(POLICY CMP0011) CMAKE_POLICY(SET CMP0011 NEW) ENDIF() IF(POLICY CMP0074) CMAKE_POLICY(SET CMP0074 NEW) ENDIF() IF(POLICY CMP0104) CMAKE_POLICY(SET CMP0104 NEW) ENDIF() # List configuration options SET(OpenMVS_BUILD_TOOLS ON CACHE BOOL "Build example applications") SET(OpenMVS_USE_OPENMP ON CACHE BOOL "Enable OpenMP library") SET(OpenMVS_USE_OPENGL ON CACHE BOOL "Enable OpenGL library") SET(OpenMVS_USE_BREAKPAD ON CACHE BOOL "Enable BreakPad library") SET(OpenMVS_USE_PYTHON ON CACHE BOOL "Enable Python library bindings") SET(OpenMVS_USE_CERES OFF CACHE BOOL "Enable CERES optimization library") SET(OpenMVS_USE_CUDA ON CACHE BOOL "Enable CUDA library") SET(OpenMVS_USE_FAST_FLOAT2INT OFF CACHE BOOL "Use an optimized code to convert real numbers to int") SET(OpenMVS_USE_FAST_INVSQRT OFF CACHE BOOL "Use an optimized code to compute the inverse square root (slower in fact on modern compilers)") SET(OpenMVS_USE_FAST_CBRT OFF CACHE BOOL "Use an optimized code to compute the cubic root") SET(OpenMVS_USE_SSE ON CACHE BOOL "Enable SSE optimizations") SET(OpenMVS_MAX_CUDA_COMPATIBILITY OFF CACHE BOOL "Build for maximum CUDA device compatibility") SET(OpenMVS_ENABLE_TESTS ON CACHE BOOL "Enable test code") # Load automatically VCPKG toolchain if available IF(NOT DEFINED CMAKE_TOOLCHAIN_FILE AND DEFINED ENV{VCPKG_ROOT}) SET(CMAKE_TOOLCHAIN_FILE "$ENV{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake" CACHE STRING "") IF(NOT DEFINED VCPKG_TARGET_TRIPLET AND DEFINED ENV{VCPKG_DEFAULT_TRIPLET}) SET(VCPKG_TARGET_TRIPLET "$ENV{VCPKG_DEFAULT_TRIPLET}" CACHE STRING "") ENDIF() ENDIF() IF(OpenMVS_USE_PYTHON) LIST(APPEND VCPKG_MANIFEST_FEATURES "python") SET(PARTIAL_BUILD_SHARED_LIBS ON) ENDIF() IF(OpenMVS_USE_CUDA) LIST(APPEND VCPKG_MANIFEST_FEATURES "cuda") ENDIF() # Name of the project. # # CMake files in this project can refer to the root source directory # as ${OpenMVS_SOURCE_DIR} and to the root binary directory as # ${OpenMVS_BINARY_DIR}. PROJECT(OpenMVS) SET(ENV_PYTHON_PATH "/home/algo/.conda/envs/py310_pyt210/lib/python3.10/site-packages") SET(ENV_MVS_PATH "/home/algo/Documents/openMVS/openMVS/libs/MVS") CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/ConfigEnv.h.in" "${CMAKE_BINARY_DIR}/ConfigEnv.h" ) SET(OpenMVS_MAJOR_VERSION 2) SET(OpenMVS_MINOR_VERSION 3) SET(OpenMVS_PATCH_VERSION 0) SET(OpenMVS_VERSION ${OpenMVS_MAJOR_VERSION}.${OpenMVS_MINOR_VERSION}.${OpenMVS_PATCH_VERSION}) # Disable SSE on unsuported platforms IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|ARM|aarch64|AARCH64)") SET(OpenMVS_USE_SSE OFF) ENDIF() # Define helper functions and macros. INCLUDE(build/Utils.cmake) # Init session with macros defined in Utils.cmake GetOperatingSystemArchitectureBitness(SYSTEM) ComposePackageLibSuffix() ConfigCompilerAndLinker() ConfigLibrary() # Find dependencies: SET(CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/build/Modules) # Find required packages SET(OpenMVS_EXTRA_INCLUDES "") SET(OpenMVS_EXTRA_LIBS "") if(OpenMVS_USE_OPENMP) SET(OpenMP_LIBS "") FIND_PACKAGE(OpenMP) if(OPENMP_FOUND) SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}") SET(_USE_OPENMP TRUE) #cmake only check for separate OpenMP library on AppleClang 7+ #https://github.com/Kitware/CMake/blob/42212f7539040139ecec092547b7d58ef12a4d72/Modules/FindOpenMP.cmake#L252 if (CMAKE_CXX_COMPILER_ID MATCHES "AppleClang" AND (NOT CMAKE_CXX_COMPILER_VERSION VERSION_LESS "7.0")) SET(OpenMP_LIBS ${OpenMP_libomp_LIBRARY}) LIST(APPEND OpenMVS_EXTRA_LIBS ${OpenMP_LIBS}) endif() else() MESSAGE("-- Can't find OpenMP. Continuing without it.") endif() endif() if(OpenMVS_USE_OPENGL) if(POLICY CMP0072) cmake_policy(SET CMP0072 NEW) endif() FIND_PACKAGE(OpenGL) if(OPENGL_FOUND) INCLUDE_DIRECTORIES(${OPENGL_INCLUDE_DIR}) ADD_DEFINITIONS(${OpenGL_DEFINITIONS}) SET(_USE_OPENGL TRUE) else() MESSAGE("-- Can't find OpenGL. Continuing without it.") endif() endif() if(OpenMVS_USE_CUDA) FIND_PACKAGE(CUDA) if(CUDA_FOUND) ENABLE_LANGUAGE(CUDA) # CUDA-11.x can not be compiled using C++14 standard on Windows string(REGEX MATCH "^[0-9]+" CUDA_MAJOR ${CMAKE_CUDA_COMPILER_VERSION}) if(${CUDA_MAJOR} GREATER 10) SET(CMAKE_CUDA_STANDARD 17) endif() EXECUTE_PROCESS(COMMAND "${CMAKE_CUDA_COMPILER}" --list-gpu-arch OUTPUT_VARIABLE LIST_GPU_ARCH ERROR_QUIET) if(NOT LIST_GPU_ARCH AND OpenMVS_MAX_CUDA_COMPATIBILITY) message(WARNING "Cannot compile for max CUDA compatibility, nvcc does not support --list-gpu-arch") SET(OpenMVS_MAX_CUDA_COMPATIBILITY OFF) endif() if(NOT OpenMVS_MAX_CUDA_COMPATIBILITY) if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES) SET(CMAKE_CUDA_ARCHITECTURES 75) endif() else() # Build for maximum compatibility # https://arnon.dk/matching-sm-architectures-arch-and-gencode-for-various-nvidia-cards/ # Extract list of arch and gencodes STRING(REPLACE "\r" "" LIST_GPU_ARCH ${LIST_GPU_ARCH}) STRING(REPLACE "\n" ";" LIST_GPU_ARCH ${LIST_GPU_ARCH}) EXECUTE_PROCESS(COMMAND "${CMAKE_CUDA_COMPILER}" --list-gpu-code OUTPUT_VARIABLE LIST_GPU_CODE ERROR_QUIET) STRING(REPLACE "\r" "" LIST_GPU_CODE ${LIST_GPU_CODE}) STRING(REPLACE "\n" ";" LIST_GPU_CODE ${LIST_GPU_CODE}) LIST(GET LIST_GPU_CODE 0 TARGET_GPU_CODE) SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -arch=${TARGET_GPU_CODE}") SET(IDX 0) foreach(GPU_ARCH ${LIST_GPU_ARCH}) LIST(GET LIST_GPU_CODE ${IDX} GPU_CODE) SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -gencode=arch=${GPU_ARCH},code=${GPU_CODE}") MATH(EXPR IDX "${IDX}+1") endforeach() MESSAGE("-- Set CUDA flags: " ${CMAKE_CUDA_FLAGS}) endif() SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr") INCLUDE_DIRECTORIES(${CUDA_INCLUDE_DIRS}) SET(_USE_CUDA TRUE) else() SET(CUDA_CUDA_LIBRARY "") MESSAGE("-- Can't find CUDA. Continuing without it.") endif() else() SET(CUDA_CUDA_LIBRARY "") endif() if(OpenMVS_USE_BREAKPAD) FIND_PACKAGE(BREAKPAD) if(BREAKPAD_FOUND) INCLUDE_DIRECTORIES(${BREAKPAD_INCLUDE_DIRS}) ADD_DEFINITIONS(${BREAKPAD_DEFINITIONS}) SET(_USE_BREAKPAD TRUE) LIST(APPEND OpenMVS_EXTRA_LIBS ${BREAKPAD_LIBS}) else() MESSAGE("-- Can't find BreakPad. Continuing without it.") endif() endif() SET(Boost_EXTRA_COMPONENTS "") if(OpenMVS_USE_PYTHON) FIND_PACKAGE(Python3 COMPONENTS Interpreter Development REQUIRED) if(Python3_FOUND) INCLUDE_DIRECTORIES(${Python3_INCLUDE_DIRS}) LIST(APPEND OpenMVS_EXTRA_INCLUDES ${Python3_INCLUDE_DIRS}) LIST(APPEND OpenMVS_EXTRA_LIBS ${Python3_LIBRARIES}) LIST(APPEND Boost_EXTRA_COMPONENTS python${Python3_VERSION_MAJOR}${Python3_VERSION_MINOR}) MESSAGE(STATUS "Python ${Python3_VERSION_MAJOR}.${Python3_VERSION_MINOR} found (include: ${Python3_INCLUDE_DIRS})") else() MESSAGE("-- Can't find Python. Continuing without it.") endif() endif() FIND_PACKAGE(Boost REQUIRED COMPONENTS iostreams program_options system serialization OPTIONAL_COMPONENTS ${Boost_EXTRA_COMPONENTS}) if(Boost_FOUND) LIST(APPEND OpenMVS_EXTRA_INCLUDES ${Boost_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${Boost_INCLUDE_DIRS}) ADD_DEFINITIONS(${Boost_DEFINITIONS}) LINK_DIRECTORIES(${Boost_LIBRARY_DIRS}) if(NOT MSVC AND DEFINED CMAKE_TOOLCHAIN_FILE) # work around this missing library link in vcpkg LIST(APPEND Boost_LIBRARIES zstd) endif() SET(_USE_BOOST TRUE) if(OpenMVS_USE_PYTHON AND Boost_${Boost_EXTRA_COMPONENTS}_FOUND) SET(_USE_BOOST_PYTHON TRUE) endif() endif() FIND_PACKAGE(Eigen3 3.4 REQUIRED) if(EIGEN3_FOUND) LIST(APPEND OpenMVS_EXTRA_INCLUDES ${EIGEN3_INCLUDE_DIR}) INCLUDE_DIRECTORIES(${EIGEN3_INCLUDE_DIR}) ADD_DEFINITIONS(${EIGEN3_DEFINITIONS}) SET(_USE_EIGEN TRUE) MESSAGE(STATUS "Eigen ${EIGEN3_VERSION} found (include: ${EIGEN3_INCLUDE_DIR})") endif() FIND_PACKAGE(OpenCV REQUIRED) if(OpenCV_FOUND) LIST(APPEND OpenMVS_EXTRA_INCLUDES ${OpenCV_INCLUDE_DIRS}) INCLUDE_DIRECTORIES(${OpenCV_INCLUDE_DIRS}) ADD_DEFINITIONS(${OpenCV_DEFINITIONS}) SET(_USE_OPENCV TRUE) MESSAGE(STATUS "OpenCV ${OpenCV_VERSION} found (include: ${OpenCV_INCLUDE_DIRS})") else() MESSAGE("-- Can't find OpenCV. Please specify OpenCV directory using OpenCV_DIR variable") endif() LIST(REMOVE_DUPLICATES OpenMVS_EXTRA_INCLUDES) LIST(REMOVE_DUPLICATES OpenMVS_EXTRA_LIBS) # Set defines if(OpenMVS_USE_FAST_FLOAT2INT) SET(_USE_FAST_FLOAT2INT TRUE) endif() if(OpenMVS_USE_FAST_INVSQRT) SET(_USE_FAST_INVSQRT TRUE) endif() if(OpenMVS_USE_FAST_CBRT) SET(_USE_FAST_CBRT TRUE) endif() if(OpenMVS_USE_SSE) SET(_USE_SSE TRUE) endif() if(OpenMVS_USE_CERES) SET(_USE_CERES TRUE) endif() INCLUDE_DIRECTORIES("${OpenMVS_SOURCE_DIR}") INCLUDE_DIRECTORIES("${CMAKE_BINARY_DIR}") # Add modules ADD_SUBDIRECTORY(libs) if(OpenMVS_BUILD_TOOLS) ADD_SUBDIRECTORY(apps) endif() ADD_SUBDIRECTORY(docs) if (OpenMVS_ENABLE_TESTS) # enable testing functionality ENABLE_TESTING() # define tests ADD_TEST(NAME UnitTests COMMAND $ "0") ADD_TEST(NAME PipelineTest COMMAND $ "1") endif() # Export the package for use from the build-tree # (this registers the build-tree with a global CMake-registry) EXPORT(PACKAGE OpenMVS) # Install the export set for use with the install-tree INSTALL(EXPORT OpenMVSTargets NAMESPACE OpenMVS:: DESTINATION "${INSTALL_CMAKE_DIR}") # Install configuration file CONFIGURE_FILE("${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/ConfigLocal.h.in" "${CMAKE_BINARY_DIR}/ConfigLocal.h") INSTALL(FILES "${CMAKE_BINARY_DIR}/ConfigLocal.h" DESTINATION "${INSTALL_INCLUDE_DIR}") # Create the OpenMVSConfig.cmake and OpenMVSConfigVersion files INCLUDE(CMakePackageConfigHelpers) write_basic_package_version_file("${PROJECT_BINARY_DIR}/OpenMVSConfigVersion.cmake" VERSION ${OpenMVS_VERSION} COMPATIBILITY AnyNewerVersion) SET(INSTALL_INCLUDE_DIR_IN ${INSTALL_INCLUDE_DIR_PREFIX} ${OpenMVS_EXTRA_INCLUDES}) SET(INSTALL_CMAKE_DIR_IN ${INSTALL_CMAKE_DIR_PREFIX}) configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/OpenMVSConfig.cmake.in" "${PROJECT_BINARY_DIR}/OpenMVSConfig.cmake" INSTALL_DESTINATION ${PROJECT_BINARY_DIR} NO_SET_AND_CHECK_MACRO) # Install the OpenMVSConfig.cmake and OpenMVSConfigVersion.cmake INSTALL(FILES "${PROJECT_BINARY_DIR}/OpenMVSConfig.cmake" "${PROJECT_BINARY_DIR}/OpenMVSConfigVersion.cmake" DESTINATION "${INSTALL_CMAKE_DIR}") # uninstall target CONFIGURE_FILE( "${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/cmake_uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake" IMMEDIATE @ONLY) ADD_CUSTOM_TARGET(uninstall COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake_uninstall.cmake)