# Основная библиотека композитора — `libcuframes_composer.so`. Содержит:
#   - source.c          подписка к cuframes публишеру + state machine
#   - nvenc_loader.c    dlopen libnvidia-encode.so + загрузка API таблицы
#   - nvenc.c           обвязка вокруг NVENC SDK (init/encode/teardown)
#   - composer.c        Phase 2: multi-source grid композитор
#   - cugrid/cugrid.cu  Phase 2: CUDA kernels (resize, fill) для NV12 grid'а
#
# Дальше по фазам:
#   Phase 3: overlay.c, png_decode.c, text_render.c, rtsp_publisher.c, rtp_h264.c
#   Phase 4: control_zmq.c
#   Phase 5: health_mqtt.c

set(COMPOSER_SOURCES_C
    source.c
    nvenc_loader.c
    nvenc.c
    composer.c
)
set(COMPOSER_SOURCES_CU
    cugrid/cugrid.cu
)

add_library(cuframes_composer SHARED ${COMPOSER_SOURCES_C} ${COMPOSER_SOURCES_CU})
add_library(cuframes_composer_static STATIC ${COMPOSER_SOURCES_C} ${COMPOSER_SOURCES_CU})

foreach(target cuframes_composer cuframes_composer_static)
    target_include_directories(${target}
        PUBLIC
            $<BUILD_INTERFACE:${CMAKE_SOURCE_DIR}/include>
            $<INSTALL_INTERFACE:include>
        PRIVATE
            ${CMAKE_CURRENT_SOURCE_DIR}
            ${NVCODEC_HEADERS_DIR}
    )
    target_compile_features(${target} PRIVATE c_std_11)
    # C-only флаги (для CUDA свои дефолты, -Wpedantic не подходит для .cu).
    target_compile_options(${target} PRIVATE
        $<$<COMPILE_LANGUAGE:C>:-Wall>
        $<$<COMPILE_LANGUAGE:C>:-Wextra>
        $<$<COMPILE_LANGUAGE:C>:-Wpedantic>
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug>>:-O0>
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Debug>>:-g3>
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Release>>:-O2>
        $<$<AND:$<COMPILE_LANGUAGE:C>,$<CONFIG:Release>>:-g>
    )
    target_link_libraries(${target}
        PUBLIC
            cuframes_static            # из third_party/cuframes
            CUDA::cudart
            CUDA::cuda_driver
            Threads::Threads
            ${LIBDL_LIBRARY}           # для dlopen libnvidia-encode.so
            rt
    )
    # CUDA properties.
    set_target_properties(${target} PROPERTIES
        CUDA_SEPARABLE_COMPILATION OFF
    )
endforeach()

set_target_properties(cuframes_composer PROPERTIES
    VERSION ${PROJECT_VERSION}
    SOVERSION 0
)

# Install rules
include(GNUInstallDirs)
install(TARGETS cuframes_composer cuframes_composer_static
    EXPORT cuframesComposerTargets
    RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
    LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
    ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}
)
install(DIRECTORY ${CMAKE_SOURCE_DIR}/include/cuframes_composer
    DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}
    FILES_MATCHING PATTERN "*.h"
)
