From 781a67bf5ead1dab73ece4f36985a263c573b847 Mon Sep 17 00:00:00 2001 From: Brad King Date: Wed, 26 Feb 2025 16:30:19 -0500 Subject: [PATCH] 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. --- Modules/CMakeDetermineCUDACompiler.cmake | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/Modules/CMakeDetermineCUDACompiler.cmake b/Modules/CMakeDetermineCUDACompiler.cmake index 444b516fbe..5198231f54 100644 --- a/Modules/CMakeDetermineCUDACompiler.cmake +++ b/Modules/CMakeDetermineCUDACompiler.cmake @@ -171,13 +171,20 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang") # Find target directory when 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! - if(CMAKE_SYSTEM_PROCESSOR STREQUAL "armv7-a") + if(_CUDA_TARGET_PROCESSOR STREQUAL "armv7-a") # Support for NVPACK 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") - elseif(CMAKE_SYSTEM_PROCESSOR MATCHES "aarch64") + elseif(_CUDA_TARGET_PROCESSOR MATCHES "aarch64") if(ANDROID_ARCH_NAME STREQUAL "arm64") set(_CUDA_TARGET_NAMES "aarch64-linux-androideabi") elseif (CMAKE_SYSTEM_NAME STREQUAL "QNX") @@ -185,7 +192,7 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang") else() set(_CUDA_TARGET_NAMES "aarch64-linux" "sbsa-linux") endif() - elseif(CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64") + elseif(_CUDA_TARGET_PROCESSOR STREQUAL "x86_64") set(_CUDA_TARGET_NAMES "x86_64-linux") endif() @@ -197,6 +204,7 @@ if(CMAKE_CUDA_COMPILER_ID STREQUAL "Clang") 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.