cmake_minimum_required(VERSION 3.16)
project(terminal LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_POSITION_INDEPENDENT_CODE ON)

include(CTest)
option(TERMINAL_UI_TESTS "Enable runtime viewport tests requiring the real Lomiri QML module" OFF)
find_package(Qt5 REQUIRED COMPONENTS Core Gui Qml Quick)

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}/terminal.apparmor.in
   ${CMAKE_CURRENT_BINARY_DIR}/terminal.apparmor
   @ONLY
)

qt5_add_resources(APP_RESOURCES resources.qrc)

add_executable(
   terminal
   src/main.cpp
   src/SettingsStore.cpp
   src/SettingsStore.h
   src/InstanceLauncher.cpp
   src/InstanceLauncher.h
   src/TerminalScreen.cpp
   src/TerminalScreen.h
   src/TerminalSession.cpp
   src/TerminalSession.h
   src/TerminalView.cpp
   src/TerminalView.h
   ${APP_RESOURCES}
)

target_link_libraries(
   terminal
   PRIVATE
   Qt5::Core
   Qt5::Gui
   Qt5::Qml
   Qt5::Quick
   util
)

if(BUILD_TESTING)
   add_executable(
      terminal-settings-restart-test
      tests/test-settings-restart.cpp
      src/SettingsStore.cpp
      src/SettingsStore.h
   )
   target_include_directories(terminal-settings-restart-test PRIVATE src)
   target_link_libraries(terminal-settings-restart-test PRIVATE Qt5::Core)
   add_test(NAME terminal-settings-restart-test COMMAND terminal-settings-restart-test)

   add_executable(
      terminal-screen-test
      tests/test-terminal-screen.cpp
      src/TerminalScreen.cpp
      src/TerminalScreen.h
   )
   target_include_directories(terminal-screen-test PRIVATE src)
   target_link_libraries(terminal-screen-test PRIVATE Qt5::Core Qt5::Gui)
   add_test(NAME terminal-screen-test COMMAND terminal-screen-test)

   add_executable(
      terminal-session-test
      tests/test-terminal-session.cpp
      src/TerminalSession.cpp
      src/TerminalSession.h
      src/TerminalScreen.cpp
      src/TerminalScreen.h
   )
   target_include_directories(terminal-session-test PRIVATE src)
   target_link_libraries(terminal-session-test PRIVATE Qt5::Core Qt5::Gui util)
   add_test(NAME terminal-session-test COMMAND terminal-session-test)
   add_executable(
      terminal-instance-test
      tests/test-instance-launcher.cpp
      src/InstanceLauncher.cpp
      src/InstanceLauncher.h
   )
   target_include_directories(terminal-instance-test PRIVATE src)
   target_link_libraries(terminal-instance-test PRIVATE Qt5::Core)
   add_test(NAME terminal-instance-test COMMAND terminal-instance-test)
   if(TERMINAL_UI_TESTS)
      add_executable(
         terminal-ui-test
         tests/test-ui-layout.cpp
         src/InstanceLauncher.cpp src/InstanceLauncher.h
         src/SettingsStore.cpp src/SettingsStore.h
         src/TerminalSession.cpp src/TerminalSession.h
         src/TerminalScreen.cpp src/TerminalScreen.h
         src/TerminalView.cpp src/TerminalView.h
         ${APP_RESOURCES}
      )
      target_include_directories(terminal-ui-test PRIVATE src)
      target_link_libraries(terminal-ui-test PRIVATE Qt5::Core Qt5::Gui Qt5::Qml Qt5::Quick util)
      add_test(NAME terminal-ui-test COMMAND terminal-ui-test)
      set_tests_properties(terminal-ui-test PROPERTIES TIMEOUT 60)
   endif()
   set_tests_properties(terminal-settings-restart-test terminal-session-test terminal-instance-test PROPERTIES TIMEOUT 40)
endif()

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

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

install(
   DIRECTORY assets
   DESTINATION .
)

install(
   FILES
   ${CMAKE_CURRENT_SOURCE_DIR}/LICENSE
   ${CMAKE_CURRENT_SOURCE_DIR}/README.md
   ${CMAKE_CURRENT_SOURCE_DIR}/THIRD-PARTY.md
   ${CMAKE_CURRENT_SOURCE_DIR}/OPENSTORE-DESCRIPTION.txt
   ${CMAKE_CURRENT_SOURCE_DIR}/CHANGELOG.md
   DESTINATION share/terminal
)
