cmake_minimum_required(VERSION 3.16)

project(UvcSDKExamples LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

if(NOT CMAKE_BUILD_TYPE)
    set(CMAKE_BUILD_TYPE Release)
endif()

if(CMAKE_CONFIGURATION_TYPES)
    set(CMAKE_CONFIGURATION_TYPES Debug Release)
    set(CMAKE_CONFIGURATION_TYPES "${CMAKE_CONFIGURATION_TYPES}" CACHE STRING
        "Reset the configurations to what we need"
        FORCE)
endif()

add_subdirectory(third_party/SDL2)

set(slcam_link_dirs)
set(lib_link_dirs)
set(demo_libs)

# Windows Platform
if(WIN32)
    set(slcam_platform win)
    if(NOT CMAKE_GENERATOR_PLATFORM)
        set(CMAKE_GENERATOR_PLATFORM x64)
    endif()

    if(CMAKE_GENERATOR_PLATFORM STREQUAL Win32)
        set(slcam_arch x86)
    else()
        set(slcam_arch ${CMAKE_GENERATOR_PLATFORM})
    endif()

    list(APPEND slcam_link_dirs ${PROJECT_SOURCE_DIR}/../../sdk/win/slcam/lib/${slcam_arch})
# UNIX Platform
elseif(UNIX AND NOT APPLE)
    set(slcam_platform linux)

    if("${CMAKE_SIZEOF_VOID_P}" MATCHES 8)
        set(slcam_arch x64)
    else()
        set(slcam_arch x86)
    endif()

    list(APPEND slcam_link_dirs ${PROJECT_SOURCE_DIR}/../../sdk/linux/slcam/lib/${slcam_arch})
    list(APPEND lib_link_dirs  ${PROJECT_SOURCE_DIR}/../../sdk/linux/FFmpeg/lib/${slcam_arch})
    list(APPEND demo_libs pthread)
# Apple Platform
elseif(APPLE)
    set(slcam_platform mac)

    list(APPEND slcam_link_dirs ${PROJECT_SOURCE_DIR}/../../sdk/mac/slcam/lib/)
    list(APPEND lib_link_dirs  ${PROJECT_SOURCE_DIR}/../../sdk/mac/FFmpeg/lib/)
endif()

set(DEST_DIR "${CMAKE_BINARY_DIR}/sdk")

foreach(DIR IN LISTS lib_link_dirs)
    file(COPY ${DIR} DESTINATION ${DEST_DIR})
endforeach()


foreach(DIR IN LISTS slcam_link_dirs)
    file(COPY ${DIR} DESTINATION ${DEST_DIR})
endforeach()

add_executable(CaptureDemo ${PROJECT_SOURCE_DIR}/CaptureDemo/main.cpp)
target_include_directories(CaptureDemo
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/../../sdk/${slcam_platform}/slcam/include
)
target_link_directories(CaptureDemo
    PRIVATE
        ${DEST_DIR}/${slcam_arch}
)
target_link_libraries(CaptureDemo
    PRIVATE
        slcam
        SDL2::SDL2 
        SDL2::SDL2main
)

add_executable(ControlDemo ${PROJECT_SOURCE_DIR}/ControlDemo/main.cpp)
target_include_directories(ControlDemo
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/../../sdk/${slcam_platform}/slcam/include
)
target_link_directories(ControlDemo
    PRIVATE
        ${DEST_DIR}/${slcam_arch}
)
target_link_libraries(ControlDemo
    PRIVATE
        slcam
)


add_executable(MultiCameraDemo ${PROJECT_SOURCE_DIR}/MultiCameraDemo/main.cpp)
target_include_directories(MultiCameraDemo
    PRIVATE 
        ${PROJECT_SOURCE_DIR}/../../sdk/${slcam_platform}/slcam/include
)
target_link_directories(MultiCameraDemo
    PRIVATE
        ${DEST_DIR}/${slcam_arch}
)
target_link_libraries(MultiCameraDemo 
    PRIVATE
        slcam
        SDL2::SDL2 
        SDL2::SDL2main
        ${demo_libs}
)
