cmake_minimum_required(VERSION 3.20)

# libcuframes — главная shared library
find_package(CUDAToolkit REQUIRED)
find_package(Threads REQUIRED)

set(CUFRAMES_SOURCES
    src/utils.c
    src/protocol.c
    src/producer.c
    src/consumer.c
    src/consumer_async.c
)

add_library(cuframes SHARED ${CUFRAMES_SOURCES})
add_library(cuframes_static STATIC ${CUFRAMES_SOURCES})

foreach(target cuframes cuframes_static)
    target_include_directories(${target}
        PUBLIC
            $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
            $<INSTALL_INTERFACE:include>
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}/src
    )
    target_compile_features(${target} PRIVATE c_std_11)
    target_compile_options(${target} PRIVATE
        -Wall -Wextra -Wpedantic
        -Wno-address-of-packed-member  # известная проблема atomics на packed structs (x86_64 ok)
        $<$<CONFIG:Debug>:-O0 -g>
        $<$<CONFIG:Release>:-O2 -g>
    )
    target_link_libraries(${target}
        PUBLIC
            CUDA::cudart
            Threads::Threads
            rt   # для shm_open
    )
endforeach()

# Set SOVERSION на shared lib для ABI tracking
set_target_properties(cuframes PROPERTIES
    VERSION 0.1.0
    SOVERSION 0
)

# Optionally — explicit visibility для exports. C-linkage уже handled extern "C"
# в header'е. Используем -fvisibility=hidden + указываем default для public symbols
# через __attribute__((visibility("default"))). Но мы это сделаем в v0.2 — пока
# default visibility внутри source files.
target_compile_definitions(cuframes PRIVATE CUFRAMES_BUILDING_DLL)
target_compile_definitions(cuframes_static PRIVATE CUFRAMES_STATIC_LIB)

# Override default fvisibility (на текущем этапе экспортируем всё)
foreach(target cuframes cuframes_static)
    set_target_properties(${target} PROPERTIES
        C_VISIBILITY_PRESET default
    )
endforeach()

# Tests
if(BUILD_TESTING)
    add_subdirectory(tests)
endif()
