diff --git a/CMakeLists.txt b/CMakeLists.txt index 920e4c3..3e62a68 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -87,8 +87,8 @@ if(OpenMVS_USE_OPENMP) #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() + LIST(APPEND OpenMVS_EXTRA_LIBS OpenMP::OpenMP_CXX) else() MESSAGE("-- Can't find OpenMP. Continuing without it.") endif() @@ -109,7 +109,10 @@ if(OpenMVS_USE_OPENGL) endif() if(OpenMVS_USE_CUDA) - FIND_PACKAGE(CUDA) + FIND_PACKAGE(CUDAToolkit REQUIRED) + set(CUDA_FOUND 1) + set(CUDA_INCLUDE_DIRS "${CUDAToolkit_INCLUDE_DIRS}") + set(CUDA_CUDA_LIBRARY CUDA::cuda_driver) if(CUDA_FOUND) ENABLE_LANGUAGE(CUDA) # CUDA-11.x can not be compiled using C++14 standard on Windows @@ -190,15 +193,10 @@ if(OpenMVS_USE_PYTHON) endif() endif() -FIND_PACKAGE(Boost REQUIRED COMPONENTS iostreams program_options system serialization OPTIONAL_COMPONENTS ${Boost_EXTRA_COMPONENTS}) +FIND_PACKAGE(Boost REQUIRED COMPONENTS assert graph iostreams pool serialization throw_exception 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) @@ -206,11 +204,9 @@ if(Boost_FOUND) endif() endif() -FIND_PACKAGE(Eigen3 3.4 REQUIRED) +FIND_PACKAGE(Eigen3 CONFIG REQUIRED) +set(EIGEN3_FOUND 1) 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() @@ -282,11 +278,11 @@ 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}) +SET(INSTALL_INCLUDE_DIR_IN "${CMAKE_INSTALL_PREFIX}/${INSTALL_INCLUDE_DIR}" ${OpenMVS_EXTRA_INCLUDES}) +SET(INSTALL_CMAKE_DIR_IN "${CMAKE_INSTALL_PREFIX}/${INSTALL_CMAKE_DIR}") configure_package_config_file("${CMAKE_CURRENT_SOURCE_DIR}/build/Templates/OpenMVSConfig.cmake.in" "${PROJECT_BINARY_DIR}/OpenMVSConfig.cmake" - INSTALL_DESTINATION ${PROJECT_BINARY_DIR} + INSTALL_DESTINATION "${INSTALL_CMAKE_DIR}" NO_SET_AND_CHECK_MACRO) # Install the OpenMVSConfig.cmake and OpenMVSConfigVersion.cmake INSTALL(FILES diff --git a/apps/CMakeLists.txt b/apps/CMakeLists.txt index 3bb00c6..e54c840 100644 --- a/apps/CMakeLists.txt +++ b/apps/CMakeLists.txt @@ -1,3 +1,5 @@ +find_package(Boost COMPONENTS program_options) +list(APPEND OpenMVS_EXTRA_LIBS Boost::program_options) # Add applications ADD_SUBDIRECTORY(InterfaceCOLMAP) ADD_SUBDIRECTORY(InterfaceMetashape) diff --git a/build/Templates/OpenMVSConfig.cmake.in b/build/Templates/OpenMVSConfig.cmake.in index 9747b3e..514f5a0 100644 --- a/build/Templates/OpenMVSConfig.cmake.in +++ b/build/Templates/OpenMVSConfig.cmake.in @@ -15,8 +15,27 @@ set(OpenMVS_INCLUDE_DIRS "@INSTALL_INCLUDE_DIR_IN@") set(OpenMVS_DEFINITIONS "@OpenMVS_DEFINITIONS@") +include(CMakeFindDependencyMacro) +find_dependency(Boost COMPONENTS iostreams pool serialization throw_exception) +find_dependency(Eigen3 CONFIG) +find_dependency(OpenCV) +find_dependency(CGAL) +if("@OpenMVS_USE_CERES@") + find_dependency(Ceres) +endif() +if("@OpenMVS_USE_CUDA@") + find_dependency(CUDAToolkit) + list(APPEND OpenMVS_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS}) +endif() +if("@OpenMVS_USE_OPENGL@") + find_dependency(OpenGL) +endif() +if("@OpenMVS_USE_OPENMP@") + find_dependency(OpenMP COMPONENTS CXX) +endif() + # These are IMPORTED targets created by OpenMVSTargets.cmake -set(OpenMVS_LIBRARIES MVS) +set(OpenMVS_LIBRARIES OpenMVS::MVS) set(OpenMVS_BINARIES InterfaceCOLMAP DensifyPointCloud ReconstructMesh RefineMesh TextureMesh) include("${CMAKE_CURRENT_LIST_DIR}/OpenMVSTargets.cmake") diff --git a/build/Utils.cmake b/build/Utils.cmake index 86d3430..b69fe50 100644 --- a/build/Utils.cmake +++ b/build/Utils.cmake @@ -119,6 +119,7 @@ macro(GetOperatingSystemArchitectureBitness) # Detect GNU version: set(CMAKE_FLG_GCC_VERSION_NUM 0) if(CMAKE_COMPILER_IS_GNUCXX) + if(0) # informational, breaking for Android execute_process(COMMAND ${CMAKE_CXX_COMPILER} --version OUTPUT_VARIABLE CMAKE_FLG_GCC_VERSION_FULL OUTPUT_STRIP_TRAILING_WHITESPACE) @@ -144,6 +145,7 @@ macro(GetOperatingSystemArchitectureBitness) set(CMAKE_FLG_GCC_VERSION ${CMAKE_FLG_GCC_VERSION_MAJOR}${CMAKE_FLG_GCC_VERSION_MINOR}) math(EXPR CMAKE_FLG_GCC_VERSION_NUM "${CMAKE_FLG_GCC_VERSION_MAJOR}*100 + ${CMAKE_FLG_GCC_VERSION_MINOR}") message(STATUS "Detected version of GNU GCC: ${CMAKE_FLG_GCC_VERSION} (${CMAKE_FLG_GCC_VERSION_NUM})") + endif() if(WIN32) execute_process(COMMAND ${CMAKE_CXX_COMPILER} -dumpmachine @@ -174,6 +176,7 @@ macro(ComposePackageLibSuffix) set(PACKAGE_LIB_SUFFIX_DBG "") set(PACKAGE_LIB_SUFFIX_REL "") if(MSVC) + elseif(0) # do not use subdirs per vc version/config if("${MSVC_VERSION}" STRGREATER "1929") set(PACKAGE_LIB_SUFFIX "/vc17") elseif("${MSVC_VERSION}" STRGREATER "1916") @@ -422,6 +425,7 @@ macro(optimize_default_compiler_settings) endif() else() list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_std_20" CXX_STD_INDEX) + set(CXX_STD_INDEX -1) # std::shared_ptr<>::unique() in libs/Common/FastDelegateCPP11.h if(${CXX_STD_INDEX} GREATER -1) set(CMAKE_CXX_STANDARD 20) else() @@ -624,7 +628,7 @@ macro(optimize_default_compiler_settings) if(NOT MSVC64) # 64-bit MSVC compiler uses SSE/SSE2 by default - if(ENABLE_SSE) + if(ENABLE_SSE AND NOT ENABLE_SSE2) set(BUILD_EXTRA_FLAGS "${BUILD_EXTRA_FLAGS} /arch:SSE") endif() if(ENABLE_SSE2) @@ -819,6 +823,7 @@ macro(ConfigLibrary) set(INSTALL_CMAKE_DIR ${DEF_INSTALL_CMAKE_DIR} CACHE PATH "Installation directory for CMake files") # Make relative paths absolute (needed later on) foreach(p LIB BIN INCLUDE CMAKE) + break() # keep relative paths set(var INSTALL_${p}_DIR) set(varp INSTALL_${p}_DIR_PREFIX) if(IS_ABSOLUTE "${${varp}}") @@ -847,6 +852,10 @@ function(cxx_library_with_type name folder type cxx_flags) if(BUILD_SHARED_LIBS OR PARTIAL_BUILD_SHARED_LIBS) set_target_properties("${name}" PROPERTIES POSITION_INDEPENDENT_CODE ON) endif() + set(ambiguous_names Common IO Math) + if(name IN_LIST ambiguous_names) + set_target_properties("${name}" PROPERTIES OUTPUT_NAME "MVS_${name}") + endif() endfunction() # cxx_executable_with_flags(name cxx_flags libs srcs...) diff --git a/libs/Common/CMakeLists.txt b/libs/Common/CMakeLists.txt index 18899af..258ada0 100644 --- a/libs/Common/CMakeLists.txt +++ b/libs/Common/CMakeLists.txt @@ -12,7 +12,18 @@ IF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.16.0) endif() # Link its dependencies -TARGET_LINK_LIBRARIES(Common ${Boost_LIBRARIES} ${OpenCV_LIBS}) +TARGET_LINK_LIBRARIES(Common + $ + Boost::iostreams + Boost::pool + Boost::serialization + Boost::throw_exception + ${OpenCV_LIBS} + Eigen3::Eigen +) +if(BUILD_EXTRA_FLAGS MATCHES "/Zc:__cplusplus") + target_compile_options(Common PUBLIC "$<$:-Zc:__cplusplus>") +endif() # Install SET_TARGET_PROPERTIES(Common PROPERTIES diff --git a/libs/MVS/CMakeLists.txt b/libs/MVS/CMakeLists.txt index 8533865..8b3100d 100644 --- a/libs/MVS/CMakeLists.txt +++ b/libs/MVS/CMakeLists.txt @@ -45,20 +45,19 @@ IF(CMAKE_VERSION VERSION_GREATER_EQUAL 3.16.0) endif() # Link its dependencies -if(_USE_CUDA) - SET_TARGET_PROPERTIES(MVS PROPERTIES CUDA_ARCHITECTURES "50;72;75") +TARGET_LINK_LIBRARIES(MVS PRIVATE Math IO CGAL::CGAL ${CERES_LIBRARIES} ${CUDA_CUDA_LIBRARY}) +TARGET_LINK_LIBRARIES(MVS PUBLIC Common) +TARGET_LINK_LIBRARIES(MVS PRIVATE $) +if(OpenMVS_USE_OPENMP) + target_link_libraries(MVS PRIVATE "$") endif() -TARGET_LINK_LIBRARIES(MVS PRIVATE Common Math IO CGAL::CGAL ${CERES_LIBRARIES} ${CUDA_CUDA_LIBRARY}) +TARGET_INCLUDE_DIRECTORIES(MVS PUBLIC "$") if(OpenMVS_USE_PYTHON) # Create the Python wrapper cxx_library_with_type(pyOpenMVS "Libs" "SHARED" "${cxx_default}" ${PATH_PythonWrapper_cpp} ) - # Link its dependencies - if(_USE_CUDA) - SET_TARGET_PROPERTIES(pyOpenMVS PROPERTIES CUDA_ARCHITECTURES "50;72;75") - endif() TARGET_LINK_LIBRARIES(pyOpenMVS PRIVATE MVS ${OpenMVS_EXTRA_LIBS}) # Suppress prefix "lib" because Python does not allow this prefix SET_TARGET_PROPERTIES(pyOpenMVS PROPERTIES PREFIX "")