function(llama_install_prune_cuda MAIN_TARGET)
    if(NOT (GGML_CUDA AND GGML_STATIC AND CMAKE_SYSTEM_NAME STREQUAL "Linux"))
        return()
    endif()

    list(LENGTH CMAKE_CUDA_ARCHITECTURES ARCH_COUNT)
    if(ARCH_COUNT GREATER 1)
        return()
    endif()

    find_package(CUDAToolkit REQUIRED)
    find_program(NVPRUNE nvprune HINTS ${CUDAToolkit_BIN_DIR})

    if(NOT NVPRUNE)
        message(WARNING "Missing nvprune")
        return()
    endif()

    list(GET CMAKE_CUDA_ARCHITECTURES 0 ARCH)
    string(REGEX REPLACE "-real" "" TARGET_ARCH "${ARCH}")

    set(PRUNED_DIR "${CMAKE_CURRENT_BINARY_DIR}/pruned_libs")
    file(MAKE_DIRECTORY ${PRUNED_DIR})
    set(NEW_LIBS "")

    foreach(CUBLAS cublas cublasLt)
        find_library(SRC_${CUBLAS} NAMES ${CUBLAS}_static HINTS ${CUDAToolkit_LIBRARY_DIR})
        set(DST "${PRUNED_DIR}/lib${CUBLAS}_sm${ARCH}.a")
        message(STATUS "Generating ${CUBLAS} for sm_${ARCH}...")
        execute_process(COMMAND ${NVPRUNE} -arch sm_${ARCH} -o "${DST}" "${SRC_${CUBLAS}}" OUTPUT_QUIET)
        list(APPEND NEW_LIBS "${DST}")
    endforeach()

    if(NEW_LIBS)
        foreach(T ggml-cuda ${MAIN_TARGET})
            if(TARGET ${T})
                get_target_property(OLD_LINKS ${T} LINK_LIBRARIES)
                set(NEW_LINKS "")
                if(OLD_LINKS)
                    foreach(ITEM ${OLD_LINKS})
                        if(NOT ITEM MATCHES "cublas")
                            list(APPEND NEW_LINKS "${ITEM}")
                        endif()
                    endforeach()
                endif()
                list(APPEND NEW_LINKS ${NEW_LIBS})
                set_target_properties(${T} PROPERTIES LINK_LIBRARIES "${NEW_LINKS}")
            endif()
        endforeach()
    endif()
endfunction()
