cmake_minimum_required(VERSION 3.16) project(StreamHubClient CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # ── Find system packages ────────────────────────────────────────────────────── find_package(OpenGL REQUIRED) # SDL2: try cmake config first, fall back to pkg-config find_package(SDL2 QUIET CONFIG) if(NOT SDL2_FOUND) find_package(PkgConfig REQUIRED) pkg_check_modules(SDL2 REQUIRED sdl2) add_library(SDL2::SDL2 INTERFACE IMPORTED) target_include_directories(SDL2::SDL2 INTERFACE ${SDL2_INCLUDE_DIRS}) target_link_libraries(SDL2::SDL2 INTERFACE ${SDL2_LIBRARIES}) target_compile_options(SDL2::SDL2 INTERFACE ${SDL2_CFLAGS_OTHER}) endif() # ── Fetch Dear ImGui ────────────────────────────────────────────────────────── include(FetchContent) FetchContent_Declare( imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.91.8 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(imgui) # ── Fetch ImPlot ────────────────────────────────────────────────────────────── FetchContent_Declare( implot GIT_REPOSITORY https://github.com/epezent/implot.git GIT_TAG v0.17 GIT_SHALLOW TRUE ) FetchContent_MakeAvailable(implot) # ── Build ImGui + ImPlot as a static library ────────────────────────────────── add_library(imgui_lib STATIC ${imgui_SOURCE_DIR}/imgui.cpp ${imgui_SOURCE_DIR}/imgui_draw.cpp ${imgui_SOURCE_DIR}/imgui_tables.cpp ${imgui_SOURCE_DIR}/imgui_widgets.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_sdl2.cpp ${imgui_SOURCE_DIR}/backends/imgui_impl_opengl3.cpp ${implot_SOURCE_DIR}/implot.cpp ${implot_SOURCE_DIR}/implot_items.cpp ) target_include_directories(imgui_lib PUBLIC ${imgui_SOURCE_DIR} ${imgui_SOURCE_DIR}/backends ${implot_SOURCE_DIR} ) target_link_libraries(imgui_lib PUBLIC SDL2::SDL2 OpenGL::GL) target_compile_options(imgui_lib PRIVATE -w) # suppress warnings from vendored code # ── Bundled resources (fonts, desktop entry, icon) ─────────────────────────── # Fonts (UI font + Font Awesome 6 Free Solid + glyph-macro header) are vendored # in resources/fonts — no network access or system fonts required. set(RESOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/resources) set(FONT_DIR ${RESOURCE_DIR}/fonts) if(EXISTS ${FONT_DIR}/fa-solid-900.ttf AND EXISTS ${FONT_DIR}/IconsFontAwesome6.h) set(HAVE_FONT_AWESOME TRUE) message(STATUS "Font Awesome icons enabled (${FONT_DIR})") else() set(HAVE_FONT_AWESOME FALSE) message(WARNING "Bundled Font Awesome missing — using ASCII icon fallbacks") endif() # Mirror resources next to the built executable so dev runs find them file(COPY ${RESOURCE_DIR}/fonts DESTINATION ${CMAKE_BINARY_DIR}/resources) # ── Application sources ─────────────────────────────────────────────────────── set(APP_SOURCES main.cpp App.cpp WSClient.cpp Protocol.cpp SourcePanel.cpp PlotPanel.cpp TriggerPanel.cpp StatsPanel.cpp ) add_executable(StreamHubClient ${APP_SOURCES}) target_include_directories(StreamHubClient PRIVATE ${CMAKE_CURRENT_SOURCE_DIR} # Reuse WSFrame.h, SHA1.h, Base64.h from StreamHub without copying ${CMAKE_CURRENT_SOURCE_DIR}/../../Source/Applications/StreamHub ) target_link_libraries(StreamHubClient PRIVATE imgui_lib SDL2::SDL2 OpenGL::GL pthread ) # Source-tree resource dir baked in as last-resort runtime fallback target_compile_definitions(StreamHubClient PRIVATE APP_RESOURCE_DIR="${RESOURCE_DIR}" ) if(HAVE_FONT_AWESOME) target_include_directories(StreamHubClient PRIVATE ${FONT_DIR}) target_compile_definitions(StreamHubClient PRIVATE HAVE_FONT_AWESOME) endif() target_compile_options(StreamHubClient PRIVATE -Wall -Wextra -Wno-unused-parameter ) # ── Install ─────────────────────────────────────────────────────────────────── install(TARGETS StreamHubClient DESTINATION bin) install(DIRECTORY ${RESOURCE_DIR}/fonts DESTINATION share/streamhub-client) install(FILES ${RESOURCE_DIR}/streamhub-client.desktop DESTINATION share/applications) install(FILES ${RESOURCE_DIR}/icons/streamhub-client.svg DESTINATION share/icons/hicolor/scalable/apps)