Browse Source

Merge topic 'cuda-cross-targets'

781a67bf5e CUDA/Clang: Determine cross-compiling target from CMAKE_CUDA_COMPILER_TARGET
40eeca77c3 CUDA/Clang: Sync target directory table with FindCUDAToolkit
05efcdd464 FindCUDA: Sync target directory table with FindCUDAToolkit

Acked-by: Kitware Robot <[email protected]>
Merge-request: !10421
Brad King 1 year ago
parent
commit
8295a4ad32
3 changed files with 34 additions and 17 deletions
  1. 28 13
      Modules/CMakeDetermineCUDACompiler.cmake
  2. 5 4
      Modules/FindCUDA.cmake
  3. 1 0
      Modules/FindCUDAToolkit.cmake

+ 28 - 13
Modules/CMakeDetermineCUDACompiler.cmake

@@ -171,24 +171,40 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
 
   # Find target directory when crosscompiling.
   if(CMAKE_CROSSCOMPILING)
-    if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
+    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!
+    if(_CUDA_TARGET_PROCESSOR STREQUAL "armv7-a")
       # Support for NVPACK
-      set(_CUDA_TARGET_NAME "armv7-linux-androideabi")
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
-      set(_CUDA_TARGET_NAME "armv7-linux-gnueabihf")
-    elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+      set(_CUDA_TARGET_NAMES "armv7-linux-androideabi")
+    elseif(_CUDA_TARGET_PROCESSOR MATCHES "arm")
+      set(_CUDA_TARGET_NAMES "armv7-linux-gnueabihf")
+    elseif(_CUDA_TARGET_PROCESSOR MATCHES "aarch64")
       if(ANDROID_ARCH_NAME STREQUAL "arm64")
-        set(_CUDA_TARGET_NAME "aarch64-linux-androideabi")
+        set(_CUDA_TARGET_NAMES "aarch64-linux-androideabi")
+      elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX")
+        set(_CUDA_TARGET_NAMES "aarch64-qnx")
       else()
-        set(_CUDA_TARGET_NAME "aarch64-linux")
+        set(_CUDA_TARGET_NAMES "aarch64-linux" "sbsa-linux")
       endif()
-    elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
-      set(_CUDA_TARGET_NAME "x86_64-linux")
+    elseif(_CUDA_TARGET_PROCESSOR STREQUAL "x86_64")
+      set(_CUDA_TARGET_NAMES "x86_64-linux")
     endif()
 
-    if(EXISTS "${CMAKE_CUDA_COMPILER_TOOLKIT_ROOT}/targets/${_CUDA_TARGET_NAME}")
-      set(_CUDA_TARGET_DIR "${CMAKE_CUDA_COMPILER_TOOLKIT_ROOT}/targets/${_CUDA_TARGET_NAME}")
-    endif()
+    foreach(_CUDA_TARGET_NAME IN LISTS _CUDA_TARGET_NAMES)
+      if(EXISTS "${CMAKE_CUDA_COMPILER_TOOLKIT_ROOT}/targets/${_CUDA_TARGET_NAME}")
+        set(_CUDA_TARGET_DIR "${CMAKE_CUDA_COMPILER_TOOLKIT_ROOT}/targets/${_CUDA_TARGET_NAME}")
+        break()
+      endif()
+    endforeach()
+    unset(_CUDA_TARGET_NAME)
+    unset(_CUDA_TARGET_NAMES)
+    unset(_CUDA_TARGET_PROCESSOR)
   endif()
 
   # If not already set we can simply use the toolkit root or it's a scattered installation.
@@ -227,7 +243,6 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang")
   unset(_CUDA_INCLUDE_DIR)
   unset(_CUDA_LIBRARY_DIR)
   unset(_CUDA_TARGET_DIR)
-  unset(_CUDA_TARGET_NAME)
 elseif(CMAKE_CUDA_COMPILER_ID STREQUAL "NVIDIA")
   include(Internal/CMakeNVCCParseImplicitInfo)
   # Parse CMAKE_CUDA_COMPILER_PRODUCED_OUTPUT to get:

+ 5 - 4
Modules/FindCUDA.cmake

@@ -891,21 +891,22 @@ endif ()
 
 if(CMAKE_CROSSCOMPILING)
   set(CUDA_TOOLKIT_ROOT $ENV{CUDA_TOOLKIT_ROOT})
+  # Keep in sync with equivalent table in FindCUDAToolkit!
   if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
     # Support for NVPACK
-    set (CUDA_TOOLKIT_TARGET_NAMES "armv7-linux-androideabi")
+    set(CUDA_TOOLKIT_TARGET_NAMES "armv7-linux-androideabi")
   elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
-    # Support for arm cross compilation
     set(CUDA_TOOLKIT_TARGET_NAMES "armv7-linux-gnueabihf")
   elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
-    # Support for aarch64 cross compilation
-    if (ANDROID_ARCH_NAME STREQUAL "arm64")
+    if(ANDROID_ARCH_NAME STREQUAL "arm64")
       set(CUDA_TOOLKIT_TARGET_NAMES "aarch64-linux-androideabi")
     elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX")
       set(CUDA_TOOLKIT_TARGET_NAMES "aarch64-qnx")
     else()
       set(CUDA_TOOLKIT_TARGET_NAMES "aarch64-linux" "sbsa-linux")
     endif()
+  elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+    set(CUDA_TOOLKIT_TARGET_NAMES "x86_64-linux")
   endif()
 
   foreach(CUDA_TOOLKIT_TARGET_NAME IN LISTS CUDA_TOOLKIT_TARGET_NAMES)

+ 1 - 0
Modules/FindCUDAToolkit.cmake

@@ -939,6 +939,7 @@ endif()
 
 # Find target directory when crosscompiling.
 if(CMAKE_CROSSCOMPILING)
+  # Keep in sync with equivalent table in CMakeDetermineCUDACompiler and FindCUDA!
   if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
     # Support for NVPACK
     set(CUDAToolkit_TARGET_NAMES "armv7-linux-androideabi")