diff --git a/.clang-format b/.clang-format index e1345f284b5..5649307e105 100644 --- a/.clang-format +++ b/.clang-format @@ -1,17 +1,3 @@ ---- BasedOnStyle: Google -AccessModifierOffset: -4 -AllowShortEnumsOnASingleLine: false -AllowShortFunctionsOnASingleLine: Inline -AllowShortLambdasOnASingleLine: Inline -BinPackArguments: false -BinPackParameters: false ColumnLimit: 120 -IncludeBlocks: Preserve IndentWidth: 4 -Language: Cpp -PackConstructorInitializers: Never -PenaltyBreakAssignment: 80 -SortIncludes: true -SpacesBeforeTrailingComments: 1 -Standard: c++17 diff --git a/.clang-tidy b/.clang-tidy index b9925b48bb8..5e2e27df0e1 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -1,39 +1,5 @@ --- Checks: > - clang-diagnostic-*, clang-analyzer-*, - bugprone-*, - cppcoreguidelines-*, - google-*, - llvm-*, - misc-*, - modernize-*, - performance-*, - portability-*, - readability-*, - -bugprone-easily-swappable-parameters, - -cppcoreguidelines-avoid-c-arrays, - -cppcoreguidelines-avoid-const-or-ref-data-members, - -cppcoreguidelines-avoid-non-const-global-variables, - -cppcoreguidelines-non-private-member-variables-in-classes, - -cppcoreguidelines-pro-type-reinterpret-cast, - -cppcoreguidelines-pro-type-static-cast-downcast, - -cppcoreguidelines-pro-type-vararg, - -cppcoreguidelines-special-member-functions, - -google-readability-todo, - -llvm-header-guard, - -llvm-include-order, - -misc-include-cleaner, - -misc-no-recursion, - -misc-non-private-member-variables-in-classes, - -misc-use-internal-linkage, - -modernize-avoid-c-arrays, - -modernize-use-trailing-return-type, - -readability-convert-member-functions-to-static, - -readability-function-cognitive-complexity, - -readability-identifier-length, - -readability-redundant-access-specifiers, - -readability-uppercase-literal-suffix WarningsAsErrors: '*' -HeaderFilterRegex: '^((?!vendor).)*$' ... diff --git a/.cmake-format b/.cmake-format index ca863a20680..ec4bf6fab11 100644 --- a/.cmake-format +++ b/.cmake-format @@ -1,3 +1,6 @@ -format: - tab_size: 4 - line_width: 100 +--- +line_width: 120 +tab_size: 4 +max_prefix_chars: 40 +use_tabchars: false +... diff --git a/.dockerignore b/.dockerignore index 724cfc15826..0df659476f9 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,6 +1,7 @@ # Ignore Git repository files .git .gitignore +.gitattributes # Ignore node_modules or other build artifacts node_modules @@ -10,8 +11,4 @@ build Dockerfile* docker-compose.yml -# Ignore OS-specific files -.DS_Store -*.swp - -CMakeLists.txt.user* +README.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 4122b57d746..5ace4600a1f 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,11 +1,6 @@ version: 2 updates: - - package-ecosystem: github-actions - directory: / + - package-ecosystem: "github-actions" + directory: "/" schedule: - interval: daily - groups: - github-actions: - patterns: - - '*' - open-pull-requests-limit: 5 + interval: "weekly" diff --git a/.github/workflows/clang-format-check.yml b/.github/workflows/clang-format-check.yml new file mode 100644 index 00000000000..c412066f3c5 --- /dev/null +++ b/.github/workflows/clang-format-check.yml @@ -0,0 +1,20 @@ +name: clang-format Check + +on: [workflow_dispatch] + +jobs: + formatting-check: + name: Formatting Check + runs-on: ubuntu-latest + strategy: + matrix: + path: + - 'src' + - 'test' + steps: + - uses: actions/checkout@v4 + - name: Run clang-format style check for C++ Source Files. + uses: jidicula/clang-format-action@main + with: + clang-format-version: '17' + check-path: ${{ matrix.path }} diff --git a/.github/workflows/flatpak.yml b/.github/workflows/flatpak.yml new file mode 100644 index 00000000000..f3792510806 --- /dev/null +++ b/.github/workflows/flatpak.yml @@ -0,0 +1,31 @@ +name: flatpak +on: [workflow_dispatch] +jobs: + flatpak-builder: + name: Flatpak + runs-on: ubuntu-latest + container: + image: bilelmoussaoui/flatpak-github-actions:gnome-47 + options: --privileged + strategy: + matrix: + arch: [x86_64, aarch64] + fail-fast: false + steps: + - uses: actions/checkout@v4 + - name: Install deps + if: ${{ matrix.arch != 'x86_64' }} + run: | + dnf -y install docker + - name: Set up QEMU + if: ${{ matrix.arch != 'x86_64' }} + id: qemu + uses: docker/setup-qemu-action@v3 + with: + platforms: arm64 + - uses: flatpak/flatpak-github-actions/flatpak-builder@v6 + with: + bundle: org.mavlink.qgroundcontrol.flatpak + manifest-path: ./deploy/flatpak/org.mavlink.qgroundcontrol.yml + cache-key: flatpak-builder-${{ github.sha }} + arch: ${{ matrix.arch }} diff --git a/.github/workflows/spelling.yml b/.github/workflows/spelling.yml new file mode 100644 index 00000000000..50220d543d5 --- /dev/null +++ b/.github/workflows/spelling.yml @@ -0,0 +1,11 @@ +name: Typos +on: [workflow_dispatch] +jobs: + typos: + name: Spell Check with Typos + runs-on: ubuntu-latest + steps: + - name: Checkout Actions Repository + uses: actions/checkout@v4 + - name: Check spelling + uses: crate-ci/typos@master diff --git a/CMakeLists.txt b/CMakeLists.txt index 774dce8de81..46b4fd87680 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -46,6 +46,10 @@ if(APPLE AND NOT IOS) set(MACOS TRUE) endif() +if(APPLE) + enable_language(OBJC) +endif() + ####################################################### # CMake Configuration Options ####################################################### @@ -62,7 +66,7 @@ set(CMAKE_AUTOMOC ON) set(CMAKE_AUTOUIC ON) set(CMAKE_AUTORCC ON) -set(CMAKE_INCLUDE_CURRENT_DIR OFF) +set(CMAKE_INCLUDE_CURRENT_DIR ON) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(CMAKE_POSITION_INDEPENDENT_CODE ON) # set(CMAKE_AUTOGEN_BETTER_GRAPH_MULTI_CONFIG ON) @@ -138,11 +142,6 @@ endif() # Qt6 Configuration ####################################################### -if(CMAKE_CROSSCOMPILING AND NOT IS_DIRECTORY ${QT_HOST_PATH}) - message(FATAL_ERROR "You need to set QT_HOST_PATH to cross compile Qt.") -endif() - -set(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING ON) set(QT_MINIMUM_VERSION 6.8.1) find_program(QMAKE_EXECUTABLE NAMES qmake HINTS ${QT_ROOT_DIR} ${QTDIR} ENV QTDIR PATH_SUFFIXES bin) @@ -151,83 +150,38 @@ if(QT_VERSION LESS QT_MINIMUM_VERSION) MESSAGE(FATAL_ERROR "Minimum supported Qt version: ${QT_MINIMUM_VERSION}. Installed version: ${QT_VERSION}") endif() - -include(Qt6QGCConfiguration) - -set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "Install path for QML" FORCE) -set(QML_IMPORT_PATH ${CMAKE_SOURCE_DIR}/src ${CMAKE_SOURCE_DIR}/qml ${CMAKE_BINARY_DIR}/imports CACHE STRING "Extra QML Import Paths" FORCE) add_compile_definitions(QT_DISABLE_DEPRECATED_UP_TO=0x060700) -if(CMAKE_BUILD_TYPE STREQUAL "Release") - add_compile_definitions( - NDEBUG - QT_NO_DEBUG - QT_NO_DEBUG_OUTPUT - ) -elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") - set(ENABLE_TESTING ON) - enable_testing() - include(CTest) - - # set(QT_ENABLE_VERBOSE_DEPLOYMENT ON CACHE BOOL "Verbose Deployment") -endif() - -if(ANDROID) - cmake_print_variables(QT_ANDROID_APPLICATION_ARGUMENTS QT_HOST_PATH) - - # set(QT_USE_TARGET_ANDROID_BUILD_DIR ON CACHE BOOL "Use Target Android Build Dir" FORCE) - - list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QGC_STABLE_BUILD) - list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QT_HOST_PATH) - cmake_print_variables(QT_ANDROID_MULTI_ABI_FORWARD_VARS) - # QT_ANDROID_DEPLOY_RELEASE - # set(QT_ANDROID_DEPLOYMENT_TYPE ON CACHE BOOL "Deployment Type") - cmake_dependent_option(QT_ANDROID_SIGN_APK "Enable Signing APK" ON "CMAKE_BUILD_TYPE STREQUAL Release" OFF) - if(QT_ANDROID_SIGN_AAB) - message(STATUS "Signing AAB") - endif() - if(QT_ANDROID_SIGN_APK) - message(STATUS "Signing APK") - endif() - # message(STATUS "QT_ANDROID_KEYSTORE_PATH $ENV{QT_ANDROID_KEYSTORE_PATH}") - # message(STATUS "QT_ANDROID_KEYSTORE_ALIAS $ENV{QT_ANDROID_KEYSTORE_ALIAS}") - # QT_ANDROID_KEYSTORE_STORE_PASS, QT_ANDROID_KEYSTORE_KEY_PASS -endif() - find_package(Qt6 ${QT_MINIMUM_VERSION} - REQUIRED COMPONENTS + Bluetooth + Charts Concurrent Core Core5Compat + LinguistTools Location Multimedia + MultimediaQuickPrivate Network OpenGL Positioning Qml QmlIntegration Quick + Quick3D + Quick3DTools QuickControls2 QuickWidgets Sensors + SerialPort Sql Svg + Test TextToSpeech Widgets Xml - OPTIONAL_COMPONENTS - Bluetooth - Charts - LinguistTools - MultimediaQuickPrivate - Quick3D - Quick3DTools - SerialPort - Test - HINTS - ${QT_LIBRARY_HINTS} ) if(LINUX) @@ -248,6 +202,46 @@ qt_policy( SET QTP0005 NEW ) +set(QT_QML_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/qml" CACHE PATH "Install path for QML" FORCE) +set(QML_IMPORT_PATH "${CMAKE_SOURCE_DIR}/src" CACHE STRING "Extra QML Import Paths" FORCE) +# set(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING ON) + +if(CMAKE_BUILD_TYPE STREQUAL "Release") + add_compile_definitions( + NDEBUG + QT_NO_DEBUG + QT_NO_DEBUG_OUTPUT + ) +elseif(CMAKE_BUILD_TYPE STREQUAL "Debug") + set(ENABLE_TESTING ON) + enable_testing() + include(CTest) + + # set(QT_ENABLE_VERBOSE_DEPLOYMENT ON CACHE BOOL "Verbose Deployment") +endif() + +if(ANDROID) + cmake_print_variables(QT_ANDROID_APPLICATION_ARGUMENTS QT_HOST_PATH) + + # set(QT_USE_TARGET_ANDROID_BUILD_DIR ON CACHE BOOL "Use Target Android Build Dir" FORCE) + + list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QGC_STABLE_BUILD) + list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QT_HOST_PATH) + cmake_print_variables(QT_ANDROID_MULTI_ABI_FORWARD_VARS) + # QT_ANDROID_DEPLOY_RELEASE + # set(QT_ANDROID_DEPLOYMENT_TYPE ON CACHE BOOL "Deployment Type") + cmake_dependent_option(QT_ANDROID_SIGN_APK "Enable Signing APK" ON "CMAKE_BUILD_TYPE STREQUAL Release" OFF) + if(QT_ANDROID_SIGN_AAB) + message(STATUS "Signing AAB") + endif() + if(QT_ANDROID_SIGN_APK) + message(STATUS "Signing APK") + endif() + # message(STATUS "QT_ANDROID_KEYSTORE_PATH $ENV{QT_ANDROID_KEYSTORE_PATH}") + # message(STATUS "QT_ANDROID_KEYSTORE_ALIAS $ENV{QT_ANDROID_KEYSTORE_ALIAS}") + # QT_ANDROID_KEYSTORE_STORE_PASS, QT_ANDROID_KEYSTORE_KEY_PASS +endif() + ####################################################### # QGroundControl Options ####################################################### @@ -259,8 +253,9 @@ endif() cmake_dependent_option(QGC_BUILD_TESTING "Enable testing" ON "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) if(QGC_BUILD_TESTING) add_compile_definitions(QGC_UNITTEST_BUILD) + set(BUILD_TESTING ON CACHE INTERNAL "" FORCE) else() - set(BUILD_TESTING OFF CACHE INTERNAL "") + set(BUILD_TESTING OFF CACHE INTERNAL "" FORCE) endif() # option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable Mavlink Inspector" OFF) # This removes QtCharts which is GPL licensed @@ -400,8 +395,8 @@ elseif(MACOS) set(MACOSX_BUNDLE_ICON_FILE "macx.icns") set(app_icon_macos "${QGC_MACOS_ICON_PATH}/macx.icns") set_source_files_properties(${app_icon_macos} PROPERTIES MACOSX_PACKAGE_LOCATION "Resources") - target_sources(${PROJECT_NAME} PRIVATE ${app_icon_macos}) - set_target_properties(${PROJECT_NAME} + target_sources(${CMAKE_PROJECT_NAME} PRIVATE ${app_icon_macos}) + set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES MACOSX_BUNDLE TRUE MACOSX_BUNDLE_INFO_PLIST "${CMAKE_SOURCE_DIR}/deploy/macos/MacOSXBundleInfo.plist.in" @@ -415,8 +410,6 @@ elseif(MACOS) MACOSX_BUNDLE_SHORT_VERSION_STRING "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}" ) elseif(IOS) - enable_language(OBJC) - set(CMAKE_XCODE_ATTRIBUTE_IPHONEOS_DEPLOYMENT_TARGET "14.0") set(CMAKE_XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1,2") # iPhone,iPad set(CMAKE_XCODE_ATTRIBUTE_INFOPLIST_FILE "${CMAKE_CURRENT_SOURCE_DIR}/deploy/ios/iOS-Info.plist") @@ -540,10 +533,14 @@ install( set(deploy_tool_options_arg "") if(MACOS) + list(APPEND deploy_tool_options_arg -appstore-compliant -qmldir=${CMAKE_SOURCE_DIR} -verbose=2) if(MACOS_SIGNING_IDENTITY) message(STATUS "Signing MacOS Bundle") - set(deploy_tool_options_arg -qmldir=${CMAKE_SOURCE_DIR} -verbose=2 -sign-for-notarization=${MACOS_SIGNING_IDENTITY}) # -dmg + list(APPEND deploy_tool_options_arg -sign-for-notarization="${MACOS_SIGNING_IDENTITY}") + else() + list(APPEND deploy_tool_options_arg -hardened-runtime -timestamp) endif() + # -dmg endif() qt_generate_deploy_qml_app_script( diff --git a/CMakePresets.json b/_CMakePresets.json similarity index 100% rename from CMakePresets.json rename to _CMakePresets.json diff --git a/cmake/Qt6QGCConfiguration.cmake b/cmake/Qt6QGCConfiguration.cmake deleted file mode 100644 index 6c9332dafa8..00000000000 --- a/cmake/Qt6QGCConfiguration.cmake +++ /dev/null @@ -1,61 +0,0 @@ -if(DEFINED ENV{QT_VERSION}) - set(QT_VERSION $ENV{QT_VERSION}) -endif() - -if(NOT QT_VERSION) - # if QT version not specified then use any available version - file(GLOB FOUND_QT_VERSIONS - LIST_DIRECTORIES true - $ENV{HOME}/Qt/6.8.* - ) - if(NOT FOUND_QT_VERSIONS) - return() - endif() - list(GET FOUND_QT_VERSIONS 0 QT_VERSION_PATH) - get_filename_component(QT_VERSION ${QT_VERSION_PATH} NAME) -endif() - -if(DEFINED ENV{QT_MKSPEC}) - set(QT_MKSPEC $ENV{QT_MKSPEC}) -endif() - -if(NOT QT_MKSPEC) - if(APPLE) - set(QT_MKSPEC clang_64) - elseif(LINUX) - set(QT_MKSPEC gcc_64) - elseif(WIN32) - set(QT_MKSPEC msvc2022_64) - elseif(ANDROID) - if(${ANDROID_ABI} STREQUAL armeabi-v7a) - set(QT_MKSPEC android_armv7) - elseif(${ANDROID_ABI} STREQUAL arm64-v8a) - set(QT_MKSPEC android_arm64_v8a) - elseif(${ANDROID_ABI} STREQUAL x86) - set(QT_MKSPEC android_x86) - elseif(${ANDROID_ABI} STREQUAL x86_64) - set(QT_MKSPEC android_x86_64) - endif() - endif() -endif() - -set(QT_LIBRARY_HINTS - $ENV{QT_PATH}/${QT_VERSION}/${QT_MKSPEC} - ${Qt6_DIR} -) - -if(ANDROID) - list(APPEND QT_LIBRARY_HINTS ${QT_HOST_PATH}/lib/cmake) -elseif(WIN32) - list(APPEND QT_LIBRARY_HINTS C:/Qt/${QT_VERSION}/${QT_MKSPEC}) -elseif(LINUX) - list(APPEND QT_LIBRARY_HINTS $ENV{HOME}/Qt/${QT_VERSION}/${QT_MKSPEC}) -endif() - -include(CMakePrintHelpers) -cmake_print_variables(QT_VERSION QT_MKSPEC QT_LIBRARY_HINTS) - -# if(ANDROID) - # set(ENV{PKG_CONFIG_SYSROOT_DIR} ${CMAKE_SYSROOT}) - # message(STATUS "PKG_CONFIG_SYSROOT_DIR $ENV{PKG_CONFIG_SYSROOT_DIR}") -# endif() diff --git a/codecov.yml b/codecov.yml index d25776f5338..28eb813be3b 100644 --- a/codecov.yml +++ b/codecov.yml @@ -1,7 +1,10 @@ +codecov: + notify: + require_ci_to_pass: yes + coverage: - round: down - precision: 1 status: project: default: - threshold: 1% + target: 10% + threshold: 5% diff --git a/custom-example/CMakeLists.txt b/custom-example/CMakeLists.txt index 7f2e467ad67..10045e5a462 100644 --- a/custom-example/CMakeLists.txt +++ b/custom-example/CMakeLists.txt @@ -1,4 +1,5 @@ message(STATUS "Adding Custom Plugin") + find_package(Qt6 REQUIRED COMPONENTS Core) # Enable custom build @@ -54,9 +55,9 @@ list(APPEND CUSTOM_RESOURCES ${CMAKE_CURRENT_SOURCE_DIR}/qgroundcontrol.qrc ${CMAKE_CURRENT_SOURCE_DIR}/custom.qrc ) -set(QGC_RESOURCES ${CUSTOM_RESOURCES} PARENT_SCOPE) +set(QGC_RESOURCES ${QGC_RESOURCES} ${CUSTOM_RESOURCES} CACHE STRING "Target Deployable Resources" FORCE) -set(QML_IMPORT_PATH "${CMAKE_CURRENT_SOURCE_DIR}/res" CACHE STRING "Extra qml import paths" PARENT_SCOPE) +set(QML_IMPORT_PATH ${QML_IMPORT_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/qml ${CMAKE_CURRENT_SOURCE_DIR}/res CACHE STRING "Extra qml import paths" FORCE) qt_add_library(CustomPlugin STATIC src/CustomPlugin.cc diff --git a/deploy/flatpak/org.mavlink.qgroundcontrol.yml b/deploy/flatpak/org.mavlink.qgroundcontrol.yml new file mode 100644 index 00000000000..36ad9105c85 --- /dev/null +++ b/deploy/flatpak/org.mavlink.qgroundcontrol.yml @@ -0,0 +1,40 @@ +app-id: org.mavlink.qgroundcontrol +runtime: org.kde.Platform +runtime-version: 6.8 +sdk: org.kde.Sdk +command: QGroundControl +rename-appdata-file: org.mavlink.qgroundcontrol.metainfo.xml + +finish-args: + - --socket=wayland + - --socket=fallback-x11 + - --socket=pulseaudio + - --device=all # allow access USB Serial + - --share=ipc + - --share=network + - --filesystem=home + - --filesystem=xdg-run/gvfs # GVfs + - --filesystem=/media # automount via udisks + - --filesystem=/run/udev:ro # enables firmware upload & auto connecting + +modules: + - name: QGroundControl + sources: + - type: git + url: https://github.com/mavlink/qgroundcontrol.git + tag: master + commit: e9e8f4cd93f96cefaa26936c971e939b0fc5e838 + buildsystem: cmake-ninja + builddir: true + config-opts: + - -D BUILD_SHARED_LIBS=OFF + - -D OpenGL_GL_PREFERENCE=GLVND + - -D BUILD_TESTING=OFF + cleanup: + - /include + - /bin/dbf* + - /bin/shp* + - /lib/cmake + - /share/shapelib + - '*.a' + - '*.cmake' diff --git a/deploy/linux/appimagecraft.yml b/deploy/linux/appimagecraft.yml new file mode 100644 index 00000000000..7863231dfaf --- /dev/null +++ b/deploy/linux/appimagecraft.yml @@ -0,0 +1,23 @@ +version: 1 + +project: + name: QGroundControl + version: Daily + +build: + cmake: + source_dir: src/ + extra_variables: + - Qt6_ROOT=/home/runner/work/_temp/Qt/6.6.3/gcc_64 + environment: + BUILD_TYPE: Release + +appimage: + linuxdeploy: + plugins: + # - qt + raw_environment: + QML_SOURCES_PATHS: "\"$PROJECT_ROOT\"/src/qmlcomponents/" + environment: + EXTRA_PLATFORM_PLUGINS: "libqwayland-egl.so;libqwayland-generic.so" + EXTRA_QT_PLUGINS: "waylandcompositor"