aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/Qt6AndroidQmlMacros.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/Qt6AndroidQmlMacros.cmake')
-rw-r--r--src/qml/Qt6AndroidQmlMacros.cmake139
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()