Make android function sequence mutable

When building Qt itself or Qt standalone tests (but not user projects),
qt6_android_add_apk_target and qt6_android_generate_deployment_setting
can now be called at any time after the Android executable target is
created.

Note: Because we're now using genexes when we build Qt as described
above, Qt developers are required to use Unix-style paths for the
following target properties:
    QT_QML_IMPORT_PATH
    QT_QML_ROOT_PATH
    QT_ANDROID_PACKAGE_SOURCE_DIR

Pick-to: 6.3
Fixes: QTBUG-100796
Change-Id: Ida788f0d58bc0c028a89eed9d115babe27144325
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
Alexey Edelev 2022-02-18 19:39:49 +01:00
parent 1ba56134f5
commit 4b8bc8b5bb

View File

@ -151,12 +151,16 @@ function(qt6_android_generate_deployment_settings target)
" \"sdk\": \"${android_sdk_root_native}\",\n")
# Android SDK Build Tools Revision
get_target_property(android_sdk_build_tools ${target} QT_ANDROID_SDK_BUILD_TOOLS_REVISION)
if (NOT android_sdk_build_tools)
_qt_internal_android_get_sdk_build_tools_revision(android_sdk_build_tools)
endif()
_qt_internal_android_get_sdk_build_tools_revision(android_sdk_build_tools)
set(android_sdk_build_tools_genex "")
string(APPEND android_sdk_build_tools_genex
"$<IF:$<BOOL:$<TARGET_PROPERTY:${target},QT_ANDROID_SDK_BUILD_TOOLS_REVISION>>,"
"$<TARGET_PROPERTY:${target},QT_ANDROID_SDK_BUILD_TOOLS_REVISION>,"
"${android_sdk_build_tools}"
">"
)
string(APPEND file_contents
" \"sdkBuildToolsRevision\": \"${android_sdk_build_tools}\",\n")
" \"sdkBuildToolsRevision\": \"${android_sdk_build_tools_genex}\",\n")
# Android NDK
file(TO_CMAKE_PATH "${CMAKE_ANDROID_NDK}" android_ndk_root_native)
@ -323,6 +327,9 @@ function(qt6_android_add_apk_target target)
if (NOT deployment_file)
message(FATAL_ERROR "Target ${target} is not a valid android executable target\n")
endif()
# Use genex to get path to the deployment settings, the above check only to confirm that
# qt6_android_add_apk_target is called on an android executable target.
set(deployment_file "$<TARGET_PROPERTY:${target},QT_ANDROID_DEPLOYMENT_SETTINGS_FILE>")
# Make global apk and aab targets depend on the current apk target.
if(TARGET aab)
@ -334,6 +341,7 @@ function(qt6_android_add_apk_target target)
endif()
set(deployment_tool "${QT_HOST_PATH}/${QT6_HOST_INFO_BINDIR}/androiddeployqt")
# No need to use genex for the BINARY_DIR since it's read-only.
get_target_property(target_binary_dir ${target} BINARY_DIR)
set(apk_final_dir "${target_binary_dir}/android-build")
set(apk_file_name "${target}.apk")
@ -655,7 +663,7 @@ endfunction()
# The function converts the target property to a json record and appends it to the output
# variable.
function(_qt_internal_add_android_deployment_property out_var json_key target property)
set(property_genex "$<TARGET_PROPERTY:${target},${property}>")
set(property_genex "$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${property}>>")
string(APPEND ${out_var}
"$<$<BOOL:${property_genex}>:"
" \"${json_key}\": \"${property_genex}\"\,\n"
@ -699,7 +707,7 @@ function(_qt_internal_add_android_deployment_list_property out_var json_key)
endif()
set(property_genex
"$<TARGET_PROPERTY:${target},${property}>"
"$<GENEX_EVAL:$<TARGET_PROPERTY:${target},${property}>>"
)
set(add_quote_genex
"$<$<BOOL:${property_genex}>:\">"
@ -708,7 +716,7 @@ function(_qt_internal_add_android_deployment_list_property out_var json_key)
"${list_join_genex}"
"${add_comma_genex}${add_quote_genex}"
"$<JOIN:"
"$<GENEX_EVAL:${property_genex}>,"
"${property_genex},"
"\",\""
">"
"${add_quote_genex}"
@ -748,14 +756,28 @@ endfunction()
# It doesn't overwrite public properties, but instead writes formatted values to internal
# properties.
function(_qt_internal_android_format_deployment_paths target)
_qt_internal_android_format_deployment_path_property(${target}
QT_QML_IMPORT_PATH _qt_native_qml_import_paths)
if(QT_BUILD_STANDALONE_TESTS OR QT_BUILDING_QT)
# When building standalone tests or Qt itself we obligate developers to not use
# windows paths when setting QT_* properties below, so their values are used as is when
# generating deployment settings.
set_target_properties(${target} PROPERTIES
_qt_native_qml_import_paths "$<TARGET_PROPERTY:${target},QT_QML_IMPORT_PATH>"
_qt_android_native_qml_root_paths "$<TARGET_PROPERTY:${target},QT_QML_ROOT_PATH>"
_qt_android_native_package_source_dir
"$<TARGET_PROPERTY:${target},QT_ANDROID_PACKAGE_SOURCE_DIR>"
)
else()
# User projects still may use windows paths inside the QT_* properties below, with
# obligation to run the finalizer code.
_qt_internal_android_format_deployment_path_property(${target}
QT_QML_IMPORT_PATH _qt_native_qml_import_paths)
_qt_internal_android_format_deployment_path_property(${target}
QT_QML_ROOT_PATH _qt_android_native_qml_root_paths)
_qt_internal_android_format_deployment_path_property(${target}
QT_QML_ROOT_PATH _qt_android_native_qml_root_paths)
_qt_internal_android_format_deployment_path_property(${target}
QT_ANDROID_PACKAGE_SOURCE_DIR _qt_android_native_package_source_dir)
_qt_internal_android_format_deployment_path_property(${target}
QT_ANDROID_PACKAGE_SOURCE_DIR _qt_android_native_package_source_dir)
endif()
endfunction()
# The function converts the value of target property to JSON compatible path and writes the