From 2a79b647fac5fc702082385cb30fedf82a972b5e Mon Sep 17 00:00:00 2001
From: Robert Maynard <rmaynard@nvidia.com>
Date: Wed, 9 Mar 2022 09:14:18 -0500
Subject: CUDA: Restore support for CMAKE_CUDA_ARCHITECTURES=OFF

Fixes: #23309
---
 Modules/CMakeDetermineCUDACompiler.cmake                      | 4 ++--
 Modules/CMakeDetermineCompilerId.cmake                        | 2 +-
 Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake          | 2 ++
 Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake | 2 ++
 Tests/RunCMake/CUDA_architectures/architectures-off.cmake     | 2 ++
 5 files changed, 9 insertions(+), 3 deletions(-)
 create mode 100644 Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
 create mode 100644 Tests/RunCMake/CUDA_architectures/architectures-off.cmake

diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake
index 8c01ea4..2649441 100644
--- a/Modules/CMakeDetermineCUDACompiler.cmake
+++ b/Modules/CMakeDetermineCUDACompiler.cmake
@@ -289,7 +289,7 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
           set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR})
         endif()
       endif()
-    else()
+    elseif(CMAKE_CUDA_ARCHITECTURES OR "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "")
       # Explicit architectures.  Test them during detection.
       set(architectures_explicit TRUE)
       set(architectures_test ${CMAKE_CUDA_ARCHITECTURES})
@@ -633,7 +633,7 @@ if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "")
       message(FATAL_ERROR "Failed to detect a default CUDA architecture.\n\nCompiler output:\n${CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT}")
     endif()
   endif()
-elseif(NOT "${architectures_tested}" MATCHES "^(all|all-major)$")
+elseif(CMAKE_CUDA_ARCHITECTURES AND NOT "${architectures_tested}" MATCHES "^(all|all-major)$")
   # Sort since order mustn't matter.
   list(SORT architectures_detected)
   list(SORT architectures_tested)
diff --git a/Modules/CMakeDetermineCompilerId.cmake b/Modules/CMakeDetermineCompilerId.cmake
index e0aa483..5670509 100644
--- a/Modules/CMakeDetermineCompilerId.cmake
+++ b/Modules/CMakeDetermineCompilerId.cmake
@@ -495,7 +495,7 @@ Id flags: ${testflags} ${CMAKE_${lang}_COMPILER_ID_FLAGS_ALWAYS}
       if(CMAKE_VS_PLATFORM_NAME STREQUAL x64)
         set(cuda_target "<TargetMachinePlatform>64</TargetMachinePlatform>")
       endif()
-      if(NOT CMAKE_CUDA_ARCHITECTURES MATCHES "^(all|all-major)$")
+      if(CMAKE_CUDA_ARCHITECTURES AND NOT CMAKE_CUDA_ARCHITECTURES MATCHES "^(all|all-major)$")
         foreach(arch ${CMAKE_CUDA_ARCHITECTURES})
           string(REGEX MATCH "[0-9]+" arch_name "${arch}")
           string(APPEND cuda_codegen "compute_${arch_name},sm_${arch_name};")
diff --git a/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake b/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
index d16156e..3b63d60 100644
--- a/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
@@ -4,3 +4,5 @@ run_cmake(architectures-all)
 run_cmake(architectures-all-major)
 run_cmake(architectures-empty)
 run_cmake(architectures-invalid)
+run_cmake(architectures-not-set)
+run_cmake(architectures-off)
diff --git a/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake b/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
new file mode 100644
index 0000000..ce5695a
--- /dev/null
+++ b/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
@@ -0,0 +1,2 @@
+unset(CMAKE_CUDA_ARCHITECTURES)
+enable_language(CUDA)
diff --git a/Tests/RunCMake/CUDA_architectures/architectures-off.cmake b/Tests/RunCMake/CUDA_architectures/architectures-off.cmake
new file mode 100644
index 0000000..99881d3
--- /dev/null
+++ b/Tests/RunCMake/CUDA_architectures/architectures-off.cmake
@@ -0,0 +1,2 @@
+set(CMAKE_CUDA_ARCHITECTURES OFF)
+enable_language(CUDA)
-- 
cgit v0.12


From 7024596a261f6ea8fc3a9735ac09fa92f19f4594 Mon Sep 17 00:00:00 2001
From: Brad King <brad.king@kitware.com>
Date: Thu, 10 Mar 2022 06:57:12 -0500
Subject: Tests: Fix testing CMAKE_CUDA_ARCHITECTURES=OFF with Clang

Clang does not automatically choose an architecture supported
by the SDK.  The `OFF` value is meant for users to provide their
own architecture flags, so provide one as part of the test.
---
 Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake        | 13 +++++++++++++
 .../RunCMake/CUDA_architectures/architectures-not-set.cmake |  5 +++++
 2 files changed, 18 insertions(+)

diff --git a/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake b/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
index 3b63d60..6fecae7 100644
--- a/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
+++ b/Tests/RunCMake/CUDA_architectures/RunCMakeTest.cmake
@@ -4,5 +4,18 @@ run_cmake(architectures-all)
 run_cmake(architectures-all-major)
 run_cmake(architectures-empty)
 run_cmake(architectures-invalid)
+
 run_cmake(architectures-not-set)
+include("${RunCMake_BINARY_DIR}/architectures-not-set-build/info.cmake" OPTIONAL)
+message(STATUS "  CMAKE_CUDA_COMPILER_ID='${CMAKE_CUDA_COMPILER_ID}'")
+message(STATUS "  CMAKE_CUDA_COMPILER_VERSION='${CMAKE_CUDA_COMPILER_VERSION}'")
+message(STATUS "  CMAKE_CUDA_ARCHITECTURES='${CMAKE_CUDA_ARCHITECTURES}'")
+
+if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang" AND CMAKE_CUDA_ARCHITECTURES)
+  list(GET CMAKE_CUDA_ARCHITECTURES 0 arch)
+  set(CMAKE_CUDA_FLAGS --cuda-gpu-arch=sm_${arch})
+  message(STATUS "Adding CMAKE_CUDA_FLAGS='${CMAKE_CUDA_FLAGS}' for CMAKE_CUDA_ARCHITECTURES=OFF with Clang.")
+  set(RunCMake_TEST_OPTIONS "-DCMAKE_CUDA_FLAGS=${CMAKE_CUDA_FLAGS}")
+endif()
 run_cmake(architectures-off)
+unset(RunCMake_TEST_OPTIONS)
diff --git a/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake b/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
index ce5695a..1be5491 100644
--- a/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
+++ b/Tests/RunCMake/CUDA_architectures/architectures-not-set.cmake
@@ -1,2 +1,7 @@
 unset(CMAKE_CUDA_ARCHITECTURES)
 enable_language(CUDA)
+file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/info.cmake" "
+set(CMAKE_CUDA_COMPILER_ID \"${CMAKE_CUDA_COMPILER_ID}\")
+set(CMAKE_CUDA_COMPILER_VERSION \"${CMAKE_CUDA_COMPILER_VERSION}\")
+set(CMAKE_CUDA_ARCHITECTURES \"${CMAKE_CUDA_ARCHITECTURES}\")
+")
-- 
cgit v0.12