Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit c978566

Browse files
committed
build: first class cuda support
1 parent b3c9842 commit c978566

11 files changed

+702
-28
lines changed

CMakeLists.txt

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ if(POLICY CMP0077)
7474
cmake_policy(SET CMP0077 NEW) # CMake 3.13+: option() honors normal variables.
7575
endif()
7676

77+
if(POLICY CMP0091)
78+
cmake_policy(SET CMP0091 NEW) # CMake 3.15+: leave MSVC runtime selection out of default CMAKE_<LANG>_FLAGS_<CONFIG> flags
79+
endif()
80+
7781
#
7882
# Configure OpenCV CMake hooks
7983
#
@@ -542,6 +546,9 @@ OCV_OPTION(OPENCV_ENABLE_MEMALIGN "Enable posix_memalign or memalign usage"
542546
OCV_OPTION(OPENCV_DISABLE_FILESYSTEM_SUPPORT "Disable filesystem support" OFF)
543547
OCV_OPTION(OPENCV_DISABLE_THREAD_SUPPORT "Build the library without multi-threaded code." OFF)
544548
OCV_OPTION(OPENCV_SEMIHOSTING "Build the library for semihosting target (Arm). See https://developer.arm.com/documentation/100863/latest." OFF)
549+
OCV_OPTION(ENABLE_CUDA_FIRST_CLASS_LANGUAGE "Enable CUDA as a first class language, if enabled dependant projects will need to use CMake >= 3.18" (WITH_CUDA AND NOT CMAKE_VERSION VERSION_LESS 3.18)
550+
VISIBLE_IF (WITH_CUDA AND NOT CMAKE_VERSION VERSION_LESS 3.18)
551+
VERIFY HAVE_CUDA)
545552

546553
OCV_OPTION(ENABLE_PYLINT "Add target with Pylint checks" (BUILD_DOCS OR BUILD_EXAMPLES) IF (NOT CMAKE_CROSSCOMPILING AND NOT APPLE_FRAMEWORK) )
547554
OCV_OPTION(ENABLE_FLAKE8 "Add target with Python flake8 checker" (BUILD_DOCS OR BUILD_EXAMPLES) IF (NOT CMAKE_CROSSCOMPILING AND NOT APPLE_FRAMEWORK) )
@@ -650,6 +657,28 @@ include(cmake/OpenCVCompilerOptions.cmake)
650657

651658
ocv_cmake_hook(POST_COMPILER_OPTIONS)
652659

660+
# --- CUDA Support ---
661+
if(ENABLE_CUDA_FIRST_CLASS_LANGUAGE)
662+
if(CMAKE_VERSION VERSION_LESS 3.18)
663+
message(WARNING "CUDA first class language only supported for CMake versions >= 3.18, falling back to FindCUDA!")
664+
set(ENABLE_CUDA_FIRST_CLASS_LANGUAGE OFF CACHE BOOL "Enable CUDA as a first class language, if enabled dependant projects will need to use CMake >= 3.18" FORCE)
665+
else()
666+
# Forcing windows search location isn't possible, UNIX searches for the compiler using CUDA_PATH, windows uses CUDA_PATH_VXX_X where VXX_X is unknown.
667+
if(UNIX AND CUDA_PATH AND NOT $ENV{CUDA_PATH})
668+
set(ENV{CUDA_PATH} ${CUDA_PATH})
669+
endif()
670+
include(CheckLanguage)
671+
check_language(CUDA)
672+
if(UNIX AND NOT CMAKE_CUDA_COMPILER)
673+
message(STATUS "Checking for CUDA compiler in default location (/usr/local/cuda)")
674+
set(CUDA_PATH "/usr/local/cuda" CACHE INTERNAL "")
675+
set(ENV{CUDA_PATH} ${CUDA_PATH})
676+
endif()
677+
cmake_policy(SET CMP0092 NEW) # CMake 3.15+: leave warning flags out of default CMAKE_<LANG>_FLAGS flags.
678+
enable_language(CUDA)
679+
endif()
680+
endif()
681+
653682
# ----------------------------------------------------------------------------
654683
# CHECK FOR SYSTEM LIBRARIES, OPTIONS, ETC..
655684
# ----------------------------------------------------------------------------

cmake/OpenCVCRTLinkage.cmake

Lines changed: 34 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -33,34 +33,44 @@ endif()
3333
# Ignore warning: This object file does not define any previously undefined public symbols, ...
3434
set(CMAKE_STATIC_LINKER_FLAGS "${CMAKE_STATIC_LINKER_FLAGS} /IGNORE:4221")
3535

36+
if(POLICY CMP0091)
37+
cmake_policy(GET CMP0091 MSVC_RUNTIME_SET_BY_ABSTRACTION)
38+
endif()
39+
3640
if(NOT BUILD_SHARED_LIBS AND BUILD_WITH_STATIC_CRT)
37-
foreach(flag_var
38-
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
39-
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
40-
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
41-
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
42-
if(${flag_var} MATCHES "/MD")
43-
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
44-
endif()
45-
if(${flag_var} MATCHES "/MDd")
46-
string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
47-
endif()
48-
endforeach(flag_var)
41+
if(MSVC_RUNTIME_SET_BY_ABSTRACTION STREQUAL "NEW")
42+
set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")
43+
else()
44+
foreach(flag_var
45+
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
46+
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
47+
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
48+
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
49+
if(${flag_var} MATCHES "/MD")
50+
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
51+
endif()
52+
if(${flag_var} MATCHES "/MDd")
53+
string(REGEX REPLACE "/MDd" "/MTd" ${flag_var} "${${flag_var}}")
54+
endif()
55+
endforeach(flag_var)
56+
endif()
4957

5058
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /NODEFAULTLIB:atlthunk.lib")
5159
set(CMAKE_EXE_LINKER_FLAGS_DEBUG "${CMAKE_EXE_LINKER_FLAGS_DEBUG} /NODEFAULTLIB:libcmt.lib /NODEFAULTLIB:libcpmt.lib /NODEFAULTLIB:msvcrt.lib")
5260
set(CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /NODEFAULTLIB:libcmtd.lib /NODEFAULTLIB:libcpmtd.lib /NODEFAULTLIB:msvcrtd.lib")
5361
else()
54-
foreach(flag_var
55-
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
56-
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
57-
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
58-
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
59-
if(${flag_var} MATCHES "/MT")
60-
string(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
61-
endif()
62-
if(${flag_var} MATCHES "/MTd")
63-
string(REGEX REPLACE "/MTd" "/MDd" ${flag_var} "${${flag_var}}")
64-
endif()
65-
endforeach(flag_var)
62+
if(NOT MSVC_RUNTIME_SET_BY_ABSTRACTION STREQUAL "NEW")
63+
foreach(flag_var
64+
CMAKE_C_FLAGS CMAKE_C_FLAGS_DEBUG CMAKE_C_FLAGS_RELEASE
65+
CMAKE_C_FLAGS_MINSIZEREL CMAKE_C_FLAGS_RELWITHDEBINFO
66+
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
67+
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
68+
if(${flag_var} MATCHES "/MT")
69+
string(REGEX REPLACE "/MT" "/MD" ${flag_var} "${${flag_var}}")
70+
endif()
71+
if(${flag_var} MATCHES "/MTd")
72+
string(REGEX REPLACE "/MTd" "/MDd" ${flag_var} "${${flag_var}}")
73+
endif()
74+
endforeach(flag_var)
75+
endif()
6676
endif()

cmake/OpenCVDetectCUDA.cmake

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -414,8 +414,25 @@ if(CUDA_FOUND)
414414
endforeach()
415415
endmacro()
416416

417+
macro(ocv_check_windows_crt_linkage)
418+
# The new MSVC runtime abstraction is only useable if CUDA is a first class language
419+
if(WIN32 AND POLICY CMP0091)
420+
cmake_policy(GET CMP0091 MSVC_RUNTIME_SET_BY_ABSTRACTION)
421+
if(MSVC_RUNTIME_SET_BY_ABSTRACTION STREQUAL "NEW")
422+
if(BUILD_SHARED_LIBS)
423+
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} " /MD")
424+
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} " /MDd")
425+
else()
426+
set(CMAKE_CXX_FLAGS_RELEASE ${CMAKE_CXX_FLAGS_RELEASE} " /MT")
427+
set(CMAKE_CXX_FLAGS_DEBUG ${CMAKE_CXX_FLAGS_DEBUG} " /MTd")
428+
endif()
429+
endif()
430+
endif()
431+
endmacro()
432+
417433
macro(ocv_cuda_compile VAR)
418434
ocv_cuda_filter_options()
435+
ocv_check_windows_crt_linkage()
419436

420437
if(BUILD_SHARED_LIBS)
421438
set(CUDA_NVCC_FLAGS ${CUDA_NVCC_FLAGS} -Xcompiler -DCVAPI_EXPORTS)

0 commit comments

Comments
 (0)