diff options
Diffstat (limited to 'src/qml/Qt6AndroidQmlMacros.cmake')
-rw-r--r-- | src/qml/Qt6AndroidQmlMacros.cmake | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/qml/Qt6AndroidQmlMacros.cmake b/src/qml/Qt6AndroidQmlMacros.cmake new file mode 100644 index 0000000000..5f6f01fd76 --- /dev/null +++ b/src/qml/Qt6AndroidQmlMacros.cmake @@ -0,0 +1,139 @@ +# Copyright (C) 2022 The Qt Company Ltd. +# SPDX-License-Identifier: BSD-3-Clause + +# Recursively scans the potential_qml_modules given as list of targets by LINK_LIBRARIES. Examines +# .qml files given as part of the QT_QML_MODULE_QML_FILES target property, and collects their +# directories in out_var. These directories can be used as "root path" for qmlimportscanner. +function(_qt_internal_find_qml_root_paths potential_qml_modules out_var) + set(qml_root_paths "") + set(processed "") + + set(potential_qml_modules_queue ${potential_qml_modules}) + while(TRUE) + list(LENGTH potential_qml_modules_queue length) + if(${length} STREQUAL "0") + break() + endif() + + list(POP_FRONT potential_qml_modules_queue lib) + + if(NOT TARGET ${lib}) + continue() + endif() + + list(FIND processed ${lib} found) + if(${found} GREATER_EQUAL "0") + continue() + endif() + + get_target_property(root_paths ${lib} _qt_internal_qml_root_path) + if(root_paths) + foreach(root_path IN LISTS root_paths) + list(APPEND qml_root_paths "${root_path}") + endforeach() + endif() + + get_target_property(qml_files ${lib} QT_QML_MODULE_QML_FILES) + + foreach(qml_file IN LISTS qml_files) + get_filename_component(extension "${qml_file}" LAST_EXT) + if(NOT extension STREQUAL ".qml") + continue() + endif() + + get_filename_component(dir "${qml_file}" DIRECTORY) + get_filename_component(absolute_dir "${dir}" ABSOLUTE) + list(APPEND qml_root_paths "${absolute_dir}") + endforeach() + + # We have to consider all dependencies here, not only QML modules. + # Further QML modules may be indirectly linked via an intermediate library that is not + # a QML module. + get_target_property(dependencies ${lib} LINK_LIBRARIES) + foreach(dependency IN LISTS dependencies) + list(APPEND potential_qml_modules_queue ${dependency}) + endforeach() + + list(APPEND processed ${lib}) + endwhile() + + list(REMOVE_DUPLICATES qml_root_paths) + set(${out_var} "${qml_root_paths}" PARENT_SCOPE) +endfunction() + +# The function collects qml root paths and sets the _qt_internal_qml_root_path property to the +# ${target} based on the provided qml source files. _qt_internal_qml_root_path is used on purpose +# to not trigger the the QTP0002 warning without user intention. +function(_qt_internal_collect_qml_root_paths target) + get_target_property(qml_root_paths ${target} _qt_internal_qml_root_path) + if(NOT qml_root_paths) + set(qml_root_paths "") + endif() + foreach(file IN LISTS ARGN) + get_filename_component(extension "${file}" LAST_EXT) + if(NOT extension STREQUAL ".qml") + continue() + endif() + + get_filename_component(dir "${file}" DIRECTORY) + get_filename_component(absolute_dir "${dir}" ABSOLUTE) + list(APPEND qml_root_paths "${absolute_dir}") + endforeach() + + get_target_property(potential_qml_modules ${target} LINK_LIBRARIES) + + _qt_internal_find_qml_root_paths(${potential_qml_modules} more_paths) + if(more_paths) + foreach(path IN LISTS more_paths) + list(APPEND qml_root_paths ${path}) + endforeach() + endif() + + list(REMOVE_DUPLICATES qml_root_paths) + set_target_properties(${target} PROPERTIES _qt_internal_qml_root_path "${qml_root_paths}") +endfunction() + +# The function extracts the required QML properties from the 'target' and +# appends them to the 'out_var' using the corresponding JSON keys. +function(_qt_internal_generate_android_qml_deployment_settings out_var target) + get_target_property(target_source_dir ${target} SOURCE_DIR) + + # QML import paths + _qt_internal_collect_target_qml_import_paths(qml_import_paths ${target}) + get_target_property(native_qml_import_paths "${target}" _qt_native_qml_import_paths) + if(native_qml_import_paths) + list(PREPEND native_qml_import_paths "${qml_import_paths}") + else() + set(native_qml_import_paths "${qml_import_paths}") + endif() + list(REMOVE_DUPLICATES native_qml_import_paths) + set_property(TARGET "${target}" PROPERTY + _qt_native_qml_import_paths "${native_qml_import_paths}") + _qt_internal_add_android_deployment_multi_value_property(${out_var} "qml-import-paths" + ${target} "_qt_native_qml_import_paths") + + # Primitive QML root path: The target's source directory. + # We need this for backwards compatibility because people might not declare a proper QML module + # and instead add the .qml files as resources. In that case we won't see them below. + 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}") + + # QML root paths, recursively across all linked libraries + set(root_paths ${target_source_dir}) + _qt_internal_find_qml_root_paths(${target} root_paths) + foreach(root_path IN LISTS root_paths) + file(TO_CMAKE_PATH "${root_path}" native_root_path) + set_property(TARGET ${target} APPEND PROPERTY + _qt_android_native_qml_root_paths "${native_root_path}") + endforeach() + + _qt_internal_add_android_deployment_list_property(${out_var} "qml-root-path" + ${target} "_qt_android_native_qml_root_paths") + + # Override qmlimportscanner binary path + _qt_internal_add_tool_to_android_deployment_settings(${out_var} qmlimportscanner + "qml-importscanner-binary" ${target}) + + set(${out_var} "${${out_var}}" PARENT_SCOPE) +endfunction() |