add_executable(copy copy_main.cc)
target_include_directories(copy PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_link_libraries(copy PRIVATE fmt::fmt)

# Select implementation based on runtime backend
if(RUNTIME_BACKEND STREQUAL "CUDA")
    file(GLOB RUNTIME_SOURCE_FILES "cuda/*.cc" "cuda/*.cu" "cuda/*.h")
    target_link_libraries(copy PRIVATE CUDA::Runtime)
    find_path(IBVERBS_INCLUDE_PATH NAMES infiniband/verbs.h)
    find_library(IBVERBS_LIB NAMES ibverbs)
    if(IBVERBS_INCLUDE_PATH AND IBVERBS_LIB)
        find_package(Threads REQUIRED)
        list(APPEND RUNTIME_SOURCE_FILES cuda/gdr/copy_case_gdr.cc)
        target_sources(copy PRIVATE cuda/gdr/rdma_channel_gdr.cc)
        target_include_directories(copy PRIVATE cuda/gdr ${IBVERBS_INCLUDE_PATH})
        target_link_libraries(copy PRIVATE ${IBVERBS_LIB} Threads::Threads)
    else()
        message(STATUS "Skipping copy GDR cases: libibverbs headers or library were not found")
    endif()
elseif(RUNTIME_BACKEND STREQUAL "Ascend")
    file(GLOB RUNTIME_SOURCE_FILES "ascend/*.cc" "ascend/*.h")
    target_link_libraries(copy PRIVATE Ascend::Runtime)
    if(HAVE_ASCEND_FFTS_RUNTIME)
        list(APPEND RUNTIME_SOURCE_FILES
            ascend/ffts_direct_h2d/copy_case_ffts_direct_h2d_ascend.cc)
        target_include_directories(copy PRIVATE
            ascend
            ascend/ffts_direct_h2d
            ascend/h2d_ffts_pipeline
            ${ASCEND_FFTS_INCLUDE_DIRS})
        target_link_libraries(copy PRIVATE "${ASCEND_RUNTIME_LIBRARY}")
    else()
        message(STATUS "Skipping copy FFTS direct H2D cases: FFTS headers or libruntime were not found")
    endif()
else()
    file(GLOB RUNTIME_SOURCE_FILES "simu/*.cc" "simu/*.h")
endif()

target_sources(copy PRIVATE ${RUNTIME_SOURCE_FILES})
