Files
2026-05-27 15:46:50 +02:00

134 lines
4.9 KiB
CMake

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
$<$<BOOL:${DAQ_OPENGL3}>: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)