cmake_minimum_required(VERSION 3.5) project(daq_viewer LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) # ─── Options ───────────────────────────────────────────────────────── option(DAQ_USE_SDL2 "Use SDL2 instead of GLFW" OFF) option(DAQ_OPENGL3 "Request OpenGL 3.2 core profile" OFF) option(DAQ_VENDOR_DEPS "Compile vendored third-party sources" ON) # ─── Platform detection ────────────────────────────────────────────── if(UNIX AND NOT APPLE) find_package(Threads REQUIRED) find_package(OpenGL REQUIRED) set(DAQ_PLATFORM_LIBS ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS} ${OPENGL_LIBRARIES}) if(NOT DAQ_USE_SDL2) find_package(X11 REQUIRED) list(APPEND DAQ_PLATFORM_LIBS ${X11_LIBRARIES}) endif() endif() # ─── Third-party libraries ─────────────────────────────────────────── set(IMGUI_DIR "${CMAKE_SOURCE_DIR}/third_party/imgui") set(IMPLOT_DIR "${CMAKE_SOURCE_DIR}/third_party/implot") set(GLFW_DIR "${CMAKE_SOURCE_DIR}/third_party/glfw") # --- Dear ImGui --- if(DAQ_VENDOR_DEPS AND EXISTS "${IMGUI_DIR}/imgui.cpp") file(GLOB IMGUI_SOURCES "${IMGUI_DIR}/*.cpp" "${IMGUI_DIR}/backends/imgui_impl_glfw.cpp" "${IMGUI_DIR}/backends/imgui_impl_opengl2.cpp" "${IMGUI_DIR}/backends/imgui_impl_opengl3.cpp" ) add_library(imgui STATIC ${IMGUI_SOURCES}) target_include_directories(imgui PUBLIC "${IMGUI_DIR}" "${IMGUI_DIR}/backends" ) target_compile_definitions(imgui PUBLIC IMGUI_DISABLE_OBSOLETE_FUNCTIONS=1 ) target_compile_definitions(imgui PRIVATE $<$:IMGUI_IMPL_OPENGL_LOADER_GLAD> ) set(IMGUI_TARGET imgui) else() message(FATAL_ERROR "ImGui sources not found at ${IMGUI_DIR}.\n" "Clone https://github.com/ocornut/imgui into third_party/imgui\n" "or set DAQ_VENDOR_DEPS=OFF and provide a system-installed ImGui.") endif() # --- ImPlot --- if(DAQ_VENDOR_DEPS AND EXISTS "${IMPLOT_DIR}/implot.cpp") add_library(implot STATIC "${IMPLOT_DIR}/implot.cpp" "${IMPLOT_DIR}/implot_items.cpp" ) target_include_directories(implot PUBLIC "${IMPLOT_DIR}") target_link_libraries(implot PUBLIC ${IMGUI_TARGET}) set(IMPLOT_TARGET implot) else() message(FATAL_ERROR "ImPlot sources not found at ${IMPLOT_DIR}.\n" "Clone https://github.com/epezent/implot into third_party/implot") endif() # --- GLFW (or SDL2) --- if(NOT DAQ_USE_SDL2) if(EXISTS "${GLFW_DIR}/src/glfw_config.h") add_subdirectory("${GLFW_DIR}" glfw_build EXCLUDE_FROM_ALL) set(GLFW_TARGET glfw) else() find_package(glfw3 QUIET) if(NOT glfw3_FOUND) message(FATAL_ERROR "GLFW not found. Options:\n" " - Clone https://github.com/glfw/glfw into third_party/glfw\n" " - Install libglfw3-dev system package\n" " - Set DAQ_USE_SDL2=ON to use SDL2 instead") endif() set(GLFW_TARGET glfw) endif() else() find_package(SDL2 REQUIRED) set(GLFW_TARGET ${SDL2_LIBRARIES}) endif() # ─── Application sources ───────────────────────────────────────────── set(DAQ_SOURCES src/main.cpp src/config.cpp src/protocol.cpp src/decimator.cpp src/trigger_engine.cpp src/udp_client.cpp src/source.cpp src/renderer.cpp # ring_buffer.h is header-only (template); .cpp has explicit instantiations # kept for backward compatibility but not needed by the new code src/ring_buffer.cpp ) add_executable(daq_viewer ${DAQ_SOURCES}) target_include_directories(daq_viewer PRIVATE src) target_link_libraries(daq_viewer PRIVATE ${IMGUI_TARGET} ${IMPLOT_TARGET} ${GLFW_TARGET} ${DAQ_PLATFORM_LIBS} ) # GL version if(DAQ_OPENGL3) target_compile_definitions(daq_viewer PRIVATE DAQ_OPENGL3) else() target_compile_definitions(daq_viewer PRIVATE DAQ_OPENGL2) endif() # ─── Compiler flags ────────────────────────────────────────────────── if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") target_compile_options(daq_viewer PRIVATE -Wall -Wextra -Wpedantic) endif() # ─── Install ───────────────────────────────────────────────────────── install(TARGETS daq_viewer RUNTIME DESTINATION bin) install(FILES config/example.ini DESTINATION share/daq_viewer)