summaryrefslogtreecommitdiffstats
path: root/cmake
diff options
context:
space:
mode:
Diffstat (limited to 'cmake')
-rw-r--r--cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch15
-rw-r--r--cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake4
-rw-r--r--cmake/FindBundletool.cmake48
-rw-r--r--cmake/QtAndroidHelpers.cmake30
-rw-r--r--cmake/QtBaseHelpers.cmake3
-rw-r--r--cmake/QtFeature.cmake3
-rw-r--r--cmake/QtFlagHandlingHelpers.cmake4
-rw-r--r--cmake/QtInternalTargets.cmake19
-rw-r--r--cmake/QtModuleHelpers.cmake5
-rw-r--r--cmake/QtPlatformAndroid.cmake30
-rw-r--r--cmake/QtPostProcessHelpers.cmake2
-rw-r--r--cmake/QtPublicWasmToolchainHelpers.cmake2
-rw-r--r--cmake/QtTestHelpers.cmake7
13 files changed, 160 insertions, 12 deletions
diff --git a/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch b/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch
new file mode 100644
index 00000000000..dbbef0c9f9e
--- /dev/null
+++ b/cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch
@@ -0,0 +1,15 @@
+diff --git a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+index 8d95c69e3ad..5145d2ffd71 100644
+--- a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
++++ b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+@@ -179,8 +179,8 @@ if (ECM_ENABLE_SANITIZERS)
+ link_libraries("${linker_flags}")
+ endif()
+ if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+- string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+- string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
++ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
++ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
+ endif ()
+ endforeach()
+ else()
diff --git a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
index 8d95c69e3ad..5145d2ffd71 100644
--- a/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
+++ b/cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake
@@ -179,8 +179,8 @@ if (ECM_ENABLE_SANITIZERS)
link_libraries("${linker_flags}")
endif()
if (CMAKE_CXX_COMPILER_ID MATCHES "Clang")
- string(REPLACE "-Wl,--no-undefined" "" CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
- string(REPLACE "-Wl,--no-undefined" "" CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
+ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS}")
+ string(REGEX REPLACE "( |^)-Wl,--no-undefined( |$)" " " CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS}")
endif ()
endforeach()
else()
diff --git a/cmake/FindBundletool.cmake b/cmake/FindBundletool.cmake
new file mode 100644
index 00000000000..f691b27da89
--- /dev/null
+++ b/cmake/FindBundletool.cmake
@@ -0,0 +1,48 @@
+# Copyright (C) 2025 The Qt Company Ltd.
+# SPDX-License-Identifier: BSD-3-Clause
+
+#.rst:
+# FindBundletool
+# ---------
+#
+# Try to locate the android bundletool.
+# If found, this will define the following variables:
+#
+# ``Bundletool_FOUND``
+# True if the Bundletool is found
+#
+# ``Bundletool_EXECUTABLE ``
+# Path to the Bundletool executable
+#
+# If ``Bundletool_FOUND`` is TRUE, it will also define the following
+# imported target:
+#
+# ``Bundletool::Bundletool``
+# The Bundletool executable
+
+if(DEFINED ENV{Bundletool_EXECUTABLE})
+ if((NOT Bundletool_EXECUTABLE OR NOT EXISTS "${Bundletool_EXECUTABLE}")
+ AND EXISTS "$ENV{Bundletool_EXECUTABLE}")
+ set(_Bundletool_use_force FORCE)
+ else()
+ set(_Bundletool_use_force "")
+ endif()
+ set(Bundletool_EXECUTABLE "$ENV{Bundletool_EXECUTABLE}" CACHE FILEPATH
+ "Path to the 'bundletool' executable." ${_Bundletool_use_force})
+ unset(_Bundletool_use_force)
+endif()
+
+find_file(Bundletool_EXECUTABLE bundletool bundletool.jar)
+
+include(FindPackageHandleStandardArgs)
+find_package_handle_standard_args(Bundletool DEFAULT_MSG Bundletool_EXECUTABLE)
+
+if(Bundletool_FOUND)
+ if(NOT TARGET Bundletool::Bundletool)
+ add_executable(Bundletool::Bundletool IMPORTED)
+ set_target_properties(Bundletool::Bundletool PROPERTIES
+ IMPORTED_LOCATION "${Bundletool_EXECUTABLE}")
+ endif()
+endif()
+
+mark_as_advanced(Bundletool_EXECUTABLE)
diff --git a/cmake/QtAndroidHelpers.cmake b/cmake/QtAndroidHelpers.cmake
index 64696fff6d4..cb7d4716f12 100644
--- a/cmake/QtAndroidHelpers.cmake
+++ b/cmake/QtAndroidHelpers.cmake
@@ -473,3 +473,33 @@ function(qt_internal_create_source_jar)
add_dependencies(install_android_source_jar_${module} ${jar_target})
add_dependencies(install_android_source_jars install_android_source_jar_${module})
endfunction()
+
+# The function stores Android permissions that are required by the module target.
+# The stored INTERFACE_QT_ANDROID_PERMISSIONS is the transitive property.
+function(qt_internal_android_add_interface_permissions target)
+ get_target_property(permissions ${target} QT_ANDROID_PERMISSIONS)
+ if(NOT permissions)
+ return()
+ endif()
+
+ set(postprocessed_permissions "")
+ foreach(permission IN LISTS permissions)
+ # TODO: skip processing extras for now, add them back once internal API
+ # will cover adding extras using internal function.
+ list(APPEND postprocessed_permissions "name\;${permission}")
+ endforeach()
+ qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES
+ INTERFACE_QT_ANDROID_PERMISSIONS "${postprocessed_permissions}")
+endfunction()
+
+# The function stores Android features that are required by the module target.
+# The stored INTERFACE_QT_ANDROID_FEATURES is the transitive property.
+function(qt_internal_android_add_interface_features target)
+ get_target_property(features ${target} QT_ANDROID_FEATURES)
+ if(NOT features)
+ return()
+ endif()
+
+ qt_internal_set_module_transitive_properties(${target} TYPE LINK PROPERTIES
+ INTERFACE_QT_ANDROID_FEATURES "${features}")
+endfunction()
diff --git a/cmake/QtBaseHelpers.cmake b/cmake/QtBaseHelpers.cmake
index b3a4e8c7619..911b6001564 100644
--- a/cmake/QtBaseHelpers.cmake
+++ b/cmake/QtBaseHelpers.cmake
@@ -237,6 +237,9 @@ macro(qt_internal_qtbase_build_repo)
# Needed when building qtbase for android.
if(ANDROID)
include(src/corelib/Qt6AndroidMacros.cmake)
+ include(src/corelib/Qt6AndroidDynamicFeatureHelpers.cmake)
+ include(src/corelib/Qt6AndroidGradleHelpers.cmake)
+ include(src/corelib/Qt6AndroidPermissionHelpers.cmake)
endif()
# Needed when building for WebAssembly.
diff --git a/cmake/QtFeature.cmake b/cmake/QtFeature.cmake
index 9cffa58229e..86b1201792d 100644
--- a/cmake/QtFeature.cmake
+++ b/cmake/QtFeature.cmake
@@ -1570,7 +1570,8 @@ function(qt_run_config_compile_test name)
endif()
if(arg_CXX_STANDARD)
- if(${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20")
+ if((${arg_CXX_STANDARD} LESS 23 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.20") AND
+ (${arg_CXX_STANDARD} LESS 26 OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.25"))
set(CMAKE_CXX_STANDARD "${arg_CXX_STANDARD}")
set(CMAKE_CXX_STANDARD_REQUIRED OFF)
endif()
diff --git a/cmake/QtFlagHandlingHelpers.cmake b/cmake/QtFlagHandlingHelpers.cmake
index 1747e7c7197..67d6f37e36d 100644
--- a/cmake/QtFlagHandlingHelpers.cmake
+++ b/cmake/QtFlagHandlingHelpers.cmake
@@ -359,7 +359,9 @@ endfunction()
function(qt_set_language_standards)
## Use the latest standard the compiler supports (same as qt_common.prf)
- if (QT_FEATURE_cxx2b)
+ if (QT_FEATURE_cxx2c)
+ set(CMAKE_CXX_STANDARD 26 PARENT_SCOPE)
+ elseif (QT_FEATURE_cxx2b)
set(CMAKE_CXX_STANDARD 23 PARENT_SCOPE)
elseif (QT_FEATURE_cxx20)
set(CMAKE_CXX_STANDARD 20 PARENT_SCOPE)
diff --git a/cmake/QtInternalTargets.cmake b/cmake/QtInternalTargets.cmake
index a1f4cb7281c..c041f9d3ac5 100644
--- a/cmake/QtInternalTargets.cmake
+++ b/cmake/QtInternalTargets.cmake
@@ -94,6 +94,18 @@ function(qt_internal_set_warnings_are_errors_flags target target_scope)
${language_args}
)
endif()
+ if(APPLE)
+ qt_internal_add_compiler_dependent_flags("${target}" ${target_scope}
+ COMPILERS CLANG AppleClang
+ CONDITIONS $<BOOL:$<TARGET_PROPERTY:UNITY_BUILD>>
+ OPTIONS
+ -Wno-error=nullability-completeness
+ COMMON_CONDITIONS
+ ${common_conditions}
+ LANGUAGES
+ OBJCXX
+ )
+ endif()
# Other options are gated at compile time that are not likely to change between different build
# environments of other modules.
if(ANDROID)
@@ -356,6 +368,13 @@ if (MSVC AND NOT CLANG)
)
endif()
+if (WIN32 AND (CLANG OR MINGW) AND (TEST_architecture_arch STREQUAL x86_64))
+ # windows 10 requires cmpxchg16b
+ target_compile_options(PlatformCommonInternal INTERFACE
+ -mcx16
+ )
+endif()
+
set(_qt_internal_clang_msvc_frontend False)
if(CMAKE_CXX_COMPILER_ID STREQUAL "Clang" AND
CMAKE_CXX_COMPILER_FRONTEND_VARIANT STREQUAL "MSVC")
diff --git a/cmake/QtModuleHelpers.cmake b/cmake/QtModuleHelpers.cmake
index ecfdb740d71..f7ab67455ce 100644
--- a/cmake/QtModuleHelpers.cmake
+++ b/cmake/QtModuleHelpers.cmake
@@ -1554,8 +1554,9 @@ function(qt_describe_module target)
endif()
if(ANDROID)
string(APPEND targets_information
- "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\",
-${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n")
+ "${indent5}\"api_version\": \"${QT_ANDROID_API_USED_FOR_JAVA}\",\n"
+ "${indent5}\"ndk_version\": \"${ANDROID_NDK_REVISION}\",\n"
+ "${indent5}\"android_platform\": \"${ANDROID_PLATFORM}\",\n")
endif()
string(APPEND targets_information "${indent5}\"architecture\": \"${architecture}\",\n")
string(APPEND targets_information "${indent5}\"abi\": \"${TEST_arch_${architecture}_abi}\"\n")
diff --git a/cmake/QtPlatformAndroid.cmake b/cmake/QtPlatformAndroid.cmake
index b480b1c14a6..d56a889d114 100644
--- a/cmake/QtPlatformAndroid.cmake
+++ b/cmake/QtPlatformAndroid.cmake
@@ -30,6 +30,7 @@ include(UseJava)
# Find JDK 8.0
find_package(Java 1.8 COMPONENTS Development REQUIRED)
+find_package(Bundletool)
# Ensure we are using the shared version of libc++
if(NOT ANDROID_STL STREQUAL c++_shared)
@@ -117,13 +118,32 @@ function(qt_internal_android_test_runner_arguments target out_test_runner out_te
set(deployment_tool "${host_bin_dir}/androiddeployqt")
_qt_internal_android_get_target_android_build_dir(android_build_dir ${target})
- set(${out_test_arguments}
+ _qt_internal_android_get_platform_tools_path(platform_tools)
+ set(test_arguments
"--path" "${android_build_dir}"
- "--adb" "${ANDROID_SDK_ROOT}/platform-tools/adb"
+ "--adb" "${platform_tools}/adb"
"--skip-install-root"
- "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk"
- "--apk" "${android_build_dir}/${target}.apk"
"--ndk-stack" "${ANDROID_NDK_ROOT}/ndk-stack"
- PARENT_SCOPE
)
+
+ if(QT_USE_ANDROID_MODERN_BUNDLE)
+ _qt_internal_android_get_target_deployment_dir(target_deployment_dir ${target})
+ list(APPEND test_arguments
+ "--manifest" "${target_deployment_dir}/AndroidManifest.xml")
+ endif()
+
+ if(EXISTS "${Bundletool_EXECUTABLE}" AND QT_USE_ANDROID_MODERN_BUNDLE)
+ list(APPEND test_arguments
+ "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_aab"
+ "--aab" "${android_build_dir}/${target}.aab"
+ "--bundletool" "${Bundletool_EXECUTABLE}"
+ )
+ else()
+ list(APPEND test_arguments
+ "--make" "\"${CMAKE_COMMAND}\" --build ${CMAKE_BINARY_DIR} --target ${target}_make_apk"
+ "--apk" "${android_build_dir}/${target}.apk"
+ )
+ endif()
+
+ set(${out_test_arguments} "${test_arguments}" PARENT_SCOPE)
endfunction()
diff --git a/cmake/QtPostProcessHelpers.cmake b/cmake/QtPostProcessHelpers.cmake
index 9f220f9d78b..07fcdee268b 100644
--- a/cmake/QtPostProcessHelpers.cmake
+++ b/cmake/QtPostProcessHelpers.cmake
@@ -790,6 +790,8 @@ function(qt_modules_process_android_dependencies)
qt_internal_get_qt_repo_known_modules(repo_known_modules)
foreach (target ${repo_known_modules})
qt_internal_android_dependencies(${target})
+ qt_internal_android_add_interface_permissions(${target})
+ qt_internal_android_add_interface_features(${target})
endforeach()
endfunction()
diff --git a/cmake/QtPublicWasmToolchainHelpers.cmake b/cmake/QtPublicWasmToolchainHelpers.cmake
index ecdca052113..32309ed05ba 100644
--- a/cmake/QtPublicWasmToolchainHelpers.cmake
+++ b/cmake/QtPublicWasmToolchainHelpers.cmake
@@ -53,7 +53,7 @@ endfunction()
function(__qt_internal_get_emcc_recommended_version out_var)
# This version of Qt needs this version of emscripten.
- set(QT_EMCC_RECOMMENDED_VERSION "3.1.70")
+ set(QT_EMCC_RECOMMENDED_VERSION "4.0.7")
set(${out_var} "${QT_EMCC_RECOMMENDED_VERSION}" PARENT_SCOPE)
endfunction()
diff --git a/cmake/QtTestHelpers.cmake b/cmake/QtTestHelpers.cmake
index ad8a9d65c14..8a0666b0ceb 100644
--- a/cmake/QtTestHelpers.cmake
+++ b/cmake/QtTestHelpers.cmake
@@ -1176,6 +1176,13 @@ function(qt_internal_collect_command_environment out_path out_plugin_path)
set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}${install_prefix}")
endforeach()
set(test_env_path "${test_env_path}${QT_PATH_SEPARATOR}$ENV{PATH}")
+ if(ANDROID)
+ # Add android platform tools to path. Required for the correct androidtestrunner work.
+ _qt_internal_android_get_platform_tools_path(platform_tools)
+ string(PREPEND test_env_path
+ "${platform_tools}" "${QT_PATH_SEPARATOR}")
+ endif()
+
string(REPLACE ";" "\;" test_env_path "${test_env_path}")
set(${out_path} "${test_env_path}" PARENT_SCOPE)