浏览代码

FindCUDAToolkit: Fix cross-compiling without CMAKE_SYSTEM_PROCESSOR

Previously we relied on the cross-compiling toolchain file to set
`CMAKE_SYSTEM_PROCESSOR` to a value consistent with the CUDA compiler's
target architecture.  When a compiled language is enabled, we now have
its target architecture in `CMAKE_<LANG>_COMPILER_ARCHITECTURE_ID`.
Use that to select the CUDA toolkit's corresponding target directory.

If no language is enabled, or the compiler's target architecture is not
known, fall back to `CMAKE_SYSTEM_PROCESSOR`.  If that is not set, fail
with an explicit error make clear what is wrong.
Brad King 8 月之前
父节点
当前提交
4f2482700b
共有 1 个文件被更改,包括 17 次插入4 次删除
  1. 17 4
      Modules/FindCUDAToolkit.cmake

+ 17 - 4
Modules/FindCUDAToolkit.cmake

@@ -939,13 +939,25 @@ endif()
 
 # Find target directory when crosscompiling.
 if(CMAKE_CROSSCOMPILING)
+  # When a language is enabled we can use its compiler's target architecture.
+  if(CMAKE_CUDA_COMPILER_LOADED AND CMAKE_CUDA_COMPILER_ARCHITECTURE_ID)
+    set(_CUDA_TARGET_PROCESSOR "${CMAKE_CUDA_COMPILER_ARCHITECTURE_ID}")
+  elseif(CMAKE_CXX_COMPILER_LOADED AND CMAKE_CXX_COMPILER_ARCHITECTURE_ID)
+    set(_CUDA_TARGET_PROCESSOR "${CMAKE_CXX_COMPILER_ARCHITECTURE_ID}")
+  elseif(CMAKE_C_COMPILER_LOADED AND CMAKE_C_COMPILER_ARCHITECTURE_ID)
+    set(_CUDA_TARGET_PROCESSOR "${CMAKE_C_COMPILER_ARCHITECTURE_ID}")
+  elseif(CMAKE_SYSTEM_PROCESSOR)
+    set(_CUDA_TARGET_PROCESSOR "${CMAKE_SYSTEM_PROCESSOR}")
+  else()
+    message(FATAL_ERROR "Cross-compiling with the CUDA toolkit requires CMAKE_SYSTEM_PROCESSOR to be set.")
+  endif()
   # Keep in sync with equivalent table in CMakeDetermineCUDACompiler and FindCUDA!
-  if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a")
+  if(_CUDA_TARGET_PROCESSOR STREQUAL "armv7-a")
     # Support for NVPACK
     set(CUDAToolkit_TARGET_NAMES "armv7-linux-androideabi")
-  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "arm")
+  elseif(_CUDA_TARGET_PROCESSOR MATCHES "arm")
     set(CUDAToolkit_TARGET_NAMES "armv7-linux-gnueabihf")
-  elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64")
+  elseif(_CUDA_TARGET_PROCESSOR MATCHES "aarch64")
     if(ANDROID_ARCH_NAME STREQUAL "arm64")
       set(CUDAToolkit_TARGET_NAMES "aarch64-linux-androideabi")
     elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX")
@@ -953,9 +965,10 @@ if(CMAKE_CROSSCOMPILING)
     else()
       set(CUDAToolkit_TARGET_NAMES "aarch64-linux" "sbsa-linux")
     endif()
-  elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64")
+  elseif(_CUDA_TARGET_PROCESSOR STREQUAL "x86_64")
     set(CUDAToolkit_TARGET_NAMES "x86_64-linux")
   endif()
+  unset(_CUDA_TARGET_PROCESSOR)
 
   foreach(CUDAToolkit_TARGET_NAME IN LISTS CUDAToolkit_TARGET_NAMES)
     if(EXISTS "${CUDAToolkit_ROOT_DIR}/targets/${CUDAToolkit_TARGET_NAME}")