summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexey Edelev <alexey.edelev@qt.io>2021-12-27 17:45:39 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2022-01-04 19:02:50 +0000
commitac7a9907cbfabb6c0f4ea5cd64302cd3c69b1646 (patch)
tree24157e3d19e9d026eb8ad25430ccb81a3180afff
parentfe0772e10824dd0488ed6441146fe207343a52f3 (diff)
Collect the apk dependencies regardless of target
_qt_internal_collect_target_apk_dependencies function is common for all targets, but its signature was telling that it's target-specific. This also causes an issue when we had more than one target in tree that produce apk, since only first target got the property after respective finalizer was executed. This change generalize the function and uses _qt_internal_apk_dependencies target to store the extra library directories from the build tree. _qt_internal_add_android_deployment_list_property signature is also changed to support reading values from multiple lists of multiple targets. Amends d20f4ae706559fb7de8db9dd4845f7ce3936061a Change-Id: I5b40fa96a0eb73348c0029e2b13c63a9465cb520 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> (cherry picked from commit 585f46c811353cf7e940fa8a9ff08315af0004ef) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--src/corelib/Qt6AndroidMacros.cmake101
-rw-r--r--src/corelib/Qt6CoreMacros.cmake2
2 files changed, 71 insertions, 32 deletions
diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake
index 38903a23a6..22e3ca614d 100644
--- a/src/corelib/Qt6AndroidMacros.cmake
+++ b/src/corelib/Qt6AndroidMacros.cmake
@@ -218,8 +218,8 @@ function(qt6_android_generate_deployment_settings target)
file(TO_CMAKE_PATH "${target_source_dir}" native_target_source_dir)
set_property(TARGET ${target} APPEND PROPERTY
_qt_android_native_qml_root_paths "${native_target_source_dir}")
- _qt_internal_add_android_deployment_list_property(file_contents ${target}
- "_qt_android_native_qml_root_paths" "qml-root-path")
+ _qt_internal_add_android_deployment_list_property(file_contents "qml-root-path"
+ ${target} "_qt_android_native_qml_root_paths")
# App binary
string(APPEND file_contents
@@ -265,8 +265,11 @@ function(qt6_android_generate_deployment_settings target)
#
# Unlike 'extraPrefixDirs', the 'extraLibraryDirs' key doesn't expect the 'lib' subfolder
# when looking for dependencies.
- _qt_internal_add_android_deployment_list_property(file_contents ${target}
- "_qt_android_extra_library_dirs" "extraLibraryDirs")
+ # TODO: add a public target property accessible from user space
+ _qt_internal_add_android_deployment_list_property(file_contents "extraLibraryDirs"
+ ${target} "_qt_android_extra_library_dirs"
+ _qt_internal_apk_dependencies "_qt_android_extra_library_dirs"
+ )
if(QT_FEATURE_zstd)
set(is_zstd_enabled "true")
@@ -490,7 +493,7 @@ function(qt6_android_add_apk_target target)
endif()
set_property(GLOBAL APPEND PROPERTY _qt_apk_targets ${target})
- _qt_internal_collect_target_apk_dependencies_defer(${target})
+ _qt_internal_collect_apk_dependencies_defer()
endfunction()
function(_qt_internal_create_global_android_targets)
@@ -519,21 +522,21 @@ endfunction()
# than or equal to 3.18.
# Note: Users that use cmake version less that 3.18 need to call qt_finalize_project
# in the end of a project's top-level CMakeLists.txt.
-function(_qt_internal_collect_target_apk_dependencies_defer target)
+function(_qt_internal_collect_apk_dependencies_defer)
# User opted-out the functionality
if(QT_NO_COLLECT_BUILD_TREE_APK_DEPS)
return()
endif()
- get_property(is_called GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_defer_called)
+ get_property(is_called GLOBAL PROPERTY _qt_is_collect_apk_dependencies_defer_called)
if(is_called) # Already scheduled
return()
endif()
- set_property(GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_defer_called TRUE)
+ set_property(GLOBAL PROPERTY _qt_is_collect_apk_dependencies_defer_called TRUE)
if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.18")
cmake_language(EVAL CODE "cmake_language(DEFER DIRECTORY \"${CMAKE_SOURCE_DIR}\"
- CALL _qt_internal_collect_target_apk_dependencies ${target})")
+ CALL _qt_internal_collect_apk_dependencies)")
else()
# User don't want to see the warning
if(NOT QT_NO_WARN_BUILD_TREE_APK_DEPS)
@@ -550,17 +553,17 @@ endfunction()
# The function collects shared libraries from the build system tree, that might be dependencies for
# the main apk targets.
-function(_qt_internal_collect_target_apk_dependencies target)
+function(_qt_internal_collect_apk_dependencies)
# User opted-out the functionality
if(QT_NO_COLLECT_BUILD_TREE_APK_DEPS)
return()
endif()
- get_property(is_called GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_called)
+ get_property(is_called GLOBAL PROPERTY _qt_is_collect_apk_dependencies_called)
if(is_called)
return()
endif()
- set_property(GLOBAL PROPERTY _qt_is_collect_target_apk_dependencies_called TRUE)
+ set_property(GLOBAL PROPERTY _qt_is_collect_apk_dependencies_called TRUE)
get_property(apk_targets GLOBAL PROPERTY _qt_apk_targets)
@@ -572,7 +575,7 @@ function(_qt_internal_collect_target_apk_dependencies target)
foreach(lib IN LISTS libs)
if(NOT lib IN_LIST apk_targets)
- list(APPEND extra_prefix_dirs "$<TARGET_FILE_DIR:${lib}>")
+ list(APPEND extra_library_dirs "$<TARGET_FILE_DIR:${lib}>")
get_target_property(target_type ${lib} TYPE)
# We collect all MODULE_LIBRARY targets since target APK may have implicit dependency
# to the plugin that will cause the runtime issue. Plugins that were added using
@@ -584,7 +587,12 @@ function(_qt_internal_collect_target_apk_dependencies target)
endif()
endforeach()
- set_target_properties(${target} PROPERTIES _qt_android_extra_library_dirs "${extra_prefix_dirs}")
+ if(NOT TARGET _qt_internal_apk_dependencies)
+ add_custom_target(_qt_internal_apk_dependencies)
+ endif()
+ set_target_properties(_qt_internal_apk_dependencies PROPERTIES
+ _qt_android_extra_library_dirs "${extra_library_dirs}"
+ )
endfunction()
# The function recursively goes through the project subfolders and collects targets that supposed to
@@ -655,25 +663,56 @@ function(_qt_internal_add_android_deployment_property out_var json_key target pr
set(${out_var} "${${out_var}}" PARENT_SCOPE)
endfunction()
-# The function converts the target list property to a json list record and appends it to the output
-# variable.
+# The function converts the list properties of the targets to a json list record and appends it
+# to the output variable.
+# _qt_internal_add_android_deployment_list_property(out_var json_key [<target> <property>]...)
# The generated JSON object is the normal JSON array, e.g.:
# "qml-root-path": ["qml/root/path1","qml/root/path2"],
-function(_qt_internal_add_android_deployment_list_property out_var target property json_key)
- set(property_genex
- "$<TARGET_PROPERTY:${target},${property}>"
- )
- set(add_quote_genex
- "$<$<BOOL:${property_genex}>:\">"
- )
- string(JOIN "" list_join_genex
- "${add_quote_genex}"
- "$<JOIN:"
- "$<GENEX_EVAL:${property_genex}>,"
- "\",\""
- ">"
- "${add_quote_genex}"
- )
+function(_qt_internal_add_android_deployment_list_property out_var json_key)
+ list(LENGTH ARGN argn_count)
+ math(EXPR is_odd "${argn_count} % 2")
+ if(is_odd)
+ message(FATAL_ERROR "Invalid argument count")
+ endif()
+
+ set(skip_next FALSE)
+ set(property_genex "")
+ math(EXPR last_index "${argn_count} - 1")
+ foreach(idx RANGE ${last_index})
+ if(skip_next)
+ set(skip_next FALSE)
+ continue()
+ endif()
+ set(skip_next TRUE)
+
+ math(EXPR property_idx "${idx} + 1")
+ list(GET ARGN ${idx} target)
+ list(GET ARGN ${property_idx} property)
+
+ # Add comma if we have at least one element from the previous iteration
+ if(property_genex)
+ set(add_comma_genex
+ "$<$<BOOL:${property_genex}>:$<COMMA>>"
+ )
+ endif()
+
+ set(property_genex
+ "$<TARGET_PROPERTY:${target},${property}>"
+ )
+ set(add_quote_genex
+ "$<$<BOOL:${property_genex}>:\">"
+ )
+ string(JOIN "" list_join_genex
+ "${list_join_genex}"
+ "${add_comma_genex}${add_quote_genex}"
+ "$<JOIN:"
+ "$<GENEX_EVAL:${property_genex}>,"
+ "\",\""
+ ">"
+ "${add_quote_genex}"
+ )
+ endforeach()
+
string(APPEND ${out_var}
" \"${json_key}\" : [ ${list_join_genex} ],\n")
set(${out_var} "${${out_var}}" PARENT_SCOPE)
diff --git a/src/corelib/Qt6CoreMacros.cmake b/src/corelib/Qt6CoreMacros.cmake
index afaa416349..6140d12a9e 100644
--- a/src/corelib/Qt6CoreMacros.cmake
+++ b/src/corelib/Qt6CoreMacros.cmake
@@ -2317,7 +2317,7 @@ function(qt6_finalize_project)
message("qt6_finalize_project is called not in the top-level CMakeLists.txt.")
endif()
if(ANDROID)
- _qt_internal_collect_target_apk_dependencies()
+ _qt_internal_collect_apk_dependencies()
endif()
endfunction()