Просмотр исходного кода

CUDA/Clang: Determine cross-compiling target from CMAKE_CUDA_COMPILER_TARGET

When cross-compiling CUDA with Clang, `CMAKE_CUDA_COMPILER_TARGET` is
typically set to the target triple.  Use it to select the CUDA toolkit
target directory.
Brad King 1 год назад
Родитель
Сommit
781a67bf5e
1 измененных файлов с 12 добавлено и 4 удалено
  1. 12 4
      Modules/CMakeDetermineCUDACompiler.cmake

+ 12 - 4
Modules/CMakeDetermineCUDACompiler.cmake

@@ -171,13 +171,20 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
 
 
   # Find target directory when crosscompiling.
   # Find target directory when crosscompiling.
   if(CMAKE_CROSSCOMPILING)
   if(CMAKE_CROSSCOMPILING)
+    if(CMAKE_CUDA_COMPILER_TARGET MATCHES "^([^-]+)(-|$)")
+      set(_CUDA_TARGET_PROCESSOR "${CMAKE_MATCH_1}")
+    elseif(CMAKE_SYSTEM_PROCESSOR)
+      set(_CUDA_TARGET_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}")
+    else()
+      message(FATAL_ERROR "Cross-compiling CUDA with Clang requires CMAKE_CUDA_COMPILER_TARGET and/or CMAKE_SYSTEM_PROCESSOR to be set.")
+    endif()
     # Keep in sync with equivalent table in FindCUDAToolkit!
     # Keep in sync with equivalent table in FindCUDAToolkit!
-    if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
+    if(_CUDA_TARGET_PROCESSOR STREQUAL "armv7-a")
       # Support for NVPACK
       # Support for NVPACK
       set(_CUDA_TARGET_NAMES "armv7-linux-androideabi")
       set(_CUDA_TARGET_NAMES "armv7-linux-androideabi")
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
+    elseif(_CUDA_TARGET_PROCESSOR MATCHES "arm")
       set(_CUDA_TARGET_NAMES "armv7-linux-gnueabihf")
       set(_CUDA_TARGET_NAMES "armv7-linux-gnueabihf")
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+    elseif(_CUDA_TARGET_PROCESSOR MATCHES "aarch64")
       if(ANDROID_ARCH_NAME STREQUAL "arm64")
       if(ANDROID_ARCH_NAME STREQUAL "arm64")
         set(_CUDA_TARGET_NAMES "aarch64-linux-androideabi")
         set(_CUDA_TARGET_NAMES "aarch64-linux-androideabi")
       elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX")
       elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX")
@@ -185,7 +192,7 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
       else()
       else()
         set(_CUDA_TARGET_NAMES "aarch64-linux" "sbsa-linux")
         set(_CUDA_TARGET_NAMES "aarch64-linux" "sbsa-linux")
       endif()
       endif()
-    elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+    elseif(_CUDA_TARGET_PROCESSOR STREQUAL "x86_64")
       set(_CUDA_TARGET_NAMES "x86_64-linux")
       set(_CUDA_TARGET_NAMES "x86_64-linux")
     endif()
     endif()
 
 
@@ -197,6 +204,7 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
     endforeach()
     endforeach()
     unset(_CUDA_TARGET_NAME)
     unset(_CUDA_TARGET_NAME)
     unset(_CUDA_TARGET_NAMES)
     unset(_CUDA_TARGET_NAMES)
+    unset(_CUDA_TARGET_PROCESSOR)
   endif()
   endif()
 
 
   # If not already set we can simply use the toolkit root or it's a scattered installation.
   # If not already set we can simply use the toolkit root or it's a scattered installation.