You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.9 KiB
50 lines
1.9 KiB
# 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()
|