From aa86191fd81003ce3e8033fb95daf8b2cffe94c9 Mon Sep 17 00:00:00 2001 From: cDc Date: Mon, 9 Sep 2024 11:50:10 +0300 Subject: [PATCH] common: refactor CUDA support in CMake (cherry picked from commit b96dd573680262e6b94f6d7e53d80c994074cc96) --- CMakeLists.txt | 35 ++++++++++++++++++++++------------- build/Utils.cmake | 21 +++++++++++++-------- 2 files changed, 35 insertions(+), 21 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 87534d7e2..b9d301cba 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -3,16 +3,22 @@ ######################################################################## # # Project-wide settings -CMAKE_MINIMUM_REQUIRED(VERSION 3.8.2) +CMAKE_MINIMUM_REQUIRED(VERSION 3.10) IF(POLICY CMP0011) CMAKE_POLICY(SET CMP0011 NEW) ENDIF() +IF(POLICY CMP0072) + CMAKE_POLICY(SET CMP0072 NEW) +ENDIF() IF(POLICY CMP0074) CMAKE_POLICY(SET CMP0074 NEW) ENDIF() IF(POLICY CMP0104) CMAKE_POLICY(SET CMP0104 NEW) ENDIF() +IF(POLICY CMP0146) + CMAKE_POLICY(SET CMP0146 OLD) # not required, but forced by OpenCV old support for CUDA +ENDIF() # List configuration options SET(OpenMVS_BUILD_TOOLS ON CACHE BOOL "Build example applications") @@ -49,14 +55,14 @@ ENDIF() # 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) +PROJECT(OpenMVS LANGUAGES CXX) 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 +# Disable SSE on unsupported platforms IF(CMAKE_SYSTEM_PROCESSOR MATCHES "^(arm|ARM|aarch64|AARCH64)") SET(OpenMVS_USE_SSE OFF) ENDIF() @@ -95,9 +101,6 @@ if(OpenMVS_USE_OPENMP) 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}) @@ -109,15 +112,20 @@ if(OpenMVS_USE_OPENGL) endif() if(OpenMVS_USE_CUDA) - if(POLICY CMP0146) - cmake_policy(SET CMP0146 NEW) - endif() - FIND_PACKAGE(CUDA) - if(CUDA_FOUND) + INCLUDE(CheckLanguage) + CHECK_LANGUAGE(CUDA) + if(CMAKE_CUDA_COMPILER) + SET(CUDA_FOUND TRUE) + if(NOT DEFINED CMAKE_CUDA_ARCHITECTURES) + SET(CMAKE_CUDA_ARCHITECTURES "native") + endif() ENABLE_LANGUAGE(CUDA) + # not required, but forced by OpenCV old support for CUDA + FIND_PACKAGE(CUDA REQUIRED) # 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) + string(REGEX MATCH "^[0-9]+" CUDA_VERSION_MAJOR ${CMAKE_CUDA_COMPILER_VERSION}) + string(REGEX REPLACE "([0-9]+)\\.([0-9]+).*" "\\2" CUDA_VERSION_MINOR ${CMAKE_CUDA_COMPILER_VERSION}) + if(${CUDA_VERSION_MAJOR} GREATER 10) SET(CMAKE_CUDA_STANDARD 17) endif() EXECUTE_PROCESS(COMMAND "${CMAKE_CUDA_COMPILER}" --list-gpu-arch @@ -159,6 +167,7 @@ if(OpenMVS_USE_CUDA) SET(CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} --expt-relaxed-constexpr") INCLUDE_DIRECTORIES(${CUDA_INCLUDE_DIRS}) SET(_USE_CUDA TRUE) + MESSAGE("-- Found CUDA: " ${CMAKE_CUDA_COMPILER_VERSION} " with GPU arch: " ${CMAKE_CUDA_ARCHITECTURES}) else() SET(CUDA_CUDA_LIBRARY "") MESSAGE("-- Can't find CUDA. Continuing without it.") diff --git a/build/Utils.cmake b/build/Utils.cmake index 6f724b2b4..61a2fcc0c 100644 --- a/build/Utils.cmake +++ b/build/Utils.cmake @@ -360,14 +360,17 @@ macro(add_extra_compiler_option option) if(CMAKE_BUILD_TYPE) set(CMAKE_TRY_COMPILE_CONFIGURATION ${CMAKE_BUILD_TYPE}) endif() - _check_flag_support(CXX "${option}" _varname "${BUILD_EXTRA_CXX_FLAGS} ${ARGN}") - if(${_varname}) - set(BUILD_EXTRA_CXX_FLAGS "${BUILD_EXTRA_CXX_FLAGS} ${option}") + if(CMAKE_CXX_COMPILER_ID) + _check_flag_support(CXX "${option}" _varname "${BUILD_EXTRA_CXX_FLAGS} ${ARGN}") + if(${_varname}) + set(BUILD_EXTRA_CXX_FLAGS "${BUILD_EXTRA_CXX_FLAGS} ${option}") + endif() endif() - - _check_flag_support(C "${option}" _varname "${BUILD_EXTRA_C_FLAGS} ${ARGN}") - if(${_varname}) - set(BUILD_EXTRA_C_FLAGS "${BUILD_EXTRA_C_FLAGS} ${option}") + if(CMAKE_C_COMPILER_ID) + _check_flag_support(C "${option}" _varname "${BUILD_EXTRA_C_FLAGS} ${ARGN}") + if(${_varname}) + set(BUILD_EXTRA_C_FLAGS "${BUILD_EXTRA_C_FLAGS} ${option}") + endif() endif() endmacro() @@ -707,7 +710,9 @@ macro(optimize_default_compiler_settings) string(REPLACE "/Zm1000" "" ${flags} "${${flags}}") endforeach() endif() - CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H) + if(CMAKE_C_COMPILER_ID) + CHECK_INCLUDE_FILE("inttypes.h" HAVE_INTTYPES_H) + endif() endmacro()