diff --git a/CMakeLists.txt b/CMakeLists.txt index 11774bf2b18b..90fa71e7bb5d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,60 +1,90 @@ +# ============================================================================ +# QGroundControl CMake Build Configuration +# ============================================================================ + cmake_minimum_required(VERSION 3.25) +# ---------------------------------------------------------------------------- +# CMake Module Paths +# ---------------------------------------------------------------------------- list(APPEND CMAKE_MODULE_PATH - ${CMAKE_SOURCE_DIR}/cmake - ${CMAKE_SOURCE_DIR}/cmake/CPack - ${CMAKE_SOURCE_DIR}/cmake/find-modules - ${CMAKE_SOURCE_DIR}/cmake/install - ${CMAKE_SOURCE_DIR}/cmake/install/CPack - ${CMAKE_SOURCE_DIR}/cmake/modules - ${CMAKE_SOURCE_DIR}/cmake/platform + "${CMAKE_SOURCE_DIR}/cmake" + "${CMAKE_SOURCE_DIR}/cmake/CPack" + "${CMAKE_SOURCE_DIR}/cmake/find-modules" + "${CMAKE_SOURCE_DIR}/cmake/install" + "${CMAKE_SOURCE_DIR}/cmake/install/CPack" + "${CMAKE_SOURCE_DIR}/cmake/modules" + "${CMAKE_SOURCE_DIR}/cmake/platform" ) +# Include helper functions early include(Helpers) +# ---------------------------------------------------------------------------- +# Default Build Type +# ---------------------------------------------------------------------------- if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) - set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Configuration types" FORCE) + set(CMAKE_BUILD_TYPE "Release" CACHE STRING "Build type (Debug or Release)" FORCE) + set(CMAKE_CONFIGURATION_TYPES "Debug;Release" CACHE STRING "Available configuration types" FORCE) + message(STATUS "No build type specified. Defaulting to Release.") endif() +# ---------------------------------------------------------------------------- +# CMake Policy Configuration +# ---------------------------------------------------------------------------- set(CMAKE_REQUIRED_QUIET ON) set(CMAKE_POLICY_VERSION_MINIMUM ${CMAKE_MINIMUM_REQUIRED_VERSION}) -####################################################### -# Custom Build Configuration -####################################################### +# ============================================================================ +# Custom Build Configuration +# ============================================================================ +# Load default options and allow custom builds to override include(CustomOptions) if(IS_DIRECTORY "${CMAKE_SOURCE_DIR}/custom") - message(STATUS "QGC: Enabling custom build") + message(STATUS "QGC: Custom build directory detected") set(QGC_CUSTOM_BUILD ON) list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/custom/cmake") include(CustomOverrides) endif() +# Disable testing if not explicitly enabled if(NOT QGC_BUILD_TESTING) - set(BUILD_TESTING OFF CACHE INTERNAL "" FORCE) + set(BUILD_TESTING OFF CACHE INTERNAL "Disable testing by default" FORCE) endif() -####################################################### -# Project Info -####################################################### +# ============================================================================ +# Project Configuration +# ============================================================================ +# ---------------------------------------------------------------------------- +# Apple-Specific Pre-Project Settings +# ---------------------------------------------------------------------------- if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0") - # set(CMAKE_OSX_SYSROOT "iphoneos") + # iOS builds: set(CMAKE_OSX_SYSROOT "iphoneos") if(QGC_MACOS_UNIVERSAL_BUILD) - set(CMAKE_OSX_ARCHITECTURES "x86_64h;arm64") # CMAKE_APPLE_SILICON_PROCESSOR + # Universal binary for both Intel and Apple Silicon + set(CMAKE_OSX_ARCHITECTURES "x86_64h;arm64") endif() endif() +# ---------------------------------------------------------------------------- +# Git Integration & Version Extraction +# ---------------------------------------------------------------------------- include(Git) +# ---------------------------------------------------------------------------- +# Compiler Caching Configuration +# ---------------------------------------------------------------------------- if(QGC_USE_CACHE) qgc_config_caching() endif() +# ---------------------------------------------------------------------------- +# Project Declaration +# ---------------------------------------------------------------------------- project(${QGC_APP_NAME} VERSION ${QGC_APP_VERSION} DESCRIPTION ${QGC_APP_DESCRIPTION} @@ -62,46 +92,59 @@ project(${QGC_APP_NAME} LANGUAGES C CXX ) -####################################################### -# CMake Configuration Options -####################################################### +# ============================================================================ +# CMake & Build System Configuration +# ============================================================================ +# Standard CMake modules include(GNUInstallDirs) include(FetchContent) include(CMakePrintHelpers) +# ---------------------------------------------------------------------------- +# CPM (CMake Package Manager) Configuration +# ---------------------------------------------------------------------------- include(CPM) if(NOT CPM_SOURCE_CACHE) set(CPM_SOURCE_CACHE "${CMAKE_BINARY_DIR}/cpm_modules") endif() +# ---------------------------------------------------------------------------- +# Toolchain Configuration (Compiler, Linker, Build Settings) +# ---------------------------------------------------------------------------- include(Toolchain) +# ---------------------------------------------------------------------------- +# Output Directories +# ---------------------------------------------------------------------------- set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$/lib") set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") -# https://cmake.org/cmake/help/latest/policy/CMP0168.html#policy:CMP0168 +# ---------------------------------------------------------------------------- +# CMake Policies +# ---------------------------------------------------------------------------- +# CMP0168: Modern FetchContent integration if(POLICY CMP0168) cmake_policy(SET CMP0168 NEW) set(CMAKE_POLICY_DEFAULT_CMP0168 NEW) endif() -# https://cmake.org/cmake/help/latest/policy/CMP0141.html#policy:CMP0141 +# CMP0141: MSVC debug information format if(POLICY CMP0141) cmake_policy(SET CMP0141 NEW) set(CMAKE_POLICY_DEFAULT_CMP0141 NEW) endif() -# https://cmake.org/cmake/help/latest/policy/CMP0075.html#policy:CMP0075 +# CMP0075: Include files in CheckIncludeFile if(POLICY CMP0075) cmake_policy(SET CMP0075 NEW) set(CMAKE_POLICY_DEFAULT_CMP0075 NEW) endif() -####################################################### -# Qt6 Configuration -####################################################### +# ============================================================================ +# Qt6 Configuration +# ============================================================================ find_package(Qt6 ${QGC_QT_MINIMUM_VERSION}...${QGC_QT_MAXIMUM_VERSION} @@ -147,55 +190,64 @@ qt_standard_project_setup( I18N_SOURCE_LANGUAGE en ) +# ---------------------------------------------------------------------------- +# Qt Policies (Enable modern Qt6 behaviors) +# ---------------------------------------------------------------------------- qt_policy( - SET QTP0001 NEW - SET QTP0002 NEW - SET QTP0003 NEW - SET QTP0004 NEW - SET QTP0005 NEW + SET QTP0001 NEW # Modern resource handling + SET QTP0002 NEW # New behavior for QML module URI + SET QTP0003 NEW # Better QML type registration + SET QTP0004 NEW # Improved translation handling + SET QTP0005 NEW # Enhanced deployment handling ) -####################################################### -# Custom Build Configuration -####################################################### +# ============================================================================ +# Custom Build Subdirectory +# ============================================================================ if(QGC_CUSTOM_BUILD) add_subdirectory(custom) endif() -####################################################### -# QGroundControl Resources -####################################################### - -# Note: Adding Resources to Library instead requires using Q_INIT_RESOURCE(qgcresources) +# ============================================================================ +# QGroundControl Resources +# ============================================================================ -list(APPEND QGC_RESOURCES - ${CMAKE_SOURCE_DIR}/qgcimages.qrc - ${CMAKE_SOURCE_DIR}/qgcresources.qrc -) +# Note: Resources added to executable (not library) to avoid needing Q_INIT_RESOURCE() list(APPEND QGC_RESOURCES - ${CMAKE_SOURCE_DIR}/resources/InstrumentValueIcons/InstrumentValueIcons.qrc + "${CMAKE_SOURCE_DIR}/qgcimages.qrc" + "${CMAKE_SOURCE_DIR}/qgcresources.qrc" + "${CMAKE_SOURCE_DIR}/resources/InstrumentValueIcons/InstrumentValueIcons.qrc" ) -####################################################### -# QGroundControl Target -####################################################### +# ============================================================================ +# QGroundControl Executable Target +# ============================================================================ +# Create the main executable qt_add_executable(${CMAKE_PROJECT_NAME} - WIN32 - MACOSX_BUNDLE + WIN32 # Windows GUI application + MACOSX_BUNDLE # macOS application bundle ${QGC_RESOURCES} ) +# ---------------------------------------------------------------------------- +# Platform-Specific Configuration +# ---------------------------------------------------------------------------- if(WIN32) include(Windows) elseif(APPLE) include(Apple) elseif(ANDROID) include(Android) +elseif(LINUX) + include(Linux) endif() +# ---------------------------------------------------------------------------- +# QML Module Configuration +# ---------------------------------------------------------------------------- qt_add_qml_module(${CMAKE_PROJECT_NAME} URI QGC VERSION 1.0 @@ -207,13 +259,21 @@ qt_add_qml_module(${CMAKE_PROJECT_NAME} QtQuick.Layouts ) +# ---------------------------------------------------------------------------- +# Source & Test Subdirectories +# ---------------------------------------------------------------------------- add_subdirectory(src) + if(QGC_BUILD_TESTING) add_subdirectory(test) + # Exclude test directory from translation scanning set_property(DIRECTORY test PROPERTY QT_EXCLUDE_FROM_TRANSLATION ON) endif() -file(GLOB TS_SOURCES ${CMAKE_SOURCE_DIR}/translations/qgc_*.ts) +# ---------------------------------------------------------------------------- +# Translation/Localization Configuration +# ---------------------------------------------------------------------------- +file(GLOB TS_SOURCES "${CMAKE_SOURCE_DIR}/translations/qgc_*.ts") set_source_files_properties(${TS_SOURCES} PROPERTIES OUTPUT_LOCATION "${CMAKE_BINARY_DIR}/i18n") qt_add_translations(${CMAKE_PROJECT_NAME} @@ -224,32 +284,44 @@ qt_add_translations(${CMAKE_PROJECT_NAME} TS_FILE_BASE ${CMAKE_PROJECT_NAME} ) -qgc_set_qt_resource_alias(${CMAKE_SOURCE_DIR}/resources/qtquickcontrols2.conf) +# ---------------------------------------------------------------------------- +# Qt Quick Controls Configuration +# ---------------------------------------------------------------------------- +qgc_set_qt_resource_alias("${CMAKE_SOURCE_DIR}/resources/qtquickcontrols2.conf") qt_add_resources(${CMAKE_PROJECT_NAME} "qgcresources_cmake" PREFIX "/" - FILES - "${CMAKE_SOURCE_DIR}/resources/qtquickcontrols2.conf" + FILES "${CMAKE_SOURCE_DIR}/resources/qtquickcontrols2.conf" ) -# cmake_print_variables(QT_ALL_PLUGIN_TYPES_FOUND_VIA_FIND_PACKAGE) +# ---------------------------------------------------------------------------- +# Qt Plugin Configuration +# ---------------------------------------------------------------------------- qt_import_plugins(${CMAKE_PROJECT_NAME} INCLUDE Qt6::QSvgPlugin - EXCLUDE_BY_TYPE geoservices + EXCLUDE_BY_TYPE geoservices # Use built-in location plugins INCLUDE_BY_TYPE sqldrivers Qt6::QSQLiteDriverPlugin - # INCLUDE_BY_TYPE styles Qt6::qtquickcontrols2basicstyleplugin Qt6::qtquickcontrols2basicstyleimplplugin ) +# Linux-specific Qt platform plugins if(LINUX) - qt_import_plugins(${CMAKE_PROJECT_NAME} + qt_import_plugins(${CMAKE_PROJECT_NAME} INCLUDE - Qt6::QWaylandIntegrationPlugin - Qt6::QXcbIntegrationPlugin - Qt6::QEglFSIntegrationPlugin + Qt6::QWaylandIntegrationPlugin # Wayland support + Qt6::QXcbIntegrationPlugin # X11 support + Qt6::QEglFSIntegrationPlugin # Embedded GL support Qt6::QWaylandEglPlatformIntegrationPlugin ) endif() +# ============================================================================ +# Installation & Packaging +# ============================================================================ + include(Install) +# ============================================================================ +# Build Summary +# ============================================================================ + include(PrintSummary) diff --git a/cmake/CustomOptions.cmake b/cmake/CustomOptions.cmake index e5a8712248d8..0737b84bad73 100644 --- a/cmake/CustomOptions.cmake +++ b/cmake/CustomOptions.cmake @@ -1,101 +1,164 @@ +# ============================================================================ +# QGroundControl Build Configuration Options +# All options can be overridden by custom builds via CustomOverrides.cmake +# ============================================================================ + include(CMakeDependentOption) -# The following options can be overriden by custom builds using the CustomOverrides.cmake file - -# App -set(QGC_APP_NAME "QGroundControl" CACHE STRING "App Name") -set(QGC_APP_COPYRIGHT "Copyright (c) 2025 QGroundControl. All rights reserved." CACHE STRING "Copyright") -set(QGC_APP_DESCRIPTION "Open Source Ground Control App" CACHE STRING "Description") -set(QGC_ORG_NAME "QGroundControl" CACHE STRING "Org Name") -set(QGC_ORG_DOMAIN "qgroundcontrol.com" CACHE STRING "Domain") -set(QGC_PACKAGE_NAME "org.mavlink.qgroundcontrol" CACHE STRING "Package Name") -set(QGC_SETTINGS_VERSION "9" CACHE STRING "Settings Version") # If you need to make an incompatible changes to stored settings, bump this version number up by 1. This will caused store settings to be cleared on next boot. - -# Build + +# ============================================================================ +# Application Metadata +# ============================================================================ + +set(QGC_APP_NAME "QGroundControl" CACHE STRING "Application name") +set(QGC_APP_COPYRIGHT "Copyright (c) 2025 QGroundControl. All rights reserved." CACHE STRING "Copyright notice") +set(QGC_APP_DESCRIPTION "Open Source Ground Control App" CACHE STRING "Application description") +set(QGC_ORG_NAME "QGroundControl" CACHE STRING "Organization name") +set(QGC_ORG_DOMAIN "qgroundcontrol.com" CACHE STRING "Organization domain") +set(QGC_PACKAGE_NAME "org.mavlink.qgroundcontrol" CACHE STRING "Package identifier") + +# Settings version - increment to clear stored settings on next boot after incompatible changes +set(QGC_SETTINGS_VERSION "9" CACHE STRING "Settings schema version") + +# ============================================================================ +# Build Configuration +# ============================================================================ + option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) -option(QGC_STABLE_BUILD "Stable Build" OFF) -option(QGC_USE_CACHE "Use Build Caching" ON) -option(QGC_BUILD_INSTALLER "Build Installer" ON) -cmake_dependent_option(QGC_BUILD_TESTING "Enable testing" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) -cmake_dependent_option(QGC_DEBUG_QML "Build QGroundControl with QML debugging/profiling support." ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) - -# Features -option(QGC_UTM_ADAPTER "Enable UTM Adapter" OFF) -option(QGC_VIEWER3D "Enable Viewer3D" ON) # Qt6Quick3D_FOUND -# option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable Mavlink Inspector" OFF) # This removes QtCharts which is GPL licensed - -# Comms -option(QGC_ENABLE_BLUETOOTH "Enable Bluetooth Links" ON) # Qt6Bluetooth_FOUND -option(QGC_ZEROCONF_ENABLED "Enable ZeroConf Compatibility" OFF) -option(QGC_AIRLINK_DISABLED "Disable AIRLink" ON) -option(QGC_NO_SERIAL_LINK "Disable Serial Links" OFF) # NOT IOS AND Qt6SerialPort_FOUND - -# Video -option(QGC_ENABLE_UVC "Enable UVC Devices" ON) # Qt6Multimedia_FOUND -option(QGC_ENABLE_GST_VIDEOSTREAMING "Enable GStreamer Video Backend" ON) -cmake_dependent_option(QGC_CUSTOM_GST_PACKAGE "Enable Using QGC Provided Custom GStreamer Packages" OFF "QGC_ENABLE_GST_VIDEOSTREAMING" OFF) -option(QGC_ENABLE_QT_VIDEOSTREAMING "Enable QtMultimedia Video Backend" OFF) # Qt6Multimedia_FOUND - -# Joystick -# set(SDL_GAMECONTROLLERCONFIG "0300000009120000544f000011010000,OpenTX Radiomaster TX16S Joystick,leftx:a3,lefty:a2,rightx:a0,righty:a1,platform:Linux" CACHE STRING "Custom SDL Joystick Mappings") - -# MAVLink -set(QGC_MAVLINK_GIT_REPO "https://github.com/mavlink/c_library_v2.git" CACHE STRING "URL to MAVLink Git Repo") -set(QGC_MAVLINK_GIT_TAG "19f9955598af9a9181064619bd2e3c04bd2d848a" CACHE STRING "Tag of MAVLink Git Repo") - -# APM -option(QGC_DISABLE_APM_MAVLINK "Disable APM Dialect" OFF) -option(QGC_DISABLE_APM_PLUGIN "Disable APM Plugin" OFF) -option(QGC_DISABLE_APM_PLUGIN_FACTORY "Disable APM Plugin Factory" OFF) - -# PX4 -option(QGC_DISABLE_PX4_PLUGIN "Disable PX4 Plugin" OFF) -option(QGC_DISABLE_PX4_PLUGIN_FACTORY "Disable PX4 Plugin Factory" OFF) - -# Android -set(QGC_QT_ANDROID_TARGET_SDK_VERSION "36" CACHE STRING "Android Target SDK Version") -set(QGC_ANDROID_PACKAGE_NAME "${QGC_PACKAGE_NAME}" CACHE STRING "Android Package Name") -set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/android" CACHE PATH "Android Package Path") -set(QT_ANDROID_DEPLOYMENT_TYPE "" CACHE STRING "Forces Signing if Set to Release") -option(QT_ANDROID_SIGN_APK "Enable Signing APK" OFF) -option(QT_ANDROID_SIGN_AAB "Enable Signing AAB" OFF) -option(QT_USE_TARGET_ANDROID_BUILD_DIR "Use Target Android Build Dir" OFF) -set(QGC_QT_MINIMUM_VERSION "6.8.3" CACHE STRING "Minimum Supported Qt Version") -set(QGC_QT_MAXIMUM_VERSION "6.10.0" CACHE STRING "Maximum Supported Qt Version") -set(QGC_QT_ANDROID_MIN_SDK_VERSION "28" CACHE STRING "Android Min SDK Version") - -# MacOS -set(QGC_MACOS_PLIST_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/MacOSXBundleInfo.plist.in" CACHE FILEPATH "MacOS PList Path") -set(QGC_MACOS_BUNDLE_ID "${QGC_PACKAGE_NAME}" CACHE STRING "MacOS Bundle ID") -set(QGC_MACOS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.icns" CACHE FILEPATH "MacOS Icon Path") -set(QGC_MACOS_ENTITLEMENTS_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.entitlements" CACHE FILEPATH "MacOS Entitlements Path") -option(QGC_MACOS_UNIVERSAL_BUILD "Build MacOS Universal Build (x86_64h;arm64)" ON) - -# Linux -option(QGC_CREATE_APPIMAGE "Build an AppImage after build" ON) -set(QGC_APPIMAGE_ICON_256_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl_256.png" CACHE FILEPATH "AppImage Icon 256x256 Path") -set(QGC_APPIMAGE_ICON_SCALABLE_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl.svg" CACHE FILEPATH "AppImage Icon SVG Path") -set(QGC_APPIMAGE_APPRUN_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/AppRun" CACHE FILEPATH "AppImage AppRun Path") -set(QGC_APPIMAGE_DESKTOP_ENTRY_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in" CACHE FILEPATH "AppImage Desktop Entry Path") -set(QGC_APPIMAGE_METADATA_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.appdata.xml.in" CACHE FILEPATH "AppImage Metadata Path") -set(QGC_APPIMAGE_APPDATA_DEVELOPER "qgroundcontrol" CACHE STRING "AppImage Metadata Developer") - -# Windows -set(QGC_WINDOWS_INSTALL_HEADER_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/installheader.bmp" CACHE FILEPATH "Windows Install Header Path") -set(QGC_WINDOWS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/WindowsQGC.ico" CACHE FILEPATH "Windows Icon Path") -set(QGC_WINDOWS_RESOURCE_FILE_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/QGroundControl.rc" CACHE FILEPATH "Windows Resource File Path") - -# CPM -# set(CPM_USE_NAMED_CACHE_DIRECTORIES ON CACHE BOOL "Use additional directory of package name in cache on the most nested level.") - -# Qt -set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "Install path for QML") -set(QML_IMPORT_PATH "${QT_QML_OUTPUT_DIRECTORY}" CACHE STRING "Extra QML Import Paths") -option(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING "Silence Missing Dependency Warnings" OFF) -option(QT_ENABLE_VERBOSE_DEPLOYMENT "Verbose Deployment" OFF) -option(QT_DEBUG_FIND_PACKAGE "Print Used Search Paths When a Package is Not Found" ON) -option(QT_QML_GENERATE_QMLLS_INI "https://doc.qt.io/qt-6/cmake-variable-qt-qml-generate-qmlls-ini.html" ON) +option(QGC_STABLE_BUILD "Stable release build (disables daily build features)" OFF) +option(QGC_USE_CACHE "Enable compiler caching (ccache/sccache)" ON) +option(QGC_BUILD_INSTALLER "Build platform installers/packages" ON) + +# Debug-dependent options +cmake_dependent_option(QGC_BUILD_TESTING "Enable unit tests" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) +cmake_dependent_option(QGC_DEBUG_QML "Enable QML debugging/profiling" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) + +# ============================================================================ +# Feature Flags +# ============================================================================ + +option(QGC_UTM_ADAPTER "Enable UTM (Unmanned Traffic Management) Adapter" OFF) +option(QGC_VIEWER3D "Enable 3D Viewer (requires Qt Quick 3D)" ON) + +# MAVLink Inspector is disabled by default due to GPL licensing of QtCharts +# option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable MAVLink Inspector" OFF) + +# ============================================================================ +# Communication Options +# ============================================================================ + +option(QGC_ENABLE_BLUETOOTH "Enable Bluetooth communication links" ON) +option(QGC_ZEROCONF_ENABLED "Enable ZeroConf/Bonjour discovery" OFF) +option(QGC_AIRLINK_DISABLED "Disable AIRLink support" ON) +option(QGC_NO_SERIAL_LINK "Disable serial port communication" OFF) + +# ============================================================================ +# Video Streaming Options +# ============================================================================ + +option(QGC_ENABLE_UVC "Enable UVC (USB Video Class) device support" ON) +option(QGC_ENABLE_GST_VIDEOSTREAMING "Enable GStreamer video backend" ON) +cmake_dependent_option(QGC_CUSTOM_GST_PACKAGE "Use QGC-provided GStreamer packages" OFF "QGC_ENABLE_GST_VIDEOSTREAMING" OFF) +option(QGC_ENABLE_QT_VIDEOSTREAMING "Enable QtMultimedia video backend" OFF) + +# ============================================================================ +# Joystick/Input Configuration +# ============================================================================ + +# Example custom SDL game controller mapping: +# set(SDL_GAMECONTROLLERCONFIG "0300000009120000544f000011010000,OpenTX Radiomaster TX16S,leftx:a3,lefty:a2,rightx:a0,righty:a1,platform:Linux" CACHE STRING "Custom SDL mappings") + +# ============================================================================ +# MAVLink Configuration +# ============================================================================ + +set(QGC_MAVLINK_GIT_REPO "https://github.com/mavlink/c_library_v2.git" CACHE STRING "MAVLink repository URL") +set(QGC_MAVLINK_GIT_TAG "19f9955598af9a9181064619bd2e3c04bd2d848a" CACHE STRING "MAVLink repository commit/tag") + +# ============================================================================ +# Autopilot Plugin Configuration +# ============================================================================ + +# ArduPilot (APM) Plugin +option(QGC_DISABLE_APM_MAVLINK "Disable ArduPilot MAVLink dialect" OFF) +option(QGC_DISABLE_APM_PLUGIN "Disable ArduPilot plugin" OFF) +option(QGC_DISABLE_APM_PLUGIN_FACTORY "Disable ArduPilot plugin factory" OFF) + +# PX4 Plugin +option(QGC_DISABLE_PX4_PLUGIN "Disable PX4 plugin" OFF) +option(QGC_DISABLE_PX4_PLUGIN_FACTORY "Disable PX4 plugin factory" OFF) + +# ============================================================================ +# Platform-Specific Configuration +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Android Platform +# ---------------------------------------------------------------------------- +set(QGC_QT_ANDROID_TARGET_SDK_VERSION "36" CACHE STRING "Android target SDK version") +set(QGC_QT_ANDROID_MIN_SDK_VERSION "28" CACHE STRING "Android minimum SDK version") +set(QGC_ANDROID_PACKAGE_NAME "${QGC_PACKAGE_NAME}" CACHE STRING "Android package identifier") +set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${CMAKE_SOURCE_DIR}/android" CACHE PATH "Android package source directory") +set(QT_ANDROID_DEPLOYMENT_TYPE "" CACHE STRING "Android deployment type (empty or Release)") +option(QT_ANDROID_SIGN_APK "Enable APK signing" OFF) +option(QT_ANDROID_SIGN_AAB "Enable AAB signing" OFF) +option(QT_USE_TARGET_ANDROID_BUILD_DIR "Use target-specific Android build directory" OFF) + +# ---------------------------------------------------------------------------- +# macOS Platform +# ---------------------------------------------------------------------------- +set(QGC_MACOS_PLIST_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/MacOSXBundleInfo.plist.in" CACHE FILEPATH "macOS Info.plist template path") +set(QGC_MACOS_BUNDLE_ID "${QGC_PACKAGE_NAME}" CACHE STRING "macOS bundle identifier") +set(QGC_MACOS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.icns" CACHE FILEPATH "macOS application icon path") +set(QGC_MACOS_ENTITLEMENTS_PATH "${CMAKE_SOURCE_DIR}/deploy/macos/qgroundcontrol.entitlements" CACHE FILEPATH "macOS entitlements file path") +option(QGC_MACOS_UNIVERSAL_BUILD "Build macOS universal binary (x86_64h + arm64)" ON) + +# ---------------------------------------------------------------------------- +# Linux Platform +# ---------------------------------------------------------------------------- +option(QGC_CREATE_APPIMAGE "Create AppImage package after build" ON) +set(QGC_APPIMAGE_ICON_256_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl_256.png" CACHE FILEPATH "AppImage 256x256 icon path") +set(QGC_APPIMAGE_ICON_SCALABLE_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/QGroundControl.svg" CACHE FILEPATH "AppImage SVG icon path") +set(QGC_APPIMAGE_APPRUN_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/AppRun" CACHE FILEPATH "AppImage AppRun script path") +set(QGC_APPIMAGE_DESKTOP_ENTRY_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in" CACHE FILEPATH "AppImage desktop entry path") +set(QGC_APPIMAGE_METADATA_PATH "${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.appdata.xml.in" CACHE FILEPATH "AppImage metadata path") +set(QGC_APPIMAGE_APPDATA_DEVELOPER "qgroundcontrol" CACHE STRING "AppImage developer name") + +# ---------------------------------------------------------------------------- +# Windows Platform +# ---------------------------------------------------------------------------- +set(QGC_WINDOWS_INSTALL_HEADER_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/installheader.bmp" CACHE FILEPATH "Windows installer header image") +set(QGC_WINDOWS_ICON_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/WindowsQGC.ico" CACHE FILEPATH "Windows application icon") +set(QGC_WINDOWS_RESOURCE_FILE_PATH "${CMAKE_SOURCE_DIR}/deploy/windows/QGroundControl.rc" CACHE FILEPATH "Windows resource file") + +# ============================================================================ +# Qt Configuration +# ============================================================================ + +set(QGC_QT_MINIMUM_VERSION "6.8.3" CACHE STRING "Minimum supported Qt version") +set(QGC_QT_MAXIMUM_VERSION "6.10.0" CACHE STRING "Maximum supported Qt version") + +set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "QML output directory") +set(QML_IMPORT_PATH "${QT_QML_OUTPUT_DIRECTORY}" CACHE STRING "Additional QML import paths") + +option(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING "Silence missing dependency warnings" OFF) +option(QT_ENABLE_VERBOSE_DEPLOYMENT "Enable verbose deployment output" OFF) +option(QT_DEBUG_FIND_PACKAGE "Print search paths when package not found" ON) +option(QT_QML_GENERATE_QMLLS_INI "Generate qmlls.ini for QML language server" ON) + +# Debug environment variables (uncomment to enable) # set(ENV{QT_DEBUG_PLUGINS} "1") # set(ENV{QML_IMPORT_TRACE} "1") -# CMAKE -# option(CMAKE_FIND_DEBUG_MODE "Print Used Search Paths When Finding a Package" OFF) +# ============================================================================ +# CMake Package Manager (CPM) +# ============================================================================ + +# Uncomment to use named cache directories for better organization +# set(CPM_USE_NAMED_CACHE_DIRECTORIES ON CACHE BOOL "Use package name subdirectories in CPM cache") + +# ============================================================================ +# CMake Configuration +# ============================================================================ + +# Uncomment for verbose package finding +# option(CMAKE_FIND_DEBUG_MODE "Print search paths when finding packages" OFF) diff --git a/cmake/Helpers.cmake b/cmake/Helpers.cmake index 12433793e1bb..92b64621cf39 100644 --- a/cmake/Helpers.cmake +++ b/cmake/Helpers.cmake @@ -1,5 +1,23 @@ +# ---------------------------------------------------------------------------- +# QGroundControl CMake Helper Functions +# ---------------------------------------------------------------------------- + +if(QGC_HELPERS_INCLUDED) + return() +endif() +set(QGC_HELPERS_INCLUDED TRUE) + +# ---------------------------------------------------------------------------- +# qgc_set_qt_resource_alias +# Sets Qt resource aliases for files based on their filenames +# Args: List of resource files +# ---------------------------------------------------------------------------- function(qgc_set_qt_resource_alias) foreach(resource_file IN LISTS ARGN) + if(NOT EXISTS "${resource_file}") + message(WARNING "QGC: Resource file does not exist: ${resource_file}") + continue() + endif() get_filename_component(alias "${resource_file}" NAME) set_source_files_properties("${resource_file}" PROPERTIES @@ -8,12 +26,17 @@ function(qgc_set_qt_resource_alias) endforeach() endfunction() +# ---------------------------------------------------------------------------- +# qgc_config_caching +# Configures compiler caching using ccache or sccache if available +# ---------------------------------------------------------------------------- function(qgc_config_caching) function(_qgc_verify_cache_tool _ok _path) execute_process( COMMAND "${_path}" --version RESULT_VARIABLE _res - OUTPUT_QUIET ERROR_QUIET + OUTPUT_QUIET + ERROR_QUIET ) if(NOT _res EQUAL 0) set(${_ok} FALSE PARENT_SCOPE) @@ -21,18 +44,20 @@ function(qgc_config_caching) endfunction() find_program(QGC_CACHE_PROGRAM - NAMES ccache sccache - VALIDATOR _qgc_verify_cache_tool) + NAMES ccache sccache + VALIDATOR _qgc_verify_cache_tool + ) + if(QGC_CACHE_PROGRAM) get_filename_component(_cache_tool "${QGC_CACHE_PROGRAM}" NAME_WE) - message(STATUS "QGC: using ${_cache_tool} (${QGC_CACHE_PROGRAM})") + message(STATUS "QGC: Using ${_cache_tool} (${QGC_CACHE_PROGRAM})") string(TOLOWER "${_cache_tool}" _cache_tool) if(_cache_tool STREQUAL "ccache") # set(ENV{CCACHE_CONFIGPATH} "${CMAKE_SOURCE_DIR}/tools/ccache.conf") # set(ENV{CCACHE_DIR} "${CMAKE_SOURCE_DIR}/.ccache") set(ENV{CCACHE_BASEDIR} "${CMAKE_SOURCE_DIR}") - set(ENV{CCACHE_COMPRESSLEVEL "5") + set(ENV{CCACHE_COMPRESSLEVEL} "5") set(ENV{CCACHE_SLOPPINESS} "pch_defines,time_macros,include_file_mtime,include_file_ctime") # set(ENV{CCACHE_NOHASHDIR} "true") if(APPLE) @@ -55,59 +80,76 @@ function(qgc_config_caching) return() endif() - set(CMAKE_C_COMPILER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "C compiler launcher") - set(CMAKE_CXX_COMPILER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "CXX compiler launcher") - # set(CMAKE_C_LINKER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "C linker cache used") - # set(CMAKE_CXX_LINKER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "CXX linker cache used") + set(CMAKE_C_COMPILER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "C compiler launcher" FORCE) + set(CMAKE_CXX_COMPILER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "CXX compiler launcher" FORCE) + # Linker launchers not currently used but available if needed + # set(CMAKE_C_LINKER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "C linker cache") + # set(CMAKE_CXX_LINKER_LAUNCHER "${QGC_CACHE_PROGRAM}" CACHE STRING "CXX linker cache") if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Xclang -fno-pch-timestamp) endif() else() - message(WARNING "QGC: no ccache/sccache found – building without a compiler cache") + message(WARNING "QGC: No ccache/sccache found - building without a compiler cache") endif() endfunction() +# ---------------------------------------------------------------------------- +# qgc_set_linker +# Attempts to use a faster linker (mold, lld, or gold) if available +# Falls back to the system default linker +# ---------------------------------------------------------------------------- function(qgc_set_linker) include(CheckLinkerFlag) + # Try linkers in order of preference: mold > lld > gold foreach(_ld mold lld gold) set(_flag "LINKER:-fuse-ld=${_ld}") check_linker_flag(CXX "${_flag}" HAVE_LD_${_ld}) if(HAVE_LD_${_ld}) add_link_options("${_flag}") - set(QGC_LINKER "${_ld}") - message(STATUS "QGC: using ${_ld} linker (flag ${_flag})") - break() + set(QGC_LINKER "${_ld}" PARENT_SCOPE) + message(STATUS "QGC: Using ${_ld} linker") + return() endif() endforeach() - if(NOT DEFINED QGC_LINKER) - message(WARNING "QGC: no mold / lld / gold found – falling back to default linker") - endif() + message(STATUS "QGC: No alternative linker (mold/lld/gold) found - using system default") endfunction() +# ---------------------------------------------------------------------------- +# qgc_enable_pie +# Enables Position Independent Executables (PIE) for improved security +# ---------------------------------------------------------------------------- function(qgc_enable_pie) include(CheckPIESupported) - check_pie_supported(OUTPUT_VARIABLE _output) + check_pie_supported(OUTPUT_VARIABLE _output LANGUAGES C CXX) + if(CMAKE_C_LINK_PIE_SUPPORTED) - set(CMAKE_POSITION_INDEPENDENT_CODE ON) - message(STATUS "QGC: PIE is enabled") + set(CMAKE_POSITION_INDEPENDENT_CODE ON PARENT_SCOPE) + message(STATUS "QGC: PIE enabled") else() - message(WARNING "QGC: PIE is not supported at link time: ${_output}") + message(WARNING "QGC: PIE not supported - ${_output}") endif() endfunction() +# ---------------------------------------------------------------------------- +# qgc_enable_ipo +# Enables Interprocedural Optimization (IPO/LTO) for Release builds +# ---------------------------------------------------------------------------- function(qgc_enable_ipo) if(CMAKE_BUILD_TYPE STREQUAL "Release") include(CheckIPOSupported) - check_ipo_supported(RESULT _result OUTPUT _output) + check_ipo_supported(RESULT _result OUTPUT _output LANGUAGES C CXX) + if(_result) - set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE) - message(STATUS "QGC: LTO is enabled") + set(CMAKE_INTERPROCEDURAL_OPTIMIZATION TRUE PARENT_SCOPE) + message(STATUS "QGC: IPO/LTO enabled for Release build") else() - message(WARNING "QGC: IPO is not supported: ${_output}") + message(WARNING "QGC: IPO/LTO not supported - ${_output}") endif() + else() + message(STATUS "QGC: IPO/LTO disabled for ${CMAKE_BUILD_TYPE} build") endif() endfunction() diff --git a/cmake/PrintSummary.cmake b/cmake/PrintSummary.cmake index 276494bd759f..123d9c868348 100644 --- a/cmake/PrintSummary.cmake +++ b/cmake/PrintSummary.cmake @@ -1,11 +1,20 @@ +# ============================================================================ +# QGroundControl Build Configuration Summary +# Prints a comprehensive summary of the build configuration +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Configuration Timestamp # ---------------------------------------------------------------------------- -# Print a timestamp for reproducibility string(TIMESTAMP QGC_CONFIGURE_TIME "%Y-%m-%d %H:%M:%S %Z") -message(STATUS "QGroundControl configuration generated at ${QGC_CONFIGURE_TIME}") +message(STATUS "") +message(STATUS "==================================================================") +message(STATUS "QGroundControl Configuration Summary") +message(STATUS "Generated at: ${QGC_CONFIGURE_TIME}") message(STATUS "==================================================================") # ---------------------------------------------------------------------------- -# Macro for printing ON/OFF flags +# Helper Macro for ON/OFF Options # ---------------------------------------------------------------------------- macro(OptionOutput _label) if(${ARGN}) @@ -13,117 +22,120 @@ macro(OptionOutput _label) else() set(_val "OFF") endif() - message(STATUS "${_label}: ${_val}") + message(STATUS " ${_label}: ${_val}") endmacro() # ---------------------------------------------------------------------------- -# Imported CMake variables +# CMake System Information # ---------------------------------------------------------------------------- -message(STATUS "-- CMake System -----------------------------------------------------") -message(STATUS "Install prefix: ${CMAKE_INSTALL_PREFIX}") -message(STATUS "Generator: ${CMAKE_GENERATOR} ${CMAKE_GENERATOR_PLATFORM} ${CMAKE_GENERATOR_TOOLSET}") -message(STATUS "Build type: ${CMAKE_BUILD_TYPE}") -message(STATUS "Host system: ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_VERSION}") -message(STATUS "Target system: ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}") -message(STATUS "CMake version: ${CMAKE_VERSION}") -message(STATUS "Source directory: ${CMAKE_SOURCE_DIR}") -message(STATUS "Toolchain file: ${CMAKE_TOOLCHAIN_FILE}") -message(STATUS "Prefix path: ${CMAKE_PREFIX_PATH}") -message(STATUS "------------------------------------------------------------------") +message(STATUS "") +message(STATUS "CMake System:") +message(STATUS " CMake version: ${CMAKE_VERSION}") +message(STATUS " Generator: ${CMAKE_GENERATOR}") +message(STATUS " Build type: ${CMAKE_BUILD_TYPE}") +message(STATUS " Source directory: ${CMAKE_SOURCE_DIR}") +message(STATUS " Install prefix: ${CMAKE_INSTALL_PREFIX}") +message(STATUS " Host system: ${CMAKE_HOST_SYSTEM_NAME} ${CMAKE_HOST_SYSTEM_VERSION}") +message(STATUS " Target system: ${CMAKE_SYSTEM_NAME} ${CMAKE_SYSTEM_VERSION}") +if(CMAKE_TOOLCHAIN_FILE) + message(STATUS " Toolchain file: ${CMAKE_TOOLCHAIN_FILE}") +endif() +if(CMAKE_PREFIX_PATH) + message(STATUS " Prefix path: ${CMAKE_PREFIX_PATH}") +endif() -message(STATUS "-- Compiler & Linker -----------------------------------------------") -message(STATUS "C++ compiler: ${CMAKE_CXX_COMPILER_ID} (${CMAKE_CXX_COMPILER}) v${CMAKE_CXX_COMPILER_VERSION}") -message(STATUS "C++ standard: C++${CMAKE_CXX_STANDARD}") -message(STATUS "Compiler flags: ${CMAKE_CXX_FLAGS}") -message(STATUS " Debug: ${CMAKE_CXX_FLAGS_DEBUG}") -message(STATUS " Release: ${CMAKE_CXX_FLAGS_RELEASE}") -message(STATUS "Linker flags: ${CMAKE_EXE_LINKER_FLAGS}") -message(STATUS " Debug: ${CMAKE_EXE_LINKER_FLAGS_DEBUG}") -message(STATUS " Release: ${CMAKE_EXE_LINKER_FLAGS_RELEASE}") -message(STATUS "------------------------------------------------------------------") +message(STATUS "") +message(STATUS "Compiler & Linker:") +message(STATUS " C++ compiler: ${CMAKE_CXX_COMPILER_ID} ${CMAKE_CXX_COMPILER_VERSION}") +message(STATUS " C++ standard: C++${CMAKE_CXX_STANDARD}") +if(CMAKE_CXX_FLAGS) + message(STATUS " Compiler flags: ${CMAKE_CXX_FLAGS}") +endif() +if(CMAKE_EXE_LINKER_FLAGS) + message(STATUS " Linker flags: ${CMAKE_EXE_LINKER_FLAGS}") +endif() # ---------------------------------------------------------------------------- -# App metadata +# Application Metadata # ---------------------------------------------------------------------------- -message(STATUS "-- Application ------------------------------------------------------") -message(STATUS "App Name: ${QGC_APP_NAME}") -message(STATUS "Description: ${QGC_APP_DESCRIPTION}") -message(STATUS "Copyright: ${QGC_APP_COPYRIGHT}") -message(STATUS "Organization: ${QGC_ORG_NAME} (${QGC_ORG_DOMAIN})") -message(STATUS "Package name: ${QGC_PACKAGE_NAME}") -message(STATUS "Settings version: ${QGC_SETTINGS_VERSION}") -message(STATUS "------------------------------------------------------------------") +message(STATUS "") +message(STATUS "Application:") +message(STATUS " Name: ${QGC_APP_NAME}") +message(STATUS " Version: ${QGC_APP_VERSION_STR}") +message(STATUS " Description: ${QGC_APP_DESCRIPTION}") +message(STATUS " Organization: ${QGC_ORG_NAME} (${QGC_ORG_DOMAIN})") +message(STATUS " Package name: ${QGC_PACKAGE_NAME}") +message(STATUS " Settings version: ${QGC_SETTINGS_VERSION}") # ---------------------------------------------------------------------------- -# Option flags +# Build & Feature Flags # ---------------------------------------------------------------------------- -message(STATUS "-- Build & Feature Flags -------------------------------------------") -OptionOutput("Build shared libraries" BUILD_SHARED_LIBS) -OptionOutput("Stable build" QGC_STABLE_BUILD) -OptionOutput("Use build caching" QGC_USE_CACHE) -OptionOutput("Enable testing" QGC_BUILD_TESTING) -OptionOutput("Enable QML debugging" QGC_DEBUG_QML) -OptionOutput("Enable Herelink support" QGC_ENABLE_HERELINK) -OptionOutput("Enable UTM Adapter" QGC_UTM_ADAPTER) -OptionOutput("Enable 3D Viewer" QGC_VIEWER3D) -OptionOutput("Enable Bluetooth links" QGC_ENABLE_BLUETOOTH) -OptionOutput("Enable ZeroConf compatibility" QGC_ZEROCONF_ENABLED) -OptionOutput("Disable AIRLink" QGC_AIRLINK_DISABLED) -OptionOutput("Disable serial links" QGC_NO_SERIAL_LINK) -OptionOutput("Enable UVC devices" QGC_ENABLE_UVC) -OptionOutput("Enable GStreamer video" QGC_ENABLE_GST_VIDEOSTREAMING) -OptionOutput("Enable Qt video backend" QGC_ENABLE_QT_VIDEOSTREAMING) -OptionOutput("Disable APM MAVLink dialect" QGC_DISABLE_APM_MAVLINK) -OptionOutput("Disable APM plugin" QGC_DISABLE_APM_PLUGIN) -OptionOutput("Disable APM plugin factory" QGC_DISABLE_APM_PLUGIN_FACTORY) -OptionOutput("Disable PX4 plugin" QGC_DISABLE_PX4_PLUGIN) -OptionOutput("Disable PX4 plugin factory" QGC_DISABLE_PX4_PLUGIN_FACTORY) -message(STATUS "------------------------------------------------------------------") +message(STATUS "") +message(STATUS "Build & Feature Flags:") +OptionOutput("Stable build " QGC_STABLE_BUILD) +OptionOutput("Use build caching " QGC_USE_CACHE) +OptionOutput("Enable testing " QGC_BUILD_TESTING) +OptionOutput("Enable QML debugging " QGC_DEBUG_QML) +OptionOutput("Enable 3D Viewer " QGC_VIEWER3D) +OptionOutput("Enable Bluetooth links " QGC_ENABLE_BLUETOOTH) +OptionOutput("Enable ZeroConf compatibility " QGC_ZEROCONF_ENABLED) +OptionOutput("Disable AIRLink " QGC_AIRLINK_DISABLED) +OptionOutput("Disable serial links " QGC_NO_SERIAL_LINK) +OptionOutput("Enable UVC devices " QGC_ENABLE_UVC) +OptionOutput("Enable GStreamer video " QGC_ENABLE_GST_VIDEOSTREAMING) +OptionOutput("Enable Qt video backend " QGC_ENABLE_QT_VIDEOSTREAMING) +OptionOutput("Disable APM MAVLink dialect " QGC_DISABLE_APM_MAVLINK) +OptionOutput("Disable APM plugin " QGC_DISABLE_APM_PLUGIN) +OptionOutput("Disable PX4 plugin " QGC_DISABLE_PX4_PLUGIN) # ---------------------------------------------------------------------------- -# Repository & dependency settings +# External Dependencies # ---------------------------------------------------------------------------- -message(STATUS "-- External Dependencies -------------------------------------------") -message(STATUS "MAVLink repo URL: ${QGC_MAVLINK_GIT_REPO}") -message(STATUS "MAVLink repo tag: ${QGC_MAVLINK_GIT_TAG}") -message(STATUS "CPM cache directory: ${CPM_SOURCE_CACHE}") -message(STATUS "QML output directory: ${QT_QML_OUTPUT_DIRECTORY}") -message(STATUS "------------------------------------------------------------------") +message(STATUS "") +message(STATUS "External Dependencies:") +message(STATUS " MAVLink repo: ${QGC_MAVLINK_GIT_REPO}") +message(STATUS " MAVLink tag: ${QGC_MAVLINK_GIT_TAG}") +message(STATUS " CPM cache: ${CPM_SOURCE_CACHE}") +message(STATUS " QML output dir: ${QT_QML_OUTPUT_DIRECTORY}") # ---------------------------------------------------------------------------- -# Platform-specific settings +# Platform-Specific Settings # ---------------------------------------------------------------------------- if(ANDROID) - message(STATUS "-- Android ---------------------------------------------------------") - message(STATUS "Target SDK: ${QGC_QT_ANDROID_TARGET_SDK_VERSION}") - message(STATUS "Package source dir: ${QGC_ANDROID_PACKAGE_SOURCE_DIR}") - message(STATUS "APK signing: ${QT_ANDROID_SIGN_APK} / AAB signing: ${QT_ANDROID_SIGN_AAB}") - message(STATUS "Use target build dir: ${QT_USE_TARGET_ANDROID_BUILD_DIR}") - message(STATUS "NDK host system: ${ANDROID_NDK_HOST_SYSTEM_NAME}") - message(STATUS "SDK root: ${ANDROID_SDK_ROOT}") - message(STATUS "Deployment type: ${QT_ANDROID_DEPLOYMENT_TYPE}") - message(STATUS "------------------------------------------------------------------") + message(STATUS "") + message(STATUS "Android Platform:") + message(STATUS " Target SDK: ${QGC_QT_ANDROID_TARGET_SDK_VERSION}") + message(STATUS " Min SDK: ${QGC_QT_ANDROID_MIN_SDK_VERSION}") + message(STATUS " Package: ${QGC_ANDROID_PACKAGE_NAME}") + message(STATUS " APK signing: ${QT_ANDROID_SIGN_APK}") + message(STATUS " AAB signing: ${QT_ANDROID_SIGN_AAB}") endif() if(MACOS) - message(STATUS "-- macOS -----------------------------------------------------------") - message(STATUS "Bundle ID: ${QGC_MACOS_BUNDLE_ID}") - message(STATUS "Info plist path: ${QGC_MACOS_PLIST_PATH}") - message(STATUS "Icon directory: ${QGC_MACOS_ICON_PATH}") - message(STATUS "Entitlements path: ${QGC_MACOS_ENTITLEMENTS_PATH}") - message(STATUS "------------------------------------------------------------------") + message(STATUS "") + message(STATUS "macOS Platform:") + message(STATUS " Bundle ID: ${QGC_MACOS_BUNDLE_ID}") + message(STATUS " Deployment target: ${CMAKE_OSX_DEPLOYMENT_TARGET}") + if(QGC_MACOS_UNIVERSAL_BUILD) + message(STATUS " Architectures: ${CMAKE_OSX_ARCHITECTURES}") + endif() endif() -if(WIN32) - message(STATUS "-- Windows ---------------------------------------------------------") - message(STATUS "Install header bmp: ${QGC_WINDOWS_INSTALL_HEADER_PATH}") - message(STATUS "Icon path: ${QGC_WINDOWS_ICON_PATH}") - message(STATUS "RC resource file: ${QGC_WINDOWS_RESOURCE_FILE_PATH}") - message(STATUS "------------------------------------------------------------------") +if(WIN32 AND NOT ANDROID) + message(STATUS "") + message(STATUS "Windows Platform:") + message(STATUS " Icon: ${QGC_WINDOWS_ICON_PATH}") + message(STATUS " Resource file: ${QGC_WINDOWS_RESOURCE_FILE_PATH}") endif() -if(LINUX) - message(STATUS "-- Linux -----------------------------------------------------------") - message(STATUS "AppImage icon path: ${QGC_APPIMAGE_ICON_PATH}") - message(STATUS "------------------------------------------------------------------") +if(LINUX AND NOT ANDROID) + message(STATUS "") + message(STATUS "Linux Platform:") + if(QGC_CREATE_APPIMAGE) + message(STATUS " AppImage: Enabled") + endif() endif() + +message(STATUS "") +message(STATUS "==================================================================") +message(STATUS "") diff --git a/cmake/Toolchain.cmake b/cmake/Toolchain.cmake index 61762a641a97..47281e700804 100644 --- a/cmake/Toolchain.cmake +++ b/cmake/Toolchain.cmake @@ -1,54 +1,104 @@ +# ---------------------------------------------------------------------------- +# QGroundControl Toolchain Configuration +# Sets compiler, linker, and build tool settings +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# C++ Standard Requirements +# ---------------------------------------------------------------------------- set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) set(CMAKE_CXX_EXTENSIONS OFF) +# ---------------------------------------------------------------------------- +# Qt-specific Automation +# ---------------------------------------------------------------------------- set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) +# ---------------------------------------------------------------------------- +# Build Configuration +# ---------------------------------------------------------------------------- set(CMAKE_COLOR_DIAGNOSTICS ON) -# set(CMAKE_EXPORT_BUILD_DATABASE ON) # Causes Configuration Error? -set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # Conflict with CMAKE_UNITY_BUILD +set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_INCLUDE_CURRENT_DIR ON) +# Unity builds can improve compile times but may cause issues +# Enable with caution - conflicts with CMAKE_EXPORT_COMPILE_COMMANDS +# set(CMAKE_EXPORT_BUILD_DATABASE ON) # set(CMAKE_UNITY_BUILD ON) # set(CMAKE_UNITY_BUILD_BATCH_SIZE 8) +# ---------------------------------------------------------------------------- +# Security & Optimization Settings +# ---------------------------------------------------------------------------- + qgc_enable_pie() -qgc_enable_ipo() +if(NOT LINUX) + qgc_enable_ipo() +endif() +# ---------------------------------------------------------------------------- +# Compiler & Linker Optimizations +# ---------------------------------------------------------------------------- if(CMAKE_CXX_COMPILER_ID MATCHES "Clang|GNU") + # Use faster alternative linkers on non-Apple platforms if(NOT APPLE) qgc_set_linker() endif() - add_link_options("$<$:-flto=thin>") + + # Link-Time Optimization (LTO) for Release builds + # Thin LTO provides faster incremental builds (Clang-specific) + if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") + add_link_options("$<$:-flto=thin>") + else() + # GCC uses standard LTO (handled by qgc_enable_ipo above) + endif() elseif(MSVC) + # MSVC-specific optimizations add_link_options("$<$:/LTCG:INCREMENTAL>") set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$<$:Embedded>") set(CMAKE_MSVC_RUNTIME_LIBRARY "MultiThreaded$<$:Debug>DLL") endif() +# ---------------------------------------------------------------------------- +# Install Configuration +# ---------------------------------------------------------------------------- + if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) if(LINUX) - # set(ENV{DESTDIR} "${CMAKE_BINARY_DIR}/staging") + # Linux uses AppDir structure for AppImage packaging set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/AppDir/usr" CACHE PATH "Install path prefix for AppImage" FORCE) else() + # Other platforms use staging directory set(CMAKE_INSTALL_PREFIX "${CMAKE_BINARY_DIR}/staging" CACHE PATH "Install path prefix" FORCE) endif() endif() +# ---------------------------------------------------------------------------- +# Cross-Compilation Configuration +# ---------------------------------------------------------------------------- if(CMAKE_CROSSCOMPILING) - if(NOT IS_DIRECTORY ${QT_HOST_PATH}) - message(FATAL_ERROR "You need to set QT_HOST_PATH to cross compile Qt.") + if(NOT DEFINED QT_HOST_PATH OR QT_HOST_PATH STREQUAL "") + message(FATAL_ERROR "Cross-compilation requires QT_HOST_PATH to be defined and set to a valid Qt host installation path") + endif() + + if(NOT IS_DIRECTORY "${QT_HOST_PATH}") + message(FATAL_ERROR "Cross-compilation QT_HOST_PATH is not a valid directory: ${QT_HOST_PATH}") endif() if(ANDROID) + # Android cross-compilation: search both target and host paths set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE BOTH) endif() endif() +# ---------------------------------------------------------------------------- +# Platform Detection Helpers +# ---------------------------------------------------------------------------- if(APPLE AND NOT IOS) set(MACOS TRUE) endif() diff --git a/cmake/find-modules/FindGStreamer.cmake b/cmake/find-modules/FindGStreamer.cmake index 3feb56093ebf..47ca3788c89a 100644 --- a/cmake/find-modules/FindGStreamer.cmake +++ b/cmake/find-modules/FindGStreamer.cmake @@ -1,3 +1,16 @@ +# ============================================================================ +# FindGStreamer.cmake +# CMake find module for GStreamer multimedia framework +# +# Handles multiple platforms: Windows, Linux, macOS, Android, iOS +# Supports both static and dynamic linking +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Default Configuration +# ---------------------------------------------------------------------------- + +# Set default version based on platform if(NOT DEFINED GStreamer_FIND_VERSION) if(LINUX) set(GStreamer_FIND_VERSION 1.20) @@ -6,6 +19,7 @@ if(NOT DEFINED GStreamer_FIND_VERSION) endif() endif() +# Determine GStreamer root directory from various environment variables if(NOT DEFINED GStreamer_ROOT_DIR) if(DEFINED GSTREAMER_ROOT) set(GStreamer_ROOT_DIR ${GSTREAMER_ROOT}) @@ -14,10 +28,11 @@ if(NOT DEFINED GStreamer_ROOT_DIR) endif() if(DEFINED GStreamer_ROOT_DIR AND NOT EXISTS "${GStreamer_ROOT_DIR}") - message(STATUS "The user provided GStreamer directory does not exist: ${GStreamer_ROOT_DIR}") + message(STATUS "GStreamer: User-provided directory does not exist: ${GStreamer_ROOT_DIR}") endif() endif() +# Static vs dynamic linking preference if(NOT DEFINED GStreamer_USE_STATIC_LIBS) if(ANDROID OR IOS) set(GStreamer_USE_STATIC_LIBS ON) @@ -26,6 +41,7 @@ if(NOT DEFINED GStreamer_USE_STATIC_LIBS) endif() endif() +# Framework usage (macOS/iOS only) if(NOT DEFINED GStreamer_USE_FRAMEWORK) if(APPLE) set(GStreamer_USE_FRAMEWORK ON) @@ -34,10 +50,15 @@ if(NOT DEFINED GStreamer_USE_FRAMEWORK) endif() endif() -################################################################################ +# ============================================================================ +# Platform-Specific Configuration +# ============================================================================ set(PKG_CONFIG_ARGN) +# ---------------------------------------------------------------------------- +# Windows Platform +# ---------------------------------------------------------------------------- if(WIN32) if(NOT DEFINED GStreamer_ROOT_DIR) if(DEFINED ENV{GSTREAMER_1_0_ROOT_X86_64} AND EXISTS "$ENV{GSTREAMER_1_0_ROOT_X86_64}") @@ -71,6 +92,10 @@ if(WIN32) --define-variable=libdir=${GSTREAMER_LIB_PATH} --define-variable=includedir=${GSTREAMER_INCLUDE_PATH} ) + +# ---------------------------------------------------------------------------- +# Linux Platform +# ---------------------------------------------------------------------------- elseif(LINUX) if(NOT DEFINED GStreamer_ROOT_DIR) if(EXISTS "/usr") @@ -95,6 +120,10 @@ elseif(LINUX) set(GSTREAMER_INCLUDE_PATH "${GStreamer_ROOT_DIR}/include") set(ENV{PKG_CONFIG_PATH} "${GSTREAMER_LIB_PATH}/pkgconfig:$ENV{PKG_CONFIG_PATH}") + +# ---------------------------------------------------------------------------- +# Android Platform +# ---------------------------------------------------------------------------- elseif(ANDROID) if(QGC_CUSTOM_GST_PACKAGE) set(_gst_android_url "https://qgroundcontrol.s3.us-west-2.amazonaws.com/android-gstreamer/qgc-android-gstreamer-${GStreamer_FIND_VERSION}.tar.xz") @@ -146,6 +175,10 @@ elseif(ANDROID) --define-variable=libdir=${GSTREAMER_LIB_PATH} --define-variable=includedir=${GSTREAMER_INCLUDE_PATH} ) + +# ---------------------------------------------------------------------------- +# macOS Platform +# ---------------------------------------------------------------------------- elseif(MACOS) if(NOT DEFINED GStreamer_ROOT_DIR) if(EXISTS "/Library/Frameworks/GStreamer.framework") @@ -179,8 +212,12 @@ elseif(MACOS) --define-variable=libdir=${GSTREAMER_LIB_PATH} --define-variable=includedir=${GSTREAMER_INCLUDE_PATH} ) + +# ---------------------------------------------------------------------------- +# iOS Platform (Currently Unsupported) +# ---------------------------------------------------------------------------- elseif(IOS) - message(FATAL_ERROR "GStreamer for iOS is Currently Unsupported.") + message(FATAL_ERROR "GStreamer for iOS is currently unsupported") CPMAddPackage( NAME gstreamer @@ -222,15 +259,20 @@ elseif(IOS) set(GSTREAMER_INCLUDE_PATH "${GSTREAMER_FRAMEWORK_PATH}/Headers") endif() +# ---------------------------------------------------------------------------- +# Validation +# ---------------------------------------------------------------------------- if(NOT EXISTS "${GStreamer_ROOT_DIR}" OR NOT EXISTS "${GSTREAMER_LIB_PATH}" OR NOT EXISTS "${GSTREAMER_PLUGIN_PATH}" OR NOT EXISTS "${GSTREAMER_INCLUDE_PATH}") - message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables") + message(FATAL_ERROR "GStreamer: Could not locate required directories - check installation or set GStreamer_ROOT_DIR") endif() if(GStreamer_USE_FRAMEWORK AND NOT EXISTS "${GSTREAMER_FRAMEWORK_PATH}") - message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables") + message(FATAL_ERROR "GStreamer: Could not locate framework at ${GSTREAMER_FRAMEWORK_PATH}") endif() -################################################################################ +# ============================================================================ +# Plugin & Dependency Configuration +# ============================================================================ if(GStreamer_USE_STATIC_LIBS) set(GSTREAMER_EXTRA_DEPS @@ -291,7 +333,9 @@ if(ANDROID) ) endif() -################################################################################ +# ============================================================================ +# Package Discovery +# ============================================================================ if(GStreamer_USE_FRAMEWORK) list(APPEND CMAKE_FRAMEWORK_PATH "${GSTREAMER_FRAMEWORK_PATH}") @@ -311,8 +355,11 @@ else() endif() set(GStreamer_VERSION "${PC_GSTREAMER_VERSION}") -################################################################################ +# ============================================================================ +# Component Discovery +# ============================================================================ +# Helper function to find individual GStreamer components function(find_gstreamer_component component pkgconfig_name) set(target GStreamer::${component}) @@ -340,8 +387,9 @@ function(find_gstreamer_component component pkgconfig_name) endif() endfunction() -################################################################################ - +# ---------------------------------------------------------------------------- +# Find Core Components (Always Required) +# ---------------------------------------------------------------------------- find_gstreamer_component(Core gstreamer-1.0) find_gstreamer_component(Base gstreamer-base-1.0) find_gstreamer_component(Video gstreamer-video-1.0) @@ -349,8 +397,9 @@ find_gstreamer_component(Gl gstreamer-gl-1.0) find_gstreamer_component(GlPrototypes gstreamer-gl-prototypes-1.0) find_gstreamer_component(Rtsp gstreamer-rtsp-1.0) -################################################################################ - +# ---------------------------------------------------------------------------- +# Find Optional Components (Based on FIND_COMPONENTS) +# ---------------------------------------------------------------------------- if(GlEgl IN_LIST GStreamer_FIND_COMPONENTS) find_gstreamer_component(GlEgl gstreamer-gl-egl-1.0) endif() @@ -363,7 +412,9 @@ if(GlX11 IN_LIST GStreamer_FIND_COMPONENTS) find_gstreamer_component(GlX11 gstreamer-gl-x11-1.0) endif() -################################################################################ +# ============================================================================ +# Package Finalization +# ============================================================================ include(FindPackageHandleStandardArgs) find_package_handle_standard_args(GStreamer @@ -371,6 +422,9 @@ find_package_handle_standard_args(GStreamer HANDLE_COMPONENTS ) +# ---------------------------------------------------------------------------- +# Create Main GStreamer Target +# ---------------------------------------------------------------------------- if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer) qt_add_library(GStreamer::GStreamer INTERFACE IMPORTED) @@ -396,8 +450,10 @@ if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer) endif() return() else() - message(FATAL_ERROR "Could not locate GStreamer - check installation or set environment/cmake variables") + message(FATAL_ERROR "GStreamer: Could not locate GStreamer.framework") endif() + + # Android-specific link options elseif(ANDROID) target_link_options(GStreamer::GStreamer INTERFACE "-Wl,-Bsymbolic") if(CMAKE_SIZEOF_VOID_P EQUAL 4) @@ -423,8 +479,9 @@ if(GStreamer_FOUND AND NOT TARGET GStreamer::GStreamer) endif() endforeach() -################################################################################ - +# ---------------------------------------------------------------------------- +# Static Plugin Linking (Static Builds Only) +# ---------------------------------------------------------------------------- if(GStreamer_USE_STATIC_LIBS) qt_add_library(GStreamer::Plugins INTERFACE IMPORTED) target_link_directories(GStreamer::Plugins INTERFACE ${GSTREAMER_PLUGIN_PATH}) diff --git a/cmake/install/CPack/CreateCPackArchive.cmake b/cmake/install/CPack/CreateCPackArchive.cmake index 073d1cf1ee01..224b5160b574 100644 --- a/cmake/install/CPack/CreateCPackArchive.cmake +++ b/cmake/install/CPack/CreateCPackArchive.cmake @@ -1,5 +1,13 @@ +# ============================================================================ +# CreateCPackArchive.cmake +# ZIP archive package generator for cross-platform distribution +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# Archive Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "ZIP") set(CPACK_BINARY_ZIP ON) diff --git a/cmake/install/CPack/CreateCPackBundle.cmake b/cmake/install/CPack/CreateCPackBundle.cmake index 3c1caa27f73e..de3c2f689b6f 100644 --- a/cmake/install/CPack/CreateCPackBundle.cmake +++ b/cmake/install/CPack/CreateCPackBundle.cmake @@ -1,14 +1,29 @@ +# ============================================================================ +# CreateCPackBundle.cmake +# macOS application bundle package generator +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# Bundle Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "BUNDLE") set(CPACK_BINARY_BUNDLE ON) set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/macos") +# ---------------------------------------------------------------------------- +# Bundle Configuration +# ---------------------------------------------------------------------------- set(CPACK_BUNDLE_NAME ${CMAKE_PROJECT_NAME}) set(CPACK_BUNDLE_PLIST "${QGC_INSTALLER_SOURCE}/MacOSXBundleInfo.plist.in") set(CPACK_BUNDLE_ICON "${QGC_APP_ICON}") # set(CPACK_BUNDLE_STARTUP_COMMAND "") + +# ---------------------------------------------------------------------------- +# Code Signing Options +# ---------------------------------------------------------------------------- # set(CPACK_BUNDLE_APPLE_CERT_APP "") # set(CPACK_BUNDLE_APPLE_ENTITLEMENTS "") # set(CPACK_BUNDLE_APPLE_CODESIGN_FILES "") diff --git a/cmake/install/CPack/CreateCPackCommon.cmake b/cmake/install/CPack/CreateCPackCommon.cmake index db890e46b5b9..8bca881ff367 100644 --- a/cmake/install/CPack/CreateCPackCommon.cmake +++ b/cmake/install/CPack/CreateCPackCommon.cmake @@ -1,4 +1,11 @@ -# Variables common to all CPack Generators +# ============================================================================ +# CreateCPackCommon.cmake +# Common CPack configuration shared across all package generators +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Basic Package Information +# ---------------------------------------------------------------------------- set(CPACK_PACKAGE_NAME ${CMAKE_PROJECT_NAME}) set(CPACK_PACKAGE_VENDOR ${QGC_ORG_NAME}) set(CPACK_PACKAGE_DIRECTORY ${CMAKE_BINARY_DIR}) @@ -9,14 +16,26 @@ set(CPACK_PACKAGE_DESCRIPTION ${PROJECT_DESCRIPTION}) # set(CPACK_PACKAGE_DESCRIPTION_FILE "") set(CPACK_PACKAGE_DESCRIPTION_SUMMARY ${PROJECT_DESCRIPTION}) set(CPACK_PACKAGE_HOMEPAGE_URL ${PROJECT_HOMEPAGE_URL}) + +# ---------------------------------------------------------------------------- +# Package Files and Directories +# ---------------------------------------------------------------------------- set(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}-${CPACK_PACKAGE_VERSION}-${CPACK_SYSTEM_NAME}") set(CPACK_PACKAGE_INSTALL_DIRECTORY ${CMAKE_PROJECT_NAME}) set(CPACK_PACKAGE_ICON "${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.png") # set(CPACK_PACKAGE_CHECKSUM "") # set(CPACK_PROJECT_CONFIG_FILE "") + +# ---------------------------------------------------------------------------- +# Resource Files +# ---------------------------------------------------------------------------- set(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/.github/COPYING.md") set(CPACK_RESOURCE_FILE_README "${CMAKE_SOURCE_DIR}/README.md") # set(CPACK_RESOURCE_FILE_WELCOME "${CMAKE_CURRENT_SOURCE_DIR}/desc/welcome.txt") + +# ---------------------------------------------------------------------------- +# Package Options +# ---------------------------------------------------------------------------- # set(CPACK_MONOLITHIC_INSTALL # set(CPACK_GENERATOR # set(CPACK_OUTPUT_CONFIG_FILE @@ -25,14 +44,18 @@ set(CPACK_PACKAGE_EXECUTABLES ${CMAKE_PROJECT_NAME}) set(CPACK_VERBATIM_VARIABLES ON) set(CPACK_THREADS -4) -# Variables for Source Package Generators +# ---------------------------------------------------------------------------- +# Source Package Configuration +# ---------------------------------------------------------------------------- # set(CPACK_SOURCE_PACKAGE_FILE_NAME # set(CPACK_SOURCE_STRIP_FILES # set(CPACK_SOURCE_GENERATOR # set(CPACK_SOURCE_OUTPUT_CONFIG_FILE # set(CPACK_SOURCE_IGNORE_FILES -# Variables for Advanced Use +# ---------------------------------------------------------------------------- +# Advanced Configuration Options +# ---------------------------------------------------------------------------- # set(CPACK_CMAKE_GENERATOR # set(CPACK_INSTALL_CMAKE_PROJECTS # set(CPACK_SYSTEM_NAME diff --git a/cmake/install/CPack/CreateCPackDMG.cmake b/cmake/install/CPack/CreateCPackDMG.cmake index bb84198c33a4..1a2057970818 100644 --- a/cmake/install/CPack/CreateCPackDMG.cmake +++ b/cmake/install/CPack/CreateCPackDMG.cmake @@ -1,10 +1,21 @@ +# ============================================================================ +# CreateCPackDMG.cmake +# macOS DMG disk image package generator +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# DMG Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "DragNDrop") set(CPACK_BINARY_DRAGNDROP ON) set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/macos") +# ---------------------------------------------------------------------------- +# DMG Options +# ---------------------------------------------------------------------------- # set(CPACK_DMG_VOLUME_NAME ${CPACK_PACKAGE_FILE_NAME}) set(CPACK_DMG_FORMAT UDBZ) # set(CPACK_DMG_DS_STORE) @@ -16,6 +27,10 @@ set(CPACK_DMG_FORMAT UDBZ) # set(CPACK_DMG_SLA_LANGUAGES "") # set(CPACK_DMG__FILE_NAME "") set(CPACK_DMG_FILESYSTEM APFS) + +# ---------------------------------------------------------------------------- +# macOS Disk Utility Commands +# ---------------------------------------------------------------------------- # set(CPACK_COMMAND_HDIUTIL "/usr/bin/sudo /usr/bin/hdiutil") # set(CPACK_COMMAND_SETFILE "") # set(CPACK_COMMAND_REZ "") diff --git a/cmake/install/CPack/CreateCPackDeb.cmake b/cmake/install/CPack/CreateCPackDeb.cmake index be816520101a..58e8d5eb2a66 100644 --- a/cmake/install/CPack/CreateCPackDeb.cmake +++ b/cmake/install/CPack/CreateCPackDeb.cmake @@ -1,10 +1,21 @@ +# ============================================================================ +# CreateCPackDeb.cmake +# Debian/Ubuntu .deb package generator +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# DEB Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "DEB") set(CPACK_BINARY_DEB ON) set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/linux") +# ---------------------------------------------------------------------------- +# Package Metadata +# ---------------------------------------------------------------------------- set(CPACK_DEB_COMPONENT_INSTALL ON) set(CPACK_DEBIAN_PACKAGE_NAME ${CPACK_PACKAGE_NAME}) set(CPACK_DEBIAN_FILE_NAME DEB-DEFAULT) @@ -21,6 +32,10 @@ set(CPACK_DEBIAN_ARCHIVE_TYPE xz) # set(CPACK_DEBIAN_COMPRESSION_TYPE # set(CPACK_DEBIAN_PACKAGE_PRIORITY set(CPACK_DEBIAN_PACKAGE_HOMEPAGE ${PROJECT_HOMEPAGE_URL}) + +# ---------------------------------------------------------------------------- +# Advanced DEB Options +# ---------------------------------------------------------------------------- # set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS 1) # set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS_PRIVATE_DIRS # set(CPACK_DEBIAN_PACKAGE_DEBUG diff --git a/cmake/install/CPack/CreateCPackIFW.cmake b/cmake/install/CPack/CreateCPackIFW.cmake index c0ef1086b712..d913a62f0003 100644 --- a/cmake/install/CPack/CreateCPackIFW.cmake +++ b/cmake/install/CPack/CreateCPackIFW.cmake @@ -1,18 +1,31 @@ +# ============================================================================ +# CreateCPackIFW.cmake +# Qt Installer Framework (IFW) package generator for cross-platform installers +# ============================================================================ + include(CreateCPackCommon) -# Hints for Finding QtIFW +# ---------------------------------------------------------------------------- +# Qt Installer Framework Detection +# ---------------------------------------------------------------------------- +# Hints for finding QtIFW set(CPACK_IFW_ROOT "${Qt6_ROOT_DIR}/../../Tools/QtInstallerFramework/*") set(QTIFWDIR "${Qt6_ROOT_DIR}/../../Tools/QtInstallerFramework/*") include(CPackIFW) +# ---------------------------------------------------------------------------- +# IFW Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "IFW") set(CPACK_BINARY_IFW ON) -# Debug +# Debug output set(CPACK_IFW_VERBOSE ON) -# Package +# ---------------------------------------------------------------------------- +# Package Appearance +# ---------------------------------------------------------------------------- set(CPACK_IFW_PACKAGE_TITLE "${QGC_INSTALLER_NAME}") set(CPACK_IFW_PACKAGE_PUBLISHER "${QGC_ORG_NAME}") set(CPACK_IFW_PRODUCT_URL "${CMAKE_PROJECT_HOMEPAGE_URL}") @@ -28,6 +41,10 @@ set(CPACK_IFW_PACKAGE_WIZARD_STYLE "Modern") # set(CPACK_IFW_PACKAGE_WIZARD_SHOW_PAGE_LIST OFF) # set(CPACK_IFW_PACKAGE_TITLE_COLOR "#007A5C") # set(CPACK_IFW_PACKAGE_STYLE_SHEET "${INSTALLER_ROOT}/config/dev/style.qss") + +# ---------------------------------------------------------------------------- +# Platform-Specific Install Directories +# ---------------------------------------------------------------------------- if(${CMAKE_SYSTEM_NAME} MATCHES Linux) set(CPACK_IFW_TARGET_DIRECTORY "@HomeDir@/${CMAKE_PROJECT_NAME}") set(CPACK_IFW_ADMIN_TARGET_DIRECTORY "@HomeDir@/${CMAKE_PROJECT_NAME}") diff --git a/cmake/install/CPack/CreateCPackNSIS.cmake b/cmake/install/CPack/CreateCPackNSIS.cmake index 2e2844ccfaf5..2331832fe766 100644 --- a/cmake/install/CPack/CreateCPackNSIS.cmake +++ b/cmake/install/CPack/CreateCPackNSIS.cmake @@ -1,16 +1,31 @@ +# ============================================================================ +# CreateCPackNSIS.cmake +# Windows NSIS installer package generator +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# NSIS Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "NSIS") set(CPACK_BINARY_NSIS ON) set(QGC_INSTALLER_SOURCE "${CMAKE_BINARY_DIR}/deploy/windows") +# ---------------------------------------------------------------------------- +# Installer Appearance +# ---------------------------------------------------------------------------- set(CPACK_NSIS_INSTALL_ROOT "$PROGRAMFILES64") set(CPACK_NSIS_MUI_ICON "${QGC_INSTALLER_SOURCE}/WindowsQGC.ico") set(CPACK_NSIS_MUI_UNIICON "${QGC_INSTALLER_SOURCE}/WindowsQGC.ico") # set(CPACK_NSIS_INSTALLER_MUI_ICON_CODE "") # set(CPACK_NSIS_MUI_WELCOMEFINISHPAGE_BITMAP "") # set(CPACK_NSIS_MUI_UNWELCOMEFINISHPAGE_BITMAP "") + +# ---------------------------------------------------------------------------- +# Install/Uninstall Commands +# ---------------------------------------------------------------------------- # set(CPACK_NSIS_EXTRA_PREINSTALL_COMMANDS "") set(CPACK_NSIS_EXTRA_INSTALL_COMMANDS " CreateDirectory \"\$SMPROGRAMS\\${CMAKE_PROJECT_NAME}\" @@ -24,6 +39,9 @@ set(CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS " Delete \"\$SMPROGRAMS\\${CMAKE_PROJECT_NAME}\\${CMAKE_PROJECT_NAME} (GPU Safe Mode).lnk\" RMDir /r /REBOOTOK \"\$SMPROGRAMS\\${CMAKE_PROJECT_NAME}\" ") +# ---------------------------------------------------------------------------- +# Installer Options +# ---------------------------------------------------------------------------- set(CPACK_NSIS_COMPRESSOR "/SOLID /FINAL lzma") set(CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON) set(CPACK_NSIS_MODIFY_PATH ON) @@ -40,6 +58,10 @@ set(CPACK_NSIS_URL_INFO_ABOUT ${CPACK_PACKAGE_HOMEPAGE_URL}) # set(CPACK_NSIS_MUI_FINISHPAGE_RUN "") # set(CPACK_NSIS_MENU_LINKS "") set(CPACK_NSIS_UNINSTALL_NAME "${CMAKE_PROJECT_NAME}-Uninstall") + +# ---------------------------------------------------------------------------- +# Installer UI Customization +# ---------------------------------------------------------------------------- # set(CPACK_NSIS_WELCOME_TITLE "") # set(CPACK_NSIS_WELCOME_TITLE_3LINES "") # set(CPACK_NSIS_FINISH_TITLE "") diff --git a/cmake/install/CPack/CreateCPackProductBuild.cmake b/cmake/install/CPack/CreateCPackProductBuild.cmake index 2b25244c1db6..266c08865368 100644 --- a/cmake/install/CPack/CreateCPackProductBuild.cmake +++ b/cmake/install/CPack/CreateCPackProductBuild.cmake @@ -1,10 +1,21 @@ +# ============================================================================ +# CreateCPackProductBuild.cmake +# macOS .pkg installer package generator using productbuild +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# ProductBuild Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "PRODUCTBUILD") set(CPACK_BINARY_PRODUCTBUILD ON) set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/macos") +# ---------------------------------------------------------------------------- +# Package Building Tools and Signing +# ---------------------------------------------------------------------------- # set(CPACK_COMMAND_PRODUCTBUILD) # set(CPACK_PRODUCTBUILD_IDENTIFIER) # set(CPACK_PRODUCTBUILD_IDENTITY_NAME) @@ -20,6 +31,9 @@ set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/macos") # set(CPACK_PRODUCTBUILD_DOMAINS_USER) # set(CPACK_PRODUCTBUILD_DOMAINS_ROOT) +# ---------------------------------------------------------------------------- +# Installer Background Images (Light and Dark Mode) +# ---------------------------------------------------------------------------- # set(CPACK_PRODUCTBUILD_BACKGROUND) # set(CPACK_PRODUCTBUILD_BACKGROUND_ALIGNMENT) # set(CPACK_PRODUCTBUILD_BACKGROUND_SCALING) diff --git a/cmake/install/CPack/CreateCPackRPM.cmake b/cmake/install/CPack/CreateCPackRPM.cmake index fa865c05022a..9c91900ff9e4 100644 --- a/cmake/install/CPack/CreateCPackRPM.cmake +++ b/cmake/install/CPack/CreateCPackRPM.cmake @@ -1,10 +1,21 @@ +# ============================================================================ +# CreateCPackRPM.cmake +# Red Hat/Fedora/CentOS .rpm package generator +# ============================================================================ + include(CreateCPackCommon) +# ---------------------------------------------------------------------------- +# RPM Generator Configuration +# ---------------------------------------------------------------------------- list(APPEND CPACK_GENERATOR "RPM") set(CPACK_BINARY_RPM ON) set(QGC_INSTALLER_SOURCE "${CMAKE_SOURCE_DIR}/deploy/linux") +# ---------------------------------------------------------------------------- +# Package Metadata +# ---------------------------------------------------------------------------- set(CPACK_RPM_COMPONENT_INSTALL ON) # CPACK_RPM_PACKAGE_SUMMARY # CPACK_RPM_PACKAGE_NAME @@ -21,6 +32,10 @@ set(CPACK_RPM_PACKAGE_ARCHITECTURE "amd64") # CPACK_RPM_PACKAGE_URL set(CPACK_RPM_PACKAGE_DESCRIPTION ${CPACK_PACKAGE_DESCRIPTION}) set(CPACK_RPM_COMPRESSION_TYPE xz) + +# ---------------------------------------------------------------------------- +# RPM Dependencies and Requirements +# ---------------------------------------------------------------------------- # CPACK_RPM_PACKAGE_AUTOREQ # CPACK_RPM_PACKAGE_AUTOPROV # CPACK_RPM_PACKAGE_AUTOREQPROV diff --git a/cmake/install/CreateAppImage.cmake b/cmake/install/CreateAppImage.cmake index 54e205b8afa6..322c1851d04e 100644 --- a/cmake/install/CreateAppImage.cmake +++ b/cmake/install/CreateAppImage.cmake @@ -1,13 +1,21 @@ -# TODO: # go-appimage, updateinformation w/ GitHub Releases, signing +# ============================================================================ +# CreateAppImage.cmake +# Creates AppImage packages for Linux distribution +# ============================================================================ +# +# TODO: Implement go-appimage, update information with GitHub Releases, signing +# -message(STATUS "QGC: Creating AppImage") +message(STATUS "QGC: Creating AppImage...") set(APPDIR_PATH "${CMAKE_BINARY_DIR}/AppDir") set(APPIMAGE_PATH "${CMAKE_BINARY_DIR}/${CMAKE_PROJECT_NAME}-${CMAKE_SYSTEM_PROCESSOR}.AppImage") -#===========================================================================# -# Download Tools +# ============================================================================ +# Helper Functions +# ============================================================================ +# Download and cache build tools function(download_tool VAR URL) cmake_path(GET URL FILENAME _name) set(_dest "${CMAKE_BINARY_DIR}/tools/${_name}") @@ -24,14 +32,25 @@ function(download_tool VAR URL) set(${VAR}_PATH "${_dest}" PARENT_SCOPE) endfunction() -download_tool(LINUXDEPLOY https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-${CMAKE_SYSTEM_PROCESSOR}.AppImage) -download_tool(APPIMAGETOOL https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${CMAKE_SYSTEM_PROCESSOR}.AppImage) +# ============================================================================ +# Download Required Tools +# ============================================================================ + +message(STATUS "QGC: Downloading AppImage build tools...") + +download_tool(LINUXDEPLOY https://github.com/linuxdeploy/linuxdeploy/releases/download/continuous/linuxdeploy-${CMAKE_SYSTEM_PROCESSOR}.AppImage) +download_tool(APPIMAGETOOL https://github.com/AppImage/appimagetool/releases/download/continuous/appimagetool-${CMAKE_SYSTEM_PROCESSOR}.AppImage) + +# AppImageLint is only available for x86_64 if(CMAKE_SYSTEM_PROCESSOR MATCHES "x86_64") - download_tool(APPIMAGELINT https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-${CMAKE_SYSTEM_PROCESSOR}.AppImage) + download_tool(APPIMAGELINT https://github.com/TheAssassin/appimagelint/releases/download/continuous/appimagelint-${CMAKE_SYSTEM_PROCESSOR}.AppImage) endif() -#===========================================================================# -# Bundle the runtime +# ============================================================================ +# Bundle Runtime Dependencies +# ============================================================================ + +message(STATUS "QGC: Bundling runtime dependencies with linuxdeploy...") execute_process( COMMAND "${LINUXDEPLOY_PATH}" @@ -44,27 +63,39 @@ execute_process( COMMAND_ERROR_IS_FATAL ANY ) -#===========================================================================# -# Build the final AppImage +# ============================================================================ +# Build Final AppImage +# ============================================================================ + +message(STATUS "QGC: Building AppImage package...") set(ENV{ARCH} ${CMAKE_SYSTEM_PROCESSOR}) set(ENV{VERSION} ${CMAKE_PROJECT_VERSION}) + execute_process( COMMAND "${APPIMAGETOOL_PATH}" "${APPDIR_PATH}" "${APPIMAGE_PATH}" COMMAND_ECHO STDOUT COMMAND_ERROR_IS_FATAL ANY ) -#===========================================================================# -# Lint +message(STATUS "QGC: AppImage created successfully: ${APPIMAGE_PATH}") + +# ============================================================================ +# Validation & Linting +# ============================================================================ if(EXISTS "${APPIMAGELINT_PATH}") + message(STATUS "QGC: Running AppImage linter...") execute_process( COMMAND "${APPIMAGELINT_PATH}" "${APPIMAGE_PATH}" RESULT_VARIABLE LINT_RESULT COMMAND_ECHO STDOUT ) if(NOT LINT_RESULT EQUAL 0) - message(WARNING "QGC: appimagelint reported problems; see log above") + message(WARNING "QGC: AppImageLint reported issues - see output above") + else() + message(STATUS "QGC: AppImage passed validation") endif() +else() + message(STATUS "QGC: AppImageLint not available, skipping validation") endif() diff --git a/cmake/install/CreateMacDMG.cmake b/cmake/install/CreateMacDMG.cmake index 5ca7b4450b2b..13c1516be268 100644 --- a/cmake/install/CreateMacDMG.cmake +++ b/cmake/install/CreateMacDMG.cmake @@ -1,17 +1,37 @@ -# -- Variables ---------------------------------------- -# QGC_STAGING_BUNDLE_PATH => full path to MyApp.app -# CREATE_DMG_PROGRAM => full path to create-dmg program -# --------------------------------------------------------------------------- +# ============================================================================ +# CreateMacDMG.cmake +# Creates macOS DMG disk image for distribution +# ============================================================================ +# +# Required Variables (passed from Install.cmake): +# QGC_STAGING_BUNDLE_PATH => Full path to MyApp.app bundle +# CREATE_DMG_PROGRAM => Full path to create-dmg program +# + +message(STATUS "QGC: Creating macOS DMG disk image...") + +# ============================================================================ +# Prepare Package Directory +# ============================================================================ set(QGC_DMG_PATH "${CMAKE_BINARY_DIR}/package") + +# Clean and create package directory file(REMOVE_RECURSE "${QGC_DMG_PATH}") file(MAKE_DIRECTORY "${QGC_DMG_PATH}") + +# Copy the application bundle to package directory file(COPY "${QGC_STAGING_BUNDLE_PATH}" DESTINATION "${QGC_DMG_PATH}") -cmake_path(GET QGC_STAGING_BUNDLE_PATH STEM QGC_TARGET_APP_NAME) +# ============================================================================ +# Create DMG +# ============================================================================ +cmake_path(GET QGC_STAGING_BUNDLE_PATH STEM QGC_TARGET_APP_NAME) set(QGC_DMG_NAME "${QGC_TARGET_APP_NAME}.dmg") +message(STATUS "QGC: Building ${QGC_DMG_NAME}...") + execute_process( COMMAND "${CREATE_DMG_PROGRAM}" --volname "${QGC_TARGET_APP_NAME}" @@ -23,4 +43,4 @@ execute_process( COMMAND_ERROR_IS_FATAL ANY ) -message(STATUS "QGC: Created ${QGC_DMG_NAME}") +message(STATUS "QGC: DMG created successfully: ${CMAKE_BINARY_DIR}/${QGC_DMG_NAME}") diff --git a/cmake/install/CreateQGCInstaller.cmake b/cmake/install/CreateQGCInstaller.cmake index 830cf768ec86..b3d94659d82e 100644 --- a/cmake/install/CreateQGCInstaller.cmake +++ b/cmake/install/CreateQGCInstaller.cmake @@ -1,12 +1,23 @@ -message(STATUS "Creating QGC Installer") +# ============================================================================ +# CreateQGCInstaller.cmake +# Generates installer packages using Qt Installer Framework +# ============================================================================ + +message(STATUS "QGC: Creating installer package") include(CMakePrintHelpers) +# ---------------------------------------------------------------------------- +# Qt Installer Framework Detection +# ---------------------------------------------------------------------------- set(QT_INSTALLER_FRAMEWORK_DIR ${QT_ROOT_DIR}/../../Tools/QtInstallerFramework) find_program(QT_INSTALLER_FRAMEWORK binarycreator PATHS "${QT_INSTALLER_FRAMEWORK_ROOT}/*/bin" ) +# ---------------------------------------------------------------------------- +# Installer Source Directories +# ---------------------------------------------------------------------------- set(INSTALLER_SOURCE_DIR ${CMAKE_SOURCE_DIR}/deploy/installer) set(INSTALLER_SOURCE_CONFIG_DIR ${INSTALLER_SOURCE_DIR}/config) set(INSTALLER_SOURCE_PACKAGES_DIR ${INSTALLER_SOURCE_DIR}/packages) @@ -15,6 +26,9 @@ set(INSTALLER_SOURCE_PACKAGES_QGC_DIR ${INSTALLER_SOURCE_PACKAGES_DIR}/org.mavli set(INSTALLER_SOURCE_PACKAGES_QGC_DATA_DIR ${INSTALLER_SOURCE_PACKAGES_QGC_DIR}/data) set(INSTALLER_SOURCE_PACKAGES_QGC_META_DIR ${INSTALLER_SOURCE_PACKAGES_QGC_DIR}/meta) +# ---------------------------------------------------------------------------- +# Installer Output Directories +# ---------------------------------------------------------------------------- set(INSTALLER_OUTPUT_DIR ${CMAKE_BINARY_DIR}/installer) set(INSTALLER_OUTPUT_CONFIG_DIR ${INSTALLER_OUTPUT_DIR}/config) set(INSTALLER_OUTPUT_PACKAGES_DIR ${INSTALLER_OUTPUT_DIR}/packages) @@ -23,6 +37,10 @@ set(INSTALLER_OUTPUT_PACKAGES_QGC_DIR ${INSTALLER_OUTPUT_PACKAGES_DIR}/org.mavli set(INSTALLER_OUTPUT_PACKAGES_QGC_DATA_DIR ${INSTALLER_OUTPUT_PACKAGES_QGC_DIR}/data) set(INSTALLER_OUTPUT_PACKAGES_QGC_META_DIR ${INSTALLER_OUTPUT_PACKAGES_QGC_DIR}/meta) +# ---------------------------------------------------------------------------- +# Create Output Directory Structure +# ---------------------------------------------------------------------------- + file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_DIR}) file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_CONFIG_DIR}) file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_PACKAGES_DIR}) @@ -31,6 +49,9 @@ file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_PACKAGES_QGC_DIR}) file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_PACKAGES_QGC_DATA_DIR}) file(MAKE_DIRECTORY ${INSTALLER_OUTPUT_PACKAGES_QGC_META_DIR}) +# ---------------------------------------------------------------------------- +# Configure Installer Templates +# ---------------------------------------------------------------------------- configure_file( ${INSTALLER_SOURCE_CONFIG_DIR}/config.xml.in ${INSTALLER_OUTPUT_CONFIG_DIR}/config.xml @@ -43,20 +64,23 @@ configure_file( @ONLY ) -# file(COPY ${QGC_INSTALLER_ROOT} DESTINATION ${QGC_INSTALLER_OUTPUT_DIR}) - +# TODO: Copy additional resources when needed # file(COPY ${QGC_APP_ICON} DESTINATION ${QGC_INSTALLER_ROOT}/config/) # file(COPY ${CMAKE_SOURCE_DIR}/README.md DESTINATION ${QGC_INSTALLER_ROOT}/README.md) # file(COPY ${CMAKE_SOURCE_DIR}/.github/COPYING.md DESTINATION ${QGC_PACKAGE_ROOT}/meta/license.txt) - # file(GLOB_RECURSE FILES_TO_INSTALL RELATIVE ${CMAKE_INSTALL_PREFIX} ${CMAKE_INSTALL_PREFIX}/**) # file(COPY ${FILES_TO_INSTALL} DESTINATION ${QGC_PACKAGE_ROOT}/data/) -# cmake_print_variables(QGC_INSTALLER_ROOT FILES_TO_INSTALL) +# ---------------------------------------------------------------------------- +# Platform-Specific Installer Names +# ---------------------------------------------------------------------------- if(WIN32) set(QGC_INSTALLER_NAME ${CMAKE_PROJECT_NAME}-Installer-${CMAKE_SYSTEM_PROCESSOR}.exe) endif() +# ---------------------------------------------------------------------------- +# Generate Installer +# ---------------------------------------------------------------------------- execute_process( COMMAND ${QT_INSTALLER_FRAMEWORK} --offline-only -c ${INSTALLER_OUTPUT_CONFIG_DIR}/config.xml -p ${INSTALLER_OUTPUT_PACKAGES_DIR} ${CMAKE_BINARY_DIR}/${QGC_INSTALLER_NAME} ) diff --git a/cmake/install/CreateWinInstaller.cmake b/cmake/install/CreateWinInstaller.cmake index e5eb18b8c64b..38151821188e 100644 --- a/cmake/install/CreateWinInstaller.cmake +++ b/cmake/install/CreateWinInstaller.cmake @@ -1,5 +1,13 @@ +# ============================================================================ +# CreateWinInstaller.cmake +# Windows NSIS installer creation using makensis +# ============================================================================ + message(STATUS "QGC: Creating Windows NSIS Installer") +# ---------------------------------------------------------------------------- +# Validate Required Variables +# ---------------------------------------------------------------------------- foreach(p IN ITEMS QGC_WINDOWS_ICON_PATH QGC_WINDOWS_INSTALL_HEADER_PATH @@ -11,12 +19,18 @@ foreach(p IN ITEMS endif() endforeach() +# ---------------------------------------------------------------------------- +# Convert Paths to Native Windows Format +# ---------------------------------------------------------------------------- file(TO_NATIVE_PATH "${QGC_WINDOWS_ICON_PATH}" QGC_INSTALLER_ICON) file(TO_NATIVE_PATH "${QGC_WINDOWS_INSTALL_HEADER_PATH}" QGC_INSTALLER_HEADER_BITMAP) file(TO_NATIVE_PATH "${QGC_WINDOWS_INSTALLER_SCRIPT}" QGC_NSIS_INSTALLER_SCRIPT) file(TO_NATIVE_PATH "${QGC_WINDOWS_OUT}" QGC_INSTALLER_OUT) file(TO_NATIVE_PATH "${CMAKE_INSTALL_PREFIX}" QGC_PAYLOAD_DIR) +# ---------------------------------------------------------------------------- +# Locate NSIS makensis Utility +# ---------------------------------------------------------------------------- set(_pf86 "ProgramFiles(x86)") set(_PF86 "PROGRAMFILES(x86)") find_program(QGC_NSIS_INSTALLER_CMD makensis @@ -26,6 +40,10 @@ find_program(QGC_NSIS_INSTALLER_CMD makensis REQUIRED ) +# ---------------------------------------------------------------------------- +# Build NSIS Command Arguments +# ---------------------------------------------------------------------------- + set(_nsis_args /NOCD /INPUTCHARSET UTF8 @@ -51,6 +69,9 @@ endif() list(APPEND _nsis_args "/XOutFile ${QGC_INSTALLER_OUT}") +# ---------------------------------------------------------------------------- +# Execute NSIS Installer Creation +# ---------------------------------------------------------------------------- execute_process( COMMAND "${QGC_NSIS_INSTALLER_CMD}" ${_nsis_args} "${QGC_NSIS_INSTALLER_SCRIPT}" WORKING_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}" diff --git a/cmake/install/Install.cmake b/cmake/install/Install.cmake index 75b8872aaef0..3ca169a3787c 100644 --- a/cmake/install/Install.cmake +++ b/cmake/install/Install.cmake @@ -1,7 +1,16 @@ +# ============================================================================ +# QGroundControl Installation Configuration +# Handles platform-specific installation and packaging +# ============================================================================ + include(InstallRequiredSystemLibraries) +# Note: Installer generation could be conditioned on Release builds # if(QGC_BUILD_INSTALLER AND CMAKE_INSTALL_CONFIG_NAME MATCHES "^[Rr]elease$") +# ---------------------------------------------------------------------------- +# Main Target Installation +# ---------------------------------------------------------------------------- install( TARGETS ${CMAKE_PROJECT_NAME} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} @@ -10,7 +19,11 @@ install( BUNDLE DESTINATION . ) +# ---------------------------------------------------------------------------- +# Qt Deployment Script Generation +# ---------------------------------------------------------------------------- set(deploy_tool_options_arg "") + if(MACOS OR WIN32) list(APPEND deploy_tool_options_arg "-qmldir=${CMAKE_SOURCE_DIR}") if(MACOS) @@ -26,12 +39,25 @@ qt_generate_deploy_qml_app_script( DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg} ) + install(SCRIPT ${deploy_script}) -message(STATUS "QGC: Deploy Script: ${deploy_script}") +message(STATUS "QGC: Qt deployment script: ${deploy_script}") +# ============================================================================ +# Platform-Specific Installation +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Android Installation +# ---------------------------------------------------------------------------- if(ANDROID) + # Android deployment handled by Qt # get_target_property(QGC_ANDROID_DEPLOY_FILE ${CMAKE_PROJECT_NAME} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE) # cmake_print_variables(QGC_ANDROID_DEPLOY_FILE) + +# ---------------------------------------------------------------------------- +# Linux Installation & AppImage Creation +# ---------------------------------------------------------------------------- elseif(LINUX) configure_file( "${QGC_APPIMAGE_DESKTOP_ENTRY_PATH}" @@ -58,13 +84,14 @@ elseif(LINUX) @ONLY ) install( - PROGRAMS "${CMAKE_BINARY_DIR}/${QGC_PACKAGE_NAME}.appdata.xml" + FILES "${CMAKE_BINARY_DIR}/${QGC_PACKAGE_NAME}.appdata.xml" DESTINATION "${CMAKE_INSTALL_DATADIR}/metainfo/" ) install( FILES "${QGC_APPIMAGE_APPRUN_PATH}" DESTINATION "${CMAKE_BINARY_DIR}/" ) + # Pass variables to AppImage creation script install(CODE " set(CMAKE_PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(CMAKE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION}) @@ -72,7 +99,12 @@ elseif(LINUX) set(CMAKE_SYSTEM_PROCESSOR ${CMAKE_SYSTEM_PROCESSOR}) ") install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install/CreateAppImage.cmake") + +# ---------------------------------------------------------------------------- +# Windows Installation & Installer Creation +# ---------------------------------------------------------------------------- elseif(WIN32) + # Pass variables to Windows installer creation script install(CODE " set(CMAKE_PROJECT_NAME ${CMAKE_PROJECT_NAME}) set(CMAKE_PROJECT_VERSION ${CMAKE_PROJECT_VERSION}) @@ -87,15 +119,22 @@ elseif(WIN32) set(QGC_WINDOWS_INSTALLER_SCRIPT \"${CMAKE_SOURCE_DIR}/deploy/windows/nullsoft_installer.nsi\") ") install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install/CreateWinInstaller.cmake") + +# ---------------------------------------------------------------------------- +# macOS Installation, Code Signing & DMG Creation +# ---------------------------------------------------------------------------- elseif(MACOS) + # Set bundle path for subsequent operations install(CODE "set(QGC_STAGING_BUNDLE_PATH \"${CMAKE_BINARY_DIR}/staging/${CMAKE_PROJECT_NAME}.app\")") + + # Code signing if(QGC_MACOS_SIGN_WITH_IDENTITY) - message(STATUS "QGC: Signing Bundle using signing identity") + message(STATUS "QGC: macOS bundle will be signed with developer identity") install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install/SignMacBundle.cmake") else() - message(STATUS "QGC: Signing Bundle using Ad-Hoc signing") + message(STATUS "QGC: macOS bundle will be signed with ad-hoc signature") install(CODE " - message(STATUS \"QGC: Signing Bundle using Ad-Hoc signing\") + message(STATUS \"QGC: Signing macOS bundle (ad-hoc)\") execute_process( COMMAND codesign --force --deep -s - \"\${QGC_STAGING_BUNDLE_PATH}\" COMMAND_ERROR_IS_FATAL ANY @@ -103,8 +142,10 @@ elseif(MACOS) ") endif() + # Find or fetch create-dmg tool find_program(CREATE_DMG_PROGRAM create-dmg) if(NOT CREATE_DMG_PROGRAM) + message(STATUS "QGC: Fetching create-dmg tool via CPM") CPMAddPackage( NAME create-dmg GITHUB_REPOSITORY create-dmg/create-dmg @@ -113,6 +154,7 @@ elseif(MACOS) ) set(CREATE_DMG_PROGRAM "${create-dmg_SOURCE_DIR}/create-dmg") endif() + install(CODE "set(CREATE_DMG_PROGRAM \"${CREATE_DMG_PROGRAM}\")") install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/install/CreateMacDMG.cmake") endif() diff --git a/cmake/install/SignMacBundle.cmake b/cmake/install/SignMacBundle.cmake index d9720d6ab1d7..922a5f9d8149 100644 --- a/cmake/install/SignMacBundle.cmake +++ b/cmake/install/SignMacBundle.cmake @@ -1,4 +1,13 @@ +# ============================================================================ +# SignMacBundle.cmake +# Code signing and notarization for macOS application bundles +# ============================================================================ + message(STATUS "QGC: Signing Bundle using signing identity") + +# ---------------------------------------------------------------------------- +# Environment Variable Validation +# ---------------------------------------------------------------------------- if(NOT DEFINED ENV{QGC_MACOS_SIGNING_IDENTITY} OR "$ENV{QGC_MACOS_SIGNING_IDENTITY}" STREQUAL "") message(FATAL_ERROR "QGC: QGC_MACOS_SIGNING_IDENTITY environment variable must be set to sign MacOS bundle") endif() @@ -11,51 +20,79 @@ endif() if(NOT DEFINED ENV{QGC_MACOS_NOTARIZATION_PASSWORD} OR "$ENV{QGC_MACOS_NOTARIZATION_PASSWORD}" STREQUAL "") message(FATAL_ERROR "QGC: QGC_MACOS_NOTARIZATION_PASSWORD environment variable must be set to notarize MacOS bundle") endif() -file(REMOVE ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Commands) -file(REMOVE ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/Commands) + +# ---------------------------------------------------------------------------- +# Clean Up GStreamer Symlinks +# ---------------------------------------------------------------------------- +file(REMOVE "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Commands") +file(REMOVE "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/Commands") + +# ---------------------------------------------------------------------------- +# Sign All Libraries and Executables +# ---------------------------------------------------------------------------- +# Sign all dynamic libraries execute_process( - COMMAND find ${QGC_STAGING_BUNDLE_PATH}/Contents -type f -name "*.dylib" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; + COMMAND find "${QGC_STAGING_BUNDLE_PATH}/Contents" -type f -name "*.dylib" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; COMMAND_ERROR_IS_FATAL ANY ) + +# Sign all shared objects execute_process( - COMMAND find ${QGC_STAGING_BUNDLE_PATH}/Contents -type f -name "*.so" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; + COMMAND find "${QGC_STAGING_BUNDLE_PATH}/Contents" -type f -name "*.so" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; COMMAND_ERROR_IS_FATAL ANY ) + +# ---------------------------------------------------------------------------- +# Sign GStreamer Framework Components +# ---------------------------------------------------------------------------- execute_process( - COMMAND find ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/libexec/gstreamer-1.0 -type f -name "*" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; + COMMAND find "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/libexec/gstreamer-1.0" -type f -name "*" -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; COMMAND_ERROR_IS_FATAL ANY ) execute_process( - COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer + COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/lib/GStreamer" COMMAND_ERROR_IS_FATAL ANY ) execute_process( - COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/GStreamer + COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/GStreamer.framework/Versions/1.0/GStreamer" COMMAND_ERROR_IS_FATAL ANY ) -file(GLOB FRAMEWORK_DIRS ${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/*.framework) + +# ---------------------------------------------------------------------------- +# Sign All Frameworks +# ---------------------------------------------------------------------------- +file(GLOB FRAMEWORK_DIRS "${QGC_STAGING_BUNDLE_PATH}/Contents/Frameworks/*.framework") foreach(FRAMEWORK_DIR ${FRAMEWORK_DIRS}) - if (EXISTS "${FRAMEWORK_DIR}/Versions/1.0") + if(EXISTS "${FRAMEWORK_DIR}/Versions/1.0") execute_process( - COMMAND find ${FRAMEWORK_DIR}/Versions/1.0 -type f -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; + COMMAND find "${FRAMEWORK_DIR}/Versions/1.0" -type f -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; COMMAND_ERROR_IS_FATAL ANY ) endif() - if (EXISTS "${FRAMEWORK_DIR}/Versions/A") + if(EXISTS "${FRAMEWORK_DIR}/Versions/A") execute_process( - COMMAND find ${FRAMEWORK_DIR}/Versions/A -type f -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; + COMMAND find "${FRAMEWORK_DIR}/Versions/A" -type f -exec codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "{}" \\; COMMAND_ERROR_IS_FATAL ANY ) endif() endforeach() + +# ---------------------------------------------------------------------------- +# Sign Main Application Bundle +# ---------------------------------------------------------------------------- execute_process( - COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" ${QGC_STAGING_BUNDLE_PATH} + COMMAND codesign --timestamp --options=runtime --force -s "$ENV{QGC_MACOS_SIGNING_IDENTITY}" "${QGC_STAGING_BUNDLE_PATH}" COMMAND_ERROR_IS_FATAL ANY ) + +# ============================================================================ +# Notarization Process +# ============================================================================ + message(STATUS "QGC: Archiving Bundle for Notarization upload") -file(REMOVE qgc_notarization_upload.zip) +file(REMOVE "qgc_notarization_upload.zip") execute_process( - COMMAND ditto -c -k --keepParent ${QGC_STAGING_BUNDLE_PATH} qgc_notarization_upload.zip + COMMAND ditto -c -k --keepParent "${QGC_STAGING_BUNDLE_PATH}" qgc_notarization_upload.zip COMMAND_ERROR_IS_FATAL ANY ) message(STATUS "QGC: Notarizing app bundle. This may take a while...") @@ -65,6 +102,6 @@ execute_process( ) message(STATUS "QGC: Stapling notarization ticket to app bundle") execute_process( - COMMAND xcrun stapler staple ${QGC_STAGING_BUNDLE_PATH} + COMMAND xcrun stapler staple "${QGC_STAGING_BUNDLE_PATH}" COMMAND_ERROR_IS_FATAL ANY ) diff --git a/cmake/modules/CMakeGraphVizOptions.cmake b/cmake/modules/CMakeGraphVizOptions.cmake index 2de998667403..48283f10e860 100644 --- a/cmake/modules/CMakeGraphVizOptions.cmake +++ b/cmake/modules/CMakeGraphVizOptions.cmake @@ -1,21 +1,31 @@ -# Basic appearance ------------------------------------------------ -set(GRAPHVIZ_GRAPH_NAME "QGC-deps") # title -set(GRAPHVIZ_GRAPH_HEADER "rankdir=LR;") # dot header snippet -set(GRAPHVIZ_NODE_PREFIX "node") # node IDs +# ============================================================================ +# CMakeGraphVizOptions.cmake +# Configuration for CMake's --graphviz dependency graph generation +# Usage: cmake --graphviz=deps.dot . && dot -Tpng deps.dot -o deps.png +# ============================================================================ -# What to show ---------------------------------------------------- -set(GRAPHVIZ_EXECUTABLES TRUE) # default TRUE -set(GRAPHVIZ_SHARED_LIBS TRUE) -set(GRAPHVIZ_MODULE_LIBS FALSE) -set(GRAPHVIZ_INTERFACE_LIBS FALSE) -set(GRAPHVIZ_OBJECT_LIBS FALSE) -set(GRAPHVIZ_UNKNOWN_LIBS FALSE) -set(GRAPHVIZ_EXTERNAL_LIBS FALSE) # hide Qt/system libs -set(GRAPHVIZ_CUSTOM_TARGETS TRUE) # include custom targets -set(GRAPHVIZ_IGNORE_TARGETS "test_.*;doc_.*") # regex list +# ---------------------------------------------------------------------------- +# Graph Appearance +# ---------------------------------------------------------------------------- +set(GRAPHVIZ_GRAPH_NAME "QGC-deps") # Graph title +set(GRAPHVIZ_GRAPH_HEADER "rankdir=LR;") # DOT header snippet (left-to-right) +set(GRAPHVIZ_NODE_PREFIX "node") # Node ID prefix -# File churn ------------------------------------------------------ -set(GRAPHVIZ_GENERATE_PER_TARGET FALSE) # only the master graph -set(GRAPHVIZ_GENERATE_DEPENDERS FALSE) +# ---------------------------------------------------------------------------- +# What to Include in Graph +# ---------------------------------------------------------------------------- +set(GRAPHVIZ_EXECUTABLES TRUE) # Show executables (default TRUE) +set(GRAPHVIZ_SHARED_LIBS TRUE) # Show shared libraries +set(GRAPHVIZ_MODULE_LIBS FALSE) # Hide module libraries +set(GRAPHVIZ_INTERFACE_LIBS FALSE) # Hide interface libraries +set(GRAPHVIZ_OBJECT_LIBS FALSE) # Hide object libraries +set(GRAPHVIZ_UNKNOWN_LIBS FALSE) # Hide unknown libraries +set(GRAPHVIZ_EXTERNAL_LIBS FALSE) # Hide external libraries (Qt/system libs) +set(GRAPHVIZ_CUSTOM_TARGETS TRUE) # Show custom targets +set(GRAPHVIZ_IGNORE_TARGETS "test_.*;doc_.*") # Regex list of targets to ignore -# --graphviz=foo.dot +# ---------------------------------------------------------------------------- +# Output File Generation +# ---------------------------------------------------------------------------- +set(GRAPHVIZ_GENERATE_PER_TARGET FALSE) # Only generate master graph +set(GRAPHVIZ_GENERATE_DEPENDERS FALSE) # Don't generate depender graphs diff --git a/cmake/modules/Git.cmake b/cmake/modules/Git.cmake index 2861545231bf..03f6e793f065 100644 --- a/cmake/modules/Git.cmake +++ b/cmake/modules/Git.cmake @@ -1,9 +1,20 @@ -find_package(Git) +# ---------------------------------------------------------------------------- +# QGroundControl Git Configuration +# Extracts version information and metadata from Git repository +# ---------------------------------------------------------------------------- +find_package(Git REQUIRED) + +# Verify we're in a Git repository +if(NOT EXISTS "${CMAKE_SOURCE_DIR}/.git") + message(WARNING "QGC: Not a Git repository. Version information may be incomplete.") +endif() + +# Optionally update submodules during configuration if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") option(GIT_SUBMODULE "Check submodules during build" OFF) if(GIT_SUBMODULE) - message(STATUS "Submodule update") + message(STATUS "Updating Git submodules...") execute_process( COMMAND ${GIT_EXECUTABLE} submodule update --init --recursive WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" @@ -13,68 +24,118 @@ if(GIT_FOUND AND EXISTS "${CMAKE_SOURCE_DIR}/.git") OUTPUT_STRIP_TRAILING_WHITESPACE ) if(NOT GIT_SUBMODULE_RESULT EQUAL 0) + include(CMakePrintHelpers) cmake_print_variables(GIT_SUBMODULE_RESULT GIT_SUBMODULE_OUTPUT GIT_SUBMODULE_ERROR) - message(FATAL_ERROR "git submodule update --init failed with ${GIT_SUBMODULE_RESULT}, please checkout submodules") + message(FATAL_ERROR "Git submodule update failed with code ${GIT_SUBMODULE_RESULT}") endif() + message(STATUS "Git submodules updated successfully") endif() endif() include(CMakePrintHelpers) +# ---------------------------------------------------------------------------- +# Extract Git Branch +# ---------------------------------------------------------------------------- + execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --abbrev-ref @ - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE QGC_GIT_BRANCH OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) +if(NOT QGC_GIT_BRANCH) + set(QGC_GIT_BRANCH "unknown") +endif() # cmake_print_variables(QGC_GIT_BRANCH) +# ---------------------------------------------------------------------------- +# Extract Git Commit Hash +# ---------------------------------------------------------------------------- execute_process( COMMAND ${GIT_EXECUTABLE} rev-parse --short @ - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE QGC_GIT_HASH OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) +if(NOT QGC_GIT_HASH) + set(QGC_GIT_HASH "0000000") +endif() # cmake_print_variables(QGC_GIT_HASH) +# ---------------------------------------------------------------------------- +# Extract Version String from Git Tags +# ---------------------------------------------------------------------------- execute_process( COMMAND ${GIT_EXECUTABLE} describe --always --tags - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE QGC_APP_VERSION_STR OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) +if(NOT QGC_APP_VERSION_STR) + set(QGC_APP_VERSION_STR "v0.0.0") +endif() # cmake_print_variables(QGC_APP_VERSION_STR) +# ---------------------------------------------------------------------------- +# Extract Clean Version Tag +# ---------------------------------------------------------------------------- execute_process( COMMAND ${GIT_EXECUTABLE} describe --always --abbrev=0 - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE QGC_APP_VERSION OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) +if(NOT QGC_APP_VERSION) + set(QGC_APP_VERSION "v0.0.0") +endif() # cmake_print_variables(QGC_APP_VERSION) +# ---------------------------------------------------------------------------- +# Extract Commit Date for Version Timestamp +# ---------------------------------------------------------------------------- + if(QGC_STABLE_BUILD) - set(QGC_APP_DATE_VERSION ${QGC_APP_VERSION}) + set(QGC_APP_DATE_VERSION "${QGC_APP_VERSION}") else() - # Daily builds uses date of last commit + # Daily builds use date of last commit set(QGC_APP_DATE_VERSION "") endif() + execute_process( COMMAND ${GIT_EXECUTABLE} log -1 --format=%aI ${QGC_APP_DATE_VERSION} - WORKING_DIRECTORY ${CMAKE_SOURCE_DIR} + WORKING_DIRECTORY "${CMAKE_SOURCE_DIR}" OUTPUT_VARIABLE QGC_APP_DATE OUTPUT_STRIP_TRAILING_WHITESPACE + ERROR_QUIET ) -#cmake_print_variables(QGC_APP_DATE) +if(NOT QGC_APP_DATE) + string(TIMESTAMP QGC_APP_DATE "%Y-%m-%dT%H:%M:%S%z" UTC) +endif() +# cmake_print_variables(QGC_APP_DATE) + +# ---------------------------------------------------------------------------- +# Parse Version Components (Major.Minor.Patch) +# ---------------------------------------------------------------------------- +# Strip 'v' prefix if present (e.g., v1.2.3 -> 1.2.3) +string(REGEX REPLACE "^v" "" QGC_APP_VERSION_CLEAN "${QGC_APP_VERSION}") -string(FIND ${QGC_APP_VERSION} "v" QGC_APP_VERSION_VALID) -if(QGC_APP_VERSION_VALID GREATER -1) - string(REPLACE "v" "" QGC_APP_VERSION ${QGC_APP_VERSION}) +# Extract version components using regex +if(QGC_APP_VERSION_CLEAN MATCHES "^([0-9]+)\\.([0-9]+)\\.([0-9]+)") + set(QGC_APP_VERSION "${QGC_APP_VERSION_CLEAN}") + set(QGC_APP_VERSION_MAJOR "${CMAKE_MATCH_1}") + set(QGC_APP_VERSION_MINOR "${CMAKE_MATCH_2}") + set(QGC_APP_VERSION_PATCH "${CMAKE_MATCH_3}") else() + # Fallback if version doesn't match expected format + message(WARNING "QGC: Could not parse semantic version from Git tag: '${QGC_APP_VERSION_CLEAN}'. Using fallback 0.0.0") set(QGC_APP_VERSION "0.0.0") + set(QGC_APP_VERSION_MAJOR "0") + set(QGC_APP_VERSION_MINOR "0") + set(QGC_APP_VERSION_PATCH "0") endif() -string(REGEX MATCH "([0-9]+)\\.([0-9]+)\\.([0-9]+)" QGC_APP_VERSION_MATCH ${QGC_APP_VERSION}) -set(QGC_APP_VERSION_MAJOR ${CMAKE_MATCH_1}) -set(QGC_APP_VERSION_MINOR ${CMAKE_MATCH_2}) -set(QGC_APP_VERSION_PATCH ${CMAKE_MATCH_3}) # cmake_print_variables(QGC_APP_VERSION QGC_APP_VERSION_MAJOR QGC_APP_VERSION_MINOR QGC_APP_VERSION_PATCH) diff --git a/cmake/modules/IWYU.cmake b/cmake/modules/IWYU.cmake index 0f7fdff6dfdb..c1974a737161 100644 --- a/cmake/modules/IWYU.cmake +++ b/cmake/modules/IWYU.cmake @@ -1,6 +1,14 @@ +# ============================================================================ +# IWYU.cmake +# Include-What-You-Use (IWYU) integration for header usage analysis +# Helps identify unnecessary includes and suggest proper forward declarations +# ============================================================================ + +# IWYU only works with Clang if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang") find_program(INCLUDE_WHAT_YOU_USE_PROGRAM include-what-you-use) if(INCLUDE_WHAT_YOU_USE_PROGRAM) + message(STATUS "QGC: Found include-what-you-use: ${INCLUDE_WHAT_YOU_USE_PROGRAM}") set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE_PROGRAM}) set(CMAKE_C_INCLUDE_WHAT_YOU_USE ${INCLUDE_WHAT_YOU_USE_PROGRAM}) endif() diff --git a/cmake/modules/vulkan.cmake b/cmake/modules/vulkan.cmake deleted file mode 100644 index 2624f3a3c738..000000000000 --- a/cmake/modules/vulkan.cmake +++ /dev/null @@ -1,105 +0,0 @@ -add_library(mbgl-vendor-vulkan-headers INTERFACE) - -target_include_directories( - mbgl-vendor-vulkan-headers SYSTEM - INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/Vulkan-Headers/include/ -) - -set_target_properties( - mbgl-vendor-vulkan-headers - PROPERTIES - INTERFACE_MAPLIBRE_NAME "Vulkan-Headers" - INTERFACE_MAPLIBRE_URL "https://github.com/KhronosGroup/Vulkan-Headers.git" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/Vulkan-Headers/LICENSE.md -) - -add_library(mbgl-vendor-VulkanMemoryAllocator INTERFACE) - -target_include_directories( - mbgl-vendor-VulkanMemoryAllocator SYSTEM - INTERFACE - ${CMAKE_CURRENT_LIST_DIR}/VulkanMemoryAllocator/include/ -) - -set_target_properties( - mbgl-vendor-VulkanMemoryAllocator - PROPERTIES - INTERFACE_MAPLIBRE_NAME "VulkanMemoryAllocator" - INTERFACE_MAPLIBRE_URL "https://github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/VulkanMemoryAllocator/LICENSE.txt -) - -set(ENABLE_OPT OFF) -set(ENABLE_HLSL OFF) -set(ENABLE_GLSLANG_BINARIES OFF) -set(GLSLANG_TESTS_DEFAULT OFF) -set(ENABLE_PCH OFF) - -if (CMAKE_VERSION VERSION_GREATER_EQUAL "3.25") - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/glslang SYSTEM) -else() - add_subdirectory(${CMAKE_CURRENT_LIST_DIR}/glslang) -endif() - -get_target_property(glslang_inc glslang INTERFACE_INCLUDE_DIRECTORIES) -set_target_properties(glslang PROPERTIES INTERFACE_SYSTEM_INCLUDE_DIRECTORIES ${glslang_inc}) - -set_target_properties( - glslang - PROPERTIES - INTERFACE_MAPLIBRE_NAME "glslang" - INTERFACE_MAPLIBRE_URL "https://github.com/KhronosGroup/glslang.git" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/glslang/LICENSE.txt -) - -set_target_properties( - SPIRV - PROPERTIES - INTERFACE_MAPLIBRE_NAME "SPIRV" - INTERFACE_MAPLIBRE_URL "https://github.com/KhronosGroup/glslang.git" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/glslang/LICENSE.txt -) - -set_target_properties( - glslang-default-resource-limits - PROPERTIES - INTERFACE_MAPLIBRE_NAME "glslang-default-resource-limits" - INTERFACE_MAPLIBRE_URL "https://github.com/KhronosGroup/glslang.git" - INTERFACE_MAPLIBRE_LICENSE ${CMAKE_CURRENT_LIST_DIR}/glslang/LICENSE.txt -) - -export(TARGETS - mbgl-vendor-vulkan-headers - mbgl-vendor-VulkanMemoryAllocator - glslang - SPIRV - glslang-default-resource-limits - MachineIndependent - OSDependent - GenericCodeGen - - APPEND FILE MapboxCoreTargets.cmake -) - -# TODO: Build Vulkan Headers -# CPMAddPackage( -# NAME Vulkan-Headers -# GITHUB_REPOSITORY KhronosGroup/Vulkan-Headers -# GIT_TAG v1.3.269 -# ) - -# # Vulkan-Headers defines a header target but not one for the module. -# if(Vulkan-Headers_ADDED) -# add_library(Vulkan-Module) -# target_sources(Vulkan-Module -# PUBLIC FILE_SET CXX_MODULES -# BASE_DIRS "${Vulkan-Headers_SOURCE_DIR}/include" -# FILES "${Vulkan-Headers_SOURCE_DIR}/include/vulkan/vulkan.cppm" -# ) -# target_compile_definitions(Vulkan-Module PUBLIC -# # Your options here, project-dependent: -# # https://github.com/KhronosGroup/Vulkan-Hpp#configuration-options -# ) -# target_link_libraries(Vulkan-Module PUBLIC Vulkan-Headers) -# endif() diff --git a/cmake/platform/Android.cmake b/cmake/platform/Android.cmake index f531d839caba..497c3c828639 100644 --- a/cmake/platform/Android.cmake +++ b/cmake/platform/Android.cmake @@ -1,43 +1,62 @@ +# ---------------------------------------------------------------------------- +# QGroundControl Android Platform Configuration +# ---------------------------------------------------------------------------- + if(NOT ANDROID) - message(FATAL_ERROR "Invalid Platform") - return() + message(FATAL_ERROR "QGC: Invalid Platform: Android.cmake included but platform is not Android") endif() -if(${Qt6_VERSION} VERSION_EQUAL 6.8.3) - if(NOT ${CMAKE_ANDROID_NDK_VERSION} VERSION_EQUAL 26.1 AND NOT ${CMAKE_ANDROID_NDK_VERSION} VERSION_EQUAL 27.2) - message(FATAL_ERROR "Invalid NDK Version: ${CMAKE_ANDROID_NDK_VERSION}, Use Version 26B of 27C instead.") +# ---------------------------------------------------------------------------- +# Android NDK Version Validation +# ---------------------------------------------------------------------------- +if(Qt6_VERSION VERSION_EQUAL "6.8.3") + if(NOT CMAKE_ANDROID_NDK_VERSION VERSION_EQUAL "26.1" AND NOT CMAKE_ANDROID_NDK_VERSION VERSION_EQUAL "27.2") + message(FATAL_ERROR "QGC: Invalid NDK Version: ${CMAKE_ANDROID_NDK_VERSION}. Qt 6.8.3 requires NDK 26.1 or 27.2") endif() endif() -# Generation of android version numbers must be consistent release to release such that they are always increasing -if(${CMAKE_PROJECT_VERSION_MAJOR} GREATER 9) - message(FATAL_ERROR "Major version larger than 1 digit: ${CMAKE_PROJECT_VERSION_MAJOR}") +# ---------------------------------------------------------------------------- +# Android Version Number Validation +# ---------------------------------------------------------------------------- + +# Generation of Android version numbers must be consistent release to release +# to ensure they are always increasing for Google Play Store +if(CMAKE_PROJECT_VERSION_MAJOR GREATER 9) + message(FATAL_ERROR "QGC: Major version must be single digit (0-9), got: ${CMAKE_PROJECT_VERSION_MAJOR}") endif() -if(${CMAKE_PROJECT_VERSION_MINOR} GREATER 9) - message(FATAL_ERROR "Minor version larger than 1 digit: ${CMAKE_PROJECT_VERSION_MINOR}") +if(CMAKE_PROJECT_VERSION_MINOR GREATER 9) + message(FATAL_ERROR "QGC: Minor version must be single digit (0-9), got: ${CMAKE_PROJECT_VERSION_MINOR}") endif() -if(${CMAKE_PROJECT_VERSION_PATCH} GREATER 99) - message(FATAL_ERROR "Patch version larger than 2 digits: ${CMAKE_PROJECT_VERSION_PATCH}") +if(CMAKE_PROJECT_VERSION_PATCH GREATER 99) + message(FATAL_ERROR "QGC: Patch version must be two digits (0-99), got: ${CMAKE_PROJECT_VERSION_PATCH}") endif() -# Bitness for android version number is 66/34 instead of 64/32 in because of a required version number bump screw-up ages ago +# ---------------------------------------------------------------------------- +# Android ABI to Bitness Code Mapping +# ---------------------------------------------------------------------------- +# NOTE: Bitness codes are 66/34 instead of 64/32 due to a historical +# version number bump requirement from an earlier Android release set(ANDROID_BITNESS_CODE) -if(${CMAKE_ANDROID_ARCH_ABI} STREQUAL "armeabi-v7a" OR ${CMAKE_ANDROID_ARCH_ABI} STREQUAL "x86") +if(CMAKE_ANDROID_ARCH_ABI STREQUAL "armeabi-v7a" OR CMAKE_ANDROID_ARCH_ABI STREQUAL "x86") set(ANDROID_BITNESS_CODE 34) -elseif(${CMAKE_ANDROID_ARCH_ABI} STREQUAL "arm64-v8a" OR ${CMAKE_ANDROID_ARCH_ABI} STREQUAL "x86_64") +elseif(CMAKE_ANDROID_ARCH_ABI STREQUAL "arm64-v8a" OR CMAKE_ANDROID_ARCH_ABI STREQUAL "x86_64") set(ANDROID_BITNESS_CODE 66) else() - message(FATAL_ERROR "Unsupported Android ABI: ${CMAKE_ANDROID_ARCH_ABI}") + message(FATAL_ERROR "QGC: Unsupported Android ABI: ${CMAKE_ANDROID_ARCH_ABI}. Supported: armeabi-v7a, arm64-v8a, x86, x86_64") endif() +# ---------------------------------------------------------------------------- +# Android Version Code Generation +# ---------------------------------------------------------------------------- +# Zero-pad patch version if less than 10 set(ANDROID_PATCH_VERSION ${CMAKE_PROJECT_VERSION_PATCH}) -if(${CMAKE_PROJECT_VERSION_PATCH} LESS 10) +if(CMAKE_PROJECT_VERSION_PATCH LESS 10) set(ANDROID_PATCH_VERSION "0${CMAKE_PROJECT_VERSION_PATCH}") endif() # Version code format: BBMIPPDDD (B=Bitness, M=Major, I=Minor, P=Patch, D=Dev) - Dev not currently supported and always 000 set(ANDROID_VERSION_CODE "${ANDROID_BITNESS_CODE}${CMAKE_PROJECT_VERSION_MAJOR}${CMAKE_PROJECT_VERSION_MINOR}${ANDROID_PATCH_VERSION}000") -message(STATUS "Android version code: ${ANDROID_VERSION_CODE}") +message(STATUS "QGC: Android version code: ${ANDROID_VERSION_CODE}") set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES @@ -63,9 +82,20 @@ set_target_properties(${CMAKE_PROJECT_NAME} list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QGC_STABLE_BUILD QT_HOST_PATH) +# ---------------------------------------------------------------------------- +# Android OpenSSL Libraries +# ---------------------------------------------------------------------------- CPMAddPackage( NAME android_openssl URL https://github.com/KDAB/android_openssl/archive/refs/heads/master.zip ) -include(${android_openssl_SOURCE_DIR}/android_openssl.cmake) -add_android_openssl_libraries(${CMAKE_PROJECT_NAME}) + +if(android_openssl_ADDED) + include(${android_openssl_SOURCE_DIR}/android_openssl.cmake) + add_android_openssl_libraries(${CMAKE_PROJECT_NAME}) + message(STATUS "QGC: Android OpenSSL libraries added") +else() + message(WARNING "QGC: Failed to add Android OpenSSL libraries") +endif() + +message(STATUS "QGC: Android platform configuration applied") diff --git a/cmake/platform/Apple.cmake b/cmake/platform/Apple.cmake index 8660dfea9eaf..8346fa093290 100644 --- a/cmake/platform/Apple.cmake +++ b/cmake/platform/Apple.cmake @@ -1,6 +1,9 @@ +# ---------------------------------------------------------------------------- +# QGroundControl Apple Platform Configuration (macOS and iOS) +# ---------------------------------------------------------------------------- + if(NOT APPLE) - message(FATAL_ERROR "QGC: Invalid Platform") - return() + message(FATAL_ERROR "QGC: Invalid Platform: Apple.cmake included but platform is not Apple") endif() if(CMAKE_GENERATOR STREQUAL "Xcode") @@ -16,6 +19,9 @@ if(CMAKE_GENERATOR STREQUAL "Xcode") set(CMAKE_XCODE_ATTRIBUTE_CODE_SIGN_ENTITLEMENTS "${QGC_MACOS_ENTITLEMENTS_PATH}") endif() +# ---------------------------------------------------------------------------- +# macOS/iOS Bundle Configuration +# ---------------------------------------------------------------------------- cmake_path(GET QGC_MACOS_ICON_PATH FILENAME MACOSX_BUNDLE_ICON_FILE) set_target_properties(${CMAKE_PROJECT_NAME} @@ -32,7 +38,11 @@ set_target_properties(${CMAKE_PROJECT_NAME} MACOSX_BUNDLE_SHORT_VERSION_STRING "${CMAKE_PROJECT_VERSION_MAJOR}.${CMAKE_PROJECT_VERSION_MINOR}" ) +# ---------------------------------------------------------------------------- +# Platform-Specific Configuration +# ---------------------------------------------------------------------------- if(MACOS) + # macOS-specific configuration set(app_icon_macos "${QGC_MACOS_ICON_PATH}") set_source_files_properties(${app_icon_macos} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") @@ -44,7 +54,10 @@ if(MACOS) "${app_entitlements_macos}" "${app_icon_macos}" ) + + message(STATUS "QGC: macOS platform configuration applied") elseif(IOS) + # iOS-specific configuration enable_language(OBJC) set(QT_IOS_LAUNCH_SCREEN "${CMAKE_SOURCE_DIR}/deploy/ios/QGCLaunchScreen.xib") @@ -70,6 +83,9 @@ elseif(IOS) XCODE_ATTRIBUTE_GCC_GENERATE_DEBUGGING_SYMBOLS "YES" ) + # Add FFmpeg libraries for iOS if needed # set(QT_NO_FFMPEG_XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON) qt_add_ios_ffmpeg_libraries(${CMAKE_PROJECT_NAME}) + + message(STATUS "QGC: iOS platform configuration applied") endif() diff --git a/cmake/platform/Linux.cmake b/cmake/platform/Linux.cmake index 0a66e137d81f..b41cf3dfbc4a 100644 --- a/cmake/platform/Linux.cmake +++ b/cmake/platform/Linux.cmake @@ -1,4 +1,37 @@ +# ---------------------------------------------------------------------------- +# QGroundControl Linux Platform Configuration +# ---------------------------------------------------------------------------- + if(NOT LINUX) - message(FATAL_ERROR "Invalid Platform") - return() + message(FATAL_ERROR "QGC: Invalid Platform: Linux.cmake included but platform is not Linux") endif() + +# ---------------------------------------------------------------------------- +# Linux-Specific Compiler Flags +# ---------------------------------------------------------------------------- +if(CMAKE_CXX_COMPILER_ID MATCHES "GNU|Clang") + # Enable additional warnings for better code quality + # target_compile_options(${CMAKE_PROJECT_NAME} + # PRIVATE + # -Wall + # -Wextra + # -Wpedantic + # $<$:-O3> + # ) +endif() + +# ---------------------------------------------------------------------------- +# Linux-Specific Definitions +# ---------------------------------------------------------------------------- +target_compile_definitions(${CMAKE_PROJECT_NAME} + PRIVATE + _GNU_SOURCE +) + +# ---------------------------------------------------------------------------- +# Linux Desktop Integration +# ---------------------------------------------------------------------------- +# Desktop entry and icon files are handled by the install scripts +# See cmake/install/CreateAppImage.cmake for AppImage-specific configuration + +message(STATUS "QGC: Linux platform configuration applied") diff --git a/cmake/platform/Windows.cmake b/cmake/platform/Windows.cmake index a11ca57fdeb1..68c8ebbd501b 100644 --- a/cmake/platform/Windows.cmake +++ b/cmake/platform/Windows.cmake @@ -1,10 +1,24 @@ +# ---------------------------------------------------------------------------- +# QGroundControl Windows Platform Configuration +# ---------------------------------------------------------------------------- + if(NOT WIN32) - message(FATAL_ERROR "Invalid Platform") - return() + message(FATAL_ERROR "QGC: Invalid Platform: Windows.cmake included but platform is not Windows") endif() -target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE _USE_MATH_DEFINES NOMINMAX WIN32_LEAN_AND_MEAN) +# ---------------------------------------------------------------------------- +# Windows-Specific Definitions +# ---------------------------------------------------------------------------- +target_compile_definitions(${CMAKE_PROJECT_NAME} + PRIVATE + _USE_MATH_DEFINES # Enable M_PI and other math constants + NOMINMAX # Prevent min/max macro conflicts + WIN32_LEAN_AND_MEAN # Reduce Windows.h bloat +) +# ---------------------------------------------------------------------------- +# Windows Executable Configuration +# ---------------------------------------------------------------------------- set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES WIN32_EXECUTABLE TRUE) if(COMMAND _qt_internal_generate_win32_rc_file) @@ -33,5 +47,7 @@ elseif(EXISTS "${CMAKE_SOURCE_DIR}/deploy/windows/QGroundControl.rc.in") ) target_sources(${CMAKE_PROJECT_NAME} PRIVATE "${CMAKE_BINARY_DIR}/QGroundControl.rc") else() - message(WARNING "No Windows resource file found") + message(WARNING "QGC: No Windows resource file found") endif() + +message(STATUS "QGC: Windows platform configuration applied") diff --git a/custom-example/CMakeLists.txt b/custom-example/CMakeLists.txt index 5d0c04733281..386dfe38e8c3 100644 --- a/custom-example/CMakeLists.txt +++ b/custom-example/CMakeLists.txt @@ -1,5 +1,14 @@ +# ============================================================================ +# QGroundControl Custom Plugin Example +# Template for building custom QGroundControl plugins +# ============================================================================ + message(STATUS "QGC: Adding Custom Plugin") +# ============================================================================ +# Custom Android Package Template +# ============================================================================ + if(ANDROID) set(CUSTOM_ANDROID_DIR "${CMAKE_SOURCE_DIR}/custom/android") if(EXISTS "${CUSTOM_ANDROID_DIR}") @@ -8,12 +17,19 @@ if(ANDROID) message(STATUS "QGC: Custom Android package template found. Overlaying custom files...") set(DEFAULT_ANDROID_DIR "${CMAKE_SOURCE_DIR}/android") set(FINAL_ANDROID_DIR "${CMAKE_BINARY_DIR}/custom/android") + + # Copy default Android template file(COPY "${DEFAULT_ANDROID_DIR}/." DESTINATION "${FINAL_ANDROID_DIR}") + + # Overlay custom Android files file(COPY "${CUSTOM_ANDROID_DIR}/." DESTINATION "${FINAL_ANDROID_DIR}") + + # Track changes to Android directories set_property(DIRECTORY APPEND PROPERTY CMAKE_CONFIGURE_DEPENDS - "${DEFAULT_ANDROID_DIR}/" - "${CUSTOM_ANDROID_DIR}/" - ) + "${DEFAULT_ANDROID_DIR}/" + "${CUSTOM_ANDROID_DIR}/" + ) + set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${FINAL_ANDROID_DIR}" CACHE PATH "Path to a custom Android package template" FORCE) message(STATUS "QGC: Android package template path will be set to: ${QGC_ANDROID_PACKAGE_SOURCE_DIR}") else() @@ -24,15 +40,26 @@ if(ANDROID) endif() endif() +# ============================================================================ +# Custom Resources and Import Paths +# ============================================================================ + +# Add custom Qt resources list(APPEND CUSTOM_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/custom.qrc ) set(QGC_RESOURCES ${QGC_RESOURCES} ${CUSTOM_RESOURCES} CACHE STRING "Paths to .qrc Resources" FORCE) +# Add custom QML import path set(QML_IMPORT_PATH ${QML_IMPORT_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/res" CACHE STRING "Extra qml import paths" FORCE) +# ============================================================================ +# Custom QML Module +# ============================================================================ + qt_add_library(CustomModule STATIC) +# Set resource aliases for custom widgets set_source_files_properties(res/Custom/Widgets/CustomArtificialHorizon.qml PROPERTIES QT_RESOURCE_ALIAS CustomArtificialHorizon.qml) qgc_set_qt_resource_alias( res/Custom/Widgets/CustomAttitudeWidget.qml @@ -60,6 +87,10 @@ qt_add_qml_module(CustomModule NO_PLUGIN ) +# ============================================================================ +# Custom Plugin Sources +# ============================================================================ + set(CUSTOM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src/CustomPlugin.cc ${CMAKE_CURRENT_SOURCE_DIR}/src/CustomPlugin.h @@ -72,11 +103,17 @@ set(CUSTOM_SOURCES CACHE INTERNAL "" FORCE ) +# ============================================================================ +# Custom Build Configuration +# ============================================================================ + +# Custom libraries to link set(CUSTOM_LIBRARIES CustomModule CACHE INTERNAL "" FORCE ) +# Custom include directories set(CUSTOM_INCLUDE_DIRECTORIES ${CMAKE_CURRENT_SOURCE_DIR}/src ${CMAKE_CURRENT_SOURCE_DIR}/src/AutoPilotPlugin @@ -84,6 +121,7 @@ set(CUSTOM_INCLUDE_DIRECTORIES CACHE INTERNAL "" FORCE ) +# Custom compiler definitions set(CUSTOM_DEFINITIONS QGC_CUSTOM_BUILD CUSTOMHEADER="CustomPlugin.h" @@ -91,6 +129,7 @@ set(CUSTOM_DEFINITIONS CACHE INTERNAL "" FORCE ) +# Custom Qt components required set(CUSTOM_QT_COMPONENTS Core CACHE INTERNAL "" FORCE diff --git a/custom-example/cmake/CustomOverrides.cmake b/custom-example/cmake/CustomOverrides.cmake index fa40101b2aa9..821c850da55f 100644 --- a/custom-example/cmake/CustomOverrides.cmake +++ b/custom-example/cmake/CustomOverrides.cmake @@ -1,25 +1,45 @@ +# ============================================================================ +# Custom Build Configuration Overrides +# Template for customizing QGroundControl branding and feature set +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Application Branding +# ---------------------------------------------------------------------------- set(QGC_APP_NAME "Custom-QGroundControl" CACHE STRING "App Name" FORCE) +# ---------------------------------------------------------------------------- +# Custom Icons and Graphics +# ---------------------------------------------------------------------------- + +# macOS Icon if(EXISTS "${CMAKE_SOURCE_DIR}/custom/res/icons/custom_qgroundcontrol.icns") set(QGC_MACOS_ICON_PATH "${CMAKE_SOURCE_DIR}/custom/res/icons/custom_qgroundcontrol.icns" CACHE FILEPATH "MacOS Icon Path" FORCE) endif() +# Linux AppImage Icon if(EXISTS "${CMAKE_SOURCE_DIR}/custom/res/icons/custom_qgroundcontrol.svg") set(QGC_APPIMAGE_ICON_SCALABLE_PATH "${CMAKE_SOURCE_DIR}/custom/res/icons/custom_qgroundcontrol.svg" CACHE FILEPATH "AppImage Icon SVG Path" FORCE) endif() -if(EXISTS ${CMAKE_SOURCE_DIR}/custom/deploy/windows/installheader.bmp) +# Windows Installer Header +if(EXISTS "${CMAKE_SOURCE_DIR}/custom/deploy/windows/installheader.bmp") set(QGC_WINDOWS_INSTALL_HEADER_PATH "${CMAKE_SOURCE_DIR}/custom/deploy/windows/installheader.bmp" CACHE FILEPATH "Windows Install Header Path" FORCE) endif() -if(EXISTS ${CMAKE_SOURCE_DIR}/custom/deploy/windows/WindowsQGC.ico) +# Windows Application Icon +if(EXISTS "${CMAKE_SOURCE_DIR}/custom/deploy/windows/WindowsQGC.ico") set(QGC_WINDOWS_ICON_PATH "${CMAKE_SOURCE_DIR}/custom/deploy/windows/WindowsQGC.ico" CACHE FILEPATH "Windows Icon Path" FORCE) endif() +# ---------------------------------------------------------------------------- +# Feature Set Customization +# ---------------------------------------------------------------------------- + # Build a single flight stack by disabling APM support set(QGC_DISABLE_APM_MAVLINK ON CACHE BOOL "Disable APM Dialect" FORCE) set(QGC_DISABLE_APM_PLUGIN ON CACHE BOOL "Disable APM Plugin" FORCE) set(QGC_DISABLE_APM_PLUGIN_FACTORY ON CACHE BOOL "Disable APM Plugin Factory" FORCE) -# We implement our own PX4 plugin factory +# Implement custom PX4 plugin factory set(QGC_DISABLE_PX4_PLUGIN_FACTORY ON CACHE BOOL "Disable PX4 Plugin Factory" FORCE) diff --git a/src/ADSB/CMakeLists.txt b/src/ADSB/CMakeLists.txt index 4cfa8c870d57..10695141faf2 100644 --- a/src/ADSB/CMakeLists.txt +++ b/src/ADSB/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# ADS-B Module +# Automatic Dependent Surveillance-Broadcast for air traffic awareness +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ADSBTCPLink.cc diff --git a/src/API/CMakeLists.txt b/src/API/CMakeLists.txt index ab2df327ad49..65786f431911 100644 --- a/src/API/CMakeLists.txt +++ b/src/API/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# API Module +# Core plugin architecture and QML component interfaces +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QGCCorePlugin.cc diff --git a/src/AnalyzeView/CMakeLists.txt b/src/AnalyzeView/CMakeLists.txt index 25bc1bc3b5f7..202de77e55c6 100644 --- a/src/AnalyzeView/CMakeLists.txt +++ b/src/AnalyzeView/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Analyze View Module +# Flight log analysis, MAVLink inspection, and telemetry visualization +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ExifParser.cc @@ -30,6 +35,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# QML Module for Analyze View UI +# ---------------------------------------------------------------------------- qt_add_library(AnalyzeViewModule STATIC) qt_add_qml_module(AnalyzeViewModule @@ -46,7 +54,9 @@ qt_add_qml_module(AnalyzeViewModule NO_PLUGIN ) -#===========================================================================# +# ============================================================================ +# ULog Parser Integration +# ============================================================================ CPMAddPackage( NAME ulog_cpp @@ -54,6 +64,7 @@ CPMAddPackage( GIT_TAG main ) +# Suppress Clang warnings for ulog_cpp if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") target_compile_options(ulog_cpp PRIVATE -Wno-unknown-warning-option) endif() diff --git a/src/Android/CMakeLists.txt b/src/Android/CMakeLists.txt index de495aab6718..88adb80b1c3d 100644 --- a/src/Android/CMakeLists.txt +++ b/src/Android/CMakeLists.txt @@ -1,3 +1,9 @@ +# ============================================================================ +# Android Module +# Android platform-specific initialization and interfaces +# ============================================================================ + +# Only build on Android platforms if(NOT ANDROID) return() endif() @@ -13,4 +19,7 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Android Serial Port Support +# ---------------------------------------------------------------------------- add_subdirectory(qtandroidserialport) diff --git a/src/Android/qtandroidserialport/CMakeLists.txt b/src/Android/qtandroidserialport/CMakeLists.txt index 16dc23a16007..ba3f06258e6c 100644 --- a/src/Android/qtandroidserialport/CMakeLists.txt +++ b/src/Android/qtandroidserialport/CMakeLists.txt @@ -1,3 +1,9 @@ +# ============================================================================ +# Qt Android Serial Port +# Android-specific serial port implementation +# ============================================================================ + +# Only build on Android platforms if(NOT ANDROID) return() endif() @@ -19,4 +25,5 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# TODO: Enable I/O device debugging # target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QIODEVICE_DEBUG) diff --git a/src/AutoPilotPlugins/APM/CMakeLists.txt b/src/AutoPilotPlugins/APM/CMakeLists.txt index d1e69b582dda..ea86c4ae8ed6 100644 --- a/src/AutoPilotPlugins/APM/CMakeLists.txt +++ b/src/AutoPilotPlugins/APM/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# APM AutoPilot Plugin +# ArduPilot-specific vehicle configuration and setup +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE APMAirframeComponent.cc @@ -44,6 +49,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# APM QML Module +# ---------------------------------------------------------------------------- qt_add_library(AutoPilotPluginsAPMModule STATIC) qt_add_qml_module(AutoPilotPluginsAPMModule @@ -91,7 +99,9 @@ qt_add_qml_module(AutoPilotPluginsAPMModule NO_PLUGIN ) -# Add json file +# ---------------------------------------------------------------------------- +# APM Component Metadata +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} autopilot_plugin_apm_resource PREFIX "/json" FILES APMFollowComponent.FactMetaData.json diff --git a/src/AutoPilotPlugins/CMakeLists.txt b/src/AutoPilotPlugins/CMakeLists.txt index 04f26cb8de01..16f48fdeacd4 100644 --- a/src/AutoPilotPlugins/CMakeLists.txt +++ b/src/AutoPilotPlugins/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# AutoPilot Plugins Module +# Provides autopilot-specific UI and configuration handling +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE AutoPilotPlugin.cc @@ -14,10 +19,15 @@ target_include_directories(${CMAKE_PROJECT_NAME} Generic ) +# ---------------------------------------------------------------------------- +# Autopilot-Specific Plugins +# ---------------------------------------------------------------------------- add_subdirectory(Common) + if(NOT QGC_DISABLE_APM_PLUGIN) add_subdirectory(APM) endif() + if(NOT QGC_DISABLE_PX4_PLUGIN) add_subdirectory(PX4) endif() diff --git a/src/AutoPilotPlugins/Common/CMakeLists.txt b/src/AutoPilotPlugins/Common/CMakeLists.txt index 38993b427d2c..c2c02f80c90e 100644 --- a/src/AutoPilotPlugins/Common/CMakeLists.txt +++ b/src/AutoPilotPlugins/Common/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Common AutoPilot Plugins +# Components shared across different autopilot types +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ESP8266Component.cc @@ -16,6 +21,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Common AutoPilot Plugins QML Module +# ---------------------------------------------------------------------------- qt_add_library(AutoPilotPluginsCommonModule STATIC) qt_add_qml_module(AutoPilotPluginsCommonModule diff --git a/src/AutoPilotPlugins/PX4/CMakeLists.txt b/src/AutoPilotPlugins/PX4/CMakeLists.txt index 66ff00f95df1..3b3093257cb2 100644 --- a/src/AutoPilotPlugins/PX4/CMakeLists.txt +++ b/src/AutoPilotPlugins/PX4/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# PX4 AutoPilot Plugin +# PX4-specific vehicle configuration and setup +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ActuatorComponent.cc @@ -34,7 +39,9 @@ target_sources(${CMAKE_PROJECT_NAME} SensorsComponentController.h ) -# Add metadata file +# ---------------------------------------------------------------------------- +# PX4 Airframe Metadata +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} autopilot_plugin_px4_resource PREFIX "/AutoPilotPlugins/PX4" FILES AirframeFactMetaData.xml @@ -42,6 +49,9 @@ qt_add_resources(${CMAKE_PROJECT_NAME} autopilot_plugin_px4_resource target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# PX4 QML Module +# ---------------------------------------------------------------------------- qt_add_library(AutoPilotPluginsPX4Module STATIC) qt_add_qml_module(AutoPilotPluginsPX4Module diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 0cbaede49e13..8cbfeae033c3 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -1,6 +1,16 @@ +# ============================================================================ +# QGroundControl Module Library +# ============================================================================ + qt_add_library(QGroundControlModule STATIC) -set_source_files_properties(UI/MainWindow.qml PROPERTIES QT_RESOURCE_ALIAS MainWindow.qml) +# ---------------------------------------------------------------------------- +# QML Resources +# ---------------------------------------------------------------------------- +set_source_files_properties(UI/MainWindow.qml + PROPERTIES + QT_RESOURCE_ALIAS MainWindow.qml +) qt_add_qml_module(QGroundControlModule URI QGroundControl @@ -13,9 +23,13 @@ qt_add_qml_module(QGroundControlModule NO_PLUGIN ) +# ============================================================================ +# Subdirectories +# ============================================================================ + +# Core subsystems add_subdirectory(ADSB) add_subdirectory(AnalyzeView) -add_subdirectory(Android) add_subdirectory(API) add_subdirectory(AutoPilotPlugins) add_subdirectory(Camera) @@ -41,8 +55,16 @@ add_subdirectory(Vehicle) add_subdirectory(VideoManager) add_subdirectory(Viewer3D) +# Platform-specific +add_subdirectory(Android) + +# Qt plugins add_subdirectory(QtLocationPlugin) +# ============================================================================ +# Main Application Sources +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE main.cc @@ -51,6 +73,7 @@ target_sources(${CMAKE_PROJECT_NAME} QGCApplication.h ) +# Platform-specific sources if(NOT ANDROID AND NOT IOS) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -59,32 +82,51 @@ if(NOT ANDROID AND NOT IOS) ) endif() -target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Include Directories +# ---------------------------------------------------------------------------- +target_include_directories(${CMAKE_PROJECT_NAME} + PRIVATE + ${CMAKE_CURRENT_SOURCE_DIR} +) + +# ============================================================================ +# Link Libraries +# ============================================================================ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE + # Qt6 Core Qt6::Charts Qt6::Concurrent Qt6::Core Qt6::Core5Compat Qt6::CorePrivate Qt6::Gui - Qt6::Location - Qt6::LocationPrivate - Qt6::Multimedia - Qt6::MultimediaQuickPrivate Qt6::Network - Qt6::Positioning - Qt6::PositioningPrivate - Qt6::Qml - Qt6::QmlIntegration - Qt6::Quick - Qt6::QuickControls2 Qt6::Sensors Qt6::Svg Qt6::TextToSpeech Qt6::Widgets Qt6::Xml + + # Qt6 QML/Quick + Qt6::Qml + Qt6::QmlIntegration + Qt6::Quick + Qt6::QuickControls2 + + # Qt6 Location + Qt6::Location + Qt6::LocationPrivate + Qt6::Positioning + Qt6::PositioningPrivate + + # Qt6 Multimedia + Qt6::Multimedia + Qt6::MultimediaQuickPrivate + + # QGC Modules AnalyzeViewModule AppSettingsModule AutoPilotPluginsCommonModule @@ -99,19 +141,30 @@ target_link_libraries(${CMAKE_PROJECT_NAME} VehicleSetupModule ) +# ---------------------------------------------------------------------------- +# Optional/Conditional Modules +# ---------------------------------------------------------------------------- if(NOT QGC_DISABLE_APM_PLUGIN) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE AutoPilotPluginsAPMModule) endif() + if(NOT QGC_DISABLE_PX4_PLUGIN) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE AutoPilotPluginsPX4Module) endif() + if(QGC_VIEWER3D) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Viewer3DModule) endif() + if(NOT QGC_AIRLINK_DISABLED) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE AirLinkModule) endif() +# ============================================================================ +# Compile Definitions +# ============================================================================ + +# Application metadata target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_APP_NAME="${QGC_APP_NAME}" @@ -125,6 +178,7 @@ target_compile_definitions(${CMAKE_PROJECT_NAME} $<$:QGC_NO_ARDUPILOT_DIALECT> ) +# Build configuration-specific definitions if(CMAKE_BUILD_TYPE STREQUAL "Release") target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE @@ -141,18 +195,45 @@ else() ) endif() +# ============================================================================ +# Target Properties +# ============================================================================ + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES QT_RESOURCE_PREFIX "/qml" OUTPUT_NAME ${CMAKE_PROJECT_NAME} ) +# ---------------------------------------------------------------------------- +# Precompiled Headers +# ---------------------------------------------------------------------------- target_precompile_headers(${CMAKE_PROJECT_NAME} PRIVATE pch.h) +# ============================================================================ +# Custom Build Configuration +# ============================================================================ + if(QGC_CUSTOM_BUILD) - find_package(Qt6 REQUIRED COMPONENTS ${CUSTOM_QT_COMPONENTS}) - target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_SOURCES}) - target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_LIBRARIES}) - target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_INCLUDE_DIRECTORIES}) - target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_DEFINITIONS}) + if(CUSTOM_QT_COMPONENTS) + find_package(Qt6 REQUIRED COMPONENTS ${CUSTOM_QT_COMPONENTS}) + endif() + + if(CUSTOM_SOURCES) + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_SOURCES}) + endif() + + if(CUSTOM_LIBRARIES) + target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_LIBRARIES}) + endif() + + if(CUSTOM_INCLUDE_DIRECTORIES) + target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_INCLUDE_DIRECTORIES}) + endif() + + if(CUSTOM_DEFINITIONS) + target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE ${CUSTOM_DEFINITIONS}) + endif() + + message(STATUS "QGC: Custom build configuration applied") endif() diff --git a/src/Camera/CMakeLists.txt b/src/Camera/CMakeLists.txt index 5b494eafb376..8e973259bf1f 100644 --- a/src/Camera/CMakeLists.txt +++ b/src/Camera/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Camera Module +# MAVLink camera control and video stream management +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE CameraMetaData.cc @@ -18,7 +23,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# Add JSON files +# ---------------------------------------------------------------------------- +# Camera Metadata Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} json_mavlink_camera PREFIX "/json" FILES CameraMetaData.json diff --git a/src/Comms/CMakeLists.txt b/src/Comms/CMakeLists.txt index 62ce9307cc1c..858a43dc06af 100644 --- a/src/Comms/CMakeLists.txt +++ b/src/Comms/CMakeLists.txt @@ -1,3 +1,11 @@ +# ============================================================================ +# Communications Module +# Handles all communication links (TCP, UDP, Serial, Bluetooth, etc.) +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Core Communication Sources +# ---------------------------------------------------------------------------- target_sources(${CMAKE_PROJECT_NAME} PRIVATE LinkConfiguration.cc @@ -18,7 +26,7 @@ target_sources(${CMAKE_PROJECT_NAME} UDPLink.h ) -# Add JSON files +# USB board information JSON data qt_add_resources(${CMAKE_PROJECT_NAME} json_comm PREFIX "/json" FILES USBBoardInfo.json @@ -26,9 +34,16 @@ qt_add_resources(${CMAKE_PROJECT_NAME} json_comm target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# Uncomment to enable Qt socket debugging # target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QABSTRACTSOCKET_DEBUG) -#===========================================================================# +# ============================================================================ +# Optional Communication Features +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Serial Port Communication +# ---------------------------------------------------------------------------- if(QGC_NO_SERIAL_LINK) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_NO_SERIAL_LINK) @@ -43,13 +58,15 @@ else() UdpIODevice.h ) + # Qt SerialPort not available on mobile platforms if(NOT ANDROID AND NOT IOS) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::SerialPort) endif() endif() -#===========================================================================# - +# ---------------------------------------------------------------------------- +# Bluetooth Communication +# ---------------------------------------------------------------------------- if(QGC_ENABLE_BLUETOOTH) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::Bluetooth) target_sources(${CMAKE_PROJECT_NAME} @@ -60,8 +77,9 @@ if(QGC_ENABLE_BLUETOOTH) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_ENABLE_BLUETOOTH) endif() -#===========================================================================# - +# ---------------------------------------------------------------------------- +# ZeroConf/mDNS Service Discovery +# ---------------------------------------------------------------------------- if(QGC_ZEROCONF_ENABLED) CPMAddPackage( NAME qmdnsengine @@ -76,10 +94,14 @@ if(QGC_ZEROCONF_ENABLED) if(TARGET qmdnsengine) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE qmdnsengine) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_ZEROCONF_ENABLED) + else() + message(WARNING "QGC: qmdnsengine target not created, ZeroConf will be disabled") endif() endif() -#===========================================================================# +# ============================================================================ +# Communication Link Subdirectories +# ============================================================================ add_subdirectory(AirLink) add_subdirectory(MockLink) diff --git a/src/FactSystem/CMakeLists.txt b/src/FactSystem/CMakeLists.txt index dd4efa68c7ff..7f3ec2802efd 100644 --- a/src/FactSystem/CMakeLists.txt +++ b/src/FactSystem/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Fact System Module +# Parameter management and data binding infrastructure +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE Fact.cc @@ -20,4 +25,7 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Fact Controls UI +# ---------------------------------------------------------------------------- add_subdirectory(FactControls) diff --git a/src/FirmwarePlugin/CMakeLists.txt b/src/FirmwarePlugin/CMakeLists.txt index dff0c2525c85..00b68277facb 100644 --- a/src/FirmwarePlugin/CMakeLists.txt +++ b/src/FirmwarePlugin/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Firmware Plugin Module +# Provides autopilot-specific firmware handling and communication +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE FirmwarePlugin.cc @@ -10,5 +15,8 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Firmware-Specific Plugins +# ---------------------------------------------------------------------------- add_subdirectory(APM) add_subdirectory(PX4) diff --git a/src/FlightDisplay/CMakeLists.txt b/src/FlightDisplay/CMakeLists.txt index e273aac9369c..a8b380f88467 100644 --- a/src/FlightDisplay/CMakeLists.txt +++ b/src/FlightDisplay/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Flight Display Module +# In-flight view, telemetry displays, and vehicle control UI +# ============================================================================ + qt_add_library(FlightDisplayModule STATIC) qt_add_qml_module(FlightDisplayModule diff --git a/src/FlightMap/CMakeLists.txt b/src/FlightMap/CMakeLists.txt index c942298a0fa0..58adacc03a5e 100644 --- a/src/FlightMap/CMakeLists.txt +++ b/src/FlightMap/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Flight Map Module +# Map widgets, vehicle indicators, and mission visualization +# ============================================================================ + qt_add_library(FlightMapModule STATIC) qt_add_qml_module(FlightMapModule diff --git a/src/FollowMe/CMakeLists.txt b/src/FollowMe/CMakeLists.txt index d5ad7bae7269..d7f127e164e2 100644 --- a/src/FollowMe/CMakeLists.txt +++ b/src/FollowMe/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Follow Me Module +# Enables vehicles to follow a ground station's GPS position +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE FollowMe.cc diff --git a/src/GPS/CMakeLists.txt b/src/GPS/CMakeLists.txt index d101c261e08f..3452d006764a 100644 --- a/src/GPS/CMakeLists.txt +++ b/src/GPS/CMakeLists.txt @@ -1,3 +1,9 @@ +# ============================================================================ +# GPS Module +# GPS/GNSS positioning and RTK support +# ============================================================================ + +# GPS requires serial link support if(QGC_NO_SERIAL_LINK) return() endif() @@ -23,7 +29,9 @@ target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::Core) target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -#===========================================================================# +# ============================================================================ +# PX4 GPS Drivers Integration +# ============================================================================ CPMAddPackage( NAME px4-gpsdrivers @@ -32,14 +40,23 @@ CPMAddPackage( SOURCE_SUBDIR src ) -file(GLOB GPS_DRIVERS_SOURCES "${px4-gpsdrivers_SOURCE_DIR}/src/*") +# NOTE: Using file(GLOB) for external dependency sources +# CONFIGURE_DEPENDS ensures CMake re-runs if files are added/removed +file(GLOB GPS_DRIVERS_SOURCES + CONFIGURE_DEPENDS + "${px4-gpsdrivers_SOURCE_DIR}/src/*.c" + "${px4-gpsdrivers_SOURCE_DIR}/src/*.cpp" + "${px4-gpsdrivers_SOURCE_DIR}/src/*.h" +) target_sources(${CMAKE_PROJECT_NAME} PRIVATE definitions.h ${GPS_DRIVERS_SOURCES} ) -# Add JSON files +# ---------------------------------------------------------------------------- +# GPS/RTK Configuration Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} json_gps_drivers PREFIX "/json/Vehicle" FILES GPSRTKFact.json diff --git a/src/Gimbal/CMakeLists.txt b/src/Gimbal/CMakeLists.txt index d8fafa30c2cd..f694b50c5f6b 100644 --- a/src/Gimbal/CMakeLists.txt +++ b/src/Gimbal/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Gimbal Module +# Camera gimbal control and stabilization +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE Gimbal.cc @@ -6,7 +11,9 @@ target_sources(${CMAKE_PROJECT_NAME} GimbalController.h ) -# Add JSON files +# ---------------------------------------------------------------------------- +# Gimbal Configuration Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} json_gimbal PREFIX "/json/Vehicle" FILES GimbalFact.json diff --git a/src/Joystick/CMakeLists.txt b/src/Joystick/CMakeLists.txt index 7c8e038293f8..f6e754d849b5 100644 --- a/src/Joystick/CMakeLists.txt +++ b/src/Joystick/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Joystick Module +# Game controller and joystick input support +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE Joystick.cc @@ -8,6 +13,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Android Joystick Implementation +# ---------------------------------------------------------------------------- if(ANDROID) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -17,6 +25,9 @@ if(ANDROID) return() endif() +# ---------------------------------------------------------------------------- +# SDL Joystick Implementation (Desktop) +# ---------------------------------------------------------------------------- target_sources(${CMAKE_PROJECT_NAME} PRIVATE JoystickSDL.cc @@ -29,7 +40,9 @@ if(SDL_GAMECONTROLLERCONFIG) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE SDL_GAMECONTROLLERCONFIG=\"${SDL_GAMECONTROLLERCONFIG}\") endif() -#===========================================================================# +# ============================================================================ +# SDL Game Controller Database +# ============================================================================ CPMAddPackage( NAME sdl_gamecontrollerdb @@ -48,8 +61,11 @@ qt_add_resources(${CMAKE_PROJECT_NAME} "qgcresources_sdl" "${SDL_GAMECONTROLLERDB_PATH}" ) -#===========================================================================# +# ============================================================================ +# SDL3 Library Integration +# ============================================================================ +# Platform-specific SDL options set(SDL_EXTRA_OPTIONS "") if(WIN32) set(SDL_EXTRA_OPTIONS @@ -64,6 +80,8 @@ if(UNIX) "SDL_UNIX_CONSOLE_BUILD ON" ) endif() + +# Video only needed on macOS if(MACOS) set(SDL_VIDEO_FLAG "ON") else() diff --git a/src/MAVLink/CMakeLists.txt b/src/MAVLink/CMakeLists.txt index 15e37b0411fc..095ef76cf1f2 100644 --- a/src/MAVLink/CMakeLists.txt +++ b/src/MAVLink/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# MAVLink Module +# MAVLink protocol implementation and communication handling +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ImageProtocolManager.cc @@ -19,11 +24,13 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -#===========================================================================# +# ============================================================================ +# MAVLink Protocol Library Integration +# ============================================================================ -message(STATUS "Building MAVLink") +message(STATUS "QGC: Building MAVLink") -# TODO: +# TODO: Enable dialect and version options # CPMAddPackage( # NAME mavlink # GITHUB_REPOSITORY ${QGC_MAVLINK_GIT_REPO} @@ -39,7 +46,11 @@ CPMAddPackage( GIT_TAG ${QGC_MAVLINK_GIT_TAG} ) -# For QGC all dialects means common and development. Though use of development mavlink code should be restricted to debug builds only. +# ---------------------------------------------------------------------------- +# MAVLink Dialect Includes +# ---------------------------------------------------------------------------- +# For QGC, "all" dialects includes common and development +# Development dialect should be restricted to debug builds only target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${mavlink_SOURCE_DIR} @@ -48,8 +59,12 @@ target_include_directories(${CMAKE_PROJECT_NAME} ${mavlink_SOURCE_DIR}/development ) +# TODO: Enable warning suppression if needed # if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU") # target_compile_options(comm PRIVATE -Wno-address-of-packed-member) # endif() +# ---------------------------------------------------------------------------- +# LibEvents - MAVLink event handling +# ---------------------------------------------------------------------------- add_subdirectory(LibEvents) diff --git a/src/MAVLink/LibEvents/CMakeLists.txt b/src/MAVLink/LibEvents/CMakeLists.txt index 35554453bc85..e8f413288138 100644 --- a/src/MAVLink/LibEvents/CMakeLists.txt +++ b/src/MAVLink/LibEvents/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# LibEvents - MAVLink Event Handling +# Event logging, health reporting, and arming checks +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE EventHandler.cc @@ -9,7 +14,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -#===========================================================================# +# ============================================================================ +# LibEvents Library Integration +# ============================================================================ CPMAddPackage( NAME libevents diff --git a/src/MissionManager/CMakeLists.txt b/src/MissionManager/CMakeLists.txt index 8c90c9955c34..3a86a95c481b 100644 --- a/src/MissionManager/CMakeLists.txt +++ b/src/MissionManager/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Mission Manager Module +# Handles mission planning, geofences, rally points, and survey patterns +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE BlankPlanCreator.cc @@ -75,7 +80,9 @@ target_sources(${CMAKE_PROJECT_NAME} VTOLLandingComplexItem.h ) -# Add JSON files +# ---------------------------------------------------------------------------- +# Mission Definition JSON Resources +# ---------------------------------------------------------------------------- file(GLOB_RECURSE JSON_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.json) qt_add_resources(${CMAKE_PROJECT_NAME} json_mission_manager PREFIX "/json" diff --git a/src/PositionManager/CMakeLists.txt b/src/PositionManager/CMakeLists.txt index f91c277a963d..84eddc713c26 100644 --- a/src/PositionManager/CMakeLists.txt +++ b/src/PositionManager/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Position Manager Module +# Manages GPS/GNSS position sources and simulated position data +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE PositionManager.cpp diff --git a/src/QmlControls/CMakeLists.txt b/src/QmlControls/CMakeLists.txt index ca86cbbbf154..186f30dbbfae 100644 --- a/src/QmlControls/CMakeLists.txt +++ b/src/QmlControls/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# QML Controls Module +# Reusable QML UI controls and controllers +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE EditPositionDialogController.cc @@ -59,6 +64,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# QML Controls Module +# ---------------------------------------------------------------------------- qt_add_library(QGroundControlControlsModule STATIC) set_source_files_properties(ScreenTools.qml PROPERTIES @@ -167,8 +175,9 @@ qt_add_qml_module(QGroundControlControlsModule VehicleRotationCal.qml VehicleSummaryRow.qml -# Due to the fact t hatset_source_files_properties with QT_RESOURCE_ALIAS doesn't work in cmombination with qt_qdd_add_qml_module on Windows. -# We had to move various qml files to this directory to get things to work. We will revisit this in the 5.1 release. +# NOTE: Due to Windows limitations with set_source_files_properties and qt_add_qml_module, +# various QML files from other modules are temporarily included here. +# This will be revisited in a future release. # src/AnalyzeView/ AnalyzePage.qml @@ -237,7 +246,9 @@ qt_add_qml_module(QGroundControlControlsModule NO_PLUGIN ) -# Add JSON files +# ---------------------------------------------------------------------------- +# Control Configuration Resources +# ---------------------------------------------------------------------------- file(GLOB_RECURSE JSON_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.json) qt_add_resources(${CMAKE_PROJECT_NAME} json_controls PREFIX "/json" diff --git a/src/QtLocationPlugin/CMakeLists.txt b/src/QtLocationPlugin/CMakeLists.txt index 0101ff1beb7f..3f71fd0627b8 100644 --- a/src/QtLocationPlugin/CMakeLists.txt +++ b/src/QtLocationPlugin/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Qt Location Plugin Module +# Custom map tile providers and caching engine +# ============================================================================ + qt_add_plugin(QGCLocation STATIC CLASS_NAME QGeoServiceProviderFactoryQGC @@ -46,10 +51,17 @@ qt_add_plugin(QGCLocation QGeoTileFetcherQGC.h ) +# ---------------------------------------------------------------------------- +# Platform-Specific Configuration +# ---------------------------------------------------------------------------- +# Google Maps not available on iOS if(IOS) target_compile_definitions(QGCLocation PRIVATE QGC_NO_GOOGLE_MAPS) endif() +# ---------------------------------------------------------------------------- +# Dependencies +# ---------------------------------------------------------------------------- target_link_libraries(QGCLocation PRIVATE Qt6::Positioning diff --git a/src/Settings/CMakeLists.txt b/src/Settings/CMakeLists.txt index 8b11c1ae1dcd..2f1abdf27a30 100644 --- a/src/Settings/CMakeLists.txt +++ b/src/Settings/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Settings Module +# Application, vehicle, and user preference settings management +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ADSBVehicleManagerSettings.cc @@ -46,6 +51,9 @@ target_sources(${CMAKE_PROJECT_NAME} Viewer3DSettings.h ) +# ---------------------------------------------------------------------------- +# APM-Specific Settings +# ---------------------------------------------------------------------------- if(NOT QGC_DISABLE_APM_MAVLINK) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -54,7 +62,9 @@ if(NOT QGC_DISABLE_APM_MAVLINK) ) endif() -# Add JSON files +# ---------------------------------------------------------------------------- +# Settings Definition Resources +# ---------------------------------------------------------------------------- file(GLOB_RECURSE JSON_SETTINGS_FILES RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/*.json) qt_add_resources(${CMAKE_PROJECT_NAME} json_app_settings PREFIX "/json" diff --git a/src/Terrain/CMakeLists.txt b/src/Terrain/CMakeLists.txt index b6f6d1339d80..2f9a85fe973e 100644 --- a/src/Terrain/CMakeLists.txt +++ b/src/Terrain/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Terrain Module +# Provides terrain elevation data and queries using Copernicus data +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE Providers/TerrainQueryCopernicus.cc diff --git a/src/UI/CMakeLists.txt b/src/UI/CMakeLists.txt index 91154de29ac2..f4259d24f4a6 100644 --- a/src/UI/CMakeLists.txt +++ b/src/UI/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# UI Module +# Main application user interface components +# ============================================================================ + add_subdirectory(AppSettings) add_subdirectory(FirstRunPromptDialogs) add_subdirectory(toolbar) diff --git a/src/UTMSP/CMakeLists.txt b/src/UTMSP/CMakeLists.txt index b9881e9f1fc2..1b895583ce96 100644 --- a/src/UTMSP/CMakeLists.txt +++ b/src/UTMSP/CMakeLists.txt @@ -1,5 +1,13 @@ +# ============================================================================ +# UTMSP Module +# Unmanned Traffic Management Service Provider integration +# ============================================================================ + qt_add_library(UTMSPModule STATIC) +# ---------------------------------------------------------------------------- +# Dummy UTMSP Module (when adapter is disabled) +# ---------------------------------------------------------------------------- if(NOT QGC_UTM_ADAPTER) set_source_files_properties(dummy/UTMSPStateStorage.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) @@ -21,6 +29,10 @@ if(NOT QGC_UTM_ADAPTER) return() endif() +# ---------------------------------------------------------------------------- +# Full UTMSP Adapter Implementation +# ---------------------------------------------------------------------------- + target_sources(${CMAKE_PROJECT_NAME} PRIVATE services/dispatcher.h @@ -49,6 +61,10 @@ target_sources(${CMAKE_PROJECT_NAME} UTMSPVehicle.h ) +# ---------------------------------------------------------------------------- +# Dependencies +# ---------------------------------------------------------------------------- +# TODO: Enable nlohmann_json when needed # CPMFindPackage( # NAME nlohmann_json # VERSION 3.11.3 @@ -70,6 +86,9 @@ target_include_directories(${CMAKE_PROJECT_NAME} target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_UTM_ADAPTER) +# ---------------------------------------------------------------------------- +# UTMSP QML Module +# ---------------------------------------------------------------------------- set_source_files_properties(UTMSPStateStorage.qml PROPERTIES QT_QML_SINGLETON_TYPE TRUE) qt_add_qml_module(UTMSPModule diff --git a/src/Utilities/Audio/CMakeLists.txt b/src/Utilities/Audio/CMakeLists.txt index e06a49acd56c..58f78028be7c 100644 --- a/src/Utilities/Audio/CMakeLists.txt +++ b/src/Utilities/Audio/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Audio Subsystem +# Audio output and notification sounds +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE AudioOutput.cc diff --git a/src/Utilities/CMakeLists.txt b/src/Utilities/CMakeLists.txt index 42d7bac6fa31..60d5ceef5426 100644 --- a/src/Utilities/CMakeLists.txt +++ b/src/Utilities/CMakeLists.txt @@ -1,3 +1,11 @@ +# ============================================================================ +# Utilities Module +# Core utilities, logging, file system helpers, and platform abstractions +# ============================================================================ + +# ---------------------------------------------------------------------------- +# Core Utility Sources +# ---------------------------------------------------------------------------- target_sources(${CMAKE_PROJECT_NAME} PRIVATE DeviceInfo.cc @@ -24,6 +32,10 @@ target_sources(${CMAKE_PROJECT_NAME} StateMachine.h ) +# ---------------------------------------------------------------------------- +# Platform-Specific Sources +# ---------------------------------------------------------------------------- +# Signal handling not available on mobile platforms if(NOT ANDROID AND NOT IOS) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -32,6 +44,7 @@ if(NOT ANDROID AND NOT IOS) ) endif() +# iOS-specific screen management if(IOS) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -46,7 +59,9 @@ target_include_directories(${CMAKE_PROJECT_NAME} FileSystem ) -#===========================================================================# +# ============================================================================ +# Utility Subdirectories +# ============================================================================ add_subdirectory(Audio) add_subdirectory(Compression) diff --git a/src/Utilities/Compression/CMakeLists.txt b/src/Utilities/Compression/CMakeLists.txt index 900010494534..cf4babfe6837 100644 --- a/src/Utilities/Compression/CMakeLists.txt +++ b/src/Utilities/Compression/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Compression Subsystem +# Compression and decompression utilities (ZIP, LZMA, ZLIB) +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QGCLZMA.cc @@ -10,8 +15,11 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -#===========================================================================# +# ============================================================================ +# zlib Integration +# ============================================================================ +# Platform-specific zlib options set(ZLIB_EXTRA_OPTIONS) if(WIN32) set(ZLIB_EXTRA_OPTIONS @@ -35,7 +43,9 @@ CPMAddPackage( target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE ZLIB::ZLIBSTATIC) -#===========================================================================# +# ============================================================================ +# XZ (LZMA) Integration +# ============================================================================ CPMAddPackage( NAME xz-embedded @@ -47,6 +57,7 @@ CPMAddPackage( "BUILD_TESTING OFF" ) +# Build XZ library from source qt_add_library(xz STATIC ${xz-embedded_SOURCE_DIR}/linux/include/linux/xz.h ${xz-embedded_SOURCE_DIR}/linux/lib/xz/xz_crc32.c diff --git a/src/Utilities/Geo/CMakeLists.txt b/src/Utilities/Geo/CMakeLists.txt index 2fca460c8975..3f1520954bcd 100644 --- a/src/Utilities/Geo/CMakeLists.txt +++ b/src/Utilities/Geo/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Geo Subsystem +# Geographic data handling (GeoJSON, KML, Shapefiles) +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE GeoJsonHelper.cc @@ -16,7 +21,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -#===========================================================================# +# ============================================================================ +# GeographicLib Integration +# ============================================================================ CPMAddPackage( NAME geographiclib @@ -42,11 +49,14 @@ CPMAddPackage( PATCHES geographiclib.patch ) +# Suppress MSVC warnings in GeographicLib target_compile_options(GeographicLib_STATIC PRIVATE $<$:/wd9025>) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE GeographicLib::GeographicLib) -#===========================================================================# +# ============================================================================ +# Shapelib Integration +# ============================================================================ CPMAddPackage( NAME Shapelib diff --git a/src/Vehicle/Actuators/CMakeLists.txt b/src/Vehicle/Actuators/CMakeLists.txt index 7b1e40e42b8e..109a56af55d1 100644 --- a/src/Vehicle/Actuators/CMakeLists.txt +++ b/src/Vehicle/Actuators/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Actuators Subsystem +# Motor, servo, and actuator configuration and testing +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ActuatorActions.cc diff --git a/src/Vehicle/CMakeLists.txt b/src/Vehicle/CMakeLists.txt index 3137d08937d8..22328ccab81d 100644 --- a/src/Vehicle/CMakeLists.txt +++ b/src/Vehicle/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Vehicle Module +# Core vehicle state management and MAVLink communication +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE Autotune.cpp @@ -28,6 +33,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Vehicle Subsystems +# ---------------------------------------------------------------------------- add_subdirectory(Actuators) add_subdirectory(ComponentInformation) add_subdirectory(FactGroups) diff --git a/src/Vehicle/ComponentInformation/CMakeLists.txt b/src/Vehicle/ComponentInformation/CMakeLists.txt index 13c261ec5a05..fac80f5db656 100644 --- a/src/Vehicle/ComponentInformation/CMakeLists.txt +++ b/src/Vehicle/ComponentInformation/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Component Information Subsystem +# MAVLink component metadata and capabilities +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE CompInfo.cc diff --git a/src/Vehicle/FactGroups/CMakeLists.txt b/src/Vehicle/FactGroups/CMakeLists.txt index 0b6c026f708c..d69785d883a6 100644 --- a/src/Vehicle/FactGroups/CMakeLists.txt +++ b/src/Vehicle/FactGroups/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Vehicle Fact Groups Subsystem +# Vehicle telemetry data organization and binding +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE BatteryFactGroupListModel.cc @@ -40,7 +45,9 @@ target_sources(${CMAKE_PROJECT_NAME} VehicleHygrometerFactGroup.h ) -# Add JSON files +# ---------------------------------------------------------------------------- +# Fact Group Definition Resources +# ---------------------------------------------------------------------------- set(JSON_FILES RPMFact.json TemperatureFact.json @@ -66,7 +73,7 @@ qt_add_resources(${CMAKE_PROJECT_NAME} json_vehicle_fact_group FILES ${JSON_FILES} ) -# Alias +# Create alias for LocalPositionSetpointFact.json set_source_files_properties(LocalPositionFact.json PROPERTIES QT_RESOURCE_ALIAS LocalPositionSetpointFact.json) qt_add_resources(${CMAKE_PROJECT_NAME} json_vehicle_fact_group_alias PREFIX "/json/Vehicle" diff --git a/src/Vehicle/VehicleSetup/CMakeLists.txt b/src/Vehicle/VehicleSetup/CMakeLists.txt index 50ad5563eddc..19357a4309da 100644 --- a/src/Vehicle/VehicleSetup/CMakeLists.txt +++ b/src/Vehicle/VehicleSetup/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Vehicle Setup Subsystem +# Vehicle configuration, calibration, and firmware upgrade +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE JoystickConfigController.cc @@ -6,6 +11,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Firmware Upgrade (requires serial link) +# ---------------------------------------------------------------------------- if(NOT QGC_NO_SERIAL_LINK) target_sources(${CMAKE_PROJECT_NAME} PRIVATE @@ -20,6 +28,9 @@ if(NOT QGC_NO_SERIAL_LINK) ) endif() +# ---------------------------------------------------------------------------- +# Vehicle Setup QML Module +# ---------------------------------------------------------------------------- qt_add_library(VehicleSetupModule STATIC) qt_add_qml_module(VehicleSetupModule diff --git a/src/VideoManager/CMakeLists.txt b/src/VideoManager/CMakeLists.txt index 561c4dcb65b8..3792876f40d3 100644 --- a/src/VideoManager/CMakeLists.txt +++ b/src/VideoManager/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Video Manager Module +# Handles video streaming and subtitle generation +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE SubtitleWriter.cc @@ -8,4 +13,7 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Video Receiver Subsystem +# ---------------------------------------------------------------------------- add_subdirectory(VideoReceiver) diff --git a/src/VideoManager/VideoReceiver/CMakeLists.txt b/src/VideoManager/VideoReceiver/CMakeLists.txt index dab1dda4a126..8b36831df460 100644 --- a/src/VideoManager/VideoReceiver/CMakeLists.txt +++ b/src/VideoManager/VideoReceiver/CMakeLists.txt @@ -1,6 +1,14 @@ +# ============================================================================ +# Video Receiver Subsystem +# Video streaming backends (GStreamer and Qt Multimedia) +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE VideoReceiver.h) target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Video Backend Implementations +# ---------------------------------------------------------------------------- add_subdirectory(GStreamer) add_subdirectory(QtMultimedia) diff --git a/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt b/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt index 7a85b09c2ece..057db82665df 100644 --- a/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt +++ b/src/VideoManager/VideoReceiver/GStreamer/CMakeLists.txt @@ -1,20 +1,37 @@ +# ============================================================================ +# GStreamer Video Receiver Backend +# GStreamer-based video streaming and decoding +# ============================================================================ + target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) target_sources(${CMAKE_PROJECT_NAME} PRIVATE VideoItemStub.h) +# ============================================================================ +# GStreamer Detection and Configuration +# ============================================================================ + if(QGC_ENABLE_GST_VIDEOSTREAMING) if(NOT MACOS) - # Using FindGStreamer.cmake is currently bypassed on MACOS since it doesn't work - # So for now we hack in a simple hardwired setup which does work + # NOTE: Using FindGStreamer.cmake is currently bypassed on macOS + # Using hardwired framework path as a workaround until FindGStreamer works on macOS find_package(GStreamer REQUIRED COMPONENTS Core Base Video Gl GlPrototypes Rtsp - OPTIONAL_COMPONENTS GlEgl GlWayland GlX11) + OPTIONAL_COMPONENTS GlEgl GlWayland GlX11 + ) endif() + # Build GStreamer Qt6 QML GL plugin add_subdirectory(gstqml6gl) - # TODO: https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html#qml6d3d11sink-page + + # TODO: Add Qt6 Direct3D11 plugin support + # https://gstreamer.freedesktop.org/documentation/qt6d3d11/index.html#qml6d3d11sink-page endif() +# ============================================================================ +# GStreamer Video Receiver Sources +# ============================================================================ + if(TARGET gstqml6gl) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE gstqml6gl) @@ -28,11 +45,19 @@ if(TARGET gstqml6gl) GstVideoReceiver.h ) + # Build custom GStreamer QGC plugin add_subdirectory(gstqgc) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_GST_STREAMING) + # ============================================================================ + # Platform-Specific GStreamer Installation + # ============================================================================ + if(LINUX) + # ---------------------------------------------------------------------------- + # Linux: Install GStreamer Plugins and Libraries + # ---------------------------------------------------------------------------- install( DIRECTORY "${GSTREAMER_PLUGIN_PATH}" @@ -54,6 +79,9 @@ if(TARGET gstqml6gl) PATTERN "gst-*" ) elseif(WIN32) + # ---------------------------------------------------------------------------- + # Windows: Install GStreamer DLLs and Plugins + # ---------------------------------------------------------------------------- install( DIRECTORY "${GStreamer_ROOT_DIR}/bin/" DESTINATION "${CMAKE_INSTALL_BINDIR}" @@ -83,6 +111,9 @@ if(TARGET gstqml6gl) PATTERN "*.exe" ) elseif(MACOS) + # ---------------------------------------------------------------------------- + # macOS: Install GStreamer Framework + # ---------------------------------------------------------------------------- if(GSTREAMER_FRAMEWORK) install( DIRECTORY "${GSTREAMER_FRAMEWORK}" diff --git a/src/VideoManager/VideoReceiver/GStreamer/gstqgc/CMakeLists.txt b/src/VideoManager/VideoReceiver/GStreamer/gstqgc/CMakeLists.txt index e21b727443cc..804785f617f0 100644 --- a/src/VideoManager/VideoReceiver/GStreamer/gstqgc/CMakeLists.txt +++ b/src/VideoManager/VideoReceiver/GStreamer/gstqgc/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# GStreamer QGC Video Sink Plugin +# Custom GStreamer elements for QGC video streaming +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE gstqgc.cc diff --git a/src/VideoManager/VideoReceiver/GStreamer/gstqml6gl/CMakeLists.txt b/src/VideoManager/VideoReceiver/GStreamer/gstqml6gl/CMakeLists.txt index dda388dcfdcb..b80335282b03 100644 --- a/src/VideoManager/VideoReceiver/GStreamer/gstqml6gl/CMakeLists.txt +++ b/src/VideoManager/VideoReceiver/GStreamer/gstqml6gl/CMakeLists.txt @@ -1,8 +1,16 @@ +# ============================================================================ +# GStreamer Qt6 QML GL Plugin +# Qt6 integration for GStreamer video rendering +# ============================================================================ + qt_add_library(gstqml6gl STATIC) +# ---------------------------------------------------------------------------- +# Platform-Specific GStreamer Linking +# ---------------------------------------------------------------------------- if(MACOS) - # Using FindGStreamer.cmake is currently bypassed on MACOS since it doesn't work - # So for now we hack in a simple hardwired setup which does work + # NOTE: Using FindGStreamer.cmake is currently bypassed on macOS + # Using hardwired framework path as a workaround find_library(GSTREAMER_FRAMEWORK GStreamer) set(GST_PLUGINS_VERSION 1.24.12) set(GSTREAMER_FRAMEWORK_PATH "/Library/Frameworks/GStreamer.framework") @@ -15,16 +23,18 @@ else() target_link_libraries(gstqml6gl PUBLIC GStreamer::GStreamer) endif() +# TODO: Skip custom build if system gstreamer1.0-qt6 plugin is found # if(GST_PLUGIN_qml6_FOUND) -# # Don't Download & Build if gstreamer1.0-qt6 gstqml6 was found # return() # endif() -################################################################################ +# ============================================================================ +# GStreamer Good Plugins Integration +# ============================================================================ -if(GStreamer_VERSION VERSION_GREATER_EQUAL 1.22) +if(GStreamer_VERSION VERSION_GREATER_EQUAL "1.22") # Use Latest Revisions for each minor version: 1.20.7, 1.22.12, 1.24.12, 1.26.3 - string(REPLACE "." ";" GST_VERSION_LIST ${GStreamer_VERSION}) + string(REPLACE "." ";" GST_VERSION_LIST "${GStreamer_VERSION}") list(GET GST_VERSION_LIST 0 GST_VERSION_MAJOR) list(GET GST_VERSION_LIST 1 GST_VERSION_MINOR) list(GET GST_VERSION_LIST 2 GST_VERSION_PATCH) @@ -41,32 +51,41 @@ if(GStreamer_VERSION VERSION_GREATER_EQUAL 1.22) set(GST_PLUGINS_VERSION ${GST_VERSION_MAJOR}.${GST_VERSION_MINOR}.${GST_VERSION_PATCH}) - # URL_HASH https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${GST_PLUGINS_VERSION}.tar.xz.sha256sum + # Download GStreamer good plugins for Qt6 support CPMAddPackage( NAME gstreamer_good_plugins VERSION ${GST_PLUGINS_VERSION} - # URL https://gitlab.freedesktop.org/gstreamer/gstreamer/-/archive/${GST_PLUGINS_VERSION}/gstreamer-${GST_PLUGINS_VERSION}.zip?path=subprojects/gst-plugins-good/ext/qt6 URL https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${GST_PLUGINS_VERSION}.tar.xz + # TODO: Add URL_HASH for verification + # URL_HASH https://gstreamer.freedesktop.org/src/gst-plugins-good/gst-plugins-good-${GST_PLUGINS_VERSION}.tar.xz.sha256sum ) set(QGC_GST_QT6_PLUGIN_PATH "${gstreamer_good_plugins_SOURCE_DIR}/ext/qt6") else() set(QGC_GST_QT6_PLUGIN_PATH "${CMAKE_CURRENT_SOURCE_DIR}/qt6") endif() -################################################################################ +# ============================================================================ +# Source Code Patching +# ============================================================================ -file(READ ${QGC_GST_QT6_PLUGIN_PATH}/qt6glitem.h FILE_CONTENTS) +# Fix missing includes in GStreamer Qt6 plugin +file(READ "${QGC_GST_QT6_PLUGIN_PATH}/qt6glitem.h" FILE_CONTENTS) string(FIND "${FILE_CONTENTS}" "#include " GST_FIX_INCLUDES) if(GST_FIX_INCLUDES EQUAL -1) string(REPLACE "#include " "#include \n#include " FILE_CONTENTS "${FILE_CONTENTS}") - file(WRITE ${QGC_GST_QT6_PLUGIN_PATH}/qt6glitem.h "${FILE_CONTENTS}") + file(WRITE "${QGC_GST_QT6_PLUGIN_PATH}/qt6glitem.h" "${FILE_CONTENTS}") endif() -################################################################################ +# ---------------------------------------------------------------------------- +# Build GStreamer QML6 GL Library +# ---------------------------------------------------------------------------- +# NOTE: Using file(GLOB) for external GStreamer plugin sources +# CONFIGURE_DEPENDS ensures CMake re-runs if files are added/removed file(GLOB gstqml6gl_SRCS - ${QGC_GST_QT6_PLUGIN_PATH}/*.cc - ${QGC_GST_QT6_PLUGIN_PATH}/*.h + CONFIGURE_DEPENDS + "${QGC_GST_QT6_PLUGIN_PATH}/*.cc" + "${QGC_GST_QT6_PLUGIN_PATH}/*.h" ) target_sources(gstqml6gl PRIVATE ${gstqml6gl_SRCS}) @@ -89,7 +108,9 @@ target_precompile_headers(gstqml6gl ) -################################################################################ +# ============================================================================ +# Shader Compilation +# ============================================================================ if(EXISTS "${QGC_GST_QT6_PLUGIN_PATH}/resources.qrc") find_package(Qt6 REQUIRED COMPONENTS ShaderTools) @@ -111,6 +132,7 @@ if(EXISTS "${QGC_GST_QT6_PLUGIN_PATH}/resources.qrc") LIST(APPEND OUTPUTS "YUV_BIPLANAR.frag.qsb") endif() + # Compile shaders for different GLSL versions qt_add_shaders(gstqml6gl "gstqml6gl_shaders" PREFIX "/org/freedesktop/gstreamer/qml6" GLSL "100 es,120,330" @@ -120,6 +142,7 @@ if(EXISTS "${QGC_GST_QT6_PLUGIN_PATH}/resources.qrc") BATCHABLE ) + # Handle additional GLES-specific RGBA shader if present if(EXISTS "${QGC_GST_QT6_PLUGIN_PATH}/RGBA_gles.frag") find_program(QSB_PROGRAM NAMES qsb @@ -161,7 +184,9 @@ if(EXISTS "${QGC_GST_QT6_PLUGIN_PATH}/resources.qrc") endif() endif() -################################################################################ +# ============================================================================ +# Platform-Specific OpenGL Support +# ============================================================================ if(GStreamer_GlX11_FOUND) target_compile_definitions(gstqml6gl PRIVATE HAVE_QT_X11) diff --git a/src/VideoManager/VideoReceiver/QtMultimedia/CMakeLists.txt b/src/VideoManager/VideoReceiver/QtMultimedia/CMakeLists.txt index d0d2cd7de1c2..06958ec3fb63 100644 --- a/src/VideoManager/VideoReceiver/QtMultimedia/CMakeLists.txt +++ b/src/VideoManager/VideoReceiver/QtMultimedia/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Qt Multimedia Video Receiver Backend +# Qt6 Multimedia-based video streaming and UVC camera support +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QtMultimediaReceiver.cc @@ -8,10 +13,16 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Qt Multimedia Video Streaming +# ---------------------------------------------------------------------------- if(QGC_ENABLE_QT_VIDEOSTREAMING) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_QT_STREAMING) endif() +# ---------------------------------------------------------------------------- +# UVC Camera Support +# ---------------------------------------------------------------------------- if(NOT QGC_ENABLE_UVC) target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_DISABLE_UVC) endif() diff --git a/src/Viewer3D/CMakeLists.txt b/src/Viewer3D/CMakeLists.txt index d344da10fc25..2a36f69566f5 100644 --- a/src/Viewer3D/CMakeLists.txt +++ b/src/Viewer3D/CMakeLists.txt @@ -1,5 +1,10 @@ +# ============================================================================ +# Viewer3D Module +# 3D visualization with terrain and city geometry # @author Omid Esrafilian +# ============================================================================ +# Only build when 3D viewer is enabled if(NOT QGC_VIEWER3D) return() endif() @@ -28,6 +33,9 @@ target_sources(${CMAKE_PROJECT_NAME} Viewer3DTileReply.h ) +# ---------------------------------------------------------------------------- +# Qt Quick3D Dependency +# ---------------------------------------------------------------------------- find_package(Qt6 REQUIRED COMPONENTS Quick3D) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::Quick3D) @@ -36,6 +44,9 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_VIEWER3D) +# ---------------------------------------------------------------------------- +# 3D QML Module +# ---------------------------------------------------------------------------- qt_add_library(Viewer3DModule STATIC) set_source_files_properties(Images/city_3d_map_icon.svg PROPERTIES QT_RESOURCE_ALIAS City3DMapIcon.svg) diff --git a/test/ADSB/CMakeLists.txt b/test/ADSB/CMakeLists.txt index 622e864d86f2..cd4fe7b4c623 100644 --- a/test/ADSB/CMakeLists.txt +++ b/test/ADSB/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# ADSB Unit Tests +# Tests for ADS-B traffic detection and collision avoidance +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ADSBTest.cc @@ -6,6 +11,7 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# TODO: Enable ADSB simulator test resources # qt_add_resources(${CMAKE_PROJECT_NAME} "ADSBTest_res" # PREFIX "/unittest" # FILES diff --git a/test/AnalyzeView/CMakeLists.txt b/test/AnalyzeView/CMakeLists.txt index 1d822e5039ca..9698fe070830 100644 --- a/test/AnalyzeView/CMakeLists.txt +++ b/test/AnalyzeView/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Analyze View Unit Tests +# Tests for log analysis, EXIF parsing, and telemetry visualization +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ExifParserTest.cc @@ -16,7 +21,10 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) -# https://github.com/ianare/exif-samples +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- +# EXIF test samples from https://github.com/ianare/exif-samples qt_add_resources(${CMAKE_PROJECT_NAME} "AnalyzeViewTest_res" PREFIX "/unittest" FILES diff --git a/test/AutoPilotPlugins/CMakeLists.txt b/test/AutoPilotPlugins/CMakeLists.txt index 72f4d3eafda0..3b47eea698c7 100644 --- a/test/AutoPilotPlugins/CMakeLists.txt +++ b/test/AutoPilotPlugins/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# AutoPilot Plugins Unit Tests +# Tests for autopilot configuration and radio calibration +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE RadioConfigTest.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index b8463611974e..a91741e9f9dd 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -1,17 +1,28 @@ +# ============================================================================ +# QGroundControl Unit Tests +# ============================================================================ + if(NOT QGC_BUILD_TESTING) return() endif() +# TODO: Android test utilities # if(ANDROID) - # include(AndroidTestUtilities) +# include(AndroidTestUtilities) # endif() +# ---------------------------------------------------------------------------- +# Test Framework Sources +# ---------------------------------------------------------------------------- target_sources(${CMAKE_PROJECT_NAME} PRIVATE UnitTestList.cc UnitTestList.h ) +# ---------------------------------------------------------------------------- +# Test Dependencies +# ---------------------------------------------------------------------------- find_package(Qt6 REQUIRED COMPONENTS Test) target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE Qt6::Test) @@ -19,12 +30,21 @@ target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_ target_compile_definitions(${CMAKE_PROJECT_NAME} PRIVATE QGC_UNITTEST_BUILD) +# ---------------------------------------------------------------------------- +# CTest Integration +# ---------------------------------------------------------------------------- include(CTest) + +# Custom target for running all tests add_custom_target(check - COMMAND ctest --output-on-failure . + COMMAND ${CMAKE_CTEST_COMMAND} --output-on-failure . USES_TERMINAL + COMMENT "Running all QGroundControl unit tests" ) +# ---------------------------------------------------------------------------- +# Helper Function for Adding Tests +# ---------------------------------------------------------------------------- function(add_qgc_test test_name) add_test( NAME ${test_name} @@ -33,6 +53,10 @@ function(add_qgc_test test_name) add_dependencies(check ${PROJECT_NAME}) endfunction() +# ============================================================================ +# Test Subdirectories & Registration +# ============================================================================ + add_subdirectory(ADSB) add_qgc_test(ADSBTest) diff --git a/test/Camera/CMakeLists.txt b/test/Camera/CMakeLists.txt index 25433ee6509d..1ada55b9d0e7 100644 --- a/test/Camera/CMakeLists.txt +++ b/test/Camera/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Camera Unit Tests +# Tests for camera management and control +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QGCCameraManagerTest.cc diff --git a/test/Comms/CMakeLists.txt b/test/Comms/CMakeLists.txt index 237420f33bf3..4c1966c15517 100644 --- a/test/Comms/CMakeLists.txt +++ b/test/Comms/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Communications Unit Tests +# Tests for serial port detection and communication links +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QGCSerialPortInfoTest.cc diff --git a/test/FactSystem/CMakeLists.txt b/test/FactSystem/CMakeLists.txt index ee03d31d89b2..0e19834aa929 100644 --- a/test/FactSystem/CMakeLists.txt +++ b/test/FactSystem/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Fact System Unit Tests +# Tests for parameter management and fact metadata +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE FactSystemTestBase.cc @@ -12,14 +17,18 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "FactSystemTest_res" PREFIX "/unittest" FILES FactSystemTest.qml ) +# TODO: Enable QML module for fact system tests # qt_add_library(FactSystemTestModule STATIC) - +# # qt_add_qml_module(FactSystemTestModule # URI QGroundControl.Test.FactSystem # VERSION 1.0 @@ -28,5 +37,5 @@ qt_add_resources(${CMAKE_PROJECT_NAME} "FactSystemTest_res" # FactSystemTest.qml # NO_PLUGIN # ) - +# # target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE FactSystemTestModule) diff --git a/test/FollowMe/CMakeLists.txt b/test/FollowMe/CMakeLists.txt index 5013adcf03c8..b3b89bd07687 100644 --- a/test/FollowMe/CMakeLists.txt +++ b/test/FollowMe/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Follow Me Unit Tests +# Tests for Follow Me mode and vehicle tracking +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE FollowMeTest.cc diff --git a/test/GPS/CMakeLists.txt b/test/GPS/CMakeLists.txt index 744d82c57fec..19b3fb5d9416 100644 --- a/test/GPS/CMakeLists.txt +++ b/test/GPS/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# GPS Unit Tests +# Tests for GPS/GNSS positioning and RTK corrections +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE GpsTest.cc diff --git a/test/MAVLink/CMakeLists.txt b/test/MAVLink/CMakeLists.txt index 06153b9d433f..1d2a52965d73 100644 --- a/test/MAVLink/CMakeLists.txt +++ b/test/MAVLink/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# MAVLink Unit Tests +# Tests for MAVLink protocol, status text handling, and message signing +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE StatusTextHandlerTest.cc diff --git a/test/MissionManager/CMakeLists.txt b/test/MissionManager/CMakeLists.txt index d7e61bdb12f5..a8e711e5e537 100644 --- a/test/MissionManager/CMakeLists.txt +++ b/test/MissionManager/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Mission Manager Unit Tests +# Tests for mission planning, waypoints, and flight plan management +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE CameraCalcTest.cc CameraCalcTest.h @@ -27,6 +32,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "MissionManagerTest_res" PREFIX "/unittest" FILES @@ -57,8 +65,9 @@ qt_add_resources(${CMAKE_PROJECT_NAME} "MissionManagerTest_res1" MissionCommandTreeEditorTestWindow.qml ) +# TODO: Enable QML module for mission manager tests # qt_add_library(MissionManagerTestModule STATIC) - +# # qt_add_qml_module(MissionManagerTestModule # URI QGroundControl.Test.MissionManager # VERSION 1.0 @@ -67,5 +76,5 @@ qt_add_resources(${CMAKE_PROJECT_NAME} "MissionManagerTest_res1" # MissionCommandTreeEditorTestWindow.qml # NO_PLUGIN # ) - +# # target_link_libraries(${CMAKE_PROJECT_NAME} PRIVATE MissionManagerTestModule) diff --git a/test/Terrain/CMakeLists.txt b/test/Terrain/CMakeLists.txt index f56374021ad3..23f5a07fb734 100644 --- a/test/Terrain/CMakeLists.txt +++ b/test/Terrain/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Terrain Unit Tests +# Tests for terrain elevation data and tile management +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE TerrainQueryTest.cc diff --git a/test/Utilities/Audio/CMakeLists.txt b/test/Utilities/Audio/CMakeLists.txt index b0358169396c..d90e3ed4c29f 100644 --- a/test/Utilities/Audio/CMakeLists.txt +++ b/test/Utilities/Audio/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Audio Utilities Unit Tests +# Tests for audio output and speech synthesis +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE AudioOutputTest.cc diff --git a/test/Utilities/CMakeLists.txt b/test/Utilities/CMakeLists.txt index 4f4e685a7613..8af46f46f8dc 100644 --- a/test/Utilities/CMakeLists.txt +++ b/test/Utilities/CMakeLists.txt @@ -1,8 +1,16 @@ +# ============================================================================ +# Utilities Unit Tests +# Tests for various utility modules +# ============================================================================ + add_subdirectory(Audio) add_subdirectory(Compression) add_subdirectory(FileSystem) add_subdirectory(Geo) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "UtilitiesTest_res" PREFIX "/unittest" FILES diff --git a/test/Utilities/Compression/CMakeLists.txt b/test/Utilities/Compression/CMakeLists.txt index 14f676294c17..ab97ee147373 100644 --- a/test/Utilities/Compression/CMakeLists.txt +++ b/test/Utilities/Compression/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Compression Utilities Unit Tests +# Tests for decompression (GZIP, XZ, ZIP) +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE DecompressionTest.cc @@ -6,6 +11,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "UtilitiesTest_CompressionTest_res" PREFIX "/unittest" FILES diff --git a/test/Utilities/FileSystem/CMakeLists.txt b/test/Utilities/FileSystem/CMakeLists.txt index 09ecbaa6fbef..a9bdd4d6ee93 100644 --- a/test/Utilities/FileSystem/CMakeLists.txt +++ b/test/Utilities/FileSystem/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# FileSystem Utilities Unit Tests +# Tests for file download and filesystem operations +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE QGCFileDownloadTest.cc diff --git a/test/Utilities/Geo/CMakeLists.txt b/test/Utilities/Geo/CMakeLists.txt index 9636465d38e2..877f485204eb 100644 --- a/test/Utilities/Geo/CMakeLists.txt +++ b/test/Utilities/Geo/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Geo Utilities Unit Tests +# Tests for geographic calculations, shapefile parsing, and KML handling +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE GeoTest.cc @@ -8,6 +13,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "Test_Utilities_Geo_res" PREFIX "/unittest" FILES diff --git a/test/Vehicle/CMakeLists.txt b/test/Vehicle/CMakeLists.txt index fe119d1e3882..5d47fb4a7ca8 100644 --- a/test/Vehicle/CMakeLists.txt +++ b/test/Vehicle/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Vehicle Unit Tests +# Tests for vehicle connection, FTP, MAVLink commands, and link management +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE FTPManagerTest.cc @@ -18,4 +23,7 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Component Information Tests +# ---------------------------------------------------------------------------- add_subdirectory(ComponentInformation) diff --git a/test/Vehicle/ComponentInformation/CMakeLists.txt b/test/Vehicle/ComponentInformation/CMakeLists.txt index 776a61f7903f..4e52641bc2b3 100644 --- a/test/Vehicle/ComponentInformation/CMakeLists.txt +++ b/test/Vehicle/ComponentInformation/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# Component Information Unit Tests +# Tests for vehicle component metadata caching and translation +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ComponentInformationCacheTest.cc @@ -8,6 +13,9 @@ target_sources(${CMAKE_PROJECT_NAME} target_include_directories(${CMAKE_PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}) +# ---------------------------------------------------------------------------- +# Test Data Resources +# ---------------------------------------------------------------------------- qt_add_resources(${CMAKE_PROJECT_NAME} "VehicleTest_ComponentInformation_res" PREFIX "/unittest" FILES diff --git a/test/qgcunittest/CMakeLists.txt b/test/qgcunittest/CMakeLists.txt index 8f6c555b722b..66dad0615024 100644 --- a/test/qgcunittest/CMakeLists.txt +++ b/test/qgcunittest/CMakeLists.txt @@ -1,3 +1,8 @@ +# ============================================================================ +# QGC Unit Test Framework +# Core testing utilities and helpers +# ============================================================================ + target_sources(${CMAKE_PROJECT_NAME} PRIVATE MultiSignalSpy.cc diff --git a/tools/setup/install-dependencies-debian.sh b/tools/setup/install-dependencies-debian.sh index 2b027458f586..24558260dea0 100755 --- a/tools/setup/install-dependencies-debian.sh +++ b/tools/setup/install-dependencies-debian.sh @@ -114,7 +114,8 @@ apt-get install -y -qq --no-install-recommends \ # Miscellaneous # -------------------------------------------------------------------- apt-get install -y -qq --no-install-recommends \ - libvulkan-dev + libvulkan-dev \ + libpipewire-0.3-dev # -------------------------------------------------------------------- # Clean‑up