diff --git a/Modules/Internal/CMakeCUDAArchitecturesAll.cmake b/Modules/Internal/CMakeCUDAArchitecturesAll.cmake index b97a2029b3..97f0c0c906 100644 --- a/Modules/Internal/CMakeCUDAArchitecturesAll.cmake +++ b/Modules/Internal/CMakeCUDAArchitecturesAll.cmake @@ -71,7 +71,14 @@ function(cmake_cuda_architectures_all lang lang_var_) endif() endif() - if(${lang_var_}TOOLKIT_VERSION VERSION_GREATER_EQUAL 12.8) + if(${lang_var_}TOOLKIT_VERSION VERSION_GREATER_EQUAL 12.9) + if(CMAKE_${lang}_COMPILER_ID STREQUAL "NVIDIA" + OR (CMAKE_${lang}_COMPILER_ID STREQUAL "Clang" AND CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) + ) + list(APPEND CMAKE_CUDA_ARCHITECTURES_ALL 100 101 103 120 121) + list(APPEND CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR 100 120) + endif() + elseif(${lang_var_}TOOLKIT_VERSION VERSION_GREATER_EQUAL 12.8) if(CMAKE_${lang}_COMPILER_ID STREQUAL "NVIDIA" OR (CMAKE_${lang}_COMPILER_ID STREQUAL "Clang" AND CMAKE_${lang}_COMPILER_VERSION VERSION_GREATER_EQUAL 16.0) ) diff --git a/Modules/Internal/CMakeCUDAArchitecturesValidate.cmake b/Modules/Internal/CMakeCUDAArchitecturesValidate.cmake index b6997d2e2a..35bc7f270a 100644 --- a/Modules/Internal/CMakeCUDAArchitecturesValidate.cmake +++ b/Modules/Internal/CMakeCUDAArchitecturesValidate.cmake @@ -5,7 +5,7 @@ function(cmake_cuda_architectures_validate lang) if(DEFINED CMAKE_${lang}_ARCHITECTURES) if(CMAKE_${lang}_ARCHITECTURES STREQUAL "") message(FATAL_ERROR "CMAKE_${lang}_ARCHITECTURES must be non-empty if set.") - elseif(CMAKE_${lang}_ARCHITECTURES AND NOT CMAKE_${lang}_ARCHITECTURES MATCHES "^([0-9]+a?(-real|-virtual)?(;[0-9]+a?(-real|-virtual)?|;)*|all|all-major|native)$") + elseif(CMAKE_${lang}_ARCHITECTURES AND NOT CMAKE_${lang}_ARCHITECTURES MATCHES "^([0-9]+(a|f)?(-real|-virtual)?(;[0-9]+(a|f)?(-real|-virtual)?|;)*|all|all-major|native)$") message(FATAL_ERROR "CMAKE_${lang}_ARCHITECTURES:\n" " ${CMAKE_${lang}_ARCHITECTURES}\n" diff --git a/Tests/CudaOnly/ArchSpecial/CMakeLists.txt b/Tests/CudaOnly/ArchSpecial/CMakeLists.txt index 88eff8aebf..3f862450a5 100644 --- a/Tests/CudaOnly/ArchSpecial/CMakeLists.txt +++ b/Tests/CudaOnly/ArchSpecial/CMakeLists.txt @@ -25,7 +25,9 @@ function(verify_output flag) list(APPEND command_archs "${CMAKE_MATCH_1}") endforeach() - list(SORT command_archs) + # We need to use a NATURAL comparison so that architecture values like `100` + # get placed at the end instead of the front + list(SORT command_archs COMPARE NATURAL) list(REMOVE_DUPLICATES command_archs) if(NOT "${command_archs}" STREQUAL "${architectures}") message(FATAL_ERROR "Architectures used for \"${flag}\" don't match the reference (\"${command_archs}\" != \"${architectures}\").")