cmake_minimum_required(VERSION 3.10.0)

project(seergdb VERSION 2.8.0 LANGUAGES CXX)

set(PROJECT_NAME seergdb)

if(NOT DEFINED QTVERSION)
    set(QTVERSION "QT6" CACHE STRING "" FORCE)
endif()

if(${QTVERSION} STREQUAL "QT6")
    message("-- Compile with QT6")
elseif(${QTVERSION} STREQUAL "QT5")
    message("-- Compile with QT5")
else()
    message(FATAL_ERROR "-- Use -DQTVERSION=QT5|QT6 not \"${QTVERSION}\"")
endif()

# Find includes in the build directories
set(CMAKE_INCLUDE_CURRENT_DIR ON)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_PREFIX_PATH ${QTDIR})
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)

if(${QTVERSION} STREQUAL "QT6")
    find_package(Qt6 COMPONENTS REQUIRED Core)
    find_package(Qt6 COMPONENTS REQUIRED Gui)
    find_package(Qt6 COMPONENTS REQUIRED Widgets)
    find_package(Qt6 COMPONENTS REQUIRED PrintSupport)
    find_package(Qt6 COMPONENTS REQUIRED Charts)
    find_package(Qt6 COMPONENTS REQUIRED Svg)
    find_package(Qt6 COMPONENTS REQUIRED OpenGL)

    set(CMAKE_CXX_STANDARD 17)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)

elseif(${QTVERSION} STREQUAL "QT5")
    find_package(Qt5 COMPONENTS REQUIRED Core)
    find_package(Qt5 COMPONENTS REQUIRED Gui)
    find_package(Qt5 COMPONENTS REQUIRED Widgets)
    find_package(Qt5 COMPONENTS REQUIRED PrintSupport)
    find_package(Qt5 COMPONENTS REQUIRED Charts)

    set(CMAKE_CXX_STANDARD 11)
    set(CMAKE_CXX_STANDARD_REQUIRED ON)
    set(CMAKE_CXX_EXTENSIONS OFF)
endif()

# Define the source location of header files
set(HEADER_FILES
    GdbMonitor.h
    QProcessInfo.h
    QProcessInfoWidget.h
    QProgressIndicator.h
    QColorButton.h
    QColorSwatch.h
    QDetachTabWidget.h
    QZoomChartView.h
    QZoomChart.h
    QClearLineEdit.h
    QIndexTreeWidget.h
    QStringPair.h
    QHistoryLineEdit.h
    QEditDelegate.h
    QHContainerWidget.h
    QImageViewer.h
    QAnsiTextEdit.h
    SeerUtl.h
    SeerArgumentsDialog.h
    SeerBreakpointCreateDialog.h
    SeerMessagesBrowserWidget.h
    SeerBreakpointsBrowserWidget.h
    SeerCatchpointCreateDialog.h
    SeerCatchpointsBrowserWidget.h
    SeerPrintpointCreateDialog.h
    SeerPrintpointsBrowserWidget.h
    SeerCheckpointsBrowserWidget.h
    SeerCommandLogsWidget.h
    SeerSeerLogWidget.h
    SeerConsoleWidget.h
    SeerConfigDialog.h
    SeerGdbConfigPage.h
    SeerRRConfigPage.h
    SeerEditorConfigPage.h
    SeerSourceConfigPage.h
    SeerAssemblyConfigPage.h
    SeerSeerConfigPage.h
    SeerKeysConfigPage.h
    SeerCloseSourceDialog.h
    SeerDebugDialog.h
    SeerDirectoryFilterProxyModel.h
    SeerEditorManagerEntry.h
    SeerEditorManagerWidget.h
    SeerEditorWidgetSource.h
    SeerEditorWidgetAssembly.h
    SeerExecutableFilterProxyModel.h
    SeerGdbWidget.h
    SeerHexWidget.h
    SeerAsmWidget.h
    SeerArrayWidget.h
    SeerMarixWidget.h
    SeerLogWidget.h
    SeerMainWindow.h
    SeerArrayVisualizerWidget.h
    SeerMatrixVisualizerWidget.h
    SeerMemoryVisualizerWidget.h
    SeerStructVisualizerWidget.h
    SeerVarVisualizerWidget.h
    SeerImageVisualizerWidget.h
    SeerGdbMonitorWidget.h
    SeerRegisterValuesBrowserWidget.h
    SeerRegisterEditValueDialog.h
    SeerRegisterProfileDialog.h
    SeerRegisterTreeWidgetItem.h
    SeerSignalValuesBrowserWidget.h
    SeerSignalProfileDialog.h
    SeerSignalEditValueDialog.h
    SeerRunStatusIndicator.h
    SeerLibraryBrowserWidget.h
    SeerSourceBrowserWidget.h
    SeerFunctionBrowserWidget.h
    SeerTypeBrowserWidget.h
    SeerStaticBrowserWidget.h
    SeerSkipBrowserWidget.h
    SeerSkipCreateDialog.h
    SeerSourceSymbolLibraryManagerWidget.h
    SeerStackArgumentsBrowserWidget.h
    SeerStackFramesBrowserWidget.h
    SeerStackLocalsBrowserWidget.h
    SeerStackDumpBrowserWidget.h
    SeerStackDumpSettingsDialog.h
    SeerStackManagerWidget.h
    SeerThreadFramesBrowserWidget.h
    SeerThreadIdsBrowserWidget.h
    SeerThreadGroupsBrowserWidget.h
    SeerAdaTasksBrowserWidget.h
    SeerAdaExceptionsBrowserWidget.h
    SeerThreadManagerWidget.h
    SeerGdbLogWidget.h
    SeerTildeLogWidget.h
    SeerVariableLoggerBrowserWidget.h
    SeerVariableManagerWidget.h
    SeerVariableTrackerBrowserWidget.h
    SeerWatchpointCreateDialog.h
    SeerWatchpointsBrowserWidget.h
    SeerSourceHighlighter.h
    SeerAdaSourceHighlighter.h
    SeerCppSourceHighlighter.h
    SeerOdinSourceHighlighter.h
    SeerRustSourceHighlighter.h
    SeerAboutDialog.h
    SeerSlashProcDialog.h
    SeerHighlighterSettings.h
    SeerKeySettings.h
    SeerPlainTextEdit.h
    SeerHelpPageDialog.h
    SeerProgressIndicator.h
    SeerMessagesDialog.h
    SeerAssemblyPreferenceDialog.h
    SeerHistoryLineEdit.h
    SeerMacroEditorDialog.h
    SeerMacroToolButton.h
    )

# Define the source location of source files
set(SOURCE_FILES
    GdbMonitor.cpp
    QProcessInfo.cpp
    QProcessInfoWidget.cpp
    QProgressIndicator.cpp
    QColorButton.cpp
    QColorSwatch.cpp
    QDetachTabWidget.cpp
    QZoomChartView.cpp
    QZoomChart.cpp
    QClearLineEdit.cpp
    QIndexTreeWidget.cpp
    QHistoryLineEdit.cpp
    QEditDelegate.cpp
    QHContainerWidget.cpp
    QImageViewer.cpp
    QAnsiTextEdit.cpp
    SeerUtl.cpp
    SeerArgumentsDialog.cpp
    SeerBreakpointCreateDialog.cpp
    SeerMessagesBrowserWidget.cpp
    SeerBreakpointsBrowserWidget.cpp
    SeerCatchpointCreateDialog.cpp
    SeerCatchpointsBrowserWidget.cpp
    SeerPrintpointCreateDialog.cpp
    SeerPrintpointsBrowserWidget.cpp
    SeerCheckpointsBrowserWidget.cpp
    SeerCommandLogsWidget.cpp
    SeerSeerLogWidget.cpp
    SeerConsoleWidget.cpp
    SeerConfigDialog.cpp
    SeerGdbConfigPage.cpp
    SeerRRConfigPage.cpp
    SeerEditorConfigPage.cpp
    SeerSourceConfigPage.cpp
    SeerAssemblyConfigPage.cpp
    SeerSeerConfigPage.cpp
    SeerKeysConfigPage.cpp
    SeerCloseSourceDialog.cpp
    SeerDebugDialog.cpp
    SeerEditorManagerWidget.cpp
    SeerEditorWidgetSource.cpp
    SeerEditorWidgetSourceAreas.cpp
    SeerEditorWidgetAssembly.cpp
    SeerEditorWidgetAssemblyAreas.cpp
    SeerGdbWidget.cpp
    SeerHexWidget.cpp
    SeerAsmWidget.cpp
    SeerArrayWidget.cpp
    SeerMatrixWidget.cpp
    SeerLogWidget.cpp
    SeerMainWindow.cpp
    SeerArrayVisualizerWidget.cpp
    SeerMatrixVisualizerWidget.cpp
    SeerMemoryVisualizerWidget.cpp
    SeerStructVisualizerWidget.cpp
    SeerVarVisualizerWidget.cpp
    SeerImageVisualizerWidget.cpp
    SeerGdbMonitorWidget.cpp
    SeerRegisterValuesBrowserWidget.cpp
    SeerRegisterEditValueDialog.cpp
    SeerRegisterProfileDialog.cpp
    SeerRegisterTreeWidgetItem.cpp
    SeerSignalValuesBrowserWidget.cpp
    SeerSignalProfileDialog.cpp
    SeerSignalEditValueDialog.cpp
    SeerRunStatusIndicator.cpp
    SeerLibraryBrowserWidget.cpp
    SeerSourceBrowserWidget.cpp
    SeerFunctionBrowserWidget.cpp
    SeerTypeBrowserWidget.cpp
    SeerStaticBrowserWidget.cpp
    SeerSkipBrowserWidget.cpp
    SeerSkipCreateDialog.cpp
    SeerSourceSymbolLibraryManagerWidget.cpp
    SeerStackArgumentsBrowserWidget.cpp
    SeerStackFramesBrowserWidget.cpp
    SeerStackLocalsBrowserWidget.cpp
    SeerStackDumpBrowserWidget.cpp
    SeerStackDumpSettingsDialog.cpp
    SeerStackManagerWidget.cpp
    SeerThreadFramesBrowserWidget.cpp
    SeerThreadIdsBrowserWidget.cpp
    SeerThreadGroupsBrowserWidget.cpp
    SeerAdaTasksBrowserWidget.cpp
    SeerAdaExceptionsBrowserWidget.cpp
    SeerThreadManagerWidget.cpp
    SeerGdbLogWidget.cpp
    SeerTildeLogWidget.cpp
    SeerVariableLoggerBrowserWidget.cpp
    SeerVariableManagerWidget.cpp
    SeerVariableTrackerBrowserWidget.cpp
    SeerWatchpointCreateDialog.cpp
    SeerWatchpointsBrowserWidget.cpp
    SeerSourceHighlighter.cpp
    SeerAdaSourceHighlighter.cpp
    SeerCppSourceHighlighter.cpp
    SeerOdinSourceHighlighter.cpp
    SeerRustSourceHighlighter.cpp
    SeerAboutDialog.cpp
    SeerSlashProcDialog.cpp
    SeerHighlighterSettings.cpp
    SeerKeySettings.cpp
    SeerPlainTextEdit.cpp
    SeerHelpPageDialog.cpp
    SeerProgressIndicator.cpp
    SeerMessagesDialog.cpp
    SeerAssemblyPreferenceDialog.cpp
    SeerHistoryLineEdit.cpp
    SeerMacroEditorDialog.cpp
    SeerMacroToolButton.cpp
    seergdb.cpp
    )

if(${QTVERSION} STREQUAL "QT6")
    qt6_add_resources(SOURCE_FILES resource.qrc resources/qdarkstyle/dark/darkstyle.qrc resources/qdarkstyle/light/lightstyle.qrc)
elseif(${QTVERSION} STREQUAL "QT5")
    qt5_add_resources(SOURCE_FILES resource.qrc resources/qdarkstyle/dark/darkstyle.qrc resources/qdarkstyle/light/lightstyle.qrc)
endif()

# Set non-Debug build as GUI application.
# Debug build remains consle application.
if(NOT CMAKE_BUILD_TYPE MATCHES Debug) #Release, RelWithDebInfo and MinSizeRel
    if(WIN32) # Check if we are on Windows
        set(SYSTEM_TYPE WIN32)
    endif()
    message("-- System type is " ${SYSTEM_TYPE})
endif()

# for Linux, BSD, Solaris, Minix
if(UNIX AND NOT APPLE)
    add_compile_options(-Wall -Wextra -Wunused-result -pedantic)   # -Werror -Wdeprecated-copy
endif()

add_definitions(-DQT_DISABLE_DEPRECATED_UP_TO=0x060300)

add_executable(${PROJECT_NAME} ${SYSTEM_TYPE} ${SOURCE_FILES})

install(TARGETS ${PROJECT_NAME} RUNTIME DESTINATION bin)

if(${QTVERSION} STREQUAL "QT6")
    target_link_libraries(${PROJECT_NAME} Qt6::Widgets Qt6::Gui Qt6::Core Qt6::PrintSupport Qt6::Charts Qt6::Svg Qt6::OpenGL)
elseif(${QTVERSION} STREQUAL "QT5")
    target_link_libraries(${PROJECT_NAME} Qt5::Widgets Qt5::Gui Qt5::Core Qt5::PrintSupport Qt5::Charts)
endif()

# Handle gdb logout debugging. Turn CONFIG_SEER_GDB_LOGOUT=1 to enable gdb logout
# -DCONFIG_SEER_GDB_LOGOUT=1
if(NOT DEFINED CONFIG_SEER_GDB_LOGOUT)
    set(CONFIG_SEER_GDB_LOGOUT 0)
endif()

target_compile_definitions(${PROJECT_NAME} PRIVATE
    SEER_GDB_LOGOUT=${CONFIG_SEER_GDB_LOGOUT}
)

# Handle default gdb binary name and location.
# -DCONFIG_SEER_GDB_NAME=/app/bin/gdb
if(NOT DEFINED CONFIG_SEER_GDB_NAME)
    set(CONFIG_SEER_GDB_NAME "/usr/bin/gdb")
endif()

target_compile_definitions(${PROJECT_NAME} PRIVATE
    SEER_GDB_NAME=${CONFIG_SEER_GDB_NAME}
)

# Handle default gdb binary launcher (for flatpak, et al)
# -DCONFIG_SEER_GDB_LAUNCHER="flatpak-spawn --host"
if(NOT DEFINED CONFIG_SEER_GDB_LAUNCHER)
    set(CONFIG_SEER_GDB_LAUNCHER "")
endif()

target_compile_definitions(${PROJECT_NAME} PRIVATE
    SEER_GDB_LAUNCHER=${CONFIG_SEER_GDB_LAUNCHER}
)

# Install icons to standard XDG icon directories
# -DCONFIG_SEER_INSTALL_ICONS=1
if(CONFIG_SEER_INSTALL_ICONS)
    message("-- Will install icons to system")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/icons/hicolor/32x32/seergdb.png"   DESTINATION "share/icons/hicolor/32x32/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/icons/hicolor/64x64/seergdb.png"   DESTINATION "share/icons/hicolor/64x64/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/icons/hicolor/128x128/seergdb.png" DESTINATION "share/icons/hicolor/128x128/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/icons/hicolor/256x256/seergdb.png" DESTINATION "share/icons/hicolor/256x256/apps")
endif()

# Install flathub icons to standard XDG icon directories
# -DCONFIG_SEER_INSTALL_FLATHUB_FILES=1
if(CONFIG_SEER_INSTALL_FLATHUB_FILES)
    message("-- Will install flathub icons+files to system")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/icons/hicolor/32x32/io.github.epasveer.seer.png"   DESTINATION "share/icons/hicolor/32x32/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/icons/hicolor/64x64/io.github.epasveer.seer.png"   DESTINATION "share/icons/hicolor/64x64/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/icons/hicolor/128x128/io.github.epasveer.seer.png" DESTINATION "share/icons/hicolor/128x128/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/icons/hicolor/256x256/io.github.epasveer.seer.png" DESTINATION "share/icons/hicolor/256x256/apps")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/io.github.epasveer.seer.metainfo.xml"              DESTINATION "share/metainfo")
    install(FILES "${CMAKE_SOURCE_DIR}/resources/flathub/io.github.epasveer.seer.desktop"                   DESTINATION "share/applications")
endif()

