| # 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() |