diff options
Diffstat (limited to 'cmake')
-rw-r--r-- | cmake/3rdparty/extra-cmake-modules/0003-ECMEnableSanitizers.cmake-fix-no-undefined-flag-replacement.patch | 15 | ||||
-rw-r--r-- | cmake/3rdparty/extra-cmake-modules/modules/ECMEnableSanitizers.cmake | 4 | ||||
-rw-r--r-- | cmake/FindBundletool.cmake | 48 | ||||
-rw-r--r-- | cmake/QtAndroidHelpers.cmake | 30 | ||||
-rw-r--r-- | cmake/QtBaseHelpers.cmake | 3 | ||||
-rw-r--r-- | cmake/QtFeature.cmake | 3 | ||||
-rw-r--r-- | cmake/QtFlagHandlingHelpers.cmake | 4 | ||||
-rw-r--r-- | cmake/QtInternalTargets.cmake | 19 | ||||
-rw-r--r-- | cmake/QtModuleHelpers.cmake | 5 | ||||
-rw-r--r-- | cmake/QtPlatformAndroid.cmake | 30 | ||||
-rw-r--r-- | cmake/QtPostProcessHelpers.cmake | 2 | ||||
-rw-r--r-- | cmake/QtPublicWasmToolchainHelpers.cmake | 2 | ||||
-rw-r--r-- | cmake/QtTestHelpers.cmake | 7 |
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) |