diff options
Diffstat (limited to 'src/qml/Qt6QmlBuildInternals.cmake')
-rw-r--r-- | src/qml/Qt6QmlBuildInternals.cmake | 160 |
1 files changed, 47 insertions, 113 deletions
diff --git a/src/qml/Qt6QmlBuildInternals.cmake b/src/qml/Qt6QmlBuildInternals.cmake index c2d8259bc0..dc0204adac 100644 --- a/src/qml/Qt6QmlBuildInternals.cmake +++ b/src/qml/Qt6QmlBuildInternals.cmake @@ -4,27 +4,26 @@ include_guard(GLOBAL) -# This function creates a CMake target for qml modules. It will also make -# sure that if no C++ source are present, that qml files show up in the project -# in an IDE. Finally, it will also create a custom ${target}_qmltypes which -# can be used to generate the respective plugins.qmltypes file. +# This function is essentially a convenience wrapper around a pair of calls +# to qt_internal_add_plugin() and qt6_add_qml_module(). It ensures a consistent +# set of arguments are used for both. Most keywords for either command are +# supported, with a few exceptions: # -# URI: Module's uri. -# TARGET_PATH: Expected installation path for the Qml Module. Equivalent -# to the module's URI where '.' is replaced with '/'. Use this to override the -# default substitution pattern. -# VERSION: Version of the qml module -# SKIP_TYPE_REGISTRATION: All qml files are expected to be registered by the -# c++ plugin code. -# PLUGIN_OPTIONAL: Any plugins are optional +# - RESOURCE_PREFIX and RESOURCE_EXPORT are both hard-coded and cannot be +# overridden by the caller. +# - OUTPUT_DIRECTORY and INSTALL_DIRECTORY will be set if not provided. +# - SOURCES is only passed through to qt_internal_add_plugin() but not to +# qt6_add_qml_module(). If SOURCES is not set, PURE_MODULE will be passed to +# qt6_add_qml_module() so that a dummy plugin.cpp file will be generated. # +# See qt_internal_add_plugin() and qt6_add_qml_module() for the full set of +# supported keywords. function(qt_internal_add_qml_module target) set(qml_module_optional_args GENERATE_QMLTYPES INSTALL_QMLTYPES DESIGNER_SUPPORTED - DO_NOT_INSTALL SKIP_TYPE_REGISTRATION PLUGIN_OPTIONAL ) @@ -34,12 +33,13 @@ function(qt_internal_add_qml_module target) TARGET_PATH VERSION CLASSNAME + TYPEINFO ) set(qml_module_multi_args + QML_FILES IMPORTS OPTIONAL_IMPORTS - TYPEINFO DEPENDENCIES PAST_MAJOR_VERSIONS ) @@ -49,70 +49,60 @@ function(qt_internal_add_qml_module target) "${__qt_add_plugin_single_args};${qml_module_single_args}" "${__qt_add_plugin_multi_args};${qml_module_multi_args}" ${ARGN}) - if (NOT arg_URI) - message(FATAL_ERROR "qt_add_qml_module called without specifying the module's uri. Please specify one using the URI parameter.") - endif() - - set(target_path ${arg_TARGET_PATH}) - - if (NOT arg_VERSION) - message(FATAL_ERROR "qt_add_qml_module called without specifying the module's import version. Please specify one using the VERSION parameter.") - endif() - if (NOT arg_TARGET_PATH) string(REPLACE "." "/" arg_TARGET_PATH ${arg_URI}) endif() + if (NOT arg_OUTPUT_DIRECTORY) + set(arg_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_QMLDIR}/${arg_TARGET_PATH}") + endif() + if (NOT arg_INSTALL_DIRECTORY) + set(arg_INSTALL_DIRECTORY "${INSTALL_QMLDIR}/${arg_TARGET_PATH}") + endif() qt_remove_args(plugin_args ARGS_TO_REMOVE - ${target} ${qml_module_optional_args} ${qml_module_single_args} ${qml_module_multi_args} + OUTPUT_DIRECTORY + INSTALL_DIRECTORY ALL_ARGS ${__qt_add_plugin_optional_args} - ${qml_module_optional_args} ${__qt_add_plugin_single_args} - ${qml_module_single_args} ${__qt_add_plugin_multi_args} + ${qml_module_optional_args} + ${qml_module_single_args} ${qml_module_multi_args} ARGS - ${ARGV} + ${ARGN} ) qt_internal_add_plugin(${target} - TYPE - qml_plugin - QML_TARGET_PATH - "${arg_TARGET_PATH}" + TYPE qml_plugin + OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} ${plugin_args} ) - set(no_create_option DO_NOT_CREATE_TARGET) - - if (arg_CLASSNAME) - set(classname_arg CLASSNAME ${arg_CLASSNAME}) - endif() - - if (arg_DESIGNER_SUPPORTED) - set(designer_supported_arg DESIGNER_SUPPORTED) + if (arg_SOURCES AND NOT arg_TYPEINFO) + set(arg_TYPEINFO "plugins.qmltypes") endif() - if (arg_SKIP_TYPE_REGISTRATION) - set(skip_registration_arg SKIP_TYPE_REGISTRATION) - endif() + set(add_qml_module_args DO_NOT_CREATE_TARGET) - if (arg_PLUGIN_OPTIONAL) - set(plugin_optional_arg PLUGIN_OPTIONAL) - endif() - - if (arg_GENERATE_QMLTYPES) - set(generate_qmltypes_arg GENERATE_QMLTYPES) - endif() + # Pass through options if given (these are present/absent, not true/false) + foreach(opt IN LISTS qml_module_optional_args) + if(arg_${opt}) + list(APPEND add_qml_module_args ${opt}) + endif() + endforeach() - if (arg_INSTALL_QMLTYPES) - set(install_qmltypes_arg INSTALL_QMLTYPES) - endif() + # Pass through single and multi-value args as provided + foreach(arg IN LISTS qml_module_single_args qml_module_multi_args) + if(DEFINED arg_${arg}) + list(APPEND add_qml_module_args ${arg} ${arg_${arg}}) + endif() + endforeach() # Because qt_internal_add_qml_module does not propagate its SOURCES option to @@ -120,72 +110,16 @@ function(qt_internal_add_qml_module target) # qt6_add_qml_module if it should generate a dummy plugin cpp file. Otherwise we'd generate # a dummy plugin.cpp file twice and thus cause duplicate symbol issues. if (NOT arg_SOURCES) - set(pure_qml_module "PURE_MODULE") - endif() - - qt_path_join(qml_module_install_dir ${QT_INSTALL_DIR} "${INSTALL_QMLDIR}/${arg_TARGET_PATH}") - - if (arg_SOURCES AND NOT arg_TYPEINFO) - set(arg_TYPEINFO "plugins.qmltypes") + list(APPEND add_qml_module_args PURE_MODULE) endif() qt6_add_qml_module(${target} - ${designer_supported_arg} - ${no_create_option} - ${skip_registration_arg} - ${plugin_optional_arg} - ${classname_arg} - ${generate_qmltypes_arg} - ${install_qmltypes_arg} - ${pure_qml_module} + ${add_qml_module_args} + OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} RESOURCE_PREFIX "/qt-project.org/imports" - TARGET_PATH ${arg_TARGET_PATH} - URI ${arg_URI} - VERSION ${arg_VERSION} - PAST_MAJOR_VERSIONS ${arg_PAST_MAJOR_VERSIONS} - QML_FILES ${arg_QML_FILES} - IMPORTS "${arg_IMPORTS}" - OPTIONAL_IMPORTS "${arg_OPTIONAL_IMPORTS}" - TYPEINFO "${arg_TYPEINFO}" - DO_NOT_INSTALL_METADATA - INSTALL_LOCATION "${qml_module_install_dir}" - DEPENDENCIES ${arg_DEPENDENCIES} RESOURCE_EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" ) - - get_target_property(qmldir_file ${target} QT_QML_MODULE_QMLDIR_FILE) - get_target_property(plugin_types ${target} QT_QML_MODULE_PLUGIN_TYPES_FILE) - set(files_to_install) - if (EXISTS ${plugin_types}) - list(APPEND files_to_install ${plugin_types}) - qt_copy_or_install(FILES ${plugin_types} - DESTINATION "${qml_module_install_dir}" - ) - - if(QT_WILL_INSTALL) - # plugin.qmltypes when present should also be copied to the - # cmake binary dir when doing prefix builds - file(COPY ${plugin_types} - DESTINATION "${QT_BUILD_DIR}/${INSTALL_QMLDIR}/${arg_TARGET_PATH}" - ) - endif() - endif() - - list(APPEND files_to_install ${qmldir_file}) - if (QT_WILL_INSTALL) - install(FILES ${files_to_install} DESTINATION ${qml_module_install_dir}) - endif() - - set(copy_destination "${QT_BUILD_DIR}/${INSTALL_QMLDIR}/${arg_TARGET_PATH}") - foreach(file IN LISTS files_to_install) - get_filename_component(file_name "${file}" NAME) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${file}" - "${copy_destination}/${file_name}" - COMMENT "Copying ${file} to ${copy_destination}" - ) - endforeach() endfunction() if(NOT QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS) |