cmake_minimum_required(VERSION 3.16) project(UDPScope CXX C) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_C_STANDARD 99) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) option(UDPSCOPE_BUILD_TESTS "Build the unit tests" ON) set(STREAMHUB_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../streamhub) set(CCLIENT_DIR ${CMAKE_CURRENT_SOURCE_DIR}/../../Common/Client/c) # ── The standalone C UDPS client, compiled in directly ──────────────────────── # Building it here rather than shelling out to its own Makefile keeps this a # single cmake --build away from a working binary. add_library(udpsclient STATIC ${CCLIENT_DIR}/udps_client.c) target_include_directories(udpsclient PUBLIC ${CCLIENT_DIR}) target_compile_options(udpsclient PRIVATE -Wall -Wextra -Wpedantic) # ── System packages ─────────────────────────────────────────────────────────── find_package(OpenGL REQUIRED) 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() # ── Dear ImGui + ImPlot ─────────────────────────────────────────────────────── include(FetchContent) FetchContent_Declare(imgui GIT_REPOSITORY https://github.com/ocornut/imgui.git GIT_TAG v1.91.8 GIT_SHALLOW TRUE) FetchContent_MakeAvailable(imgui) FetchContent_Declare(implot GIT_REPOSITORY https://github.com/epezent/implot.git GIT_TAG v0.17 GIT_SHALLOW TRUE) FetchContent_MakeAvailable(implot) 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) # ── Bundled resources, borrowed read-only from the StreamHub client ─────────── set(RESOURCE_DIR ${STREAMHUB_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() file(COPY ${FONT_DIR} DESTINATION ${CMAKE_BINARY_DIR}/resources) # ── Core library: everything except main.cpp, so tests can link it ──────────── set(CORE_SOURCES Decimate.cpp ) add_library(udpscope_core STATIC ${CORE_SOURCES}) target_include_directories(udpscope_core PUBLIC ${CMAKE_CURRENT_SOURCE_DIR} ${STREAMHUB_DIR}) # SignalBuffer.h, reused verbatim target_link_libraries(udpscope_core PUBLIC udpsclient pthread) target_compile_options(udpscope_core PRIVATE -Wall -Wextra -Wno-unused-parameter) # ── Application ─────────────────────────────────────────────────────────────── set(APP_SOURCES main.cpp ) if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/main.cpp) add_executable(UDPScope ${APP_SOURCES}) target_link_libraries(UDPScope PRIVATE udpscope_core imgui_lib SDL2::SDL2 OpenGL::GL) target_compile_definitions(UDPScope PRIVATE APP_RESOURCE_DIR="${RESOURCE_DIR}") if(HAVE_FONT_AWESOME) target_include_directories(UDPScope PRIVATE ${FONT_DIR}) target_compile_definitions(UDPScope PRIVATE HAVE_FONT_AWESOME) endif() target_compile_options(UDPScope PRIVATE -Wall -Wextra -Wno-unused-parameter) install(TARGETS UDPScope DESTINATION bin) install(DIRECTORY ${FONT_DIR} DESTINATION share/udpscope) endif() # ── Tests ───────────────────────────────────────────────────────────────────── if(UDPSCOPE_BUILD_TESTS) FetchContent_Declare(googletest GIT_REPOSITORY https://github.com/google/googletest.git GIT_TAG v1.15.2 GIT_SHALLOW TRUE) set(gtest_force_shared_crt ON CACHE BOOL "" FORCE) FetchContent_MakeAvailable(googletest) file(GLOB TEST_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/tests/*.cpp) add_executable(udpscope_tests ${TEST_SOURCES}) target_link_libraries(udpscope_tests PRIVATE udpscope_core GTest::gtest_main) target_compile_options(udpscope_tests PRIVATE -Wall -Wextra -Wno-unused-parameter) enable_testing() include(GoogleTest) gtest_discover_tests(udpscope_tests) endif()