From 176e490e7f117793247a1c1b4f3ba4ee56e266fc Mon Sep 17 00:00:00 2001 From: hesuicong Date: Mon, 21 Jul 2025 09:53:14 +0800 Subject: [PATCH] test --- CMakeLists.txt | 304 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 304 insertions(+) create mode 100644 CMakeLists.txt diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..920e4c3 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,304 @@ +# 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(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)