diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake index 698346f41c..5198231f54 100644 --- a/Modules/CMakeDetermineCUDACompiler.cmake +++ b/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: diff --git a/Modules/FindCUDA.cmake b/Modules/FindCUDA.cmake index 4323fda046..284726c4b0 100644 --- a/Modules/FindCUDA.cmake +++ b/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) diff --git a/Modules/FindCUDAToolkit.cmake b/Modules/FindCUDAToolkit.cmake index b10880dd81..7df621e282 100644 --- a/Modules/FindCUDAToolkit.cmake +++ b/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")