fwt_software/CMakeLists.txt

152 lines
6.2 KiB
CMake

cmake_minimum_required(VERSION 3.20)
project(fire_gimbal_control LANGUAGES C CXX)
# ---------------------------------------------------------------------------
# Options (runtime toggles still select mock vs real at launch; these control
# whether the heavy/proprietary dependencies are compiled in at all).
# ---------------------------------------------------------------------------
option(WITH_VIMBA "Build with Allied Vision Vimba X camera support" ON)
option(WITH_MQTT "Build with Eclipse Paho MQTT support" ON)
option(WITH_TUI "Build the terminal UI dashboard (FTXUI)" ON)
option(BUILD_TESTING "Build unit tests" OFF)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake")
if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE)
endif()
# ---------------------------------------------------------------------------
# Always-required dependencies
# ---------------------------------------------------------------------------
find_package(Threads REQUIRED)
find_package(OpenCV REQUIRED COMPONENTS core highgui imgproc)
# Boost.Asio is header-only (Boost >= 1.69); only program_options is a compiled lib.
if(POLICY CMP0167)
cmake_policy(SET CMP0167 NEW)
endif()
find_package(Boost REQUIRED CONFIG COMPONENTS program_options)
# libjxl via pkg-config (Arch/Manjaro ship a .pc file)
find_package(PkgConfig REQUIRED)
pkg_check_modules(JXL REQUIRED IMPORTED_TARGET libjxl libjxl_threads)
# ---------------------------------------------------------------------------
# fgc_core: SDK-independent core (config, path resolution, and - as the
# refactor proceeds - logging, the capture scheduler and the I/O interfaces).
# Builds and unit-tests WITHOUT Vimba X or Paho, so the core logic is
# verifiable on any machine.
# ---------------------------------------------------------------------------
add_library(fgc_core STATIC
src/core/Config.cpp
src/core/Paths.cpp
src/core/Logger.cpp
src/core/Geometry.cpp
src/core/ScanGrid.cpp
src/core/TelemetryParser.cpp
src/core/CaptureScheduler.cpp
src/core/CommandParser.cpp
src/ui/UiSnapshot.cpp
src/ui/HeadlessUi.cpp
ini.c
)
target_include_directories(fgc_core PUBLIC
${CMAKE_SOURCE_DIR}/include
${CMAKE_SOURCE_DIR} # for the bundled ini.h
)
target_link_libraries(fgc_core PUBLIC Threads::Threads)
# ---------------------------------------------------------------------------
# Application executable. Camera image pipeline + serial controller always
# build (OpenCV/libjxl/Boost.Asio are available everywhere); MQTT and Vimba
# sources are added only when their option is ON.
# ---------------------------------------------------------------------------
set(FGC_SOURCES
main.cpp
src/core/Application.cpp
src/camera/JpegXlEncoder.cpp
src/camera/ImagePipeline.cpp
src/serial/SerialMotorController.cpp
)
if(WITH_MQTT)
list(APPEND FGC_SOURCES src/mqtt/MqttControlChannel.cpp)
endif()
if(WITH_VIMBA)
list(APPEND FGC_SOURCES src/camera/VimbaCameraSource.cpp)
endif()
add_executable(fire_gimbal_control ${FGC_SOURCES})
target_include_directories(fire_gimbal_control PRIVATE ${CMAKE_SOURCE_DIR})
target_link_libraries(fire_gimbal_control PRIVATE
fgc_core
${OpenCV_LIBS}
Boost::headers
Boost::program_options
PkgConfig::JXL
)
# ---------------------------------------------------------------------------
# Optional: MQTT (Eclipse Paho). Fetched + built from pinned, hash-verified
# upstream release tarballs (no AUR, no system install required).
# ---------------------------------------------------------------------------
if(WITH_MQTT)
include(cmake/Paho.cmake)
target_link_libraries(fire_gimbal_control PRIVATE PahoMqttCpp::paho-mqttpp3-static)
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_MQTT=1)
else()
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_MQTT=0)
message(STATUS "WITH_MQTT=OFF: building without MQTT support")
endif()
# ---------------------------------------------------------------------------
# Optional: Vimba X SDK (proprietary; install manually from Allied Vision).
# ---------------------------------------------------------------------------
if(WITH_VIMBA)
find_package(Vmb REQUIRED)
target_link_libraries(fire_gimbal_control PRIVATE Vmb::VmbC Vmb::VmbCPP)
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_VIMBA=1)
else()
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_VIMBA=0)
message(STATUS "WITH_VIMBA=OFF: building without Vimba X camera support (mock cameras only)")
endif()
# ---------------------------------------------------------------------------
# Optional: terminal UI (FTXUI). The TuiUi source and the FTXUI link are added
# only when ON; the SDK-independent core (HeadlessUi, UiSnapshot) is unaffected,
# so a headless build needs no extra dependency.
# ---------------------------------------------------------------------------
if(WITH_TUI)
include(cmake/Ftxui.cmake)
target_sources(fire_gimbal_control PRIVATE src/ui/TuiUi.cpp)
target_link_libraries(fire_gimbal_control PRIVATE ftxui::component ftxui::dom ftxui::screen)
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_TUI=1)
else()
target_compile_definitions(fire_gimbal_control PRIVATE FGC_WITH_TUI=0)
message(STATUS "WITH_TUI=OFF: building without the terminal dashboard (headless console only)")
endif()
# ---------------------------------------------------------------------------
# Tests
# ---------------------------------------------------------------------------
if(BUILD_TESTING)
enable_testing()
add_subdirectory(tests)
endif()
# ---------------------------------------------------------------------------
# Summary
# ---------------------------------------------------------------------------
message(STATUS "------------------------------------------------------------")
message(STATUS "fire_gimbal_control configuration")
message(STATUS " build type : ${CMAKE_BUILD_TYPE}")
message(STATUS " WITH_VIMBA : ${WITH_VIMBA}")
message(STATUS " WITH_MQTT : ${WITH_MQTT}")
message(STATUS " WITH_TUI : ${WITH_TUI}")
message(STATUS " tests : ${BUILD_TESTING}")
message(STATUS "------------------------------------------------------------")