cmake_minimum_required (VERSION 3.9.4)

#set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -D__LIBAVRESAMPLE__ -std=c99")

set(VAPOUR_SIMPLE_EVENTDISPATCHER ON)
set(VAPOUR_APP ON)
set(VAPOUR_DEBUG_ASYNC ON)
set(VAPOUR_DEBUG_LOG_TO_FILE ON)
set(VAPOUR_RAPIDJSON ON)
set(VAPOUR_ENV ON)
set(VAPOUR_PUBSUB_SERVICE_BASE ON)
set(VAPOUR_PUBSUB_CLIENT ON)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
set(VAPOUR_APP_NAME "multistream")

# Add source to this project's executable.
file (GLOB_RECURSE SOURCES 
    ./*.cpp
)

include_directories(.)
add_executable (${ProjectName} ${SOURCES})

target_compile_definitions(${ProjectName} PUBLIC ${VapourGIT_COMPILE_DEFINITIONS})
add_compile_definitions(BOOST_BEAST_ALLOW_DEPRECATED=1)

set_property(TARGET ${ProjectName} PROPERTY CXX_STANDARD 17)
set_property(TARGET ${ProjectName} PROPERTY CXX_STANDARD_REQUIRED ON)
add_compile_options(-march=skylake)

find_package(FFmpeg REQUIRED)

if(FFMPEG_FOUND)
    message(STATUS "Found FFMPEG/LibAV libraries ${FFMPEG_INCLUDE_DIR}")
    include_directories(${FFMPEG_INCLUDE_DIR})
    target_link_libraries(${ProjectName} PRIVATE ${FFMPEG_LIBRARIES})
else()
    message(FATAL_ERROR "Can't find libavcodec, libavformat or libavutil. Add them!")
endif()

target_link_libraries(${ProjectName} PRIVATE "-lm")
target_link_libraries(${ProjectName} PRIVATE "-lavcodec")
target_link_libraries(${ProjectName} PRIVATE "-lavfilter")
target_link_libraries(${ProjectName} PRIVATE "-lavutil")
target_link_libraries(${ProjectName} PRIVATE "-lswresample")
target_link_libraries(${ProjectName} PRIVATE "-lswscale")
target_link_libraries(${ProjectName} PRIVATE "-lavformat")

target_link_libraries(${ProjectName} PUBLIC PajladaSerialize)
target_link_libraries(${ProjectName} PUBLIC PajladaHumanize)

find_package(DeckLink REQUIRED)
include_directories(${DeckLink_INCLUDE_DIRS})
target_sources(${ProjectName} PRIVATE ${DeckLink_SOURCES})

find_package(NDI REQUIRED)
target_link_libraries(${ProjectName} PRIVATE NDI)

target_link_libraries(${ProjectName} PRIVATE "-ldl")

find_package(Threads REQUIRED)
target_link_libraries(${ProjectName} PRIVATE Threads::Threads)

find_package(ZLIB REQUIRED)
target_link_libraries(${ProjectName} PRIVATE ZLIB::ZLIB)

find_library(SoundTouch SoundTouch)
target_link_libraries(${ProjectName} PRIVATE ${SoundTouch})

find_package(Boost COMPONENTS filesystem REQUIRED)
target_link_libraries(${ProjectName} PRIVATE ${Boost_FILESYSTEM_LIBRARY})

# Internal dependencies
add_subdirectory(${CMAKE_SOURCE_DIR}/internal/fundamentals build-fundamentals)
add_subdirectory(${CMAKE_SOURCE_DIR}/internal/api build-api)
add_subdirectory(${CMAKE_SOURCE_DIR}/internal/pubsub build-pubsub)
add_subdirectory(${CMAKE_SOURCE_DIR}/internal/quitter build-quitter)
add_subdirectory(${CMAKE_SOURCE_DIR}/internal/player-core-platform build-playercore)

target_link_libraries(${ProjectName} PUBLIC VapourFundamentals)
target_link_libraries(${ProjectName} PUBLIC VapourAPI)
target_link_libraries(${ProjectName} PUBLIC VapourPubSub)
target_link_libraries(${ProjectName} PUBLIC VapourQuitter)
target_link_libraries(${ProjectName} PUBLIC VapourThreadHelpers)
target_link_libraries(${ProjectName} PUBLIC VapourPlayerCore)

# optional sanitizers
# Valid options:
# SANITIZE_ADDRESS
# SANITIZE_MEMORY
# SANITIZE_THREAD
# SANITIZE_UNDEFINED
find_package(Sanitizers)
add_sanitizers(${ProjectName})

include(${CMAKE_SOURCE_DIR}/internal/cmake/VapourClangTidy.cmake)
