cmake_minimum_required(VERSION 3.16)
project(sstvapp LANGUAGES C CXX)

set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED ON)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Qml Quick Multimedia Concurrent)

if(NOT DEFINED ENV{ARCH_TRIPLET})
   message(FATAL_ERROR "ARCH_TRIPLET is not set. Build this project with Clickable.")
endif()

set(ARCH "$ENV{ARCH}")
set(ARCH_TRIPLET "$ENV{ARCH_TRIPLET}")
set(CLICK_FRAMEWORK "$ENV{CLICK_FRAMEWORK}")
set(APPARMOR_POLICY "$ENV{APPARMOR_POLICY}")

configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/manifest.json.in
   ${CMAKE_CURRENT_BINARY_DIR}/manifest.json
   @ONLY
)

configure_file(
   ${CMAKE_CURRENT_SOURCE_DIR}/sstv.apparmor.in
   ${CMAKE_CURRENT_BINARY_DIR}/sstv.apparmor
   @ONLY
)

# libsstv provides TX encoding. RX is implemented in the application using a
# native Qt/C++ decoder based on the mode timing and VIS design documented by
# slowrx, avoiding its GTK/ALSA/FFTW application dependencies.
include(FetchContent)
set(BUILD_TOOLS OFF CACHE BOOL "Build libsstv command line tool" FORCE)
FetchContent_Declare(
   libsstv_source
   URL https://github.com/rimio/libsstv/archive/refs/heads/master.tar.gz
   DOWNLOAD_EXTRACT_TIMESTAMP TRUE
)
FetchContent_MakeAvailable(libsstv_source)

if(TARGET sstv)
   set(LIBSSTV_TARGET sstv)
elseif(TARGET libsstv)
   set(LIBSSTV_TARGET libsstv)
elseif(TARGET sstv_static)
   set(LIBSSTV_TARGET sstv_static)
elseif(TARGET libsstv_static)
   set(LIBSSTV_TARGET libsstv_static)
else()
   message(FATAL_ERROR "Unable to find the libsstv CMake library target.")
endif()

qt5_add_resources(APP_RESOURCES resources.qrc)

add_executable(
   sstvapp
   src/main.cpp
   src/SstvBackend.cpp
   src/SstvBackend.h
   src/SstvRxDecoder.cpp
   src/SstvRxDecoder.h
   ${APP_RESOURCES}
)

target_include_directories(
   sstvapp
   PRIVATE
   ${CMAKE_CURRENT_SOURCE_DIR}/src
   ${libsstv_source_SOURCE_DIR}/include
   ${libsstv_source_BINARY_DIR}/include
)

target_link_libraries(
   sstvapp
   PRIVATE
   Qt5::Core
   Qt5::Gui
   Qt5::Qml
   Qt5::Quick
   Qt5::Multimedia
   Qt5::Concurrent
   ${LIBSSTV_TARGET}
)

set_target_properties(
   sstvapp
   PROPERTIES
   INSTALL_RPATH "$ORIGIN/.."
)

install(
   TARGETS sstvapp
   RUNTIME DESTINATION lib/${ARCH_TRIPLET}/bin
)

# If upstream builds a shared library, package it next to the architecture
# runtime tree. Static targets simply contribute an archive that is not needed
# at runtime.
get_target_property(LIBSSTV_TYPE ${LIBSSTV_TARGET} TYPE)
if(LIBSSTV_TYPE STREQUAL "SHARED_LIBRARY" OR LIBSSTV_TYPE STREQUAL "MODULE_LIBRARY")
   install(
      TARGETS ${LIBSSTV_TARGET}
      LIBRARY DESTINATION lib/${ARCH_TRIPLET}
   )
endif()

install(
   FILES
   ${CMAKE_CURRENT_BINARY_DIR}/manifest.json
   ${CMAKE_CURRENT_BINARY_DIR}/sstv.apparmor
   ${CMAKE_CURRENT_SOURCE_DIR}/sstv.desktop
   DESTINATION .
)

install(
   DIRECTORY assets
   DESTINATION .
)

install(
   FILES
   ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
   ${CMAKE_CURRENT_SOURCE_DIR}/THIRD-PARTY.md
   ${CMAKE_CURRENT_SOURCE_DIR}/third_party/slowrx-COPYING
   DESTINATION share/sstv
)
