# # QtDeclarative Specific extensions # include_guard(GLOBAL) # 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: # # - 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 SKIP_TYPE_REGISTRATION PLUGIN_OPTIONAL ) set(qml_module_single_args URI TARGET_PATH VERSION CLASSNAME TYPEINFO ) set(qml_module_multi_args QML_FILES IMPORTS OPTIONAL_IMPORTS DEPENDENCIES PAST_MAJOR_VERSIONS ) qt_parse_all_arguments(arg "qt_add_qml_module" "${__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_multi_args}" ${ARGN}) 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 ${qml_module_optional_args} ${qml_module_single_args} ${qml_module_multi_args} OUTPUT_DIRECTORY INSTALL_DIRECTORY ALL_ARGS ${__qt_add_plugin_optional_args} ${__qt_add_plugin_single_args} ${__qt_add_plugin_multi_args} ${qml_module_optional_args} ${qml_module_single_args} ${qml_module_multi_args} ARGS ${ARGN} ) qt_internal_add_plugin(${target} TYPE qml_plugin OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} ${plugin_args} ) if (arg_SOURCES AND NOT arg_TYPEINFO) set(arg_TYPEINFO "plugins.qmltypes") endif() set(add_qml_module_args DO_NOT_CREATE_TARGET) # 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() # 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 # qt6_add_qml_module, but only to qt_internal_add_plugin, we need a way to tell # 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) list(APPEND add_qml_module_args PURE_MODULE) endif() qt6_add_qml_module(${target} ${add_qml_module_args} OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} RESOURCE_PREFIX "/qt-project.org/imports" RESOURCE_EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" ) endfunction() if(NOT QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS) # Compatibility functions that should be removed once all their usages are removed. function(add_qml_module) qt_add_qml_module(${ARGV}) endfunction() function(qt_add_qml_module) qt_internal_add_qml_module(${ARGV}) endfunction() endif()