Support for QML Type Registrar
Change-Id: Ifc1f44cf40b22c20ab768333ba9d5ce58a5f7250 Reviewed-by: Alexandru Croitor <alexandru.croitor@qt.io>
This commit is contained in:
parent
48c82e90af
commit
cce8ada814
@ -2349,75 +2349,6 @@ function(qt_add_plugin target)
|
||||
qt_internal_add_linker_version_script(${target})
|
||||
endfunction()
|
||||
|
||||
# Generate custom ${target}_qmltypes target for Qml Plugins
|
||||
function(qt_add_qmltypes_target target)
|
||||
|
||||
# Do nothing when cross compiling
|
||||
if (CMAKE_CROSSCOMPILING)
|
||||
return()
|
||||
endif()
|
||||
|
||||
# Do nothing during a Qt static build (because the tool isn't built in that case).
|
||||
if (NOT QT_BUILD_SHARED_LIBS)
|
||||
return()
|
||||
endif()
|
||||
|
||||
qt_parse_all_arguments(arg "qt_generate_qmltypes"
|
||||
""
|
||||
"TARGET_PATH;IMPORT_VERSION;IMPORT_NAME;QML_PLUGINDUMP_DEPENDENCIES"
|
||||
""
|
||||
${ARGN})
|
||||
|
||||
# scan repos for qml repositories
|
||||
foreach(repo IN LISTS QT_REPOS)
|
||||
if (IS_DIRECTORY "${repo}/qml")
|
||||
list(APPEND import_paths "${repo}/qml")
|
||||
endif()
|
||||
endforeach()
|
||||
list(REMOVE_DUPLICATES import_paths)
|
||||
if (UNIX)
|
||||
list(JOIN import_paths ":" import_paths_env)
|
||||
else()
|
||||
list(JOIN import_paths "\;" import_paths_env)
|
||||
endif()
|
||||
|
||||
if(NOT arg_IMPORT_NAME)
|
||||
string(REGEX REPLACE "\\.\\d+$" "" import_name ${arg_TARGET_PATH})
|
||||
else()
|
||||
set(import_name ${arg_IMPORT_NAME})
|
||||
endif()
|
||||
|
||||
if(NOT arg_IMPORT_VERSION)
|
||||
message(FATAL_ERROR "Import version parameter was not specified. Specify the import version using the IMPORT_VERSION.")
|
||||
endif()
|
||||
|
||||
get_target_property(source_dir ${target} SOURCE_DIR)
|
||||
|
||||
# qml1_target check is no longer required
|
||||
set(qmltypes_command_args "-nonrelocatable")
|
||||
if (NOT arg_QML_PLUGINDUMP_DEPENDENCIES AND EXISTS "${source_dir}/dependencies.json")
|
||||
list(APPEND qmltypes_command_args "-dependencies" "${source_dir}/dependencies.json")
|
||||
elseif(arg_QML_PLUGINDUMP_DEPENDENCIES)
|
||||
list(APPEND qmltypes_command_args "-dependencies" "${arg_QML_PLUGINDUMP_DEPENDENCIES}")
|
||||
endif()
|
||||
|
||||
string(REPLACE "/" "." import_name_arg ${import_name})
|
||||
|
||||
list(APPEND qmltypes_command_args "${import_name_arg}" "${arg_IMPORT_VERSION}")
|
||||
|
||||
set(qml_plugindump_target ${QT_CMAKE_EXPORT_NAMESPACE}::qmlplugindump)
|
||||
|
||||
# Manually set dependency on plugindump target since CMake will not add
|
||||
# this rule because it's not the main executable argument to the COMMAND
|
||||
# parameter.
|
||||
add_custom_target(
|
||||
"${target}_qmltypes"
|
||||
DEPENDS ${qml_plugindump_target}
|
||||
COMMAND ${CMAKE_COMMAND} -E env "QML2_IMPORTPATH=${import_paths_env}"
|
||||
$<TARGET_FILE:${qml_plugindump_target}> ${qmltypes_command_args} > "${source_dir}/plugins.qmltypes"
|
||||
)
|
||||
endfunction()
|
||||
|
||||
function(qt_install_qml_files target)
|
||||
|
||||
qt_parse_all_arguments(arg "qt_install_qml_files"
|
||||
@ -2488,6 +2419,7 @@ endfunction()
|
||||
function(qt_add_qml_module target)
|
||||
|
||||
set(qml_module_optional_args
|
||||
GENERATE_QMLTYPES
|
||||
DESIGNER_SUPPORTED
|
||||
DO_NOT_INSTALL
|
||||
SKIP_TYPE_REGISTRATION
|
||||
@ -2570,11 +2502,16 @@ function(qt_add_qml_module target)
|
||||
set(skip_registration_arg SKIP_TYPE_REGISTRATION)
|
||||
endif()
|
||||
|
||||
if (arg_GENERATE_QMLTYPES)
|
||||
set(generate_qmltypes_arg GENERATE_QMLTYPES)
|
||||
endif()
|
||||
|
||||
qt6_add_qml_module(${target}
|
||||
${designer_supported_arg}
|
||||
${no_create_option}
|
||||
${skip_registration_arg}
|
||||
${classname_arg}
|
||||
${generate_qmltypes_arg}
|
||||
RESOURCE_PREFIX "/qt-project.org/imports"
|
||||
TARGET_PATH ${arg_TARGET_PATH}
|
||||
URI ${arg_URI}
|
||||
@ -2590,8 +2527,8 @@ function(qt_add_qml_module target)
|
||||
)
|
||||
|
||||
get_target_property(qmldir_file ${target} QT_QML_MODULE_QMLDIR_FILE)
|
||||
get_target_property(plugin_types ${target} QT_QML_MODULE_PLUGIN_TYPES_FILE)
|
||||
qt_path_join(qml_module_install_dir ${QT_INSTALL_DIR} "${INSTALL_QMLDIR}/${arg_TARGET_PATH}")
|
||||
set(plugin_types "${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes")
|
||||
if (EXISTS ${plugin_types})
|
||||
qt_copy_or_install(FILES ${plugin_types}
|
||||
DESTINATION "${qml_module_install_dir}"
|
||||
@ -2606,7 +2543,6 @@ function(qt_add_qml_module target)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
|
||||
qt_copy_or_install(
|
||||
FILES
|
||||
"${qmldir_file}"
|
||||
|
@ -2839,7 +2839,7 @@ def write_module(cm_fh: IO[str], scope: Scope, *, indent: int = 0) -> str:
|
||||
extra.append("NO_PRIVATE_MODULE")
|
||||
if "header_module" in scope.get("CONFIG"):
|
||||
extra.append("HEADER_MODULE")
|
||||
if "metatypes" in scope.get("CONFIG"):
|
||||
if "metatypes" in scope.get("CONFIG") or "qmltypes" in scope.get("CONFIG"):
|
||||
extra.append("GENERATE_METATYPES")
|
||||
|
||||
module_config = scope.get("MODULE_CONFIG")
|
||||
@ -3280,6 +3280,8 @@ def write_plugin(cm_fh, scope, *, indent: int = 0) -> str:
|
||||
extra.append(f'INSTALL_DIRECTORY "{target_path}"')
|
||||
else:
|
||||
extra.append("SKIP_INSTALL")
|
||||
if "qmltypes" in scope.get("CONFIG"):
|
||||
extra.append("GENERATE_QMLTYPES")
|
||||
|
||||
plugin_class_name = scope.get_string("PLUGIN_CLASS_NAME")
|
||||
if plugin_class_name:
|
||||
@ -3498,6 +3500,39 @@ def handle_app_or_lib(
|
||||
footer=")\n",
|
||||
)
|
||||
|
||||
# Generate qmltypes instruction for anything that may have CONFIG += qmltypes
|
||||
# that is not a qml plugin
|
||||
if "qmltypes" in scope.get("CONFIG") and not "qml_plugin" in scope.get("_LOADED"):
|
||||
cm_fh.write(f"\n{spaces(indent)}set_target_properties({target} PROPERTIES\n")
|
||||
cm_fh.write(f"{spaces(indent+1)}QT_QML_MODULE_INSTALL_QMLTYPES TRUE\n")
|
||||
|
||||
import_version = scope.get_string("IMPORT_VERSION")
|
||||
if not import_version:
|
||||
import_version = scope.get_string("QML_IMPORT_VERSION")
|
||||
if import_version:
|
||||
import_version = import_version.replace(
|
||||
"$$QT_MINOR_VERSION", "${CMAKE_PROJECT_VERSION_MINOR}"
|
||||
)
|
||||
cm_fh.write(f"{spaces(indent+1)}QT_QML_MODULE_VERSION {import_version}\n")
|
||||
|
||||
import_name = scope.expandString("QML_IMPORT_NAME")
|
||||
if import_name:
|
||||
cm_fh.write(f"{spaces(indent+1)}QT_QML_MODULE_URI {import_name}\n")
|
||||
|
||||
target_path = scope.get("TARGETPATH")
|
||||
if target_path:
|
||||
cm_fh.write(f"{spaces(indent+1)}QT_QML_MODULE_TARGET_PATH {target_path}\n")
|
||||
|
||||
install_dir = scope.expandString("QMLTYPES_INSTALL_DIR")
|
||||
if install_dir:
|
||||
install_dir = install_dir.replace(
|
||||
"$$[QT_INSTALL_QML]","${Qt6_DIR}/../../../qml"
|
||||
)
|
||||
cm_fh.write(f"{spaces(indent+1)}QT_QML_MODULE_INSTALL_DIR \"{install_dir}\"\n")
|
||||
|
||||
cm_fh.write(f"{spaces(indent)})\n\n")
|
||||
cm_fh.write(f"qt6_qml_type_registration({target})\n")
|
||||
|
||||
|
||||
def handle_top_level_repo_project(scope: Scope, cm_fh: IO[str]):
|
||||
# qtdeclarative
|
||||
|
Loading…
x
Reference in New Issue
Block a user