Browse Source

CUDA: Simplify CMAKE_CUDA_ARCHITECTURES special value logic

Refactor the logic checking `CMAKE_CUDA_ARCHITECTURES` special values.
Switch on the value first, and then make other decisions for each case.
This makes room for other special values to be added later.
Brad King 3 years ago
parent
commit
fe64c49e72
2 changed files with 31 additions and 33 deletions
  1. 18 20
      Modules/CMakeDetermineCUDACompiler.cmake
  2. 13 13
      Source/cmGeneratorTarget.cxx

+ 18 - 20
Modules/CMakeDetermineCUDACompiler.cmake

@@ -272,26 +272,24 @@ if(NOT CMAKE_CUDA_COMPILER_ID_RUN)
     endif()
   endif()
 
-  # Detect explicit architectures and add them during detection.
-  if(DEFINED CMAKE_CUDA_ARCHITECTURES AND NOT "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all" AND NOT "${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
-    set(architectures_explicit TRUE)
-    set(architectures_test ${CMAKE_CUDA_ARCHITECTURES})
-  endif()
-
-  # For sufficiently new NVCC we can just use the all and all-major flags.
-  # For VS we don't test since we can't figure out the version this early (see #23161).
-  # For others select based on version.
-  if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA" AND CMAKE_CUDA_COMPILER_TOOLKIT_VERSION VERSION_GREATER_EQUAL 11.5)
-    if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all")
-      string(APPEND nvcc_test_flags " -arch=all")
-    elseif("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
-      string(APPEND nvcc_test_flags " -arch=all-major")
-    endif()
-  elseif(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
-    if("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all")
-      set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL})
-    elseif("${CMAKE_CUDA_ARCHITECTURES}" STREQUAL "all-major")
-      set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR})
+  if(DEFINED CMAKE_CUDA_ARCHITECTURES)
+    if(CMAKE_CUDA_ARCHITECTURES MATCHES "^(all|all-major)$")
+      # For sufficiently new NVCC we can just use the all and all-major flags.
+      # For VS we don't test since we can't figure out the version this early (see #23161).
+      # For others select based on version.
+      if(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA" AND CMAKE_CUDA_COMPILER_TOOLKIT_VERSION VERSION_GREATER_EQUAL 11.5)
+        string(APPEND nvcc_test_flags " -arch=${CMAKE_CUDA_ARCHITECTURES}")
+      elseif(NOT CMAKE_GENERATOR MATCHES "Visual Studio")
+        if(CMAKE_CUDA_ARCHITECTURES STREQUAL "all")
+          set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL})
+        elseif(CMAKE_CUDA_ARCHITECTURES STREQUAL "all-major")
+          set(architectures_test ${CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR})
+        endif()
+      endif()
+    else()
+      # Explicit architectures.  Test them during detection.
+      set(architectures_explicit TRUE)
+      set(architectures_test ${CMAKE_CUDA_ARCHITECTURES})
     endif()
   endif()
 

+ 13 - 13
Source/cmGeneratorTarget.cxx

@@ -3447,22 +3447,22 @@ void cmGeneratorTarget::AddCUDAArchitectureFlags(std::string& flags) const
     this->Makefile->GetSafeDefinition("CMAKE_CUDA_COMPILER_ID");
 
   // Check for special modes: `all`, `all-major`.
-  if (compiler == "NVIDIA" &&
-      cmSystemTools::VersionCompare(
-        cmSystemTools::OP_GREATER_EQUAL,
-        this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
-        "11.5")) {
-    if (property == "all" || property == "all-major") {
+  if (property == "all" || property == "all-major") {
+    if (compiler == "NVIDIA" &&
+        cmSystemTools::VersionCompare(
+          cmSystemTools::OP_GREATER_EQUAL,
+          this->Makefile->GetDefinition("CMAKE_CUDA_COMPILER_VERSION"),
+          "11.5")) {
       flags = cmStrCat(flags, " -arch=", property);
       return;
     }
-  }
-
-  if (property == "all") {
-    property = *this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL");
-  } else if (property == "all-major") {
-    property =
-      *this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR");
+    if (property == "all") {
+      property =
+        *this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL");
+    } else if (property == "all-major") {
+      property =
+        *this->Makefile->GetDefinition("CMAKE_CUDA_ARCHITECTURES_ALL_MAJOR");
+    }
   }
 
   struct CudaArchitecture