diff options
author | Alexey Edelev <alexey.edelev@qt.io> | 2021-09-07 14:19:47 +0200 |
---|---|---|
committer | Alexey Edelev <alexey.edelev@qt.io> | 2021-09-09 23:44:39 +0200 |
commit | 76665f2a72857916667ebe6b04a804ed8abb5853 (patch) | |
tree | 1518a85919a759f9160b21f45bee5dbbf2aacac7 /src | |
parent | d20f4ae706559fb7de8db9dd4845f7ce3936061a (diff) |
Replace manual android properties reading with genex's
Since qt6_android_generate_deployment_settings uses 'file(GENERATE'
API now, we can use generator expressions when writing target
properties to deployment setting files.
This adds the generic functions to accumulate list and non-list
target properties and write them to a deployment setting file
with respecitve key.
Change-Id: Ibfdc875c84c39166f26b2f12ab59831d4f9a6e00
Reviewed-by: Assam Boudjelthia <assam.boudjelthia@qt.io>
Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
Diffstat (limited to 'src')
-rw-r--r-- | src/corelib/Qt6AndroidMacros.cmake | 216 |
1 files changed, 128 insertions, 88 deletions
diff --git a/src/corelib/Qt6AndroidMacros.cmake b/src/corelib/Qt6AndroidMacros.cmake index 144a082c6f..015ad81825 100644 --- a/src/corelib/Qt6AndroidMacros.cmake +++ b/src/corelib/Qt6AndroidMacros.cmake @@ -19,7 +19,15 @@ endfunction() # Generate the deployment settings json file for a cmake target. function(qt6_android_generate_deployment_settings target) - # Avoid calling the function twice + # When parsing JSON file format backslashes and follow up symbols are regarded as special + # characters. This puts Windows path format into a trouble. + # _qt_internal_android_format_deployment_paths converts sensitive paths to the CMake format + # that is supported by JSON as well. The function should be called as many times as + # qt6_android_generate_deployment_settings, because users may change properties that contain + # paths inbetween the calls. + _qt_internal_android_format_deployment_paths(${target}) + + # Avoid calling the function body twice because of 'file(GENERATE'. get_target_property(is_called ${target} _qt_is_android_generate_deployment_settings_called) if(is_called) return() @@ -124,93 +132,47 @@ function(qt6_android_generate_deployment_settings target) " \"architectures\": { \"${CMAKE_ANDROID_ARCH_ABI}\" : \"${arch_value}\" },\n") # deployment dependencies - get_target_property(android_deployment_dependencies - ${target} QT_ANDROID_DEPLOYMENT_DEPENDENCIES) - if (android_deployment_dependencies) - list(JOIN android_deployment_dependencies "," android_deployment_dependencies) - string(APPEND file_contents - " \"deployment-dependencies\": \"${android_deployment_dependencies}\",\n") - endif() + _qt_internal_add_android_deployment_multi_value_property(file_contents ${target} + "QT_ANDROID_DEPLOYMENT_DEPENDENCIES" "dependencies") # Extra plugins - get_target_property(android_extra_plugins ${target} QT_ANDROID_EXTRA_PLUGINS) - if (android_extra_plugins) - list(JOIN android_extra_plugins "," android_extra_plugins) - string(APPEND file_contents - " \"android-extra-plugins\": \"${android_extra_plugins}\",\n") - endif() + _qt_internal_add_android_deployment_multi_value_property(file_contents ${target} + "QT_ANDROID_EXTRA_PLUGINS" "android-extra-plugins") # Extra libs - get_target_property(android_extra_libs ${target} QT_ANDROID_EXTRA_LIBS) - if (android_extra_libs) - list(JOIN android_extra_libs "," android_extra_libs) - string(APPEND file_contents - " \"android-extra-libs\": \"${android_extra_libs}\",\n") - endif() + _qt_internal_add_android_deployment_multi_value_property(file_contents ${target} + "QT_ANDROID_EXTRA_LIBS" "android-extra-libs") # package source dir - set(android_package_source_dir_genex - "$<TARGET_PROPERTY:${target},QT_ANDROID_PACKAGE_SOURCE_DIR>") - string(APPEND file_contents - "$<$<BOOL:${android_package_source_dir_genex}>:" - " \"android-package-source-directory\": \"${android_package_source_dir_genex}\"\,\n" - ">") + _qt_internal_add_android_deployment_property(file_contents ${target} + "_qt_android_native_package_source_dir" "android-package-source-directory") # version code - get_target_property(android_version_code ${target} QT_ANDROID_VERSION_CODE) - if (android_version_code) - string(APPEND file_contents - " \"android-version-code\": \"${android_version_code}\",\n") - endif() + _qt_internal_add_android_deployment_property(file_contents ${target} + "QT_ANDROID_VERSION_CODE" "android-version-code") # version name - get_target_property(android_version_name ${target} QT_ANDROID_VERSION_NAME) - if (android_version_name) - string(APPEND file_contents - " \"android-version-name\": \"${android_version_name}\",\n") - endif() + _qt_internal_add_android_deployment_property(file_contents ${target} + "QT_ANDROID_VERSION_NAME" "android-version-name") # minimum SDK version - get_target_property(android_min_sdk_version ${target} QT_ANDROID_MIN_SDK_VERSION) - if(android_min_sdk_version) - string(APPEND file_contents - " \"android-min-sdk-version\": \"${android_min_sdk_version}\",\n") - endif() + _qt_internal_add_android_deployment_property(file_contents ${target} + "QT_ANDROID_MIN_SDK_VERSION" "android-min-sdk-version") # target SDK version - get_target_property(android_target_sdk_version ${target} QT_ANDROID_TARGET_SDK_VERSION) - if(android_target_sdk_version) - string(APPEND file_contents - " \"android-target-sdk-version\": \"${android_target_sdk_version}\",\n") - endif() + _qt_internal_add_android_deployment_property(file_contents ${target} + "QT_ANDROID_TARGET_SDK_VERSION" "android-target-sdk-version") - get_target_property(qml_import_path ${target} QT_QML_IMPORT_PATH) - if (qml_import_path) - set(_import_paths "") - foreach(_path IN LISTS qml_import_path) - file(TO_CMAKE_PATH "${_path}" _path) - list(APPEND _import_paths ${_path}) - endforeach() - list(JOIN _import_paths "," _import_paths) - string(APPEND file_contents - " \"qml-import-paths\": \"${_import_paths}\",\n") - endif() - - get_target_property(qml_root_paths ${target} QT_QML_ROOT_PATH) - if(NOT qml_root_paths) - set(qml_root_paths "${target_source_dir}") - endif() - - set(qml_native_root_paths "") - foreach(root_path IN LISTS qml_root_paths) - file(TO_CMAKE_PATH "${root_path}" qml_root_path_native) - list(APPEND qml_native_root_paths "\"${qml_root_path_native}\"") - endforeach() + # QML import paths + _qt_internal_add_android_deployment_multi_value_property(file_contents ${target} + "_qt_native_qml_import_paths" "qml-import-paths") - list(JOIN qml_native_root_paths "," qml_native_root_paths) - - string(APPEND file_contents - " \"qml-root-path\": [${qml_native_root_paths}],\n") + # QML root paths + 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") # App binary string(APPEND file_contents @@ -244,6 +206,7 @@ function(qt6_android_generate_deployment_settings target) foreach(prefix IN LISTS CMAKE_FIND_ROOT_PATH) if (NOT "${prefix}" STREQUAL "${qt_android_install_dir_native}" AND NOT "${prefix}" STREQUAL "${android_ndk_root_native}") + file(TO_CMAKE_PATH "${prefix}" prefix) list(APPEND extra_prefix_list "\"${prefix}\"") endif() endforeach() @@ -255,22 +218,8 @@ function(qt6_android_generate_deployment_settings target) # # Unlike 'extraPrefixDirs', the 'extraLibraryDirs' key doesn't expect the 'lib' subfolder # when looking for dependencies. - set(extra_library_dirs_property_genex - "$<TARGET_PROPERTY:${target},_qt_android_extra_library_dirs>" - ) - set(extra_library_dirs_add_quote_genex - "$<$<BOOL:${extra_library_dirs_property_genex}>:\">" - ) - string(JOIN "" extra_library_dirs - "${extra_library_dirs_add_quote_genex}" - "$<JOIN:" - "$<GENEX_EVAL:${extra_library_dirs_property_genex}>," - "\",\"" - ">" - "${extra_library_dirs_add_quote_genex}" - ) - string(APPEND file_contents - " \"extraLibraryDirs\" : [ ${extra_library_dirs} ],\n") + _qt_internal_add_android_deployment_list_property(file_contents ${target} + "_qt_android_extra_library_dirs" "extraLibraryDirs") if(QT_FEATURE_zstd) set(is_zstd_enabled "true") @@ -519,6 +468,97 @@ function(_qt_internal_create_global_apk_all_target_if_needed) endif() 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 target property json_key) + set(property_genex "$<TARGET_PROPERTY:${target},${property}>") + string(APPEND ${out_var} + "$<$<BOOL:${property_genex}>:" + " \"${json_key}\": \"${property_genex}\"\,\n" + ">" + ) + + 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 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}" + ) + string(APPEND ${out_var} + " \"${json_key}\" : [ ${list_join_genex} ],\n") + set(${out_var} "${${out_var}}" PARENT_SCOPE) +endfunction() + +# The function converts the target list property to a json multi-value string record and appends it +# to the output variable. +# The generated JSON object is a simple string with the list property items separated by commas, +# e.g: +# "android-extra-plugins": "plugin1,plugin2", +function(_qt_internal_add_android_deployment_multi_value_property out_var target property json_key) + set(property_genex + "$<TARGET_PROPERTY:${target},${property}>" + ) + string(JOIN "" list_join_genex + "$<JOIN:" + "$<GENEX_EVAL:${property_genex}>," + "," + ">" + ) + string(APPEND ${out_var} + "$<$<BOOL:${property_genex}>:" + " \"${json_key}\" : \"${list_join_genex}\",\n" + ">" + ) + + set(${out_var} "${${out_var}}" PARENT_SCOPE) +endfunction() + +# The function converts paths to the CMake format to make them acceptable for JSON. +# 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_android_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_ANDROID_PACKAGE_SOURCE_DIR _qt_android_native_package_source_dir) +endfunction() + +# The function converts the value of target property to JSON compatible path and writes the +# result to out_property. Property might be either single value, semicolon separated list or system +# path spec. +function(_qt_internal_android_format_deployment_path_property target property out_property) + get_target_property(_paths ${target} ${property}) + if(_paths) + set(native_paths "") + foreach(_path IN LISTS _paths) + file(TO_CMAKE_PATH "${_path}" _path) + list(APPEND native_paths "${_path}") + endforeach() + set_target_properties(${target} PROPERTIES + ${out_property} "${native_paths}") + endif() +endfunction() + if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) function(qt_android_add_apk_target) qt6_android_add_apk_target(${ARGV}) |