blob: 4185eda6222db4231227cb43589fb03946f2eb0a [file] [log] [blame]
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
# file Copyright.txt or https://cmake.org/licensing for details.
function(cmake_cuda_architectures_native lang)
# Run the test binary to detect the native architectures.
execute_process(COMMAND "${CMAKE_PLATFORM_INFO_DIR}/CMakeDetermineCompilerABI_${lang}.bin"
RESULT_VARIABLE archs_result
OUTPUT_VARIABLE archs_output
ERROR_VARIABLE archs_output
OUTPUT_STRIP_TRAILING_WHITESPACE
)
if(archs_result EQUAL 0)
if("$ENV{CMAKE_CUDA_ARCHITECTURES_NATIVE_CLAMP}")
# Undocumented hook used by CMake's CI.
# Clamp native architecture to version range supported by this CUDA.
list(GET CMAKE_${lang}_ARCHITECTURES_ALL 0 arch_min)
list(GET CMAKE_${lang}_ARCHITECTURES_ALL -1 arch_max)
set(CMAKE_CUDA_ARCHITECTURES_NATIVE "")
foreach(arch IN LISTS archs_output)
if(arch LESS arch_min)
set(arch "${arch_min}")
endif()
if(arch GREATER arch_max)
set(arch "${arch_max}")
endif()
list(APPEND CMAKE_CUDA_ARCHITECTURES_NATIVE ${arch})
endforeach()
unset(arch)
unset(arch_min)
unset(arch_max)
else()
set(CMAKE_CUDA_ARCHITECTURES_NATIVE "${archs_output}")
endif()
list(REMOVE_DUPLICATES CMAKE_CUDA_ARCHITECTURES_NATIVE)
list(TRANSFORM CMAKE_CUDA_ARCHITECTURES_NATIVE APPEND "-real")
else()
if(NOT archs_result MATCHES "[0-9]+")
set(archs_status " (${archs_result})")
else()
set(archs_status "")
endif()
string(REPLACE "\n" "\n " archs_output " ${archs_output}")
message(CONFIGURE_LOG
"Detecting the CUDA native architecture(s) failed with "
"the following output${archs_status}:\n${archs_output}\n\n")
endif()
set(CMAKE_${lang}_ARCHITECTURES_NATIVE "${CMAKE_CUDA_ARCHITECTURES_NATIVE}" PARENT_SCOPE)
endfunction()