Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
126 lines
5.3 KiB
CMake
126 lines
5.3 KiB
CMake
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()
|