cmake_minimum_required(VERSION 3.17)
project(soma-dns VERSION 2.0.0 LANGUAGES CXX CUDA)

set(CMAKE_CXX_STANDARD 17)
list(PREPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake)

find_package(CUDAToolkit)
include(json)

# Setting auto-detect compute architecture for the current GPU
# Reference: https://stackoverflow.com/a/68223399
function(get_compute_architecture compute_architecture_var)
    include(FindCUDA/select_compute_arch)

    CUDA_DETECT_INSTALLED_GPUS(INSTALLED_GPU_CCS_1)
    string(STRIP "${INSTALLED_GPU_CCS_1}" INSTALLED_GPU_CCS_2)
    string(REPLACE " " ";" INSTALLED_GPU_CCS_3 "${INSTALLED_GPU_CCS_2}")
    string(REPLACE "." "" CUDA_ARCH_LIST "${INSTALLED_GPU_CCS_3}")
    string(REPLACE ";" ";" architectures_list "${CUDA_ARCH_LIST}")
    set(pattern "^..+PTX$")
    set(matches)

    foreach(arch IN LISTS architectures_list)
        if(NOT arch MATCHES "${pattern}")
            list(APPEND matches "${arch}")
        endif()
    endforeach()

    set(${compute_architecture_var} ${matches} PARENT_SCOPE)
endfunction()

get_compute_architecture(CUDA_ARCH_LIST)
message(STATUS "CUDA_ARCH_LIST: ${CUDA_ARCH_LIST}")
set(CMAKE_CUDA_ARCHITECTURES ${CUDA_ARCH_LIST})

add_executable(sim src/Sim/main.cu src/Sim/SimulatorMultiPart.cu)
target_link_libraries(sim PRIVATE CUDA::cudart CUDA::curand)
target_include_directories(sim PRIVATE ${json_SOURCE_DIR}/single_include/nlohmann)
set_target_properties(sim
    PROPERTIES
    CUDA_SEPARABLE_COMPILATION ON
    CUDA_RESOLVE_DEVICE_SYMBOLS ON)
