From 0c8dddc0bed582bef23c82e4fca496c9f1086e17 Mon Sep 17 00:00:00 2001 From: Holden Ramsey Date: Sat, 8 Feb 2025 04:14:48 -0500 Subject: [PATCH] CMake: Cleanup CMakeLists --- .github/workflows/android-linux.yml | 1 + .github/workflows/android-windows.yml | 1 + .github/workflows/custom.yml | 1 + .github/workflows/docker-linux.yml | 1 + .github/workflows/linux.yml | 1 + .github/workflows/macos.yml | 1 + .github/workflows/windows.yml | 1 + CMakeLists.txt | 242 +++++------------- cmake/CustomOptions.cmake | 57 +++-- cmake/Install.cmake | 68 +++++ ...{printSummary.cmake => PrintSummary.cmake} | 18 +- cmake/Qt6QGCConfiguration.cmake | 61 ----- custom-example/CMakeLists.txt | 6 +- test/CMakeLists.txt | 3 - 14 files changed, 192 insertions(+), 270 deletions(-) create mode 100644 cmake/Install.cmake rename cmake/{printSummary.cmake => PrintSummary.cmake} (90%) delete mode 100644 cmake/Qt6QGCConfiguration.cmake diff --git a/.github/workflows/android-linux.yml b/.github/workflows/android-linux.yml index d732216728d..d50703d2533 100644 --- a/.github/workflows/android-linux.yml +++ b/.github/workflows/android-linux.yml @@ -14,6 +14,7 @@ on: - 'src/**' - 'android/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/android-windows.yml b/.github/workflows/android-windows.yml index b8e0e43d40b..fb5b223b344 100644 --- a/.github/workflows/android-windows.yml +++ b/.github/workflows/android-windows.yml @@ -14,6 +14,7 @@ on: - 'src/**' - 'android/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/custom.yml b/.github/workflows/custom.yml index f4cc62d12d8..d9fade3be0f 100644 --- a/.github/workflows/custom.yml +++ b/.github/workflows/custom.yml @@ -14,6 +14,7 @@ on: - 'src/**' - 'custom-example/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/docker-linux.yml b/.github/workflows/docker-linux.yml index 37930b93130..03c924b26c1 100644 --- a/.github/workflows/docker-linux.yml +++ b/.github/workflows/docker-linux.yml @@ -14,6 +14,7 @@ on: - 'deploy/linux/**' - 'src/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/linux.yml b/.github/workflows/linux.yml index e888db1ada8..ac627c6e829 100644 --- a/.github/workflows/linux.yml +++ b/.github/workflows/linux.yml @@ -14,6 +14,7 @@ on: - 'src/**' - 'test/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/macos.yml b/.github/workflows/macos.yml index 0dcfe837615..f396c65d787 100644 --- a/.github/workflows/macos.yml +++ b/.github/workflows/macos.yml @@ -13,6 +13,7 @@ on: - 'deploy/macos/**' - 'src/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/.github/workflows/windows.yml b/.github/workflows/windows.yml index 69961b8dd21..12f0d7fa386 100644 --- a/.github/workflows/windows.yml +++ b/.github/workflows/windows.yml @@ -13,6 +13,7 @@ on: - 'deploy/windows/**' - 'src/**' - 'CMakeLists.txt' + - 'cmake/**' # concurrency: # group: ${{ github.workflow }}-${{ github.ref }} diff --git a/CMakeLists.txt b/CMakeLists.txt index c88ef213575..2e9460ca03a 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -6,6 +6,11 @@ list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/find-modules ) +if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) + set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) + set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release") +endif() + set(CMAKE_REQUIRED_QUIET ON) ####################################################### @@ -27,7 +32,7 @@ endif() # set(CMAKE_OSX_ARCHITECTURES "arm64") # set(CMAKE_OSX_SYSROOT "iphoneos") -if(APPLE AND NOT IOS) +if(APPLE) set(CMAKE_OSX_DEPLOYMENT_TARGET "12.0") endif() @@ -40,10 +45,6 @@ project(${QGC_APP_NAME} LANGUAGES C CXX ) -if(UNIX AND NOT APPLE AND NOT ANDROID) - set(LINUX TRUE) -endif() - if(APPLE AND NOT IOS) set(MACOS TRUE) endif() @@ -53,7 +54,6 @@ endif() ####################################################### include(GNUInstallDirs) -include(CMakeDependentOption) include(FetchContent) include(CMakePrintHelpers) @@ -64,63 +64,52 @@ 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) -if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES) - set(CMAKE_BUILD_TYPE Release CACHE STRING "Build type" FORCE) - set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS "Debug;Release") -endif() - -if(LINUX) - set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/AppDir/usr) -else() - set(CMAKE_INSTALL_PREFIX ${CMAKE_BINARY_DIR}/staging) +if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT) + if(LINUX) + set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_BINARY_DIR}/AppDir/usr") + else() + set_property(CACHE CMAKE_INSTALL_PREFIX PROPERTY VALUE "${CMAKE_BINARY_DIR}/staging") + endif() endif() -if(UNIX) - find_program(CCACHE_PROGRAM ccache) - if(CCACHE_PROGRAM) - message(STATUS "Using CCache") - set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) - set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) - if(APPLE) - set(CMAKE_OBJC_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) +if(QGC_USE_CACHE) + if(CMAKE_HOST_UNIX) + find_program(CCACHE_PROGRAM ccache) + if(CCACHE_PROGRAM) + message(STATUS "Using CCache") + set(CMAKE_C_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) + set(CMAKE_CXX_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) + if(APPLE) + set(CMAKE_OBJC_COMPILER_LAUNCHER ${CCACHE_PROGRAM}) + endif() endif() - endif() -elseif(WIN32) - find_program(SCCACHE_PROGRAM sccache) - if(SCCACHE_PROGRAM) - message(STATUS "Using SCCache") - set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE_PROGRAM}) - set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE_PROGRAM}) - endif() - if(MSVC) - if(CMAKE_BUILD_TYPE STREQUAL "Debug") - string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG}") - string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG}") - elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - string(REPLACE "/Zi" "/Z7" CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE}") - string(REPLACE "/Zi" "/Z7" CMAKE_C_FLAGS_RELEASE "${CMAKE_C_FLAGS_RELEASE}") - endif() - set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) - if(POLICY CMP0141) - cmake_policy(SET CMP0141 NEW) + elseif(CMAKE_HOST_WIN32) + find_program(SCCACHE_PROGRAM sccache) + if(SCCACHE_PROGRAM) + message(STATUS "Using SCCache") + set(CMAKE_C_COMPILER_LAUNCHER ${SCCACHE_PROGRAM}) + set(CMAKE_CXX_COMPILER_LAUNCHER ${SCCACHE_PROGRAM}) endif() endif() endif() +if(MSVC) + set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT Embedded) +endif() + if(CMAKE_CROSSCOMPILING AND ANDROID) 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() -set(BUILD_SHARED_LIBS OFF CACHE BOOL "" FORCE) -set(CMAKE_RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") -set(CMAKE_LIBRARY_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/$") +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 if(POLICY CMP0168) @@ -146,9 +135,6 @@ 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) execute_process(COMMAND ${QMAKE_EXECUTABLE} -query QT_VERSION OUTPUT_VARIABLE QT_VERSION) if(QT_VERSION LESS QT_MINIMUM_VERSION) @@ -156,10 +142,6 @@ if(QT_VERSION LESS 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=0x060800) if(CMAKE_BUILD_TYPE STREQUAL "Release") @@ -169,33 +151,11 @@ if(CMAKE_BUILD_TYPE STREQUAL "Release") 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 + list(APPEND QT_ANDROID_MULTI_ABI_FORWARD_VARS QGC_STABLE_BUILD QT_HOST_PATH) endif() find_package(Qt6 @@ -239,8 +199,8 @@ if(LINUX) endif() qt_standard_project_setup( - REQUIRES ${QT_MINIMUM_VERSION} - SUPPORTS_UP_TO ${QT_MINIMUM_VERSION} + REQUIRES ${QGC_QT_MINIMUM_VERSION} + SUPPORTS_UP_TO ${QGC_QT_MAXIMUM_VERSION} I18N_SOURCE_LANGUAGE en ) @@ -256,45 +216,28 @@ qt_policy( # QGroundControl Options ####################################################### -if(NOT QGC_STABLE_BUILD) - add_compile_definitions(QGC_DAILY_BUILD) -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) -else() - set(BUILD_TESTING OFF CACHE INTERNAL "") -endif() - -# option(QGC_DISABLE_MAVLINK_INSPECTOR "Disable Mavlink Inspector" OFF) # This removes QtCharts which is GPL licensed - -cmake_dependent_option(QGC_DEBUG_QML "Build QGroundControl with QML debugging/profiling support." OFF "CMAKE_BUILD_TYPE STREQUAL Debug" OFF) -if(QGC_DEBUG_QML) - message(STATUS "To enable the QML debugger/profiler, run with: '-qmljsdebugger=port:1234'") - add_compile_definitions(QT_QML_DEBUG) -endif() - -if(QGC_DISABLE_APM_MAVLINK) - add_compile_definitions(QGC_NO_ARDUPILOT_DIALECT) -endif() +add_compile_definitions( + $<$>:QGC_DAILY_BUILD> + $<$:QGC_UNITTEST_BUILD> + $<$:QT_QML_DEBUG> + $<$:QGC_NO_ARDUPILOT_DIALECT> + $<$:QGC_VIEWER3D> +) -if(QGC_VIEWER3D) - add_compile_definitions(QGC_VIEWER3D) +if(NOT QGC_BUILD_TESTING) + set(BUILD_TESTING OFF CACHE INTERNAL "" FORCE) endif() if("${CMAKE_OSX_ARCHITECTURES}" MATCHES "arm64;x86_64" OR "${CMAKE_OSX_ARCHITECTURES}" MATCHES "x86_64;arm64") - set(MACOS_UNIVERSAL_BUILD ON CACHE INTERNAL "" FORCE) + set(MACOS_UNIVERSAL_BUILD ON) endif() # TODO: Force building dependencies if(NOT CMAKE_HOST_SYSTEM_PROCESSOR STREQUAL CMAKE_SYSTEM_PROCESSOR)? # if(CMAKE_OSX_ARCHITECTURES AND NOT "${CMAKE_HOST_SYSTEM_PROCESSOR}" IN_LIST CMAKE_OSX_ARCHITECTURES) -cmake_dependent_option(QGC_BUILD_DEPENDENCIES "Force Building of Dependencies." OFF "NOT CMAKE_CROSSCOMPILING;NOT MACOS_UNIVERSAL_BUILD" ON) - include(CPM) if(CMAKE_CROSSCOMPILING OR ANDROID OR MACOS_UNIVERSAL_BUILD) - set(CPM_DOWNLOAD_ALL ON CACHE BOOL "Download all Dependencies" FORCE) + set(CPM_DOWNLOAD_ALL ON) endif() ####################################################### @@ -341,6 +284,8 @@ endif() ####################################################### qt_add_executable(${CMAKE_PROJECT_NAME} + WIN32 + MACOSX_BUNDLE src/main.cc ${QGC_RESOURCES} ) @@ -409,8 +354,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" @@ -446,7 +391,7 @@ elseif(IOS) ) # set(QT_NO_FFMPEG_XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON) - # qt_add_ios_ffmpeg_libraries(CMAKE_PROJECT_NAME) + qt_add_ios_ffmpeg_libraries(${CMAKE_PROJECT_NAME}) elseif(ANDROID) include(CPM) CPMAddPackage( @@ -498,8 +443,8 @@ target_link_libraries(${CMAKE_PROJECT_NAME} Qt6::Core Qt6::Core5Compat Qt6::Quick - Qt6::Widgets Qt6::Svg + Qt6::Widgets QGC QmlControls ) @@ -532,77 +477,6 @@ qt_import_plugins(${CMAKE_PROJECT_NAME} INCLUDE_BY_TYPE sqldrivers Qt6::QSQLiteDriverPlugin ) -####################################################### -# Install Configuration -####################################################### - -include(InstallRequiredSystemLibraries) - -install( - TARGETS ${CMAKE_PROJECT_NAME} - LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} - RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} - ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} - BUNDLE DESTINATION . -) - -set(deploy_tool_options_arg "") -if(MACOS OR WIN32) - set(deploy_tool_options_arg "-qmldir=${CMAKE_SOURCE_DIR}") - if(MACOS_SIGNING_IDENTITY) - message(STATUS "Signing MacOS Bundle") - set(deploy_tool_options_arg "${deplay_tool_options_arg} -sign-for-notarization=${MACOS_SIGNING_IDENTITY}") - endif() -endif() - -qt_generate_deploy_qml_app_script( - TARGET ${CMAKE_PROJECT_NAME} - OUTPUT_SCRIPT deploy_script - DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg} - MACOS_BUNDLE_POST_BUILD - NO_UNSUPPORTED_PLATFORM_ERROR - DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM -) -install(SCRIPT ${deploy_script}) - -if(ANDROID) - # get_target_property(QGC_ANDROID_DEPLOY_FILE ${CMAKE_PROJECT_NAME} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE) - # cmake_print_variables(QGC_ANDROID_DEPLOY_FILE) -elseif(LINUX) - configure_file( - ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in - ${CMAKE_BINARY_DIR}/org.mavlink.qgroundcontrol.desktop - @ONLY - ) - install( - FILES ${CMAKE_BINARY_DIR}/org.mavlink.qgroundcontrol.desktop - DESTINATION ${CMAKE_INSTALL_DATADIR}/applications - ) - install( - FILES ${QGC_APPIMAGE_ICON_PATH} - DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/ - RENAME org.mavlink.qgroundcontrol.png - ) - configure_file( - ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in - ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml - @ONLY - ) - install( - FILES ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml - DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo/ - ) - install( - FILES ${CMAKE_SOURCE_DIR}/deploy/linux/AppRun - DESTINATION ${CMAKE_BINARY_DIR} - ) - install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateAppImage.cmake") -elseif(WIN32) - install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake") -elseif(MACOS) - install(CODE "set(TARGET_APP_NAME ${QGC_APP_NAME})") - install(CODE "set(MACDEPLOYQT ${Qt6_DIR}/../../../bin/macdeployqt)") - install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateMacDMG.cmake") -endif() +include(Install) -include(printSummary) +include(PrintSummary) diff --git a/cmake/CustomOptions.cmake b/cmake/CustomOptions.cmake index 805f9cac208..b32966b9888 100644 --- a/cmake/CustomOptions.cmake +++ b/cmake/CustomOptions.cmake @@ -1,35 +1,59 @@ +include(CMakeDependentOption) # The following options can be overriden by custom builds using the CustomOverrides.cmake file -# General +# App set(QGC_APP_NAME "QGroundControl" CACHE STRING "App Name") set(QGC_APP_COPYRIGHT "Copyright (c) 2024 QGroundControl. All rights reserved." CACHE STRING "Copyright") set(QGC_APP_DESCRIPTION "Open Source Ground Control App" CACHE STRING "Description") set(QGC_ORG_NAME "QGroundControl.org" CACHE STRING "Org Name") set(QGC_ORG_DOMAIN "org.qgroundcontrol" CACHE STRING "Domain") +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 +option(BUILD_SHARED_LIBS "Build using shared libraries" OFF) option(QGC_STABLE_BUILD "Stable Build" OFF) -option(QGC_DOWNLOAD_DEPENDENCIES "Download Dependencies if Possible" ON) +option(QGC_USE_CACHE "Use Build Caching" 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." OFF "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 -option(QGC_UTM_ADAPTER "Enable UTM Adapter" OFF) -option(QGC_VIEWER3D "Enable Viewer3D" ON) # Qt6Quick3D_FOUND - +# Video option(QGC_ENABLE_UVC "Enable UVC Devices" ON) # Qt6Multimedia_FOUND option(QGC_ENABLE_GST_VIDEOSTREAMING "Enable GStreamer Video Backend" ON) option(QGC_ENABLE_QT_VIDEOSTREAMING "Enable QtMultimedia Video Backend" OFF) # Qt6Multimedia_FOUND +# 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 "b71f061a53941637cbcfc5bcf860f96bc82e0892" 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_MIN_SDK_VERSION "28" CACHE STRING "Android Min SDK Version") set(QGC_QT_ANDROID_TARGET_SDK_VERSION "35" CACHE STRING "Android Target SDK Version") set(QGC_ANDROID_PACKAGE_NAME "org.mavlink.qgroundcontrol" 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) # MacOS set(QGC_BUNDLE_ID "org.qgroundcontrol.QGroundControl" CACHE STRING "MacOS Bundle ID") # MACOS @@ -42,17 +66,14 @@ set(QGC_APPIMAGE_ICON_PATH "${CMAKE_SOURCE_DIR}/resources/icons/qgroundcontrol.p 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") -# 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) - -# 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. -set(QGC_SETTINGS_VERSION "9" CACHE STRING "Settings Version") - +# CPM set(CPM_SOURCE_CACHE ${CMAKE_BINARY_DIR}/cpm_modules CACHE PATH "Directory to download CPM dependencies") + +# Qt +set(QGC_QT_MINIMUM_VERSION "6.8.1" CACHE STRING "Minimum Supported Qt Version") +set(QGC_QT_MAXIMUM_VERSION "6.8.2" CACHE STRING "Maximum Supported Qt Version") +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(QML_IMPORT_TRACE "Debug QML Imports" OFF) +option(QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING "Silence Missing Dependency Warnings" OFF) +option(QT_ENABLE_VERBOSE_DEPLOYMENT "Verbose Deployment" OFF) diff --git a/cmake/Install.cmake b/cmake/Install.cmake new file mode 100644 index 00000000000..49a841e44c0 --- /dev/null +++ b/cmake/Install.cmake @@ -0,0 +1,68 @@ +include(InstallRequiredSystemLibraries) + +install( + TARGETS ${CMAKE_PROJECT_NAME} + LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} + RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} + ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} + BUNDLE DESTINATION . +) + +set(deploy_tool_options_arg "") +if(MACOS OR WIN32) + set(deploy_tool_options_arg "-qmldir=${CMAKE_SOURCE_DIR}") + if(MACOS_SIGNING_IDENTITY) + message(STATUS "Signing MacOS Bundle") + set(deploy_tool_options_arg "${deplay_tool_options_arg} -sign-for-notarization=${MACOS_SIGNING_IDENTITY}") + endif() +endif() + +qt_generate_deploy_qml_app_script( + TARGET ${CMAKE_PROJECT_NAME} + OUTPUT_SCRIPT deploy_script + DEPLOY_TOOL_OPTIONS ${deploy_tool_options_arg} + MACOS_BUNDLE_POST_BUILD + NO_UNSUPPORTED_PLATFORM_ERROR + DEPLOY_USER_QML_MODULES_ON_UNSUPPORTED_PLATFORM +) +install(SCRIPT ${deploy_script}) + +if(ANDROID) + # get_target_property(QGC_ANDROID_DEPLOY_FILE ${CMAKE_PROJECT_NAME} QT_ANDROID_DEPLOYMENT_SETTINGS_FILE) + # cmake_print_variables(QGC_ANDROID_DEPLOY_FILE) +elseif(LINUX) + configure_file( + ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.desktop.in + ${CMAKE_BINARY_DIR}/org.mavlink.qgroundcontrol.desktop + @ONLY + ) + install( + FILES ${CMAKE_BINARY_DIR}/org.mavlink.qgroundcontrol.desktop + DESTINATION ${CMAKE_INSTALL_DATADIR}/applications + ) + install( + FILES ${QGC_APPIMAGE_ICON_PATH} + DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/128x128/apps/ + RENAME org.mavlink.qgroundcontrol.png + ) + configure_file( + ${CMAKE_SOURCE_DIR}/deploy/linux/org.mavlink.qgroundcontrol.metainfo.xml.in + ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml + @ONLY + ) + install( + FILES ${CMAKE_BINARY_DIR}/metainfo/org.mavlink.qgroundcontrol.metainfo.xml + DESTINATION ${CMAKE_INSTALL_DATADIR}/metainfo/ + ) + install( + FILES ${CMAKE_SOURCE_DIR}/deploy/linux/AppRun + DESTINATION ${CMAKE_BINARY_DIR} + ) + install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateAppImage.cmake") +elseif(WIN32) + install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateWinInstaller.cmake") +elseif(MACOS) + install(CODE "set(TARGET_APP_NAME ${QGC_APP_NAME})") + install(CODE "set(MACDEPLOYQT ${Qt6_DIR}/../../../bin/macdeployqt)") + install(SCRIPT "${CMAKE_SOURCE_DIR}/cmake/CreateMacDMG.cmake") +endif() diff --git a/cmake/printSummary.cmake b/cmake/PrintSummary.cmake similarity index 90% rename from cmake/printSummary.cmake rename to cmake/PrintSummary.cmake index 3dda683517a..13c0850007e 100644 --- a/cmake/printSummary.cmake +++ b/cmake/PrintSummary.cmake @@ -74,7 +74,6 @@ endif() OptionOutput( "Stable Build: " QGC_STABLE_BUILD ) OptionOutput( "Building Tests: " QGC_BUILD_TESTING AND BUILD_TESTING ) OptionOutput( "Debug QML: " QGC_DEBUG_QML ) -OptionOutput( "Build Dependencies: " QGC_BUILD_DEPENDENCIES ) OptionOutput( "Disable APM Dialect: " QGC_DISABLE_APM_MAVLINK ) OptionOutput( "Disable APM Plugin: " QGC_DISABLE_APM_PLUGIN ) OptionOutput( "Disable APM Plugin Factory: " QGC_DISABLE_APM_PLUGIN_FACTORY ) @@ -94,3 +93,20 @@ message( STATUS "MAVLink Git Tag: ${QGC_MAVLINK_GIT_TAG}" ) message( STATUS "" ) message( STATUS "------------------------------------------------------------------" ) message( STATUS "" ) + +# QT_ANDROID_MULTI_ABI_FORWARD_VARS +# QT_ANDROID_APPLICATION_ARGUMENTS +# QT_HOST_PATH +# QT_ANDROID_SIGN_AAB +# QT_ANDROID_SIGN_APK +# 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 +# QT_ANDROID_DEPLOY_RELEASE +# QT_USE_TARGET_ANDROID_BUILD_DIR +# QT_ANDROID_DEPLOYMENT_TYPE +# QT_ENABLE_VERBOSE_DEPLOYMENT + +# QGC_QT_MINIMUM_VERSION +# QGC_QT_MAXIMUM_VERSION +# QT_SILENCE_MISSING_DEPENDENCY_TARGET_WARNING 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/custom-example/CMakeLists.txt b/custom-example/CMakeLists.txt index 7f2e467ad67..c2338b88b7b 100644 --- a/custom-example/CMakeLists.txt +++ b/custom-example/CMakeLists.txt @@ -23,7 +23,7 @@ if(ANDROID) "${DEFAULT_ANDROID_DIR}/" "${CUSTOM_ANDROID_DIR}/" ) - set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${FINAL_ANDROID_DIR}" CACHE STRING "Path to a custom Android package template" FORCE) + set(QGC_ANDROID_PACKAGE_SOURCE_DIR "${FINAL_ANDROID_DIR}" CACHE PATH "Path to a custom Android package template" FORCE) message(STATUS "Android package template path will be set to: ${QGC_ANDROID_PACKAGE_SOURCE_DIR}") else() message(STATUS "Custom Android package template empty. Using default.") @@ -54,9 +54,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 "Paths to .qrc 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}/res" CACHE STRING "Extra qml import paths" FORCE) qt_add_library(CustomPlugin STATIC src/CustomPlugin.cc diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt index ee1d75a6875..dea58864038 100644 --- a/test/CMakeLists.txt +++ b/test/CMakeLists.txt @@ -4,9 +4,6 @@ endif() find_package(Qt6 REQUIRED COMPONENTS Core Test) -include(CTest) -enable_testing() - # if(ANDROID) # include(AndroidTestUtilities) # endif()