diff options
80 files changed, 2012 insertions, 2734 deletions
diff --git a/examples/qml/qmlextensionplugins/CMakeLists.txt b/examples/qml/qmlextensionplugins/CMakeLists.txt index 7fc2b7268f..dcfde4a8ae 100644 --- a/examples/qml/qmlextensionplugins/CMakeLists.txt +++ b/examples/qml/qmlextensionplugins/CMakeLists.txt @@ -1,7 +1,7 @@ # Generated from qmlextensionplugins.pro. cmake_minimum_required(VERSION 3.14) -project(qmlqtimeexampleplugin LANGUAGES CXX) +project(qmlqtimeexample LANGUAGES CXX) set(CMAKE_INCLUDE_CURRENT_DIR ON) @@ -19,37 +19,38 @@ find_package(Qt6 COMPONENTS Core) find_package(Qt6 COMPONENTS Gui) find_package(Qt6 COMPONENTS Qml) -qt6_add_qml_module(qmlqtimeexampleplugin +set_source_files_properties(imports/TimeExample/Clock.qml PROPERTIES + QT_RESOURCE_ALIAS Clock.qml +) +qt6_add_qml_module(qmlqtimeexample OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/imports/TimeExample" VERSION 1.0 URI "TimeExample" - INSTALL_LOCATION ${INSTALL_EXAMPLEDIR} -) - -target_sources(qmlqtimeexampleplugin PRIVATE - plugin.cpp - timemodel.cpp timemodel.h + SOURCES timemodel.cpp timemodel.h + QML_FILES imports/TimeExample/Clock.qml ) -set_target_properties(qmlqtimeexampleplugin PROPERTIES +set_target_properties(qmlqtimeexample PROPERTIES WIN32_EXECUTABLE TRUE MACOSX_BUNDLE TRUE ) -target_link_libraries(qmlqtimeexampleplugin PUBLIC +target_link_libraries(qmlqtimeexample PUBLIC Qt::Core Qt::Gui Qt::Qml ) -install(TARGETS qmlqtimeexampleplugin +qt6_add_resources(qmlqtimeexample example_images + PREFIX "/TimeExample" + BASE imports/TimeExample + FILES + imports/TimeExample/center.png + imports/TimeExample/clock.png + imports/TimeExample/hour.png + imports/TimeExample/minute.png +) + +install(TARGETS qmlqtimeexample RUNTIME DESTINATION "${INSTALL_EXAMPLEDIR}" BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" ) - -set_target_properties(qmlqtimeexampleplugin PROPERTIES - QT_QML_MODULE_VERSION 1.0 - QT_QML_MODULE_URI TimeExample - QT_QMLTYPES_FILENAME imports/TimeExample/plugins.qmltypes -) - -qt6_qml_type_registration(qmlqtimeexampleplugin) diff --git a/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt b/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt index ad3a5972e8..f75028aa69 100644 --- a/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt +++ b/examples/qml/tutorials/extending-qml/chapter6-plugins/import/CMakeLists.txt @@ -24,11 +24,10 @@ qt6_add_qml_module(chartsplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/../Charts" VERSION 1.0 URI "Charts" - INSTALL_LOCATION ${INSTALL_EXAMPLEDIR} + PLUGIN_TARGET chartsplugin ) target_sources(chartsplugin PRIVATE - chartsplugin.h piechart.cpp piechart.h pieslice.cpp pieslice.h ) @@ -48,10 +47,3 @@ install(TARGETS chartsplugin BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" ) - -set_target_properties(chartsplugin PROPERTIES - QT_QML_MODULE_VERSION 1.0 - QT_QML_MODULE_URI Charts -) - -qt6_qml_type_registration(chartsplugin) diff --git a/examples/quick/customitems/painteditem/CMakeLists.txt b/examples/quick/customitems/painteditem/CMakeLists.txt index 533396a7cd..fa964778d0 100644 --- a/examples/quick/customitems/painteditem/CMakeLists.txt +++ b/examples/quick/customitems/painteditem/CMakeLists.txt @@ -24,11 +24,12 @@ qt6_add_qml_module(qmltextballoonplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/TextBalloonPlugin" VERSION 1.0 URI "TextBalloonPlugin" - INSTALL_LOCATION ${INSTALL_EXAMPLEDIR} + PLUGIN_TARGET qmltextballoonplugin + QML_FILES textballoons.qml + RESOURCE_PREFIX "/painteditem" ) target_sources(qmltextballoonplugin PRIVATE - TextBalloonPlugin/plugin.h textballoon.cpp textballoon.h ) set_target_properties(qmltextballoonplugin PROPERTIES @@ -46,7 +47,6 @@ target_link_libraries(qmltextballoonplugin PUBLIC # Resources: set(painteditem_resource_files "textballoon.h" - "textballoons.qml" ) qt6_add_resources(qmltextballoonplugin "painteditem" @@ -61,10 +61,3 @@ install(TARGETS qmltextballoonplugin BUNDLE DESTINATION "${INSTALL_EXAMPLEDIR}" LIBRARY DESTINATION "${INSTALL_EXAMPLEDIR}" ) - -set_target_properties(qmltextballoonplugin PROPERTIES - QT_QML_MODULE_VERSION 1.0 - QT_QML_MODULE_URI TextBalloonPlugin -) - -qt6_qml_type_registration(qmltextballoonplugin) diff --git a/examples/quick/imageprovider/CMakeLists.txt b/examples/quick/imageprovider/CMakeLists.txt index e3318b0755..5a25a45deb 100644 --- a/examples/quick/imageprovider/CMakeLists.txt +++ b/examples/quick/imageprovider/CMakeLists.txt @@ -24,7 +24,10 @@ qt6_add_qml_module(qmlimageproviderplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ImageProviderCore" VERSION 1.0 URI "ImageProviderCore" - INSTALL_LOCATION ${INSTALL_EXAMPLEDIR} + PLUGIN_TARGET qmlimageproviderplugin + NO_PLUGIN_OPTIONAL + NO_GENERATE_PLUGIN_SOURCE + CLASS_NAME ImageProviderExtensionPlugin ) target_sources(qmlimageproviderplugin PRIVATE diff --git a/examples/quick/imageresponseprovider/CMakeLists.txt b/examples/quick/imageresponseprovider/CMakeLists.txt index 5f282a0fb9..551ce01197 100644 --- a/examples/quick/imageresponseprovider/CMakeLists.txt +++ b/examples/quick/imageresponseprovider/CMakeLists.txt @@ -24,7 +24,10 @@ qt6_add_qml_module(qmlimageresponseproviderplugin OUTPUT_DIRECTORY "${CMAKE_CURRENT_BINARY_DIR}/ImageResponseProviderCore" VERSION 1.0 URI "ImageResponseProviderCore" - INSTALL_LOCATION ${INSTALL_EXAMPLEDIR} + PLUGIN_TARGET qmlimageresponseproviderplugin + NO_PLUGIN_OPTIONAL + NO_GENERATE_PLUGIN_SOURCE + CLASS_NAME ImageProviderExtensionPlugin ) target_sources(qmlimageresponseproviderplugin PRIVATE diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 5464524d10..c9d9c1444d 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -1,4 +1,11 @@ - qt_internal_add_module(QmlCore +qt_internal_add_qml_module(QmlCore + URI "QtCore" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET qtqmlcoreplugin + CLASS_NAME QtQmlCorePlugin + DEPENDENCIES + QtQml SOURCES qqmlstandardpaths_p.h qqmlstandardpaths.cpp @@ -10,16 +17,6 @@ Qt::Qml ) -set_target_properties(QmlCore PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtCore - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtCore" -) - -qt6_qml_type_registration(QmlCore) - qt_internal_add_docs(QmlCore doc/qtqmlcore.qdocconf ) diff --git a/src/imports/CMakeLists.txt b/src/imports/CMakeLists.txt index fbc80b87bd..29dd2ce5c0 100644 --- a/src/imports/CMakeLists.txt +++ b/src/imports/CMakeLists.txt @@ -1,46 +1,2 @@ -# Generated from imports.pro. - add_subdirectory(builtins) -add_subdirectory(qtqml) -add_subdirectory(core) -add_subdirectory(models) add_subdirectory(tooling) -if (QT_FEATURE_qml_xmllistmodel) - add_subdirectory(xmllistmodel) -endif() -if(QT_FEATURE_qml_itemmodel) - add_subdirectory(labsmodels) - add_subdirectory(folderlistmodel) -endif() -if(QT_FEATURE_qml_worker_script) - add_subdirectory(workerscript) -endif() -if(TARGET Qt::Sql) - add_subdirectory(localstorage) -endif() -if(QT_FEATURE_settings) - add_subdirectory(settings) -endif() -if(TARGET Qt::Quick) - add_subdirectory(labsanimation) - add_subdirectory(layouts) - add_subdirectory(qtquick2) -endif() -if(QT_FEATURE_quick_shadereffect AND TARGET Qt::Quick) - add_subdirectory(wavefrontmesh) -endif() -if(TARGET Qt::Quick AND TARGET Qt::Test) - add_subdirectory(testlib) -endif() -if(QT_FEATURE_systemsemaphore AND TARGET Qt::Quick) - add_subdirectory(sharedimage) -endif() -if(QT_FEATURE_quick_particles AND TARGET Qt::Quick) - add_subdirectory(particles) -endif() -if(QT_FEATURE_quick_path AND TARGET Qt::Quick) - add_subdirectory(shapes) -endif() -# special case begin -add_subdirectory(window) -# special case end diff --git a/src/imports/builtins/CMakeLists.txt b/src/imports/builtins/CMakeLists.txt index b41e38d128..fb6984a961 100644 --- a/src/imports/builtins/CMakeLists.txt +++ b/src/imports/builtins/CMakeLists.txt @@ -1,12 +1,6 @@ -# Generated from builtins.pro. - -# special case begin - set(qml_type_files builtins.qmltypes jsroot.qmltypes) qt_path_join(qml_install_dir "${QT_INSTALL_DIR}" "${INSTALL_QMLDIR}") qt_copy_or_install(FILES ${qml_type_files} DESTINATION ${qml_install_dir} ) - -# special case end diff --git a/src/imports/core/CMakeLists.txt b/src/imports/core/CMakeLists.txt deleted file mode 100644 index 6e4d54e066..0000000000 --- a/src/imports/core/CMakeLists.txt +++ /dev/null @@ -1,17 +0,0 @@ -qt_internal_add_qml_module(qtqmlcoreplugin - URI "QtCore" - VERSION "${CMAKE_PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQmlCorePlugin - SKIP_TYPE_REGISTRATION - DEPENDENCIES - QtQml - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Qml - Qt::QmlCore - Qt::QmlCorePrivate -) diff --git a/src/imports/core/plugin.cpp b/src/imports/core/plugin.cpp deleted file mode 100644 index dbbddff086..0000000000 --- a/src/imports/core/plugin.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Quick Layouts module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQmlCore/private/qqmlcoreglobal_p.h> - -QT_BEGIN_NAMESPACE - -class QtQmlCorePlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) - -public: - QtQmlCorePlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtCore; - Q_UNUSED(registration); - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/folderlistmodel/CMakeLists.txt b/src/imports/folderlistmodel/CMakeLists.txt deleted file mode 100644 index 9ef942ae9d..0000000000 --- a/src/imports/folderlistmodel/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from folderlistmodel.pro. - -##################################################################### -## qmlfolderlistmodelplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmlfolderlistmodelplugin - URI "Qt.labs.folderlistmodel" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QmlFolderListModelPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::CorePrivate - Qt::QmlPrivate - Qt::LabsFolderListModelPrivate -) - -#### Keys ignored in scope 1:.:.:folderlistmodel.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/folderlistmodel" diff --git a/src/imports/folderlistmodel/plugin.cpp b/src/imports/folderlistmodel/plugin.cpp deleted file mode 100644 index d50002b4c4..0000000000 --- a/src/imports/folderlistmodel/plugin.cpp +++ /dev/null @@ -1,70 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQml module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> -#include <QtQml/private/qqmlmetatype_p.h> - -#include <QtLabsFolderListModel/private/qquickfolderlistmodelglobal_p.h> -#include <QtLabsFolderListModel/private/qquickfolderlistmodel_p.h> - -QT_BEGIN_NAMESPACE - -//![class decl] -class QmlFolderListModelPlugin : public QQmlExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlExtensionInterface_iid) - -public: - QmlFolderListModelPlugin(QObject *parent = nullptr) : QQmlExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_Qt_labs_folderlistmodel; - Q_UNUSED(registration); - } - - void registerTypes(const char *) override - { - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/labsanimation/CMakeLists.txt b/src/imports/labsanimation/CMakeLists.txt deleted file mode 100644 index 50c6bb7912..0000000000 --- a/src/imports/labsanimation/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from labsanimation.pro. - -##################################################################### -## labsanimationplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(labsanimationplugin - URI "Qt.labs.animation" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QtLabsAnimationPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::QmlPrivate - Qt::QuickPrivate - Qt::LabsAnimationPrivate -) - -#### Keys ignored in scope 1:.:.:labsanimation.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/animation" diff --git a/src/imports/labsanimation/plugin.cpp b/src/imports/labsanimation/plugin.cpp deleted file mode 100644 index 11367ab287..0000000000 --- a/src/imports/labsanimation/plugin.cpp +++ /dev/null @@ -1,79 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> - -#include <QtLabsAnimation/private/qqmlanimationglobal_p.h> - -QT_BEGIN_NAMESPACE - -/*! - \qmlmodule Qt.labs.animation 1.0 - \title Qt Quick experimental animation types - \ingroup qmlmodules - \brief Provides QML experimental types for animation - \since 5.14 - - This QML module contains experimental QML types related to animation. - - To use the types in this module, import the module with the following line: - - \code - import Qt.labs.animation - \endcode -*/ - -//![class decl] -class QtLabsAnimationPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtLabsAnimationPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_Qt_labs_animation; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/labsmodels/CMakeLists.txt b/src/imports/labsmodels/CMakeLists.txt deleted file mode 100644 index 0d3c118e77..0000000000 --- a/src/imports/labsmodels/CMakeLists.txt +++ /dev/null @@ -1,26 +0,0 @@ -# Generated from labsmodels.pro. - -##################################################################### -## labsmodelsplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(labsmodelsplugin - URI "Qt.labs.qmlmodels" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QtQmlLabsModelsPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::QmlPrivate - Qt::LabsQmlModelsPrivate -) - -#### Keys ignored in scope 1:.:.:labsmodels.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/qmlmodels" - -## Scopes: -##################################################################### diff --git a/src/imports/labsmodels/plugin.cpp b/src/imports/labsmodels/plugin.cpp deleted file mode 100644 index 4735fe3583..0000000000 --- a/src/imports/labsmodels/plugin.cpp +++ /dev/null @@ -1,81 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> - -#include <private/qqmlmodelsmodule_p.h> - -#include <QtLabsQmlModels/private/qqmlmodelsglobal_p.h> - -QT_BEGIN_NAMESPACE - -/*! - \qmlmodule Qt.labs.qmlmodels 1.0 - \title Qt QML Models experimental QML Types - \ingroup qmlmodules - \brief Provides QML experimental types for data models. - \since 5.12 - - This QML module contains experimental QML types related to data models. - - To use the types in this module, import the module with the following line: - - \code - import Qt.labs.qmlmodels - \endcode -*/ - -//![class decl] -class QtQmlLabsModelsPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQmlLabsModelsPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_Qt_labs_qmlmodels; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/layouts/CMakeLists.txt b/src/imports/layouts/CMakeLists.txt deleted file mode 100644 index ef454d03ef..0000000000 --- a/src/imports/layouts/CMakeLists.txt +++ /dev/null @@ -1,30 +0,0 @@ -# Generated from layouts.pro. - -##################################################################### -## qquicklayoutsplugin Plugin: -##################################################################### - - -qt_internal_add_qml_module(qquicklayoutsplugin - URI "QtQuick.Layouts" - VERSION "${PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQuickLayoutsPlugin - SKIP_TYPE_REGISTRATION - DEPENDENCIES - QtQuick - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Gui - Qt::Qml - Qt::QuickLayoutsPrivate -) - - -#### Keys ignored in scope 1:.:.:layouts.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQuick/Layouts" diff --git a/src/imports/layouts/plugin.cpp b/src/imports/layouts/plugin.cpp deleted file mode 100644 index 7e0c4ef053..0000000000 --- a/src/imports/layouts/plugin.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Quick Layouts module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQuickLayouts/private/qquicklayoutglobal_p.h> - -QT_BEGIN_NAMESPACE - -//![class decl] -class QtQuickLayoutsPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQuickLayoutsPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQuick_Layouts; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/localstorage/CMakeLists.txt b/src/imports/localstorage/CMakeLists.txt deleted file mode 100644 index 488470c1c4..0000000000 --- a/src/imports/localstorage/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from localstorage.pro. - -##################################################################### -## qmllocalstorageplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmllocalstorageplugin - URI "QtQuick.LocalStorage" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QQmlLocalStoragePlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Qml - Qt::QmlLocalStoragePrivate -) - -#### Keys ignored in scope 1:.:.:localstorage.pro:<TRUE>: -# CXX_MODULE = "qml" -# OTHER_FILES = "localstorage.json" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQuick/LocalStorage" diff --git a/src/imports/localstorage/plugin.cpp b/src/imports/localstorage/plugin.cpp deleted file mode 100644 index 766469e4f6..0000000000 --- a/src/imports/localstorage/plugin.cpp +++ /dev/null @@ -1,62 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> - -#include <QtQmlLocalStorage/private/qqmllocalstorageglobal_p.h> - -QT_BEGIN_NAMESPACE - -class QQmlLocalStoragePlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) - -public: - QQmlLocalStoragePlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQuick_LocalStorage; - Q_UNUSED(registration); - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/models/CMakeLists.txt b/src/imports/models/CMakeLists.txt deleted file mode 100644 index 88de431dc0..0000000000 --- a/src/imports/models/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from models.pro. - -##################################################################### -## modelsplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(modelsplugin - URI "QtQml.Models" - VERSION "${PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQmlModelsPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::QmlModelsPrivate - Qt::QmlPrivate -) - -#### Keys ignored in scope 1:.:.:models.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQml/Models" diff --git a/src/imports/particles/CMakeLists.txt b/src/imports/particles/CMakeLists.txt deleted file mode 100644 index ba2980e6fd..0000000000 --- a/src/imports/particles/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Generated from particles.pro. - -##################################################################### -## particlesplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(particlesplugin - URI "QtQuick.Particles" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QtQuick2ParticlesPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - DEPENDENCIES - QtQuick - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Gui - Qt::QmlPrivate - Qt::QuickParticlesPrivate - Qt::QuickPrivate -) - -#### Keys ignored in scope 1:.:.:particles.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQuick/Particles" diff --git a/src/imports/particles/plugin.cpp b/src/imports/particles/plugin.cpp deleted file mode 100644 index 04e30b38d3..0000000000 --- a/src/imports/particles/plugin.cpp +++ /dev/null @@ -1,63 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> - -#include <private/qtquickparticlesglobal_p.h> - -QT_BEGIN_NAMESPACE - -//![class decl] -class QtQuick2ParticlesPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQuick2ParticlesPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQuick_Particles; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/qtqml/CMakeLists.txt b/src/imports/qtqml/CMakeLists.txt deleted file mode 100644 index 761417143a..0000000000 --- a/src/imports/qtqml/CMakeLists.txt +++ /dev/null @@ -1,43 +0,0 @@ -# Generated from qtqml.pro. - -set(module_dynamic_qml_imports - QtQml.Models/auto -) - -if (QT_FEATURE_qml_worker_script) - list(APPEND module_dynamic_qml_imports - QtQml.WorkerScript/auto - ) -endif() - -##################################################################### -## qmlplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmlplugin - URI "QtQml" - VERSION "${PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQmlPlugin - SKIP_TYPE_REGISTRATION - IMPORTS ${module_dynamic_qml_imports} - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::QmlModelsPrivate - Qt::QmlPrivate - Qt::CorePrivate # special case -) - -#### Keys ignored in scope 1:.:.:qtqml.pro:<TRUE>: -# CXX_MODULE = "qml" -# DYNAMIC_QMLDIR = "module QtQml" "optional plugin qmlplugin" "classname QtQmlPlugin" "typeinfo plugins.qmltypes" "designersupported" "import QtQml.Models auto" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQml" - -## Scopes: -##################################################################### - -#### Keys ignored in scope 2:.:.:qtqml.pro:QT_FEATURE_qml_worker_script: -# DYNAMIC_QMLDIR = "import QtQml.WorkerScript auto" diff --git a/src/imports/qtqml/plugin.cpp b/src/imports/qtqml/plugin.cpp deleted file mode 100644 index 275d1e01bc..0000000000 --- a/src/imports/qtqml/plugin.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/private/qtqmlglobal_p.h> -#include <QtQml/qqmlextensionplugin.h> - -QT_BEGIN_NAMESPACE - -//![class decl] -class QtQmlPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQmlPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQml; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/qtquick2/CMakeLists.txt b/src/imports/qtquick2/CMakeLists.txt deleted file mode 100644 index 00b80b6ee5..0000000000 --- a/src/imports/qtquick2/CMakeLists.txt +++ /dev/null @@ -1,37 +0,0 @@ -# Generated from qtquick2.pro. - -##################################################################### -## qtquick2plugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qtquick2plugin - URI "QtQuick" - VERSION "${PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQuick2Plugin - SKIP_TYPE_REGISTRATION - IMPORTS - QtQml/auto - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Gui - Qt::QmlModelsPrivate - Qt::QmlPrivate - Qt::QuickPrivate -) - -#### Keys ignored in scope 1:.:.:qtquick2.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQuick" - -## Scopes: -##################################################################### - -qt_internal_extend_target(qtquick2plugin CONDITION QT_FEATURE_qml_worker_script - PUBLIC_LIBRARIES - Qt::QmlWorkerScriptPrivate -) diff --git a/src/imports/settings/CMakeLists.txt b/src/imports/settings/CMakeLists.txt deleted file mode 100644 index 052a576639..0000000000 --- a/src/imports/settings/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from settings.pro. - -##################################################################### -## qmlsettingsplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmlsettingsplugin - URI "Qt.labs.settings" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QmlSettingsPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Qml - Qt::LabsSettingsPrivate -) - -#### Keys ignored in scope 1:.:.:settings.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/settings" diff --git a/src/imports/shapes/CMakeLists.txt b/src/imports/shapes/CMakeLists.txt deleted file mode 100644 index a48a717c1b..0000000000 --- a/src/imports/shapes/CMakeLists.txt +++ /dev/null @@ -1,28 +0,0 @@ -# Generated from shapes.pro. - -##################################################################### -## qmlshapesplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmlshapesplugin - URI "QtQuick.Shapes" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QmlShapesPlugin - SKIP_TYPE_REGISTRATION - DEPENDENCIES - QtQuick - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::GuiPrivate - Qt::Qml - Qt::QuickPrivate - Qt::QuickShapesPrivate -) - -#### Keys ignored in scope 1:.:.:shapes.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQuick/Shapes" diff --git a/src/imports/sharedimage/CMakeLists.txt b/src/imports/sharedimage/CMakeLists.txt deleted file mode 100644 index 32e1b43777..0000000000 --- a/src/imports/sharedimage/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# Generated from sharedimage.pro. - -##################################################################### -## sharedimageplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(sharedimageplugin - URI "Qt.labs.sharedimage" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QtQuickSharedImagePlugin - SKIP_TYPE_REGISTRATION - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Qml - Qt::LabsSharedImagePrivate -) - -#### Keys ignored in scope 1:.:.:sharedimage.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/sharedimage" diff --git a/src/imports/testlib/CMakeLists.txt b/src/imports/testlib/CMakeLists.txt deleted file mode 100644 index fe70dd8a29..0000000000 --- a/src/imports/testlib/CMakeLists.txt +++ /dev/null @@ -1,46 +0,0 @@ -# Generated from testlib.pro. - -##################################################################### -## qmltestplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmltestplugin - URI "QtTest" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QTestQmlModule - DEPENDENCIES - QtQuick.Window/2.0 - SOURCES - main.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Gui - Qt::Qml - Qt::QuickTestPrivate -) - -#### Keys ignored in scope 1:.:.:testlib.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_FILES = "TestCase.qml" "SignalSpy.qml" "testlogger.js" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtTest" - -set(qml_files - "TestCase.qml" - "SignalSpy.qml" - "testlogger.js" -) -set_source_files_properties(TestCase.qml PROPERTIES - QT_QML_SOURCE_VERSION "1.0" -) -set_source_files_properties(SignalSpy.qml PROPERTIES - QT_QML_SOURCE_VERSION "1.0" -) -set_source_files_properties(testlogger.js PROPERTIES - QT_QML_SKIP_QMLDIR_ENTRY TRUE -) - -qt6_target_qml_files(qmltestplugin - FILES - ${qml_files} -) diff --git a/src/imports/testlib/main.cpp b/src/imports/testlib/main.cpp deleted file mode 100644 index 8981ac0ff0..0000000000 --- a/src/imports/testlib/main.cpp +++ /dev/null @@ -1,60 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the test suite of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQuickTest/private/quicktestglobal_p.h> - -QT_BEGIN_NAMESPACE - -class QTestQmlModule : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) - -public: - QTestQmlModule(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtTest; - Q_UNUSED(registration); - } -}; - -QT_END_NAMESPACE - -#include "main.moc" diff --git a/src/imports/tooling/CMakeLists.txt b/src/imports/tooling/CMakeLists.txt index 48a0a19795..a39f9ee91b 100644 --- a/src/imports/tooling/CMakeLists.txt +++ b/src/imports/tooling/CMakeLists.txt @@ -1,6 +1,3 @@ -# Generated from tooling.pro. -# special case skip regeneration - set(qml_files "Component.qml" "Enum.qml" @@ -12,20 +9,15 @@ set(qml_files "Signal.qml" ) -qt_internal_add_qml_module(quicktooling - URI "QtQuick.tooling" - VERSION "${PROJECT_VERSION}" - GENERATE_QMLTYPES - INSTALL_QMLTYPES - PAST_MAJOR_VERSIONS 1 -) - set_source_files_properties(${qml_files} PROPERTIES QT_QML_SOURCE_VERSION "1.2;6.0" ) -qt6_target_qml_files(quicktooling - FILES - ${qml_files} +qt_internal_add_qml_module(quicktooling + URI "QtQuick.tooling" + VERSION "${PROJECT_VERSION}" + NO_PLUGIN_OPTIONAL + PLUGIN_TARGET quicktooling + PAST_MAJOR_VERSIONS 1 + QML_FILES ${qml_files} ) - diff --git a/src/imports/wavefrontmesh/CMakeLists.txt b/src/imports/wavefrontmesh/CMakeLists.txt deleted file mode 100644 index b9ef95f16a..0000000000 --- a/src/imports/wavefrontmesh/CMakeLists.txt +++ /dev/null @@ -1,23 +0,0 @@ -# Generated from wavefrontmesh.pro. - -##################################################################### -## qmlwavefrontmeshplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(qmlwavefrontmeshplugin - URI "Qt.labs.wavefrontmesh" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QmlWavefrontMeshPlugin - SKIP_TYPE_REGISTRATION - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::CorePrivate - Qt::QmlPrivate - Qt::LabsWavefrontMeshPrivate -) - -#### Keys ignored in scope 1:.:.:wavefrontmesh.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "Qt/labs/wavefrontmesh" diff --git a/src/imports/wavefrontmesh/plugin.cpp b/src/imports/wavefrontmesh/plugin.cpp deleted file mode 100644 index 16c40ae8d5..0000000000 --- a/src/imports/wavefrontmesh/plugin.cpp +++ /dev/null @@ -1,61 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2018 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the QtQuick module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> - -#include <QtLabsWavefrontMesh/private/qqmlwavefrontmeshglobal_p.h> -QT_BEGIN_NAMESPACE - -class QmlWavefrontMeshPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QmlWavefrontMeshPlugin(QObject *parent = nullptr) - : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_Qt_labs_wavefrontmesh; - Q_UNUSED(registration); - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/window/CMakeLists.txt b/src/imports/window/CMakeLists.txt deleted file mode 100644 index 4a6015f8f4..0000000000 --- a/src/imports/window/CMakeLists.txt +++ /dev/null @@ -1,11 +0,0 @@ -# special case skip regeneration - -qt_internal_add_qml_module(quickwindow - URI "QtQuick.Window" - VERSION "${PROJECT_VERSION}" - IMPORTS - QtQuick/auto - PAST_MAJOR_VERSIONS 2 - GENERATE_QMLTYPES - INSTALL_QMLTYPES -) diff --git a/src/imports/workerscript/CMakeLists.txt b/src/imports/workerscript/CMakeLists.txt deleted file mode 100644 index 004d8f781e..0000000000 --- a/src/imports/workerscript/CMakeLists.txt +++ /dev/null @@ -1,24 +0,0 @@ -# Generated from workerscript.pro. - -##################################################################### -## workerscriptplugin Plugin: -##################################################################### - -qt_internal_add_qml_module(workerscriptplugin - URI "QtQml.WorkerScript" - VERSION "${PROJECT_VERSION}" - DESIGNER_SUPPORTED - CLASS_NAME QtQmlWorkerScriptPlugin - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::QmlPrivate - Qt::QmlWorkerScriptPrivate -) - -#### Keys ignored in scope 1:.:.:workerscript.pro:<TRUE>: -# CXX_MODULE = "qml" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# TARGETPATH = "QtQml/WorkerScript" diff --git a/src/imports/workerscript/plugin.cpp b/src/imports/workerscript/plugin.cpp deleted file mode 100644 index 55b88cb9b7..0000000000 --- a/src/imports/workerscript/plugin.cpp +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2019 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the plugins of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQmlWorkerScript/private/qtqmlworkerscriptglobal_p.h> -#include <QtQml/qqmlextensionplugin.h> - -QT_BEGIN_NAMESPACE - -/*! - \qmlmodule QtQml.WorkerScript 2.\QtMinorVersion - \title Qt QML WorkerScript QML Types - \ingroup qmlmodules - \brief Provides QML types for worker scripts - \since 5.14 - - This QML module contains types for using worker scripts. - - To use the types in this module, import the module with the following line: - - \qml - import QtQml.WorkerScript - \endqml -*/ - -class QtQmlWorkerScriptPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQmlWorkerScriptPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQml_WorkerScript; - Q_UNUSED(registration); - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/xmllistmodel/CMakeLists.txt b/src/imports/xmllistmodel/CMakeLists.txt deleted file mode 100644 index 1f9fb50dfa..0000000000 --- a/src/imports/xmllistmodel/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -qt_internal_add_qml_module(qmlxmllistmodelplugin - URI "QtQml.XmlListModel" - VERSION "${PROJECT_VERSION}" - CLASS_NAME QtQmlXmlListModelPlugin - SKIP_TYPE_REGISTRATION - DEPENDENCIES - QtQml - PLUGIN_OPTIONAL - SOURCES - plugin.cpp - PUBLIC_LIBRARIES - Qt::Core - Qt::Qml - Qt::QmlXmlListModelPrivate -) diff --git a/src/imports/xmllistmodel/plugin.cpp b/src/imports/xmllistmodel/plugin.cpp deleted file mode 100644 index d4ddcd317d..0000000000 --- a/src/imports/xmllistmodel/plugin.cpp +++ /dev/null @@ -1,59 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2021 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of the Qt Quick Layouts module of the Qt Toolkit. -** -** $QT_BEGIN_LICENSE:LGPL$ -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** -** $QT_END_LICENSE$ -** -****************************************************************************/ - -#include <QtQml/qqmlextensionplugin.h> -#include <QtQmlXmlListModel/private/qtqmlxmllistmodelglobal_p.h> - -QT_BEGIN_NAMESPACE - -class QtQmlXmlListModelPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQmlXmlListModelPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQml_XmlListModel; - Q_UNUSED(registration) - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/labs/animation/CMakeLists.txt b/src/labs/animation/CMakeLists.txt index 2985139bf0..88e756f3a6 100644 --- a/src/labs/animation/CMakeLists.txt +++ b/src/labs/animation/CMakeLists.txt @@ -1,20 +1,14 @@ -qt_internal_add_module(LabsAnimation - SOURCES - qquickboundaryrule.cpp qquickboundaryrule_p.h - qqmlanimationglobal_p.h - DEFINES - QT_BUILD_LABSANIMATION_LIB - PUBLIC_LIBRARIES - Qt::QmlPrivate - Qt::QuickPrivate +qt_internal_add_qml_module(LabsAnimation + URI "Qt.labs.animation" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET labsanimationplugin + CLASS_NAME QtLabsAnimationPlugin + SOURCES + qquickboundaryrule.cpp qquickboundaryrule_p.h + qqmlanimationglobal_p.h + DEFINES + QT_BUILD_LABSANIMATION_LIB + PUBLIC_LIBRARIES + Qt::QmlPrivate + Qt::QuickPrivate ) - -set_target_properties(LabsAnimation PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.animation - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/animation" -) - -qt6_qml_type_registration(LabsAnimation) diff --git a/src/labs/animation/doc/src/qmlanimation.qdoc b/src/labs/animation/doc/src/qmlanimation.qdoc new file mode 100644 index 0000000000..c8d949b27b --- /dev/null +++ b/src/labs/animation/doc/src/qmlanimation.qdoc @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmlmodule Qt.labs.animation 1.0 + \title Qt Quick experimental animation types + \ingroup qmlmodules + \brief Provides QML experimental types for animation + \since 5.14 + + This QML module contains experimental QML types related to animation. + + To use the types in this module, import the module with the following line: + + \code + import Qt.labs.animation + \endcode +*/ diff --git a/src/labs/folderlistmodel/CMakeLists.txt b/src/labs/folderlistmodel/CMakeLists.txt index fb6e47e154..8f49d691dd 100644 --- a/src/labs/folderlistmodel/CMakeLists.txt +++ b/src/labs/folderlistmodel/CMakeLists.txt @@ -1,23 +1,16 @@ -qt_internal_add_module(LabsFolderListModel - SOURCES +qt_internal_add_qml_module(LabsFolderListModel + URI "Qt.labs.folderlistmodel" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmlfolderlistmodelplugin + CLASS_NAME QmlFolderListModelPlugin + SOURCES fileinfothread.cpp fileinfothread_p.h fileproperty_p.h qquickfolderlistmodel.cpp qquickfolderlistmodel_p.h qquickfolderlistmodelglobal_p.h - DEFINES + DEFINES QT_BUILD_LABSFOLDERMODEL_LIB - PUBLIC_LIBRARIES + PUBLIC_LIBRARIES Qt::CorePrivate Qt::QmlPrivate ) - -set_target_properties(LabsFolderListModel PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.folderlistmodel - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/folderlistmodel" -) - - -qt6_qml_type_registration(LabsFolderListModel) diff --git a/src/labs/models/CMakeLists.txt b/src/labs/models/CMakeLists.txt index 98fdf0aa74..e417013ea6 100644 --- a/src/labs/models/CMakeLists.txt +++ b/src/labs/models/CMakeLists.txt @@ -1,12 +1,16 @@ -qt_internal_add_module(LabsQmlModels - SOURCES - qqmlmodelsglobal_p.h - DEFINES - QT_BUILD_LABSQMLMODELS_LIB - PUBLIC_LIBRARIES +qt_internal_add_qml_module(LabsQmlModels + URI "Qt.labs.qmlmodels" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET labsmodelsplugin + CLASS_NAME QtQmlLabsModelsPlugin + SOURCES + qqmlmodelsglobal_p.h + DEFINES + QT_BUILD_LABSQMLMODELS_LIB + PUBLIC_LIBRARIES Qt::QmlModelsPrivate Qt::QmlPrivate - ) +) qt_internal_extend_target(LabsQmlModels CONDITION QT_FEATURE_qml_table_model SOURCES @@ -18,14 +22,3 @@ qt_internal_extend_target(LabsQmlModels CONDITION QT_FEATURE_qml_delegate_model SOURCES qqmldelegatecomponent.cpp qqmldelegatecomponent_p.h ) - -set_target_properties(LabsQmlModels PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.qmlmodels - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/qmlmodels" - -) - -qt6_qml_type_registration(LabsQmlModels) diff --git a/src/labs/models/doc/src/qmllabsmodels.qdoc b/src/labs/models/doc/src/qmllabsmodels.qdoc new file mode 100644 index 0000000000..f780a75687 --- /dev/null +++ b/src/labs/models/doc/src/qmllabsmodels.qdoc @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmlmodule Qt.labs.qmlmodels 1.0 + \title Qt QML Models experimental QML Types + \ingroup qmlmodules + \brief Provides QML experimental types for data models. + \since 5.12 + + This QML module contains experimental QML types related to data models. + + To use the types in this module, import the module with the following line: + + \code + import Qt.labs.qmlmodels + \endcode +*/ diff --git a/src/labs/settings/CMakeLists.txt b/src/labs/settings/CMakeLists.txt index c323e6f9ce..e40e727f98 100644 --- a/src/labs/settings/CMakeLists.txt +++ b/src/labs/settings/CMakeLists.txt @@ -1,4 +1,8 @@ -qt_internal_add_module(LabsSettings +qt_internal_add_qml_module(LabsSettings + URI "Qt.labs.settings" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmlsettingsplugin + CLASS_NAME QmlSettingsPlugin SOURCES qqmlsettings.cpp qqmlsettings_p.h qqmlsettingsglobal_p.h @@ -8,13 +12,3 @@ qt_internal_add_module(LabsSettings Qt::Core Qt::Qml ) - -set_target_properties(LabsSettings PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.settings - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/settings" -) - -qt6_qml_type_registration(LabsSettings) diff --git a/src/labs/sharedimage/CMakeLists.txt b/src/labs/sharedimage/CMakeLists.txt index e1b4706043..b59c30d905 100644 --- a/src/labs/sharedimage/CMakeLists.txt +++ b/src/labs/sharedimage/CMakeLists.txt @@ -1,23 +1,25 @@ -qt_internal_add_module(LabsSharedImage - SOURCES +qt_internal_add_qml_module(LabsSharedImage + URI "Qt.labs.sharedimage" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET sharedimageplugin + NO_PLUGIN_OPTIONAL + NO_GENERATE_PLUGIN_SOURCE + CLASS_NAME QtQuickSharedImagePlugin + SOURCES qsharedimageloader.cpp qsharedimageloader_p.h qsharedimageprovider.cpp qsharedimageprovider_p.h qtlabssharedimageglobal_p.h - DEFINES + DEFINES QT_BUILD_LABSSHAREDIMAGE_LIB - PUBLIC_LIBRARIES + PUBLIC_LIBRARIES Qt::CorePrivate Qt::GuiPrivate Qt::QuickPrivate ) - -set_target_properties(LabsSharedImage PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.sharedimage - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/sharedimage" +# We need to do additional initialization, so we have to provide our own +# plugin class rather than using the generated one +qt_internal_extend_target(sharedimageplugin + SOURCES qsharedimageplugin.cpp + LIBRARIES Qt::LabsSharedImagePrivate ) - -qt6_qml_type_registration(LabsSharedImage) diff --git a/src/imports/sharedimage/plugin.cpp b/src/labs/sharedimage/doc/src/qsharedimage.qdoc index dab04efd92..119f49bf91 100644 --- a/src/imports/sharedimage/plugin.cpp +++ b/src/labs/sharedimage/doc/src/qsharedimage.qdoc @@ -1,11 +1,11 @@ /**************************************************************************** ** -** Copyright (C) 2017 The Qt Company Ltd. +** Copyright (C) 2021 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** -** This file is part of the plugins of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the @@ -14,35 +14,17 @@ ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include <QtLabsSharedImage/private/qtlabssharedimageglobal_p.h> -#include <QtLabsSharedImage/private/qsharedimageprovider_p.h> - -#include <qqmlextensionplugin.h> -#include <qqmlengine.h> - /*! \qmlmodule Qt.labs.sharedimage 1 \title Qt Quick Shared Image Provider @@ -99,27 +81,3 @@ The shared image module does not provide any directly usable QML types. */ - -QT_BEGIN_NAMESPACE - -class QtQuickSharedImagePlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQuickSharedImagePlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_Qt_labs_sharedimage; - Q_UNUSED(registration); - } - - void initializeEngine(QQmlEngine *engine, const char *uri) override - { - Q_UNUSED(uri); - engine->addImageProvider("shared", new SharedImageProvider); - } -}; - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/imports/settings/plugin.cpp b/src/labs/sharedimage/qsharedimageplugin.cpp index 428bd27198..dab68410f3 100644 --- a/src/imports/settings/plugin.cpp +++ b/src/labs/sharedimage/qsharedimageplugin.cpp @@ -1,9 +1,9 @@ /**************************************************************************** ** -** Copyright (C) 2016 The Qt Company Ltd. +** Copyright (C) 2017 The Qt Company Ltd. ** Contact: https://www.qt.io/licensing/ ** -** This file is part of the QtQml module of the Qt Toolkit. +** This file is part of the plugins of the Qt Toolkit. ** ** $QT_BEGIN_LICENSE:LGPL$ ** Commercial License Usage @@ -37,26 +37,32 @@ ** ****************************************************************************/ -#include <QtQml/qqmlextensionplugin.h> -#include <QtQml/qqml.h> +#include <QtLabsSharedImage/private/qtlabssharedimageglobal_p.h> +#include <QtLabsSharedImage/private/qsharedimageprovider_p.h> -#include <QtLabsSettings/private/qqmlsettingsglobal_p.h> +#include <qqmlextensionplugin.h> +#include <qqmlengine.h> QT_BEGIN_NAMESPACE -class QmlSettingsPlugin : public QQmlEngineExtensionPlugin +class QtQuickSharedImagePlugin : public QQmlEngineExtensionPlugin { Q_OBJECT Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) - public: - QmlSettingsPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) + QtQuickSharedImagePlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) { - volatile auto registration = &qml_register_types_Qt_labs_settings; + volatile auto registration = &qml_register_types_Qt_labs_sharedimage; Q_UNUSED(registration); } + + void initializeEngine(QQmlEngine *engine, const char *uri) override + { + Q_UNUSED(uri); + engine->addImageProvider("shared", new SharedImageProvider); + } }; QT_END_NAMESPACE -#include "plugin.moc" +#include "qsharedimageplugin.moc" diff --git a/src/labs/wavefrontmesh/CMakeLists.txt b/src/labs/wavefrontmesh/CMakeLists.txt index 718bf09624..7a6c7a5cc0 100644 --- a/src/labs/wavefrontmesh/CMakeLists.txt +++ b/src/labs/wavefrontmesh/CMakeLists.txt @@ -1,22 +1,15 @@ -qt_internal_add_module(LabsWavefrontMesh - SOURCES - qwavefrontmesh.cpp qwavefrontmesh_p.h - qqmlwavefrontmeshglobal_p.h - DEFINES +qt_internal_add_qml_module(LabsWavefrontMesh + URI "Qt.labs.wavefrontmesh" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmlwavefrontmeshplugin + CLASS_NAME QmlWavefrontMeshPlugin + SOURCES + qwavefrontmesh.cpp qwavefrontmesh_p.h + qqmlwavefrontmeshglobal_p.h + DEFINES QT_BUILD_LABSWAVEFRONTMESH_LIB - PUBLIC_LIBRARIES + PUBLIC_LIBRARIES Qt::CorePrivate Qt::GuiPrivate Qt::QuickPrivate ) - - -set_target_properties(LabsWavefrontMesh PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI Qt.labs.wavefrontmesh - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/Qt/labs/wavefrontmesh" -) - -qt6_qml_type_registration(LabsWavefrontMesh) diff --git a/src/particles/CMakeLists.txt b/src/particles/CMakeLists.txt index 0b6e21fd9f..076cac11e0 100644 --- a/src/particles/CMakeLists.txt +++ b/src/particles/CMakeLists.txt @@ -1,10 +1,14 @@ -# Generated from particles.pro. - ##################################################################### ## QuickParticles Module: ##################################################################### -qt_internal_add_module(QuickParticles +qt_internal_add_qml_module(QuickParticles + URI "QtQuick.Particles" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET particlesplugin + CLASS_NAME QtQuick2ParticlesPlugin + DEPENDENCIES + QtQuick INTERNAL_MODULE SOURCES qquickage.cpp qquickage_p.h @@ -82,17 +86,6 @@ qt_internal_add_resource(QuickParticles "particles1" ${particles1_resource_files} ) - -#### Keys ignored in scope 1:.:.:particles.pro:<TRUE>: -# MODULE = "quickparticles" -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQuick/Particles" -# QML_IMPORT_NAME = "QtQuick.Particles" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -## Scopes: -##################################################################### - qt_internal_extend_target(QuickParticles CONDITION MSVC DEFINES _CRT_SECURE_NO_WARNINGS @@ -109,13 +102,3 @@ qt_internal_extend_target(QuickParticles CONDITION EXISTS "qqml_enable_gcov" -fprofile-arcs -ftest-coverage ) - -set_target_properties(QuickParticles PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQuick.Particles - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQuick/Particles" -) - -qt6_qml_type_registration(QuickParticles) diff --git a/src/qml/CMakeLists.txt b/src/qml/CMakeLists.txt index ce62e48ca0..adf62af47f 100644 --- a/src/qml/CMakeLists.txt +++ b/src/qml/CMakeLists.txt @@ -1,10 +1,31 @@ -# Generated from qml.pro. +include(Qt6QmlBuildInternals.cmake) ##################################################################### ## Qml Module: ##################################################################### -qt_internal_add_module(Qml +# Need to evaluate Qml features early. We can't wait until +# qt_internal_add_qml_module() is executed because we need feature evaluation +# to determine some of the arguments to that command. +qt_feature_evaluate_features("${CMAKE_CURRENT_SOURCE_DIR}/configure.cmake") + +set(module_dynamic_qml_imports + QtQml.Models/auto +) + +if (QT_FEATURE_qml_worker_script) + list(APPEND module_dynamic_qml_imports + QtQml.WorkerScript/auto + ) +endif() + +qt_internal_add_qml_module(Qml + URI "QtQml" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET qmlplugin + CLASS_NAME QtQmlPlugin + IMPORTS ${module_dynamic_qml_imports} PLUGIN_TYPES qmltooling SOURCES ../3rdparty/masm/assembler/ARM64Assembler.h @@ -356,7 +377,9 @@ qt_internal_add_module(Qml PRIVATE_MODULE_INTERFACE Qt::CorePrivate EXTRA_CMAKE_FILES - "${CMAKE_CURRENT_SOURCE_DIR}/Qt6qmldirTemplate.cmake.in" + "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}qmldirTemplate.cmake.in" + "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}QmlImportScannerTemplate.cpp.in" + "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}QmlPluginTemplate.cpp.in" ) # special case begin remove the block, handled manually @@ -373,15 +396,6 @@ qt_process_qlalr(Qml "${CMAKE_CURRENT_SOURCE_DIR}/parser/qqmljs.g" "${_qt_qlalr_ qt_declarative_generate_reg_exp_jit_tables(Qml) # special case end -#### Keys ignored in scope 1:.:.:qml.pro:<TRUE>: -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQml" -# QML_IMPORT_NAME = "QtQml" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -## Scopes: -##################################################################### - qt_internal_extend_target(Qml CONDITION QT_FEATURE_qml_network SOURCES qml/qqmltypeloadernetworkreplyproxy.cpp qml/qqmltypeloadernetworkreplyproxy_p.h @@ -652,33 +666,3 @@ qt_internal_create_tracepoints(Qml qtqml.tracepoints) qt_internal_add_docs(Qml doc/qtqml.qdocconf ) - - -set_target_properties(Qml PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQml - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQml" -) - -qt6_qml_type_registration(Qml) - -include(Qt6QmlBuildInternals.cmake) # special case - -# special case begin -# Install Qml import scanner template cpp file. -set(target "Qml") -set(path_suffix "${INSTALL_CMAKE_NAMESPACE}${target}") -qt_path_join(config_install_dir ${QT_CONFIG_INSTALL_DIR} ${path_suffix}) -qt_copy_or_install(FILES - "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}${target}ImportScannerTemplate.cpp.in" - DESTINATION "${config_install_dir}" -) - -# Install pure QML Plugin template cpp file. -qt_copy_or_install(FILES - "${CMAKE_CURRENT_LIST_DIR}/${INSTALL_CMAKE_NAMESPACE}${target}PluginTemplate.cpp.in" - DESTINATION "${config_install_dir}" -) -# special case end diff --git a/src/qml/Qt6QmlBuildInternals.cmake b/src/qml/Qt6QmlBuildInternals.cmake index ef2c1c4ac6..5196a2f7ed 100644 --- a/src/qml/Qt6QmlBuildInternals.cmake +++ b/src/qml/Qt6QmlBuildInternals.cmake @@ -4,51 +4,58 @@ 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: +# This function is essentially a wrapper around qt6_add_qml_module(). +# It creates the targets explicitly and sets up internal properties before +# passing those targets to qt6_add_qml_module() for further updates. +# All keywords supported by qt_internal_add_module() can be used, as can most +# keywords for qt6_add_qml_module() except RESOURCE_PREFIX and +# OUTPUT_TARGETS. # -# - 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. +# OUTPUT_DIRECTORY and INSTALL_DIRECTORY will be given more appropriate defaults +# if not provided by the caller. The defaults are usually what you want to use. +# +# - SOURCES is only passed through to qt_internal_add_plugin() or +# qt_internal_add_module() but not to qt6_add_qml_module(). # # See qt_internal_add_plugin() and qt6_add_qml_module() for the full set of # supported keywords. function(qt_internal_add_qml_module target) - _qt_internal_get_add_plugin_keywords( - public_option_args - public_single_args - public_multi_args - ) - qt_internal_get_internal_add_plugin_keywords( - internal_option_args - internal_single_args - internal_multi_args + qt_internal_get_internal_add_module_keywords( + module_option_args + module_single_args + module_multi_args ) # We don't want to pass CLASS_NAME to qt_internal_add_plugin(), we will # pass it to qt6_add_qml_module() to handle instead. qt_internal_add_plugin() # would just ignore it anyway because we set TYPE to qml_plugin, but we have # to remove it to prevent duplicates in argument parsing. - list(REMOVE_ITEM public_single_args CLASS_NAME) + list(REMOVE_ITEM module_single_args CLASS_NAME) set(qml_module_option_args - GENERATE_QMLTYPES - INSTALL_QMLTYPES DESIGNER_SUPPORTED - SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL + NO_PLUGIN_OPTIONAL + NO_CREATE_PLUGIN_TARGET + NO_GENERATE_PLUGIN_SOURCE + NO_GENERATE_QMLTYPES + NO_GENERATE_QMLDIR + NO_LINT + NO_CACHEGEN + ) + # TODO: Remove these once all repos have been updated to not use them + set(ignore_option_args + SKIP_TYPE_REGISTRATION # Now always done + PLUGIN_OPTIONAL # Now the default + GENERATE_QMLTYPES # Now the default + INSTALL_QMLTYPES # Now the default ) set(qml_module_single_args URI TARGET_PATH VERSION + PLUGIN_TARGET TYPEINFO CLASS_NAME CLASSNAME # TODO: Remove once all other repos have been updated to use @@ -56,26 +63,36 @@ function(qt_internal_add_qml_module target) ) set(qml_module_multi_args + # SOURCES will be handled by qt_internal_add_module() QML_FILES IMPORTS + IMPORT_PATH OPTIONAL_IMPORTS DEPENDENCIES PAST_MAJOR_VERSIONS ) + # Args used by qt_internal_add_qml_module directly, which should not be passed to any other + # functions. + # INSTALL_SOURCE_QMLTYPES takes a path to an existing plugins.qmltypes file that should be + # installed. + # INSTALL_SOURCE_QMLDIR takes a path to an existing qmldir file that should be installed. + set(internal_single_args + INSTALL_SOURCE_QMLTYPES + INSTALL_SOURCE_QMLDIR) + set(option_args - ${public_option_args} - ${internal_option_args} + ${module_option_args} ${qml_module_option_args} + ${ignore_option_args} ) set(single_args - ${public_single_args} - ${internal_single_args} + ${module_single_args} ${qml_module_single_args} + ${internal_single_args} ) set(multi_args - ${public_multi_args} - ${internal_multi_args} + ${module_multi_args} ${qml_module_multi_args} ) @@ -86,44 +103,123 @@ function(qt_internal_add_qml_module target) ${ARGN} ) - if (NOT arg_TARGET_PATH) + if(NOT arg_TARGET_PATH) string(REPLACE "." "/" arg_TARGET_PATH ${arg_URI}) endif() - if (NOT arg_OUTPUT_DIRECTORY) + if(NOT arg_OUTPUT_DIRECTORY) set(arg_OUTPUT_DIRECTORY "${QT_BUILD_DIR}/${INSTALL_QMLDIR}/${arg_TARGET_PATH}") endif() - if (NOT arg_INSTALL_DIRECTORY) + if(NOT arg_INSTALL_DIRECTORY) set(arg_INSTALL_DIRECTORY "${INSTALL_QMLDIR}/${arg_TARGET_PATH}") endif() + if(NOT arg_PLUGIN_TARGET) + set(arg_PLUGIN_TARGET ${target}plugin) + endif() - qt_remove_args(plugin_args - ARGS_TO_REMOVE - ${qml_module_option_args} - ${qml_module_single_args} - ${qml_module_multi_args} - OUTPUT_DIRECTORY - INSTALL_DIRECTORY - ALL_ARGS - ${option_args} - ${single_args} - ${multi_args} - ARGS - ${ARGN} - ) + # TODO: Support for old keyword, remove once all repos no longer use CLASSNAME + if(arg_CLASSNAME) + if(arg_CLASS_NAME AND NOT arg_CLASSNAME STREQUAL arg_CLASS_NAME) + message(FATAL_ERROR + "Both CLASSNAME and CLASS_NAME were given and were different. " + "Update call site to only use CLASS_NAME." + ) + endif() + set(arg_CLASS_NAME "${arg_CLASSNAME}") + unset(arg_CLASSNAME) + endif() - qt_internal_add_plugin(${target} - TYPE qml_plugin - OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} - INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} - ${plugin_args} - ) + set(plugin_args "") + if(NOT arg_PLUGIN_TARGET STREQUAL target) + # Create the backing target now to handle module-related things + qt_remove_args(module_args + ARGS_TO_REMOVE + ${ignore_option_args} + ${qml_module_option_args} + ${qml_module_single_args} + ${qml_module_multi_args} + ${internal_single_args} + OUTPUT_DIRECTORY + INSTALL_DIRECTORY + ALL_ARGS + ${option_args} + ${single_args} + ${multi_args} + ARGS + ${ARGN} + ) + qt_internal_add_module(${target} ${module_args}) + else() + # Since we are not creating a separate backing target, we have to pass + # through the default args to the plugin target creation instead + qt_internal_get_internal_add_plugin_keywords( + plugin_option_args plugin_single_args plugin_multi_args + ) + set(args_to_remove ${option_args} ${single_args} ${multi_args}) + list(REMOVE_ITEM args_to_remove + ${plugin_option_args} + ${plugin_single_args} + ${plugin_multi_args} + ) + qt_remove_args(plugin_args + ARGS_TO_REMOVE + ${args_to_remove} + DEFAULT_IF + OUTPUT_DIRECTORY + INSTALL_DIRECTORY + CLASS_NAME + CLASSNAME + ALL_ARGS + ${option_args} + ${single_args} + ${multi_args} + ARGS + ${ARGN} + ) + endif() + + if(NOT arg_NO_CREATE_PLUGIN_TARGET) + # Create plugin target now so we can set internal things + list(APPEND plugin_args + TYPE qml_plugin + DEFAULT_IF FALSE + OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + INSTALL_DIRECTORY ${arg_INSTALL_DIRECTORY} + CLASS_NAME ${arg_CLASS_NAME} + ) + + qt_internal_add_plugin(${arg_PLUGIN_TARGET} ${plugin_args}) + + if(NOT arg_PLUGIN_TARGET STREQUAL target) + get_target_property(lib_type ${arg_PLUGIN_TARGET} TYPE) + if(lib_type STREQUAL "STATIC_LIBRARY") + # This is needed so that the dependency on the backing target + # is included in the plugin's find_package() support. + # The naming of backing targets and plugins don't typically + # follow the pattern of other plugins with regard to Private + # suffixes, so the dependency logic in qt_internal_add_plugin() + # doesn't find these. For non-static builds, the private + # dependency doesn't get exposed to find_package(), so we don't + # have to make the dependency known for that case. + set_property(TARGET ${arg_PLUGIN_TARGET} APPEND PROPERTY + _qt_target_deps "${INSTALL_CMAKE_NAMESPACE}${target}\;${PROJECT_VERSION}" + ) + endif() + endif() + + # FIXME: Some repos expect this to be set and use it to install other + # things relative to it. They should just specify the install + # location directly. Once the other repos have been updated to + # not rely on this, remove this property. + set_target_properties(${arg_PLUGIN_TARGET} PROPERTIES + QT_QML_MODULE_INSTALL_DIR ${arg_INSTALL_DIRECTORY} + ) + endif() + # TODO: Check if we need arg_SOURCES in this condition 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_option_args) if(arg_${opt}) @@ -131,29 +227,92 @@ function(qt_internal_add_qml_module target) endif() endforeach() - # Pass through single and multi-value args as provided + # 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) + if(QT_LIBINFIX) + list(APPEND add_qml_module_args __QT_INTERNAL_QT_LIBINFIX "${QT_LIBINFIX}") endif() + # Update the backing and plugin targets with qml-specific things. 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" + OUTPUT_TARGETS resource_targets ) + + if(resource_targets) + qt_install(TARGETS ${resource_targets} + EXPORT "${INSTALL_CMAKE_NAMESPACE}${target}Targets" + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + qt_internal_record_rcc_object_files(${target} "${resource_targets}" + INSTALL_DIRECTORY "${arg_INSTALL_DIRECTORY}" + ) + endif() + + # Empty list will not cause an installation error. + qt_install( + FILES $<TARGET_PROPERTY:${target},QT_QML_MODULE_FILES> + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + + if(NOT arg_NO_GENERATE_QMLTYPES) + qt_install( + FILES ${arg_OUTPUT_DIRECTORY}/$<TARGET_PROPERTY:${target},QT_QMLTYPES_FILENAME> + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + endif() + + if(NOT arg_NO_GENERATE_QMLDIR) + qt_install( + FILES ${arg_OUTPUT_DIRECTORY}/qmldir + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + endif() + + if(arg_INSTALL_SOURCE_QMLTYPES) + message(AUTHOR_WARNING + "INSTALL_SOURCE_QMLTYPES option is deprecated and should not be used. " + "Please port your module to use declarative type registration.") + + set(files ${arg_INSTALL_SOURCE_QMLTYPES}) + if(QT_WILL_INSTALL) + install( + FILES ${files} + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + else() + file( + COPY ${files} + DESTINATION "${arg_OUTPUT_DIRECTORY}" + ) + endif() + endif() + + if(arg_INSTALL_SOURCE_QMLDIR) + message(AUTHOR_WARNING + "INSTALL_SOURCE_QMLDIR option is deprecated and should not be used. " + "Please port your module to use declarative type registration.") + + set(files ${arg_INSTALL_SOURCE_QMLDIR}) + if(QT_WILL_INSTALL) + install( + FILES ${files} + DESTINATION "${arg_INSTALL_DIRECTORY}" + ) + else() + file( + COPY ${files} + DESTINATION "${arg_OUTPUT_DIRECTORY}" + ) + endif() + endif() endfunction() if(NOT QT_NO_INTERNAL_COMPATIBILITY_FUNCTIONS) diff --git a/src/qml/Qt6QmlMacros.cmake b/src/qml/Qt6QmlMacros.cmake index 501d76bfe5..116d6a65a4 100644 --- a/src/qml/Qt6QmlMacros.cmake +++ b/src/qml/Qt6QmlMacros.cmake @@ -2,58 +2,99 @@ # Q6QmlMacros # -set(__qt_qml_macros_module_base_dir "${CMAKE_CURRENT_LIST_DIR}") +set(__qt_qml_macros_module_base_dir "${CMAKE_CURRENT_LIST_DIR}" CACHE INTERNAL "") +# Create a Qml Module. # -# Create a Qml Module. Arguments: +# target: The name of the target to use for the qml module. If it does not +# already exist, it will be created. This is referred to as the "backing +# target" when a separate plugin is also generated (see PLUGIN_TARGET below). +# (REQUIRED) # # URI: Declares the module identifier of the module. The module identifier is -# the (dotted URI notation) identifier for the module, which must match the -# module's install path. (REQUIRED) +# the (dotted URI notation) identifier for the module, which must match the +# module's install path. (REQUIRED) # # VERSION: The module's version. (REQUIRED) # +# PAST_MAJOR_VERSIONS: List of past major versions this QML module was available +# in. Ensures that the module can be imported when using these major versions. +# (OPTIONAL) +# # TARGET_PATH: Overwrite the generated target path. By default the target path # is generated from the URI by replacing the '.' with a '/'. However, under # certain circumstance this may not be enough. Use this argument to provide # a replacement. (OPTIONAL) # -# RESOURCE_PREFIX: Resource Prefix to be used when generating a static library. -# When building a static library, the qmldir file is embedded into the library -# using rcc. It is is also used by the Qt Quick Compiler to embed compiled -# Qml files into a shared or static library. If none is supplied we will -# generate the following prefix: /org.qt-project/imports/${target_path}. -# (OPTIONAL) -# -# OUTPUT_DIRECTORY: If the module is not to be build under -# ${CMAKE_CURRENT_BINARY_DIR}. This ensures the qmldir file is copied to the -# right location. (OPTIONAL) -# -# INSTALL_DIRECTORY: Intended installation directory for this module. (OPTIONAL) -# -# SOURCES: List of C++ sources. (OPTIONAL) -# -# DEPENDENCIES: List of QML Module dependencies and their versions. The module -# and its version must be separated via a slash(/). E.g. QtQuick/2.0 +# RESOURCE_PREFIX: Resource Prefix to be used when adding resources to the +# target. This may include the qmldir file, compiled/cached *.qml files, etc. +# If not specified, a default prefix of "/" is used. (OPTIONAL) # -# PAST_MAJOR_VERSIONS: List of past major versions this QML module was available -# in. Ensures that the module can be imported when using these major versions. +# OUTPUT_DIRECTORY: Overrides the directory where the qmldir, *.qmltypes and +# plugin library will be created. Defaults to ${CMAKE_CURRENT_BINARY_DIR} if +# not specified. (OPTIONAL) # -# QML_FILES: List of Qml files. See qt6_target_qml_files for more information -# on how to specify additional properties on qml files. (OPTIONAL) +# STATIC, SHARED: Explicitly specify the type of library to create. At most one +# of these two options can be specified. If neither is given, then the type of +# library follows CMake's usual rules of creating a static library unless the +# BUILD_SHARED_LIBS variable is set to true. (OPTIONAL) # # CLASS_NAME: Provides the class name of the C++ plugin used by the module. This # information is required for all the QML modules that depend on a C++ plugin # for additional functionality. Qt Quick applications built with static # linking cannot resolve the module imports without this information. -# (REQUIRED for static QML modules backed by C++ sources aka non-pure QML modules) +# If no CLASS_NAME is given, it defaults to the URI with non-alphanumeric +# characters converted to underscores, and "Plugin" appended. If an existing +# target is passed in as the PLUGIN_TARGET and it has a QT_PLUGIN_CLASS_NAME +# target property set, that will be used as the default CLASS_NAME instead. +# (OPTIONAL) +# +# PLUGIN_TARGET: The recommended arrangement is to have separate backing and +# plugin libraries. By default, the plugin library will be created as a second +# CMake target with the same name as ${target}, but with "plugin" appended. +# This name can be overridden with PLUGIN_TARGET. To use a single target +# instead of separate backing and plugin targets, set PLUGIN_TARGET to the +# same as ${target}. (OPTIONAL) +# +# NO_CREATE_PLUGIN_TARGET: When given, the plugin target will not be +# automatically created. Use this if the qml module will always be used by +# linking directly to the backing target and no plugin is needed at runtime. +# An executable that is set up as its own qml module is one example where this +# option is appropriate. Note also that an existing target can be specified in +# PLUGIN_TARGET, in which case it will be modified by this function rather +# than created by it. (OPTIONAL) +# +# NO_GENERATE_PLUGIN_SOURCE: A .cpp file will be created for the plugin class +# by default and automatically added to the plugin target. Use this option to +# indicate that no such .cpp file should be generated. The caller is then +# responsible for providing their own plugin class if a separate plugin will +# be created. Note that this option is independent of NO_CREATE_PLUGIN_TARGET. +# (OPTIONAL) +# +# NO_PLUGIN_OPTIONAL: The plugin is marked as optional in the qmldir file by +# default. If the plugin contains code other than just the shim plugin loader +# class, specify this option to indicate that the plugin must always be loaded +# as part of the qml module. (OPTIONAL) +# +# OUTPUT_TARGETS: In static builds, additional CMake targets can be created +# which consumers of the module will need to link to and potentially install. +# Supply the name of an output variable, which will be set to a list of these +# targets. If installing the main target, you will also need to install these +# output targets for static builds. (OPTIONAL) # # DESIGNER_SUPPORTED: Specify this argument if the plugin is supported by Qt # Quick Designer. By default, the plugin will not be supported. (OPTIONAL) # # TYPEINFO: Path to a file which declares a type description file for the module # that can be read by QML tools such as Qt Creator to access information about -# the types defined by the module's plugins. (OPTIONAL) +# the types defined by the module's plugins. You will typically need to also +# specify NO_GENERATE_QMLTYPES if using this option. When TYPEINFO is not +# specified, it will default to "${target}.qmltypes". (OPTIONAL) +# +# NO_GENERATE_QMLTYPES: Do not automatically generate the *.qmltypes file. +# See also the TYPEINFO option. (OPTIONAL) +# +# NO_GENERATE_QMLDIR: Do not automatically generate the qmldir file. (OPTIONAL) # # IMPORTS: List of other Qml Modules that this module imports. A version can be # specified by appending it after a slash(/), e.g QtQuick/2.0. The minor @@ -64,78 +105,128 @@ set(__qt_qml_macros_module_base_dir "${CMAKE_CURRENT_LIST_DIR}") # OPTIONAL_IMPORTS: List of other Qml Modules that this module may import at # run-time. Those are not automatically imported by the QML engine when # importing the current module, but rather serve as hints to tools like -# qmllint. Versions can be specified in the same as for IMPORT. (OPTIONAL) +# qmllint. Versions can be specified in the same way as for IMPORTS. +# (OPTIONAL) +# +# DEPENDENCIES: List of QML Module dependencies and their versions. The module +# and its version must be separated via a slash(/). E.g. QtQuick/2.0 +# (OPTIONAL) # -# RESOURCE_EXPORT: In static builds, when Qml files are processed via the Qt -# Quick Compiler generate a separate static library that will be linked in -# as an Interface. Supply an output variable to perform any custom actions -# on these extra generated targets. +# IMPORT_PATH: State that QML modules this one depends on may be found in the +# given import paths. (OPTIONAL) # -# SKIP_TYPE_REGISTRATION: When present will cause the generated qmldir file -# to not list any qml types. These are expected to be registered by the -# c++ plugin code instead. +# SOURCES: List of C++ sources. (OPTIONAL) # -# PLUGIN_OPTIONAL: The plugin is marked as optional in the qmldir file. If the -# type registration functions are already available by other means, typically -# by linking a library proxied by the plugin, it won't be loaded. +# QML_FILES: List of Qml files. See qt6_target_qml_sources() for more +# information on how to specify additional properties on qml files. (OPTIONAL) # -# PURE_MODULE: The plugin does not take any C++ source files. A dummy class plugin cpp file will -# be generated to ensure the module is found by the Qml engine. +# NO_LINT: By default, this function will create a separate ${target}_qmllint +# target if any .qml files are added to ${target} (see qt6_add_qml_sources()). +# Provide the NO_LINT option to disable this behavior. (OPTIONAL) # -# IMPORT_PATH: State that QML modules this one depends on may be found in the given import paths. +# NO_CACHEGEN: By default, this function will compile each .qml file added to +# the target and store that compiled version in the target's resources. +# Provide the NO_CACHEGEN option to disable this behavior. +# See qt6_add_qml_sources() for further details. (OPTIONAL) # -# This function is currently in Technical Preview. -# It's signature and behavior might change. function(qt6_add_qml_module target) - set(args_optional - GENERATE_QMLTYPES - INSTALL_QMLTYPES + set(args_option + STATIC + SHARED DESIGNER_SUPPORTED + NO_PLUGIN_OPTIONAL + NO_CREATE_PLUGIN_TARGET + NO_GENERATE_PLUGIN_SOURCE + NO_GENERATE_QMLTYPES + NO_GENERATE_QMLDIR + NO_LINT + NO_CACHEGEN + # TODO: Remove once all usages have also been removed SKIP_TYPE_REGISTRATION - PLUGIN_OPTIONAL - PURE_MODULE ) - if (QT_BUILDING_QT) - list(APPEND args_optional DO_NOT_CREATE_TARGET) - endif() - set(args_single + PLUGIN_TARGET + OUTPUT_TARGETS RESOURCE_PREFIX URI TARGET_PATH VERSION OUTPUT_DIRECTORY - INSTALL_DIRECTORY CLASS_NAME - CLASSNAME # For backward compatibility, remove once all repos no longer use it + CLASSNAME # TODO: For backward compatibility, remove once all repos no longer use it TYPEINFO + # TODO: We don't handle installation, warn if callers used these with the old + # API and eventually remove them once we have updated all other repos RESOURCE_EXPORT + INSTALL_DIRECTORY + INSTALL_LOCATION + __QT_INTERNAL_QT_LIBINFIX # Used only by _qt_internal_target_generate_qmldir() ) set(args_multi - SOURCES - QML_FILES - IMPORTS - IMPORT_PATH - OPTIONAL_IMPORTS - DEPENDENCIES - PAST_MAJOR_VERSIONS + SOURCES + QML_FILES + IMPORTS + IMPORT_PATH + OPTIONAL_IMPORTS + DEPENDENCIES + PAST_MAJOR_VERSIONS ) - cmake_parse_arguments(arg - "${args_optional}" + cmake_parse_arguments(PARSE_ARGV 1 arg + "${args_option}" "${args_single}" "${args_multi}" - ${ARGN} ) + if(arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown/unexpected arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + + # Warn about options we no longer need/use (these were used by the internal + # targets and examples, but the logic has been shifted to + # qt_internal_add_qml_module() or left as a responsibility of the caller). + if(DEFINED arg_RESOURCE_EXPORT) + message(AUTHOR_WARNING + "RESOURCE_EXPORT will be ignored. This function does not handle " + "installation, which is what RESOURCE_EXPORT was previously used " + "for. Please update your project to install the target directly." + ) + endif() + + if(DEFINED arg_INSTALL_DIRECTORY) + message(AUTHOR_WARNING + "INSTALL_DIRECTORY will be ignored. This function does not handle " + "installation, please update your project to install the target " + "directly." + ) + endif() + + if(DEFINED arg_INSTALL_LOCATION) + message(AUTHOR_WARNING + "INSTALL_LOCATION will be ignored. This function does not handle " + "installation, please update your project to install the target " + "directly." + ) + endif() + + if(arg_SKIP_TYPE_REGISTRATION) + message(AUTHOR_WARNING + "SKIP_TYPE_REGISTRATION is no longer used and will be ignored." + ) + endif() + # Mandatory arguments if (NOT arg_URI) - message(FATAL_ERROR "qt6_add_qml_module called without a module URI. Please specify one using the URI argument.") + message(FATAL_ERROR + "Called without a module URI. Please specify one using the URI argument." + ) endif() if (NOT arg_VERSION) - message(FATAL_ERROR "qt6_add_qml_module called without a module version. Please specify one using the VERSION argument.") + message(FATAL_ERROR + "Called without a module version. Please specify one using the VERSION argument." + ) endif() if ("${arg_VERSION}" MATCHES "^([0-9]+\\.[0-9]+)\\.[0-9]+$") @@ -143,10 +234,45 @@ function(qt6_add_qml_module target) endif() if (NOT "${arg_VERSION}" MATCHES "^[0-9]+\\.[0-9]+$") - message(FATAL_ERROR "qt6_add_qml_module called with an invalid version argument: '${arg_VERSION}'. Expected version style: VersionMajor.VersionMinor.") + message(FATAL_ERROR + "Called with an invalid version argument: '${arg_VERSION}'. " + "Expected version in the form: VersionMajor.VersionMinor." + ) + endif() + + # Provide defaults for options that have one + if (NOT arg_TARGET_PATH) + string(REPLACE "." "/" arg_TARGET_PATH ${arg_URI}) + endif() + + if(NOT arg_NO_CREATE_PLUGIN_TARGET AND NOT DEFINED arg_PLUGIN_TARGET) + set(arg_PLUGIN_TARGET ${target}plugin) + endif() + if(NOT DEFINED arg_PLUGIN_TARGET) + set(arg_PLUGIN_TARGET "") # Simplifies things a bit further below + endif() + + set(no_gen_source) + if(arg_NO_GENERATE_PLUGIN_SOURCE) + set(no_gen_source NO_GENERATE_SOURCE) + endif() + + set(lib_type "") + if(arg_STATIC) + set(lib_type STATIC) + elseif(arg_SHARED) + set(lib_type SHARED) + endif() + + if(arg_OUTPUT_DIRECTORY) + get_filename_component(arg_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" + ABSOLUTE BASE_DIR "${CMAKE_CURRENT_BINARY_DIR}" + ) + else() + set(arg_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}) endif() - # Support for old keyword, remove once all repos no longer use CLASSNAME + # TODO: Support for old keyword, remove once all repos no longer use CLASSNAME if(arg_CLASSNAME) if(arg_CLASS_NAME AND NOT arg_CLASSNAME STREQUAL arg_CLASS_NAME) message(FATAL_ERROR @@ -158,420 +284,813 @@ function(qt6_add_qml_module target) unset(arg_CLASSNAME) endif() - if (arg_DO_NOT_CREATE_TARGET AND NOT TARGET "${target}") - message(FATAL_ERROR "qt6_add_qml_module called with DO_NOT_CREATE_TARGET, but the given target '${target}' is not a cmake target") - endif() - - if (arg_DO_NOT_CREATE_TARGET) - get_target_property(target_type ${target} TYPE) - if (target_type STREQUAL "STATIC_LIBRARY") - set(is_static TRUE) - elseif(target_type STREQUAL "MODULE_LIBRARY") - set(is_static FALSE) - else() - message(FATAL_ERROR "qt6_add_qml_module called with DO_NOT_CREATE_TARGET, but target '${target}' is neither a static or a module library.") + if(NOT arg_CLASS_NAME AND TARGET "${arg_PLUGIN_TARGET}") + get_target_property(class_name ${arg_PLUGIN_TARGET} QT_PLUGIN_CLASS_NAME) + if(class_name) + set(arg_CLASS_NAME) endif() - else() - # TODO: Creating a library here means we're missing creation of supporting .prl files, - # as well as install(TARGET foo EXPORT bar) mapping, as opposed to when it's done - # by qt_internal_add_plugin inside the qt_internal_add_qml_module call. - if(NOT BUILD_SHARED_LIBS) - add_library(${target} STATIC) - set(is_static TRUE) - - # No need to compile Q_IMPORT_PLUGIN-containing files for non-executables. - _qt_internal_disable_static_default_plugins("${resource_target}") - else() - add_library(${target} MODULE) - set(is_static FALSE) - if(APPLE) - # CMake defaults to using .so extensions for loadable modules, aka plugins, - # but Qt plugins are actually suffixed with .dylib. - set_property(TARGET "${target}" PROPERTY SUFFIX ".dylib") - endif() - if(WIN32) - # CMake sets for Windows-GNU platforms the suffix "lib" - set_property(TARGET "${target}" PROPERTY PREFIX "") - endif() - endif() - _qt_internal_apply_strict_cpp("${target}") endif() - - if (NOT arg_TARGET_PATH) - string(REPLACE "." "/" arg_TARGET_PATH ${arg_URI}) + if(NOT arg_CLASS_NAME) + string(REGEX REPLACE "[^A-Za-z0-9]" "_" escaped_uri "${arg_URI}") + set(arg_CLASS_NAME "${escaped_uri}Plugin") endif() - # If C++ sources were directly specified (not via qt_internal_add_qml_module), we assume the - # user will provide a plugin.cpp file. Don't generate a dummy plugin.cpp file in this case. - # - # If no sources were specified, it doesn't necessarily mean this is a pure QML module. - # Only if the caller explicitly says it is a pure QML module should we generate a - # dummy plugin.cpp file (the caller might be handling sources in another way). - if (arg_PURE_MODULE) - if (arg_SOURCES) - message(FATAL_ERROR "SOURCES cannot be specified with PURE_MODULE") + if(TARGET ${target}) + if(arg_STATIC OR arg_SHARED) + message(FATAL_ERROR + "Cannot use STATIC or SHARED keyword when passed an existing target (${target})" + ) endif() - if(arg_CLASS_NAME) + if(arg_PLUGIN_TARGET STREQUAL target) + # Insert the plugin's URI into its meta data to enable usage + # of static plugins in QtDeclarative (like in mkspecs/features/qml_plugin.prf). + set_property(TARGET ${target} APPEND PROPERTY + AUTOMOC_MOC_OPTIONS "-Muri=${arg_URI}" + ) + endif() + else() + if(arg_STATIC AND arg_SHARED) message(FATAL_ERROR - "CLASS_NAME cannot be specified with PURE_MODULE. " - "The class name will be auto-generated." + "Both STATIC and SHARED specified, at most one can be given" ) endif() - # Note that this populates arg_CLASS_NAME, since it creates a dummy - # class name to match the dummy plugin - _qt_internal_create_dummy_qml_plugin("${target}" "${arg_URI}" arg_CLASS_NAME) - endif() - - if (ANDROID) - # Adjust Qml plugin names on Android similar to qml_plugin.prf which calls - # $$qt5LibraryTarget($$TARGET, "qml/$$TARGETPATH/"). - # Example plugin names: - # qtdeclarative - # TARGET_PATH: QtQml/Models - # file name: libqml_QtQml_Models_modelsplugin_arm64-v8a.so - # qtquickcontrols2 - # TARGET_PATH: QtQuick/Controls.2/Material - # file name: - # libqml_QtQuick_Controls.2_Material_qtquickcontrols2materialstyleplugin_arm64-v8a.so - string(REPLACE "/" "_" android_plugin_name_infix_name "${arg_TARGET_PATH}") - - set(final_android_qml_plugin_name "qml_${android_plugin_name_infix_name}_${target}") - set_target_properties(${target} - PROPERTIES - LIBRARY_OUTPUT_NAME "${final_android_qml_plugin_name}" - ) - endif() - - if (NOT arg_RESOURCE_PREFIX) - set(arg_RESOURCE_PREFIX "/org.qt-project/imports") - endif() - set(should_install TRUE) - if (NOT arg_INSTALL_DIRECTORY) - set(should_install FALSE) - endif() - - set_target_properties(${target} - PROPERTIES - QT_QML_MODULE_TARGET_PATH "${arg_TARGET_PATH}" - QT_QML_MODULE_URI "${arg_URI}" - QT_RESOURCE_PREFIX "${arg_RESOURCE_PREFIX}/${arg_TARGET_PATH}" - QT_QML_MODULE_VERSION "${arg_VERSION}" - QT_QML_MODULE_INSTALL_DIR "${arg_INSTALL_DIRECTORY}" - QT_QML_MODULE_RESOURCE_EXPORT "${arg_RESOURCE_EXPORT}" - ) - if (arg_OUTPUT_DIRECTORY) - set_target_properties(${target} - PROPERTIES - LIBRARY_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" - ARCHIVE_OUTPUT_DIRECTORY "${arg_OUTPUT_DIRECTORY}" - QT_QML_MODULE_OUTPUT_DIR "${arg_OUTPUT_DIRECTORY}" - ) - endif() - - if (NOT DO_NOT_CREATE_TARGET AND should_install) - install(TARGETS ${target} - DESTINATION "${arg_INSTALL_DIRECTORY}" - ) - endif() - - if (arg_OUTPUT_DIRECTORY) - set(target_output_dir ${arg_OUTPUT_DIRECTORY}) - else() - if(is_static) - get_target_property(target_output_dir ${target} ARCHIVE_OUTPUT_DIRECTORY) + if(arg_PLUGIN_TARGET STREQUAL target) + if(arg_NO_CREATE_PLUGIN_TARGET AND NOT TARGET ${target}) + message(FATAL_ERROR + "NO_CREATE_PLUGIN_TARGET was given, but PLUGIN_TARGET is " + "the same as the backing target (which is allowed) and the " + "target does not exist. Either ensure the target is already " + "created or do not specify NO_CREATE_PLUGIN_TARGET." + ) + endif() + qt6_add_qml_plugin(${target} + ${lib_type} + ${no_gen_source} + OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + URI ${arg_URI} + CLASS_NAME ${arg_CLASS_NAME} + ) else() - get_target_property(target_output_dir ${target} LIBRARY_OUTPUT_DIRECTORY) + add_library(${target} ${lib_type}) + if(ANDROID) + # TODO: Check if we need to do this for a backing library + qt6_android_apply_arch_suffix(${target}) + endif() endif() endif() - if (arg_SKIP_TYPE_REGISTRATION) - set_target_properties(${target} PROPERTIES QT_QML_MODULE_SKIP_TYPE_REGISTRATION TRUE) - endif() - - if (arg_SOURCES) - target_sources(${target} PRIVATE ${arg_SOURCES}) + if(NOT target STREQUAL Qml) + target_link_libraries(${target} PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Qml) endif() - if (arg_IMPORT_PATH) - set_target_properties(${target} PROPERTIES QT_QML_IMPORT_PATH "${arg_IMPORT_PATH}") + if(NOT arg_TYPEINFO) + set(arg_TYPEINFO ${target}.qmltypes) endif() - # Insert the plugins URI into its meta data to enable usage - # of static plugins in QtDeclarative (like in mkspecs/features/qml_plugin.prf). - set_property(TARGET "${target}" APPEND PROPERTY AUTOMOC_MOC_OPTIONS "-Muri=${arg_URI}") - - # Tracker so we can generate unique resource names for multiple - # target_qml_files() calls. - set_target_properties(${target} PROPERTIES QT6_QML_MODULE_ADD_QML_FILES_COUNT 1) - - # Generate qmldir file - set(qmldir_file "${CMAKE_CURRENT_BINARY_DIR}/qmldir") - set_target_properties(${target} PROPERTIES QT_QML_MODULE_QMLDIR_FILE ${qmldir_file}) - set(qmldir_file_contents "module ${arg_URI}\n") - - if (arg_PLUGIN_OPTIONAL) - string(APPEND qmldir_file_contents "optional plugin ${target}${QT_LIBINFIX}\n") - else() - string(APPEND qmldir_file_contents "plugin ${target}${QT_LIBINFIX}\n") + # Make the prefix conform to the following: + # - Starts with a "/" + # - Does not end with a "/" unless the prefix is exactly "/" + if(NOT arg_RESOURCE_PREFIX) + set(arg_RESOURCE_PREFIX "/") endif() - - if (arg_CLASS_NAME) - string(APPEND qmldir_file_contents "classname ${arg_CLASS_NAME}\n") + if(NOT arg_RESOURCE_PREFIX MATCHES "^/") + string(PREPEND arg_RESOURCE_PREFIX "/") endif() - if (arg_DESIGNER_SUPPORTED) - string(APPEND qmldir_file_contents "designersupported\n") - endif() - if (arg_TYPEINFO) - string(APPEND qmldir_file_contents "typeinfo ${arg_TYPEINFO}\n") - else() - # This always need to be written out since at the moment we have cases - # where qmltyperegistrar is not run with the plugin but on a module - # e.g: src/qml generates the qmltypes for src/imports/qtqml. - # When this has been fixed/standardized we should move this to - # qt6_qml_type_registration() so that it is written out when the - # plugins.qmltypes is actually generated. - string(APPEND qmldir_file_contents "typeinfo plugins.qmltypes\n") + if(arg_RESOURCE_PREFIX MATCHES [[(.*)/$]]) + set(arg_RESOURCE_PREFIX "${CMAKE_MATCH_1}") endif() - macro(_add_imports imports import_string) - foreach(import IN LISTS ${imports}) + foreach(import_set IN ITEMS IMPORTS OPTIONAL_IMPORTS) + foreach(import IN LISTS arg_${import_set}) string(FIND ${import} "/" slash_position REVERSE) if (slash_position EQUAL -1) - string(APPEND qmldir_file_contents "${import_string} ${import}\n") + set_property(TARGET ${target} APPEND PROPERTY + QT_QML_MODULE_${import_set} "${import}" + ) else() string(SUBSTRING ${import} 0 ${slash_position} import_module) math(EXPR slash_position "${slash_position} + 1") string(SUBSTRING ${import} ${slash_position} -1 import_version) - if (import_version MATCHES "[0-9]+\\.[0-9]+" OR import_version MATCHES "[0-9]+") - string(APPEND qmldir_file_contents "${import_string} ${import_module} ${import_version}\n") - elseif (import_version MATCHES "auto") - string(APPEND qmldir_file_contents "${import_string} ${import_module} auto\n") + if (import_version MATCHES "^([0-9]+(\\.[0-9]+)?|auto)$") + set_property(TARGET ${target} APPEND PROPERTY + QT_QML_MODULE_${import_set} "${import_module} ${import_version}" + ) else() - message(FATAL_ERROR "Invalid module ${import_string} version number. Expected 'VersionMajor', 'VersionMajor.VersionMinor' or 'auto'.") + message(FATAL_ERROR + "Invalid module ${import} version number. " + "Expected 'VersionMajor', 'VersionMajor.VersionMinor' or 'auto'." + ) endif() endif() endforeach() - endmacro() - - _add_imports(arg_IMPORTS "import") - _add_imports(arg_OPTIONAL_IMPORTS "optional import") + endforeach() foreach(dependency IN LISTS arg_DEPENDENCIES) string(FIND ${dependency} "/" slash_position REVERSE) if (slash_position EQUAL -1) - string(APPEND qmldir_file_contents "depends ${dependency}\n") + set_property(TARGET ${target} APPEND PROPERTY + QT_QML_MODULE_DEPENDENCIES "${dependency}" + ) else() string(SUBSTRING ${dependency} 0 ${slash_position} dep_module) math(EXPR slash_position "${slash_position} + 1") string(SUBSTRING ${dependency} ${slash_position} -1 dep_version) - if (dep_version MATCHES "[0-9]+\\.[0-9]+" OR dep_version MATCHES "[0-9]+") - string(APPEND qmldir_file_contents "depends ${dep_module} ${dep_version}\n") - elseif (dep_version MATCHES "auto") - string(APPEND qmldir_file_contents "depends ${dep_module} auto\n") + if (dep_version MATCHES "^([0-9]+(\\.[0-9]+)?|auto)$") + set_property(TARGET ${target} APPEND PROPERTY + QT_QML_MODULE_DEPENDENCIES "${dep_module} ${dep_version}" + ) else() - message(FATAL_ERROR "Invalid module dependency version number. Expected 'VersionMajor', 'VersionMajor.VersionMinor' or 'auto'.") + message(FATAL_ERROR + "Invalid module dependency version number. " + "Expected 'VersionMajor', 'VersionMajor.VersionMinor' or 'auto'." + ) endif() endif() endforeach() - string(APPEND qmldir_file_contents "prefer :${arg_RESOURCE_PREFIX}/${arg_TARGET_PATH}/\n") - - _qt_internal_qmldir_defer_file(WRITE "${qmldir_file}" "${qmldir_file_contents}") - - # Process qml files - if (arg_QML_FILES) - qt6_target_qml_files(${target} FILES ${arg_QML_FILES}) - endif() - - # Embed qmldir in static builds - if (is_static) - # The qmldir resource name needs to match the one generated by qmake's qml_module.prf, to - # ensure that all Q_INIT_RESOURCE(resource_name) calls in Qt code don't lead to undefined - # symbol errors when linking an application project. - # The Q_INIT_RESOURCE() calls are not strictly necessary anymore because the CMake Qt - # build passes around the compiled resources as object files. - # These object files have global initiliazers that don't get discared when linked into - # an application (as opposed to when the resource libraries were embedded into the static - # libraries when Qt was built with qmake). - # The reason to match the naming is to ensure that applications link successfully regardless - # if Qt was built with CMake or qmake, while the build system transition phase is still - # happening. - string(REPLACE "/" "_" qmldir_resource_name ${arg_TARGET_PATH}) - string(PREPEND qmldir_resource_name "qmake_") - - set_source_files_properties("${qmldir_file}" - PROPERTIES QT_RESOURCE_ALIAS "qmldir" - ) + set_target_properties(${target} PROPERTIES + QT_QML_MODULE_NO_LINT "${arg_NO_LINT}" + QT_QML_MODULE_NO_CACHEGEN "${arg_NO_CACHEGEN}" + QT_QML_MODULE_NO_GENERATE_QMLDIR "${arg_NO_GENERATE_QMLDIR}" + QT_QML_MODULE_NO_PLUGIN_OPTIONAL "${arg_NO_PLUGIN_OPTIONAL}" + QT_QML_MODULE_URI "${arg_URI}" + QT_QML_MODULE_VERSION "${arg_VERSION}" + QT_QML_MODULE_CLASS_NAME "${arg_CLASS_NAME}" + QT_QML_MODULE_LIBINFIX "${arg___QT_INTERNAL_QT_LIBINFIX}" + QT_QML_MODULE_PLUGIN_TARGET "${arg_PLUGIN_TARGET}" + QT_QML_MODULE_DESIGNER_SUPPORTED "${arg_DESIGNER_SUPPORTED}" + QT_QML_MODULE_OUTPUT_DIR "${arg_OUTPUT_DIRECTORY}" + QT_RESOURCE_PREFIX "${arg_RESOURCE_PREFIX}/${arg_TARGET_PATH}" + QT_QML_PAST_MAJOR_VERSIONS "${arg_PAST_MAJOR_VERSIONS}" + QT_QMLTYPES_FILENAME "${arg_TYPEINFO}" + + # TODO: Check how this is used by qt6_android_generate_deployment_settings() + QT_QML_IMPORT_PATH "${arg_IMPORT_PATH}" + ) + set(ensure_set_properties + QT_QML_MODULE_PLUGIN_TYPES_FILE + QT_QML_MODULE_RESOURCE_PATHS + QT_QMLCACHEGEN_DIRECT_CALLS + QT_QMLCACHEGEN_QMLJS_RUNTIME + ) + foreach(prop IN LISTS ensure_set_properties) + get_target_property(val ${target} ${prop}) + if("${val}" MATCHES "-NOTFOUND$") + set_target_properties(${target} PROPERTIES ${prop} "") + endif() + endforeach() - qt6_add_resources(${target} ${qmldir_resource_name} - FILES "${qmldir_file}" - OUTPUT_TARGETS resource_targets - ) + if(NOT arg_NO_GENERATE_QMLTYPES) + qt6_qml_type_registration(${target} OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY}) + endif() - if (resource_targets AND arg_RESOURCE_EXPORT) - install(TARGETS ${resource_targets} - EXPORT "${arg_RESOURCE_EXPORT}" - DESTINATION "${arg_INSTALL_DIRECTORY}" - ) + set(output_targets) - # When building a static Qt, we need to record information about the compiled resource - # object files to embed them into .prl files. - if(COMMAND qt_internal_record_rcc_object_files) - qt_internal_record_rcc_object_files( - "${target}" "${resource_targets}" INSTALL_DIRECTORY "${arg_INSTALL_DIRECTORY}") - endif() + if(NOT arg_NO_GENERATE_QMLDIR) + _qt_internal_target_generate_qmldir(${target} ${arg_OUTPUT_DIRECTORY} ${arg_TARGET_PATH}) + + get_target_property(target_type ${target} TYPE) + if(target_type STREQUAL "STATIC_LIBRARY") + # Embed qmldir in static builds. The following comments relate mostly to Qt5->6 transition. + # The requirement to keep the same resource name might no longer apply, but it doesn't + # currently appear to cause any hinderance to keep it. + # The qmldir resource name needs to match the one generated by qmake's qml_module.prf, to + # ensure that all Q_INIT_RESOURCE(resource_name) calls in Qt code don't lead to undefined + # symbol errors when linking an application project. + # The Q_INIT_RESOURCE() calls are not strictly necessary anymore because the CMake Qt + # build passes around the compiled resources as object files. + # These object files have global initiliazers that don't get discared when linked into + # an application (as opposed to when the resource libraries were embedded into the static + # libraries when Qt was built with qmake). + # The reason to match the naming is to ensure that applications link successfully regardless + # if Qt was built with CMake or qmake, while the build system transition phase is still + # happening. + string(REPLACE "/" "_" qmldir_resource_name "qmake_${arg_TARGET_PATH}") + set_source_files_properties(${arg_OUTPUT_DIRECTORY}/qmldir + PROPERTIES QT_RESOURCE_ALIAS "qmldir" + ) + set(resource_targets) + qt6_add_resources(${target} ${qmldir_resource_name} + FILES ${arg_OUTPUT_DIRECTORY}/qmldir + OUTPUT_TARGETS resource_targets + ) + list(APPEND output_targets ${resource_targets}) endif() endif() - # Copy QMLDIR file to build directory. We want to do this even for static - # builds so that tools and IDEs can read it. - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${qmldir_file} - ${target_output_dir}/qmldir - BYPRODUCTS - ${target_output_dir}/qmldir + if(arg_PLUGIN_TARGET AND NOT arg_NO_CREATE_PLUGIN_TARGET) + # This also handles the case where ${arg_PLUGIN_TARGET} already exists, + # including where it is the same as ${target}. If ${arg_PLUGIN_TARGET} + # already exists, it will update the necessary things that are specific + # to qml plugins. + qt6_add_qml_plugin(${arg_PLUGIN_TARGET} + ${lib_type} + ${no_gen_source} + OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + BACKING_TARGET ${target} + CLASS_NAME ${arg_CLASS_NAME} + ) + endif() + + if(TARGET "${arg_PLUGIN_TARGET}" AND NOT arg_PLUGIN_TARGET STREQUAL target) + target_link_libraries(${arg_PLUGIN_TARGET} PRIVATE ${target}) + endif() + + target_sources(${target} PRIVATE ${arg_SOURCES}) + + set(cache_target) + qt6_target_qml_sources(${target} + __QT_INTERNAL_FORCE_DEFER_QMLDIR + FILES ${arg_QML_FILES} + OUTPUT_TARGETS cache_target ) + list(APPEND output_targets ${cache_target}) - # Install QMLDIR file - if (should_install) - install(FILES ${qmldir_file} - DESTINATION "${arg_INSTALL_DIRECTORY}" - ) + if(NOT arg_NO_GENERATE_QMLDIR) + if(${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.19.0") + # Defer the write to allow more qml files to be added later by calls to + # qt6_target_qml_sources(). We wrap the deferred call with EVAL CODE + # so that ${target} is evaluated now rather than the end of the scope. + cmake_language(EVAL CODE + "cmake_language(DEFER CALL _qt_internal_write_deferred_qmldir_file ${target})" + ) + else() + # Can't defer the write, have to do it now + _qt_internal_write_deferred_qmldir_file(${target}) + endif() + endif() + + if(arg_OUTPUT_TARGETS) + set(${arg_OUTPUT_TARGETS} ${output_targets} PARENT_SCOPE) + endif() + +endfunction() + +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_add_qml_module) + qt6_add_qml_module(${ARGV}) + endfunction() +endif() + +macro(_qt_internal_genex_getproperty var target property) + set(${var} "$<TARGET_PROPERTY:${target},${property}>") + set(have_${var} "$<BOOL:${${var}}>") +endmacro() + +macro(_qt_internal_genex_getjoinedproperty var target property item_prefix glue) + _qt_internal_genex_getproperty(${var} ${target} ${property}) + set(${var} "$<${have_${var}}:${item_prefix}$<JOIN:${${var}},${glue}${item_prefix}>>") +endmacro() + +macro(_qt_internal_genex_getoption var target property) + set(${var} "$<BOOL:$<TARGET_PROPERTY:${target},${property}>>") +endmacro() + +function(_qt_internal_target_enable_qmllint target) + set(lint_target ${target}_qmllint) + if(TARGET ${lint_target}) + return() endif() - # Install and Copy plugin.qmltypes if exists - set(target_plugin_qmltypes "${CMAKE_CURRENT_SOURCE_DIR}/plugins.qmltypes") + _qt_internal_genex_getproperty(qmllint_files ${target} QT_QML_LINT_FILES) + _qt_internal_genex_getjoinedproperty(import_args ${target} + QT_QML_IMPORT_PATH "-I$<SEMICOLON>" "$<SEMICOLON>" + ) + + set(cmd + ${QT_TOOL_COMMAND_WRAPPER_PATH} + ${QT_CMAKE_EXPORT_NAMESPACE}::qmllint + ${import_args} + ${qmllint_files} + ) + + add_custom_target(${lint_target} + COMMAND "$<${have_qmllint_files}:${cmd}>" + COMMAND_EXPAND_LISTS + DEPENDS ${QT_CMAKE_EXPORT_NAMESPACE}::qmllint ${qmllint_files} + WORKING_DIRECTORY "$<TARGET_PROPERTY:${target},SOURCE_DIR>" + ) +endfunction() + +# This is a modified version of __qt_propagate_generated_resource from qtbase. +# +# The main reason we can't use it is because it unconditionally links the object library to the +# target (in the static Qt case). We need to link conditionally based on 'link_condition' genex. +# +# The reason for propagating the qmlcache target as a 'fake resource' from the build system +# perspective is to ensure proper handling of the object files in generated qmake .prl files. +# +# TODO: The qtbase function should be refactored into separate parts, so that we can reuse the +# common functionality in this function. +function(_qt_internal_propagate_qmlcache_object_lib + target + generated_source_code + link_condition + output_generated_target) + set(resource_target "${target}_qmlcache") + add_library("${resource_target}" OBJECT "${generated_source_code}") + + # Needed to trigger the handling of the object library for .prl generation. + set_property(TARGET ${resource_target} APPEND PROPERTY _qt_resource_name ${resource_target}) + + # Save the path to the generated source file, relative to the the current build dir. + # The path will be used in static library prl file generation to ensure qmake links + # against the installed resource object files. + # Example saved path: + # .rcc/qrc_qprintdialog.cpp + file(RELATIVE_PATH generated_cpp_file_relative_path + "${CMAKE_CURRENT_BINARY_DIR}" + "${generated_source_code}") + set_property(TARGET ${resource_target} APPEND PROPERTY + _qt_resource_generated_cpp_relative_path "${generated_cpp_file_relative_path}") + + # FIXME: _is_qt_resource_target finalizer mode processing has been removed in this + # implementation, because qtbase's finalizer currently can't handle conditional linking + # of object libraries. It would try to link to the object library unconditionally, ignoring + # ${link_condition}. See the implementation of __qt_internal_collect_dependency_resource_objects + # for the reason why that happens. + + # Do not litter the static libraries + set(not_static_condition + "$<NOT:$<STREQUAL:$<TARGET_PROPERTY:TYPE>,STATIC_LIBRARY>>" + ) + set(resource_objects "$<TARGET_OBJECTS:$<TARGET_NAME:${resource_target}>>") + + # It's necessary to link the object library target, since we want to pass + # the object library dependencies to the 'target'. Interface linking doesn't + # add the objects of the resource library to the end-point linker line + # but propagates all the dependencies of the resource_target added before + # or AFTER the line below. + target_link_libraries(${target} INTERFACE + "$<$<AND:${not_static_condition},${link_condition}>:${resource_target}>" + ) + + # Qml specific additions. + target_link_libraries(${resource_target} PRIVATE + ${QT_CMAKE_EXPORT_NAMESPACE}::QmlPrivate + ${QT_CMAKE_EXPORT_NAMESPACE}::Core + ) + + # FIXME: Try to adapt finalizer approach to be usable here. + # + # We need the qmlcache_loader.cpp.o file to appear before ${target} on the link line. + # Otherwise GNU ld will discard the compiled-QML files that were embedded into the static + # ${target} library, which are referenced by the loader file. + # + # We can't use target_link_libraries(${target} INTERFACE $<TARGET_OBJECTS:qmlcache_loder.cpp.o>) + # because that will place the object file after ${target} on the link line with all CMake + # versions lower than 3.21.0. + # https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6166 + # + # We can't use the qtbase finalizer approach at the moment, because its implementation doesn't + # take into account the ${condition_link} genex. + # There might also be complications using finalizer mode during the Qt build itself, because we + # currently only use it in public user projects (those that call qt_finalize_target). + # + # We are forced to use target_sources to place the object file before ${target}. + # This means linking will fail for user projects that will try to propagate the usage + # of ${target} via their own static library A, if library A doesn't link publicly to ${target}. + # This is not the majority of user projects. + # Hopefully we can lift this limitation once we can use the finalizer approach here. + # + # Until then, this is needed to get the Qt build working. + target_sources(${target} INTERFACE + "$<$<AND:${not_static_condition},${link_condition}>:${resource_objects}>" + ) + + set(${output_generated_target} "${resource_target}" PARENT_SCOPE) +endfunction() + +function(_qt_internal_target_enable_qmlcachegen target output_targets_var) + + set(output_targets) + set_target_properties(${target} PROPERTIES _qt_cachegen_set_up TRUE) - # For an in-source build, ensure that the file is not the one that was generated by - # qt6_qml_type_registration. get_target_property(target_binary_dir ${target} BINARY_DIR) - set(generated_marker_file "${target_binary_dir}/.generated/plugins.qmltypes") + set(qmlcache_dir ${target_binary_dir}/.rcc/qmlcache/${target}) + set(qmlcache_resource_name qmlcache_${target}) + set(qmlcache_loader_cpp ${qmlcache_dir}/qmlcache_loader.cpp) + set(qmlcache_loader_list ${qmlcache_dir}/qml_loader_file_list.rsp) + set(qmlcache_resource_paths "$<TARGET_PROPERTY:${target},QT_QML_MODULE_RESOURCE_PATHS>") + set(qmlcache_have_resource_paths "$<BOOL:${qmlcache_resource_paths}>") + + set(cmd + ${QT_TOOL_COMMAND_WRAPPER_PATH} + $<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen> + --resource-name "${qmlcache_resource_name}" + -o "${qmlcache_loader_cpp}" + "@${qmlcache_loader_list}" + ) - if (EXISTS "${target_plugin_qmltypes}" AND NOT EXISTS "${generated_marker_file}") - set_target_properties(${target} - PROPERTIES QT_QML_MODULE_PLUGIN_TYPES_FILE "${target_plugin_qmltypes}" - ) + file(GENERATE + OUTPUT ${qmlcache_loader_list} + CONTENT "$<JOIN:${qmlcache_resource_paths},\n>\n" + CONDITION "${qmlcache_have_resource_paths}" + ) - _qt_internal_qmldir_defer_file(APPEND "${qmldir_file}" "typeinfo plugins.qmltypes\n") + add_custom_command( + OUTPUT ${qmlcache_loader_cpp} + COMMAND "$<${qmlcache_have_resource_paths}:${cmd}>" + COMMAND_EXPAND_LISTS + DEPENDS + ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen + ${qmlcache_loader_list} + ) - if (should_install) - install(FILES "${target_plugin_qmltypes}" - DESTINATION "${arg_INSTALL_DIRECTORY}" - ) - endif() + # TODO: Probably need to reject ${target} being an object library as unsupported + get_target_property(target_type ${target} TYPE) + if(target_type STREQUAL "STATIC_LIBRARY") + _qt_internal_propagate_qmlcache_object_lib( + ${target} + "${qmlcache_loader_cpp}" + "${qmlcache_have_resource_paths}" + output_target) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${target_plugin_qmltypes} - ${target_output_dir}/plugins.qmltypes - BYPRODUCTS - ${target_output_dir}/plugins.qmltypes + list(APPEND output_targets ${output_target}) + else() + target_sources(${target} PRIVATE + "$<${qmlcache_have_resource_paths}:${qmlcache_loader_cpp}>" + ) + target_link_libraries(${target} PRIVATE + ${QT_CMAKE_EXPORT_NAMESPACE}::QmlPrivate + ${QT_CMAKE_EXPORT_NAMESPACE}::Core ) endif() - # Copy/Install type info file - if (EXISTS ${arg_TYPEINFO}) - if (should_install) - install(FILES "${arg_TYPEINFO}" - DESTINATION "${arg_INSTALL_DIRECTORY}" - ) + set(${output_targets_var} ${output_targets} PARENT_SCOPE) +endfunction() + +# We cannot defer writing out the qmldir file to generation time because the +# qmlimportscanner runs at configure time as part of target finalizers. +# Therefore, the best we can do is defer writing the qmldir file if we are +# using a recent enough CMake version, otherwise we write it out progressively +# on each call that adds qml sources. The immediate progressive writes will +# trigger some unnecessary rebuilds after reconfiguring due to the qmldir +# file's timestamp being updated even though its contents might not change, +# but that's the cost of not having deferred write capability. +function(_qt_internal_target_generate_qmldir target out_dir target_path) + + macro(_qt_internal_qmldir_item prefix property) + get_target_property(_value ${target} ${property}) + if(_value) + string(APPEND content "${prefix} ${_value}\n") endif() + endmacro() - get_filename_component(filename ${arg_TYPEINFO} NAME) - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - ${arg_TYPEINFO} - ${target_output_dir}/${filename} - BYPRODUCTS - ${target_output_dir}/${filename} - ) + macro(_qt_internal_qmldir_item_list prefix property) + get_target_property(_values ${target} ${property}) + if(_values) + foreach(_value IN LISTS _values) + string(APPEND content "${prefix} ${_value}\n") + endforeach() + endif() + endmacro() + + get_target_property(uri ${target} QT_QML_MODULE_URI) + if(NOT uri) + message(FATAL_ERROR "Target ${target} has no URI set, cannot create qmldir") endif() + set(content "module ${uri}\n") - if (arg_INSTALL_QMLTYPES) - set_target_properties(${target} PROPERTIES QT_QML_MODULE_INSTALL_QMLTYPES TRUE) - if (arg_INSTALL_DIRECTORY) - get_target_property(qml_module_install_dir ${target} QT_QML_MODULE_INSTALL_DIR) - if (NOT qml_module_install_dir) - set_target_properties(${target} - PROPERTIES QT_QML_MODULE_INSTALL_DIR "${arg_INSTALL_DIRECTORY}" - ) - endif() + get_target_property(plugin_target ${target} QT_QML_MODULE_PLUGIN_TARGET) + if(plugin_target) + get_target_property(no_plugin_optional ${target} QT_QML_MODULE_NO_PLUGIN_OPTIONAL) + if(NOT no_plugin_optional MATCHES "NOTFOUND" AND NOT no_plugin_optional) + string(APPEND content "optional ") endif() + + get_target_property(qt_libinfix ${target} QT_QML_MODULE_LIBINFIX) + string(APPEND content "plugin ${plugin_target}${qt_libinfix}\n") endif() - if (arg_PAST_MAJOR_VERSIONS) - set_target_properties(${target} PROPERTIES QT_QML_PAST_MAJOR_VERSIONS "${arg_PAST_MAJOR_VERSIONS}") + get_target_property(designer_supported ${target} QT_QML_MODULE_DESIGNER_SUPPORTED) + if(designer_supported) + string(APPEND content "designersupported\n") endif() - # Generate meta types data - if (arg_GENERATE_QMLTYPES) - qt6_qml_type_registration(${target}) + _qt_internal_qmldir_item(classname QT_QML_MODULE_CLASS_NAME) + _qt_internal_qmldir_item(typeinfo QT_QMLTYPES_FILENAME) + + _qt_internal_qmldir_item_list(import QT_QML_MODULE_IMPORTS) + _qt_internal_qmldir_item_list("optional import" QT_QML_MODULE_OPTIONAL_IMPORTS) + _qt_internal_qmldir_item_list(depends QT_QML_MODULE_DEPENDENCIES) + + get_target_property(prefix ${target} QT_RESOURCE_PREFIX) + if(prefix) + # Ensure we use a path that ends with a "/", but handle the special case + # of "/" without anything after it + if(NOT prefix STREQUAL "/" AND NOT prefix MATCHES "/$") + string(APPEND prefix "/") + endif() + string(APPEND content "prefer :${prefix}\n") endif() + + # TODO: What about multi-config generators? Would we need per-config qmldir + # files (because we will have per-config plugin targets)? + + # Record the contents but defer the actual write. We will write the file + # later, either at the end of qt6_add_qml_module() or the end of the + # directory scope (depending on the CMake version being used). + set_property(TARGET ${target} PROPERTY _qt_internal_qmldir_content "${content}") + + # NOTE: qt6_target_qml_sources() may append further content later. endfunction() -if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) - function(qt_add_qml_module) - qt6_add_qml_module(${ARGV}) - endfunction() -endif() +# TODO: Need to consider the case where an executable's finalizer might execute +# before our deferred call. That can occur in the following situations: +# +# - The executable target is created in the same scope as the qml module +# and the executable target is created first. +# - The qml module is created in a parent scope of the executable. +# +# Note that the qml module can safely be created in another scope as long +# as that scope has been finalized by the time the executable target's +# finalizer is called. A child scope satisfies this, as does any other +# scope that has already finished being processed earlier in the CMake run. +function(_qt_internal_write_deferred_qmldir_file target) + get_target_property(__qt_qmldir_content ${target} _qt_internal_qmldir_content) + get_target_property(out_dir ${target} QT_QML_MODULE_OUTPUT_DIR) + set(qmldir_file "${out_dir}/qmldir") + configure_file(${__qt_qml_macros_module_base_dir}/Qt6qmldirTemplate.cmake.in ${qmldir_file} @ONLY) +endfunction() + + +# Create a Qml plugin. Projects should not normally need to call this function +# directly. Rather, it would normally be called by qt6_add_qml_module() to +# create or update the plugin associated with its backing target. +# +# target: The name of the target to use for the qml plugin. If it does not +# already exist, it will be created. (REQUIRED) +# +# STATIC, SHARED: Explicitly specify the type of plugin library to create. +# At most one of these two options can be specified. (OPTIONAL) +# +# BACKING_TARGET: The backing target that the plugin is associated with. This +# can be the same as ${target}, in which case there is only the one merged +# target. If this option is not provided, then URI must be given. (OPTIONAL) +# +# URI: Declares the module identifier of the qml module this plugin is +# associated with. The module identifier is the (dotted URI notation) +# identifier for the qml module. If URI is not given, then a BACKING_TARGET +# must be provided (the backing target should have its URI recorded on it by +# qt6_add_qml_module()). (OPTIONAL) +# +# TARGET_PATH: Overwrite the generated target path. By default the target path +# is generated from the URI by replacing the '.' with a '/'. However, under +# certain circumstances this may not be enough. Use this argument to provide +# a replacement. It is only used if targeting Android. (OPTIONAL) +# +# CLASS_NAME: By default, the class name will be taken from the backing target, +# if provided, or falling back to the URI with "Plugin" appended. Any +# non-alphanumeric characters in the URI will be replaced with underscores. +# (OPTIONAL) +# +# OUTPUT_DIRECTORY: Overrides the directory where the plugin library will be +# created. Defaults to ${CMAKE_CURRENT_BINARY_DIR} if not specified. +# (OPTIONAL) +# +# NO_GENERATE_SOURCE: A .cpp file will be created for the plugin class +# by default and automatically added to the plugin target. Use this option to +# indicate that no such .cpp file should be generated. The caller is then +# responsible for providing their own plugin class. (OPTIONAL) +# +function(qt6_add_qml_plugin target) + set(args_option + STATIC + SHARED + NO_GENERATE_SOURCE + ) -# Creates a dummy Qml plugin class for pure Qml modules. -# Needed for both shared and static Qt builds, so that the Qml engine knows to load the plugin. -function(_qt_internal_create_dummy_qml_plugin target uri out_class_name) - # Use the escaped URI name as the basis for the class name. - string(REGEX REPLACE "[^A-Za-z0-9]" "_" escaped_uri "${uri}") + set(args_single + OUTPUT_DIRECTORY + URI + BACKING_TARGET + CLASS_NAME + # The following is only needed on Android, and even then, only if the + # default conversion from the URI is not applicable + TARGET_PATH + ) - set(qt_qml_plugin_class_name "${escaped_uri}Plugin") - set(generated_cpp_file_name_base "Qt6_PureQmlModule_${target}_${qt_qml_plugin_class_name}") - set(qt_qml_plugin_moc_include_name "${generated_cpp_file_name_base}.moc") + set(args_multi "") - set(register_types_function_name "qml_register_types_${escaped_uri}") - set(qt_qml_plugin_intro "extern void ${register_types_function_name}();") + cmake_parse_arguments(PARSE_ARGV 1 arg + "${args_option}" + "${args_single}" + "${args_multi}" + ) - if(QT_BUILDING_QT) - string(APPEND qt_qml_plugin_intro "\n\nQT_BEGIN_NAMESPACE") - set(qt_qml_plugin_outro "QT_END_NAMESPACE") + if(NOT arg_URI) + if(NOT arg_BACKING_TARGET) + message(FATAL_ERROR "No URI or BACKING_TARGET provided") + endif() + if(arg_BACKING_TARGET STREQUAL target AND NOT TARGET ${target}) + message(FATAL_ERROR + "Plugin ${target} is its own backing target, URI must be provided" + ) + endif() + get_target_property(arg_URI ${arg_BACKING_TARGET} QT_QML_MODULE_URI) endif() - set(qt_qml_plugin_constructor_content - "volatile auto registration = &${register_types_function_name}; - Q_UNUSED(registration); -") + string(REGEX REPLACE "[^A-Za-z0-9]" "_" escaped_uri "${arg_URI}") - set(template_path "${__qt_qml_macros_module_base_dir}/Qt6QmlPluginTemplate.cpp.in") - set(generated_cpp_file_name "${generated_cpp_file_name_base}.cpp") - set(generated_cpp_file_path "${CMAKE_CURRENT_BINARY_DIR}/${generated_cpp_file_name}") + if(TARGET ${target}) + foreach(arg IN ITEMS STATIC SHARED) + if(arg_${arg}) + message(FATAL_ERROR + "Cannot specify ${arg} keyword, target ${target} already exists" + ) + endif() + endforeach() + get_target_property(class_name ${target} QT_PLUGIN_CLASS_NAME) + if(class_name) + if(arg_CLASS_NAME AND NOT arg_CLASS_NAME STREQUAL class_name) + message(FATAL_ERROR + "CLASS_NAME was specified, but an existing target with a " + "different class name was also given" + ) + endif() + set(arg_CLASS_NAME ${class_name}) + elseif(NOT arg_CLASS_NAME) + set(arg_CLASS_NAME "${escaped_uri}Plugin") + endif() + else() + if(arg_STATIC AND arg_SHARED) + message(FATAL_ERROR + "Cannot specify both STATIC and SHARED for target ${target}" + ) + endif() + set(lib_type "") + if(arg_STATIC) + set(lib_type STATIC) + elseif(arg_SHARED) + set(lib_type SHARED) + endif() - configure_file("${template_path}" "${generated_cpp_file_path}" @ONLY) + if(NOT arg_CLASS_NAME) + set(arg_CLASS_NAME "${escaped_uri}Plugin") + endif() - target_sources("${target}" PRIVATE "${generated_cpp_file_path}") - target_link_libraries("${target}" PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Qml) + qt6_add_plugin(${target} ${lib_type} + TYPE qml_plugin + CLASS_NAME ${arg_CLASS_NAME} + ) + endif() + + get_target_property(moc_opts ${target} AUTOMOC_MOC_OPTIONS) + set(already_set FALSE) + if(moc_opts) + foreach(opt IN LISTS moc_opts) + if("${opt}" MATCHES "^-Muri=") + set(already_set TRUE) + break() + endif() + endforeach() + endif() + if(NOT already_set) + # Insert the plugin's URI into its meta data to enable usage + # of static plugins in QtDeclarative (like in mkspecs/features/qml_plugin.prf). + set_property(TARGET ${target} APPEND PROPERTY + AUTOMOC_MOC_OPTIONS "-Muri=${arg_URI}" + ) + endif() + + if (ANDROID) + # Adjust Qml plugin names on Android similar to qml_plugin.prf which calls + # $$qt5LibraryTarget($$TARGET, "qml/$$TARGETPATH/"). + # Example plugin names: + # qtdeclarative + # TARGET_PATH: QtQml/Models + # file name: libqml_QtQml_Models_modelsplugin_arm64-v8a.so + # qtquickcontrols2 + # TARGET_PATH: QtQuick/Controls.2/Material + # file name: + # libqml_QtQuick_Controls.2_Material_qtquickcontrols2materialstyleplugin_arm64-v8a.so + if(NOT arg_TARGET_PATH AND TARGET "${arg_BACKING_TARGET}") + get_target_property(arg_TARGET_PATH ${target} ${arg_BACKING_TARGET}) + endif() + if(arg_TARGET_PATH) + string(REPLACE "/" "_" android_plugin_name_infix_name "${arg_TARGET_PATH}") + else() + string(REPLACE "." "_" android_plugin_name_infix_name "${arg_URI}") + endif() + + set(final_android_qml_plugin_name "qml_${android_plugin_name_infix_name}_${target}") + set_target_properties(${target} + PROPERTIES + LIBRARY_OUTPUT_NAME "${final_android_qml_plugin_name}" + ) + qt6_android_apply_arch_suffix(${target}) + endif() + + if(arg_OUTPUT_DIRECTORY) + set_target_properties(${target} PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + LIBRARY_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + ARCHIVE_OUTPUT_DIRECTORY ${arg_OUTPUT_DIRECTORY} + ) + endif() + + if(NOT arg_NO_GENERATE_SOURCE) + set(generated_cpp_file_name_base "${target}_${arg_CLASS_NAME}") + set(register_types_function_name "qml_register_types_${escaped_uri}") + + # These are all substituted in the template file used further below + set(qt_qml_plugin_class_name "${arg_CLASS_NAME}") + set(qt_qml_plugin_moc_include_name "${generated_cpp_file_name_base}.moc") + set(qt_qml_plugin_intro "extern void ${register_types_function_name}();") + set(qt_qml_plugin_outro "") + if(QT_BUILDING_QT) + string(APPEND qt_qml_plugin_intro "\n\nQT_BEGIN_NAMESPACE") + string(APPEND qt_qml_plugin_outro "QT_END_NAMESPACE") + endif() + + # Indenting here is deliberately different so as to make the generated + # file have sensible indenting + set(qt_qml_plugin_constructor_content + "volatile auto registration = &${register_types_function_name}; + Q_UNUSED(registration);" + ) + + set(generated_cpp_file + "${CMAKE_CURRENT_BINARY_DIR}/${generated_cpp_file_name_base}.cpp" + ) + configure_file( + "${__qt_qml_macros_module_base_dir}/Qt6QmlPluginTemplate.cpp.in" + "${generated_cpp_file}" + @ONLY + ) + target_sources(${target} PRIVATE "${generated_cpp_file}") + + # The generated cpp file expects to include its moc-ed output file. + set_target_properties(${target} PROPERTIES AUTOMOC TRUE) + endif() - set(${out_class_name} "${qt_qml_plugin_class_name}" PARENT_SCOPE) + target_link_libraries(${target} PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Qml) + if(NOT "${arg_BACKING_TARGET}" STREQUAL target) + target_link_libraries(${target} PRIVATE ${arg_BACKING_TARGET}) + endif() - # Enable AUTOMOC explicitly, because the generated cpp file expects to include its moc-ed - # output file. - set_property(TARGET "${target}" PROPERTY AUTOMOC ON) endfunction() +if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) + function(qt_add_qml_plugin) + qt6_add_qml_plugin(${ARGV}) + endfunction() +endif() + +# Add Qml files (.qml,.js,.mjs) to a Qml module. +# +# target: The backing target of the qml module. (REQUIRED) +# +# FILES: The qml files to add to the backing target. Supported file extensions +# are .qml, .js and .mjs. No other file types should be listed. (REQUIRED) +# +# PREFIX: The resource path under which to add the compiled qml files. If not +# specified, the QT_RESOURCE_PREFIX property of the target is used (that +# property is normally set by qt6_add_qml_module()). If the default is empty, +# this option must be provided. (OPTIONAL) +# +# OUTPUT_TARGETS: In static builds, additional CMake targets can be created +# which consumers of the module will need to link to and potentially install. +# Supply the name of an output variable, which will be set to a list of these +# targets. If installing the main target, you will also need to install these +# output targets for static builds. (OPTIONAL) # -# Add Qml files (.qml,.js,.mjs) to a Qml module. This will also append the -# qml files to the qmldir file of the module. Two source file properties can -# be used to control the generated qmldir entry. +# NO_LINT: Do not add the specified files to the ${target}_qmllint target. +# If this option is not given, the default will be taken from the target. +# +# NO_CACHEGEN: Do not compile the qml files. Add the raw qml files to the +# target resources instead. If this option is not given, the default will be +# taken from the target. +# +# NO_QMLDIR_TYPES: Do not append type information from the qml files to the +# qmldir file associated with the qml module. If this option is not given, +# the default will be taken from the target. +# +# In addition to the above NO_... options, individual files can be explicitly +# skipped by setting the relevant source property. These are: +# +# - QT_QML_SKIP_QMLLINT +# - QT_QML_SKIP_QMLDIR_ENTRY +# - QT_QML_SKIP_CACHEGEN +# +# Disabling the qmldir entry for a qml file would normally only be used for a +# file that does not expose a public type (e.g. a private JS file). +# If appending of type information has not been disabled for a particular qml +# file, the following additional source properties can be specified to +# customize the file's type details: # # QT_QML_SOURCE_VERSION: Version(s) for this qml file. If not present the module # version will be used. -# QT_QML_SOURCE_TYPENAME: Override the file's type name. If not present the +# +# QT_QML_SOURCE_TYPENAME: Override the file's type name. If not present, the # type name will be deduced using the file's basename. -# QT_QML_SINGLETON_TYPE: Set to true if this qml file contains a singleton -# type. +# +# QT_QML_SINGLETON_TYPE: Set to true if this qml file contains a singleton type. +# # QT_QML_INTERNAL_TYPE: When set to true, the type specified by # QT_QML_SOURCE_TYPENAME will not be available to users of this module. -# QT_QML_SKIP_QMLDIR_ENTRY: When set to true, no qmldir entry will be created for -# the source file. Useful if a file needs to be installed (like a private JS -# file) but does not expose a public type. # # e.g.: # set_source_files_properties(my_qml_file.qml @@ -579,136 +1098,354 @@ endfunction() # QT_QML_SOURCE_VERSION "2.0;6.0" # QT_QML_SOURCE_TYPENAME MyQmlFile # -# qt6_target_qml_files(my_qml_module +# qt6_target_qml_sources(my_qml_module # FILES # my_qml_file.qml # ) # -# Will produce the following entry in the qmldir file +# The above will produce the following entry in the qmldir file: # # MyQmlFile 2.0 my_qml_file.qml # -# -# This function is currently in Technical Preview. -# It's signature and behavior might change. -function(qt6_target_qml_files target) +function(qt6_target_qml_sources target) - cmake_parse_arguments(arg "" "" "FILES" ${ARGN}) - get_target_property(resource_count ${target} QT6_QML_MODULE_ADD_QML_FILES_COUNT) - get_target_property(qmldir_file ${target} QT_QML_MODULE_QMLDIR_FILE) - if (NOT qmldir_file) - message(FATAL_ERROR "qt6_target_qml_file: ${target} is not a Qml module") + set(args_option + NO_LINT + NO_CACHEGEN + NO_QMLDIR_TYPES + __QT_INTERNAL_FORCE_DEFER_QMLDIR # Used only by qt6_add_qml_module() + ) + + set(args_single + PREFIX + OUTPUT_TARGETS + ) + + set(args_multi + FILES + ) + + cmake_parse_arguments(PARSE_ARGV 1 arg + "${args_option}" "${args_single}" "${args_multi}" + ) + if(arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown/unexpected arguments: ${arg_UNPARSED_ARGUMENTS}") endif() if (NOT arg_FILES) + if(arg_OUTPUT_TARGETS) + set(${arg_OUTPUT_TARGETS} "" PARENT_SCOPE) + endif() return() endif() - math(EXPR new_count "${resource_count} + 1") - set_target_properties(${target} PROPERTIES QT6_QML_MODULE_ADD_QML_FILES_COUNT ${new_count}) - - qt6_add_resources(${target} "${target}_qml_files_${new_count}" - FILES ${arg_FILES} - OUTPUT_TARGETS resource_targets - ) - get_target_property(skip_type_registration ${target} QT_QML_MODULE_SKIP_TYPE_REGISTRATION) - get_target_property(target_resource_export ${target} QT_QML_MODULE_RESOURCE_EXPORT) - get_target_property(qml_module_install_dir ${target} QT_QML_MODULE_INSTALL_DIR) - get_target_property(qml_module_output_dir ${target} QT_QML_MODULE_OUTPUT_DIR) - if(NOT qml_module_install_dir) - message(AUTHOR_WARNING - "No QT_QML_MODULE_INSTALL_DIR property value provided for the '${target}' target. " - "Installation of qml_files will most likely be broken.") + if(arg___QT_INTERNAL_FORCE_DEFER_QMLDIR OR ${CMAKE_VERSION} VERSION_GREATER_EQUAL "3.19.0") + set(can_defer_qmldir TRUE) + else() + set(can_defer_qmldir FALSE) endif() - if (resource_targets) - install(TARGETS ${resource_targets} - EXPORT "${target_resource_export}" - DESTINATION "${qml_module_install_dir}" - ) + get_target_property(no_lint ${target} QT_QML_MODULE_NO_LINT) + get_target_property(no_cachegen ${target} QT_QML_MODULE_NO_CACHEGEN) + get_target_property(no_qmldir ${target} QT_QML_MODULE_NO_GENERATE_QMLDIR) + get_target_property(resource_prefix ${target} QT_RESOURCE_PREFIX) + get_target_property(qml_module_version ${target} QT_QML_MODULE_VERSION) + get_target_property(output_dir ${target} QT_QML_MODULE_OUTPUT_DIR) + + if(NOT output_dir) + # Probably not a qml module. We still want to support tooling for this + # scenario, it's just that we will be relying solely on the implicit + # imports to find things. + set(output_dir ${CMAKE_CURRENT_BINARY_DIR}) + set(no_qmldir TRUE) + endif() - # When building a static Qt, we need to record information about the compiled resource - # object files to embed them into .prl files. - if(COMMAND qt_internal_record_rcc_object_files) - qt_internal_record_rcc_object_files( - "${target}" "${resource_targets}" INSTALL_DIRECTORY "${qml_module_install_dir}") + if(NOT arg_PREFIX) + if(resource_prefix) + set(arg_PREFIX ${resource_prefix}) + else() + message(FATAL_ERROR + "PREFIX option not given and target ${target} was not given a RESOURCE_PREFIX" + ) endif() endif() + if(NOT arg_PREFIX MATCHES [[/$]]) + string(APPEND arg_PREFIX "/") + endif() - qt6_target_enable_qmllint(${target}) + # Linting and cachegen can still occur for a target that isn't a qml module, + # but for such targets, there is no qmldir file to update. + if(arg_NO_LINT) + set(no_lint TRUE) + endif() + if(arg_NO_CACHEGEN) + set(no_cachegen TRUE) + endif() + if(no_qmldir MATCHES "NOTFOUND" OR arg_NO_QMLDIR_TYPES) + set(no_qmldir TRUE) + endif() - set(file_contents "") - foreach(qml_file IN LISTS arg_FILES) - get_filename_component(qml_file_dir "${qml_file}" DIRECTORY) - if (NOT "${qml_file_dir}" STREQUAL "") - set(qml_file_dir "/${qml_file_dir}") - endif() - if (qml_module_output_dir) - file(COPY "${qml_file}" DESTINATION "${qml_module_output_dir}${qml_file_dir}") - endif() - if (qml_module_install_dir) - install(FILES "${qml_file}" DESTINATION "${qml_module_install_dir}${qml_file_dir}") - endif() + if(NOT no_cachegen) + _qt_internal_genex_getproperty(types_file ${target} QT_QML_MODULE_PLUGIN_TYPES_FILE) + _qt_internal_genex_getproperty(direct_calls ${target} QT_QMLCACHEGEN_DIRECT_CALLS) + _qt_internal_genex_getproperty(qmljs_runtime ${target} QT_QMLCACHEGEN_QMLJS_RUNTIME) + _qt_internal_genex_getjoinedproperty(import_paths ${target} + QT_QML_IMPORT_PATH "-I$<SEMICOLON>" "$<SEMICOLON>" + ) + set(cachegen_args + "$<${have_import_paths}:${import_paths}>" + "$<${have_types_file}:-i$<SEMICOLON>${types_file}>" + "$<${have_direct_calls}:--direct-calls$<SEMICOLON>${direct_calls}>" + "$<${have_qmljs_runtime}:--qmljs-runtime$<SEMICOLON>${qmljs_runtime}>" + ) + endif() - if (skip_type_registration AND qml_file MATCHES "\\.qml$") + set(non_qml_files) + set(output_targets) + + foreach(qml_file_src IN LISTS arg_FILES) + # This is to facilitate updating code that used the earlier tech preview + # API function qt6_target_qml_files() + if(NOT qml_file_src MATCHES "\\.(js|mjs|qml)$") + list(APPEND non_qml_files ${qml_file_src}) continue() endif() - get_source_file_property(qml_file_skip_qmldir ${qml_file} QT_QML_SKIP_QMLDIR_ENTRY) - if (qml_file_skip_qmldir) - continue() + # We need to copy the file to the build directory now so that when + # qmlimportscanner is run in qt6_import_qml_plugins() as part of + # target finalizers, the qml files will be there. We need to do this + # in a way that CMake doesn't create a dependency on the source or it + # will re-run CMake every time the qml file is modified. We also don't + # want to update the file's timestamp if its contents won't change. + # We still enforce the dependency on the qml source file by adding a + # build-time rule. This avoids having to re-run CMake just to re-copy + # the file. + get_filename_component(file_absolute ${qml_file_src} ABSOLUTE) + file(RELATIVE_PATH file_relative ${CMAKE_CURRENT_SOURCE_DIR} ${file_absolute}) + + get_property(alias SOURCE ${qml_file_src} PROPERTY QT_RESOURCE_ALIAS) + if(alias) + set(file_resource_path ${alias}) + else() + set(file_resource_path ${file_relative}) endif() - # TODO: rename to QT_QML_SOURCE_VERSIONS - get_source_file_property(qml_file_versions ${qml_file} QT_QML_SOURCE_VERSION) - get_source_file_property(qml_file_typename ${qml_file} QT_QML_SOURCE_TYPENAME) - get_source_file_property(qml_file_singleton ${qml_file} QT_QML_SINGLETON_TYPE) - get_source_file_property(qml_file_internal ${qml_file} QT_QML_INTERNAL_TYPE) - get_target_property(qml_module_version ${target} QT_QML_MODULE_VERSION) + set(qml_file_out ${output_dir}/${file_resource_path}) + + # Don't generate or copy the file in an in-source build if the source + # and destination paths are the same, it will cause a ninja dependency + # cycle at build time. + if(NOT qml_file_out STREQUAL file_absolute) + get_filename_component(file_out_dir ${qml_file_out} DIRECTORY) + file(MAKE_DIRECTORY ${file_out_dir}) + + set(need_write TRUE) + file(READ ${qml_file_src} new_contents) + if(EXISTS ${qml_file_out}) + file(READ ${qml_file_out} old_contents) + if("${new_contents}" STREQUAL "${old_contents}") + set(need_write FALSE) + endif() + endif() + if(need_write) + file(WRITE ${qml_file_out} "${new_contents}") + endif() - if (NOT qml_file_versions) - set(qml_file_versions ${qml_module_version}) + add_custom_command(OUTPUT ${qml_file_out} + COMMAND ${CMAKE_COMMAND} -E copy ${qml_file_src} ${qml_file_out} + DEPENDS ${qml_file_src} + WORKING_DIRECTORY $<TARGET_PROPERTY:${target},SOURCE_DIR> + ) endif() - if (NOT qml_file_typename) - get_filename_component(qml_file_typename ${qml_file} NAME_WLE) + # For the tooling steps below, run the tools on the copied qml file in + # the build directory, not the source directory. This is required + # because the tools may need to reference imported modules from + # subdirectories, which would require those subdirectories to have + # their generated qmldir files present. They also need to use the right + # resource paths and the source locations might be structured quite + # differently. + + # Fed to qmlimportscanner in qt6_import_qml_plugins. Also may be used in + # generator expressions to install all qml files for the target. + set_property(TARGET ${target} APPEND PROPERTY QT_QML_MODULE_FILES ${qml_file_out}) + + # Add file to those processed by qmllint + get_source_file_property(skip_qmllint ${qml_file_src} QT_QML_SKIP_QMLLINT) + if(NOT no_lint AND NOT skip_qmllint) + # The set of qml files to run qmllint on may be a subset of the + # full set of files, so record these in a separate property. + _qt_internal_target_enable_qmllint(${target}) + set_property(TARGET ${target} APPEND PROPERTY QT_QML_LINT_FILES ${qml_file_out}) endif() - # Do not add qmldir entries for lowercase names. Those are not components. - if (NOT qml_file_typename MATCHES "^[A-Z]") - continue() + # Add qml file's type to qmldir + get_source_file_property(skip_qmldir ${qml_file_src} QT_QML_SKIP_QMLDIR_ENTRY) + if(NOT no_qmldir AND NOT skip_qmldir) + get_source_file_property(qml_file_typename ${qml_file_src} QT_QML_SOURCE_TYPENAME) + if (NOT qml_file_typename) + get_filename_component(qml_file_typename ${qml_file_src} NAME_WLE) + endif() + + # Do not add qmldir entries for lowercase names. Those are not components. + if (qml_file_typename MATCHES "^[A-Z]") + if(NOT can_defer_qmldir) + message(FATAL_ERROR + "You are using CMake ${CMAKE_VERSION}, but CMake 3.19 or later " + "is required to add qml files with this function. Either pass " + "the qml files to qt6_add_qml_module() instead or update to " + "CMake 3.19 or later." + ) + endif() + + # TODO: rename to QT_QML_SOURCE_VERSIONS + get_source_file_property(qml_file_versions ${qml_file_src} QT_QML_SOURCE_VERSION) + get_source_file_property(qml_file_singleton ${qml_file_src} QT_QML_SINGLETON_TYPE) + get_source_file_property(qml_file_internal ${qml_file_src} QT_QML_INTERNAL_TYPE) + + if (NOT qml_file_versions) + set(qml_file_versions ${qml_module_version}) + endif() + + set(qmldir_file_contents "") + foreach(qml_file_version IN LISTS qml_file_versions) + if (qml_file_singleton) + string(APPEND qmldir_file_contents "singleton ") + endif() + string(APPEND qmldir_file_contents "${qml_file_typename} ${qml_file_version} ${file_resource_path}\n") + endforeach() + + if (qml_file_internal) + string(APPEND qmldir_file_contents "internal ${qml_file_typename} ${file_resource_path}\n") + endif() + + set_property(TARGET ${target} APPEND_STRING PROPERTY + _qt_internal_qmldir_content "${qmldir_file_contents}" + ) + endif() endif() - foreach(qml_file_version IN LISTS qml_file_versions) - if (qml_file_singleton) - string(APPEND file_contents "singleton ") + # Run cachegen on the qml file, or if disabled, store the raw qml file in the resources + get_source_file_property(skip_cachegen ${qml_file_src} QT_QML_SKIP_CACHEGEN) + if(NOT no_cachegen AND NOT skip_cachegen) + # We delay this to here to ensure that we only ever enable cachegen + # after we know there will be at least one file to compile. + get_target_property(is_cachegen_set_up ${target} _qt_cachegen_set_up) + if(NOT is_cachegen_set_up) + _qt_internal_target_enable_qmlcachegen(${target} resource_target) + list(APPEND output_targets ${resource_target}) endif() - string(APPEND file_contents "${qml_file_typename} ${qml_file_version} ${qml_file}\n") - endforeach() - if (qml_file_internal) - string(APPEND file_contents "internal ${qml_file_typename} ${qml_file}\n") - endif() + # We ensured earlier that arg_PREFIX always ends with "/" + file(TO_CMAKE_PATH "${arg_PREFIX}${file_resource_path}" file_resource_path) + + set_property(TARGET ${target} APPEND PROPERTY + QT_QML_MODULE_RESOURCE_PATHS ${file_resource_path} + ) + + string(REGEX REPLACE "\\.(js|mjs|qml)$" "_\\1" compiled_file ${file_relative}) + string(REGEX REPLACE "[$#?]+" "_" compiled_file ${compiled_file}) + set(compiled_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmlcache/${target}/${compiled_file}.cpp") + get_filename_component(out_dir ${compiled_file} DIRECTORY) + + add_custom_command( + OUTPUT ${compiled_file} + COMMAND ${CMAKE_COMMAND} -E make_directory ${out_dir} + COMMAND + ${QT_TOOL_COMMAND_WRAPPER_PATH} + $<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen> + --resource-path "${file_resource_path}" + ${cachegen_args} + -o "${compiled_file}" + "${file_absolute}" + COMMAND_EXPAND_LISTS + DEPENDS + ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen + "${file_absolute}" + "$<$<BOOL:${qmltypes}>:${qmltypes}>" + ) + target_sources(${target} PRIVATE + ${compiled_file} + ${qml_file_src} # Make the original qml file show up under this target in the IDE + ) + set_source_files_properties(${compiled_file} PROPERTIES + SKIP_AUTOGEN ON + ) + endif() endforeach() - _qt_internal_qmldir_defer_file(APPEND "${qmldir_file}" "${file_contents}") + + if(non_qml_files) + list(JOIN non_qml_files "\n " file_list) + if(COMMAND qt_add_resources) + set(cmd "qt_add_resources()") + else() + set(cmd "qt6_add_resources()") + endif() + message(WARNING + "Only .qml, .js or .mjs files should be added with this function. " + "The following files should be added with ${cmd} instead:" + "\n ${file_list}" + ) + endif() + + # Batch all the non-compiled qml sources into a single resource for this + # call. Subsequent calls for the same target will be in their own separate + # resource file. + get_target_property(counter ${target} QT_QML_MODULE_RAW_QML_SETS) + if(NOT counter) + set(counter 0) + endif() + set(resource_name ${target}_raw_qml_${counter}) + set(resource_targets) + qt6_add_resources(${target} ${resource_name} + PREFIX ${arg_PREFIX} + FILES ${arg_FILES} + OUTPUT_TARGETS resource_targets + ) + math(EXPR counter "${counter} + 1") + set_target_properties(${target} PROPERTIES QT_QML_MODULE_RAW_QML_SETS ${counter}) + list(APPEND output_targets ${resource_targets}) + + if(arg_OUTPUT_TARGETS AND output_targets) + set(${arg_OUTPUT_TARGETS} ${output_targets} PARENT_SCOPE) + endif() + endfunction() if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) - function(qt_target_qml_files) - qt6_target_qml_files(${ARGV}) + function(qt_target_qml_sources) + qt6_target_qml_sources(${ARGV}) endfunction() endif() -# QT_QMLTYPES_FILENAME: If the target has the target property QT_QMLTPYES_FILENAME set, it will be -# used for the name of the generated file. Otherwise, the file will be named plugins.qmltypes if the -# target is a plugin, or ${target}.qmltypes in all other cases -# This function is currently in Technical Preview. -# It's signature and behavior might change. -# MANUAL_MOC_JSON_FILES specifies a list of json files, generated by manual moc call, -# to extract metatypes. +# NOTE: This function does not normally need to be called directly by projects. +# It is called automatically by qt6_add_qml_module() unless +# NO_GENERATE_QMLTYPES is also given to that function. +# +# target: Expected to be the backing target for a qml module. Certain target +# properties normally set by qt6_add_qml_module() will be retrieved from this +# target. (REQUIRED) +# +# OUTPUT_DIRECTORY: Specifies the directory in which to write the generated +# ${target}.qmltypes file. If not given, it defaults to the binary directory +# of the target. (OPTIONAL) +# +# MANUAL_MOC_JSON_FILES: Specifies a list of json files, generated by a manual +# moc call, to extract metatypes. (OPTIONAL) +# function(qt6_qml_type_registration target) - cmake_parse_arguments(arg "" "" "MANUAL_MOC_JSON_FILES" ${ARGN}) + set(args_option "") + set(args_single OUTPUT_DIRECTORY) + set(args_multi MANUAL_MOC_JSON_FILES) + + cmake_parse_arguments(PARSE_ARGV 1 arg + "${args_option}" "${args_single}" "${args_multi}" + ) + if(arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown/unexpected arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() + get_target_property(import_name ${target} QT_QML_MODULE_URI) if (NOT import_name) message(FATAL_ERROR "Target ${target} is not a QML module") @@ -730,6 +1467,7 @@ function(qt6_qml_type_registration target) get_target_property(qml_install_dir ${target} QT_QML_MODULE_INSTALL_DIR) set(meta_types_json_args "") + # TODO: This is internal Qt logic, it should be moved out of here. if(QT_BUILDING_QT AND QT_WILL_INSTALL AND qml_install_dir AND qml_install_dir MATCHES "^${INSTALL_EXAMPLESDIR}") set(meta_types_json_args "INSTALL_DIR" "${qml_install_dir}/lib/metatypes") @@ -748,21 +1486,20 @@ function(qt6_qml_type_registration target) message(FATAL_ERROR "Target ${target} does not have a meta types file") endif() - # Extract major and minor version - if (NOT import_version MATCHES "[0-9]+\\.[0-9]+") - message(FATAL_ERROR "Invalid module version number. Expected VersionMajor.VersionMinor.") + if(NOT arg_OUTPUT_DIRECTORY) + set(arg_OUTPUT_DIRECTORY ${target_binary_dir}) endif() - #string(FIND "${import_version}" "." dot_location) - #string(SUBSTRING ${import_version} 0 ${dot_location} major_version) - #math(EXPR dot_location "${dot_location}+1") - #string(SUBSTRING ${import_version} ${dot_location} -1 minor_version) - string(REPLACE "." ";" import_version_split "${import_version}") - list(LENGTH import_version_split import_version_split_length) - if(import_version_split_length GREATER 0) - list(GET import_version_split 0 major_version) - endif() - if(import_version_split_length GREATER 1) - list(GET import_version_split 1 minor_version) + + # Extract major and minor version (could also have patch part, but we don't + # need that here) + if (import_version MATCHES "^([0-9]+)\\.([0-9]+)") + set(major_version ${CMAKE_MATCH_1}) + set(minor_version ${CMAKE_MATCH_2}) + else() + message(FATAL_ERROR + "Invalid module version number '${import_version}'. " + "Expected VersionMajor.VersionMinor." + ) endif() # check if plugins.qmltypes is already defined @@ -772,7 +1509,7 @@ function(qt6_qml_type_registration target) endif() set(cmd_args) - set(plugin_types_file "${target_binary_dir}/${qmltypes_output_name}") + set(plugin_types_file "${arg_OUTPUT_DIRECTORY}/${qmltypes_output_name}") set(generated_marker_file "${target_binary_dir}/.generated/${qmltypes_output_name}") get_filename_component(generated_marker_dir "${generated_marker_file}" DIRECTORY) set_target_properties(${target} PROPERTIES @@ -796,7 +1533,6 @@ function(qt6_qml_type_registration target) endforeach() endif() - # Run a script to recursively evaluate all the metatypes.json files in order # to collect all foreign types. string(TOLOWER "${target}_qmltyperegistrations.cpp" type_registration_cpp_file_name) @@ -827,7 +1563,8 @@ function(qt6_qml_type_registration target) cmake_policy(PUSH) set(registration_cpp_file_dep_args) - if (CMAKE_GENERATOR MATCHES "Ninja") # TODO: Makefiles supported too since CMake 3.20 + if (CMAKE_GENERATOR MATCHES "Ninja" OR + (CMAKE_VERSION VERSION_GREATER_EQUAL 3.20 AND CMAKE_GENERATOR MATCHES "Makefiles")) if(POLICY CMP0116) # Without explicitly setting this policy to NEW, we get a warning # even though we ensure there's actually no problem here. @@ -845,12 +1582,6 @@ function(qt6_qml_type_registration target) ) endif() - set(extra_env_command) - if (WIN32) - # TODO: FIXME: The env path is wrong when not building Qt, but a standalone example. - file(TO_NATIVE_PATH "${${PROJECT_NAME}_BINARY_DIR}/bin$<SEMICOLON>${CMAKE_INSTALL_PREFIX}/${INSTALL_BINDIR}$<SEMICOLON>%PATH%" env_path_native) - set(extra_env_command COMMAND set \"PATH=${env_path_native}\") - endif() add_custom_command( OUTPUT ${type_registration_cpp_file} @@ -860,8 +1591,8 @@ function(qt6_qml_type_registration target) ${target_metatypes_json_file} ${QT_CMAKE_EXPORT_NAMESPACE}::qmltyperegistrar "$<$<BOOL:${genex_list}>:${genex_list}>" - ${extra_env_command} COMMAND + ${QT_TOOL_COMMAND_WRAPPER_PATH} $<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qmltyperegistrar> ${cmd_args} -o ${type_registration_cpp_file} @@ -878,6 +1609,15 @@ function(qt6_qml_type_registration target) target_sources(${target} PRIVATE ${type_registration_cpp_file}) + # FIXME: The generated .cpp file has usually lost the path information for + # the headers it #include's. Since these generated .cpp files are in + # the build directory away from those headers, the header search path + # has to be augmented to ensure they can be found. We don't know what + # paths are needed, but add the source directory to at least handle + # the common case of headers in the same directory as the target. + # See QTBUG-93443. + target_include_directories(${target} PRIVATE ${target_source_dir}) + # Circumvent "too many sections" error when doing a 32 bit debug build on Windows with # MinGW. set(additional_source_files_properties "") @@ -891,50 +1631,8 @@ function(qt6_qml_type_registration target) ${additional_source_files_properties} ) - # Usually for Qt Qml-like modules and qml plugins, the installation destination of the .qmltypes - # file is somewhere under the ${qt_prefix}/qml (Qt qml import path). - # - # For user-written qml plugins, the file should be installed next to the - # binary / library, and not the Qt qml import path. - # - # Unfortunately CMake doesn't provide a way to query where a binary will be installed, so the - # only way to know where to install is to request the installation path via a property. - # - # Thus only install the qmltypes file if an explicit path via the QT_QML_MODULE_INSTALL_DIR - # property has been provided. Otherwise if installation is requested, and no path is provided, - # warn the user, and don't install the file. - get_target_property(install_qmltypes ${target} QT_QML_MODULE_INSTALL_QMLTYPES) - if (install_qmltypes) - if(qml_install_dir) - if(NOT DEFINED QT_WILL_INSTALL OR QT_WILL_INSTALL) - install(FILES ${plugin_types_file} DESTINATION "${qml_install_dir}") - else() - # Need to make the path absolute during a Qt non-prefix build, otherwise files are - # written to the source dir because the paths are relative to the source dir. - if(NOT IS_ABSOLUTE "${qml_install_dir}") - set(qml_install_dir "${CMAKE_INSTALL_PREFIX}/${qml_install_dir}") - endif() - - add_custom_command(TARGET ${target} POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_if_different - "${plugin_types_file}" - "${qml_install_dir}/${qmltypes_output_name}" - BYPRODUCTS - "${qml_install_dir}/${qmltypes_output_name}" - COMMENT "Copying ${plugin_types_file} to ${qml_install_dir}" - ) - endif() - else() - message(AUTHOR_WARNING - "No QT_QML_MODULE_INSTALL_DIR property value provided for the '${target}' target. " - "Please either provide a value, or don't set the " - "QT_QML_MODULE_INSTALL_QMLTYPES property. " - "Skipping installation of '${qmltypes_output_name}'.") - endif() - endif() - target_include_directories(${target} PRIVATE - $<TARGET_PROPERTY:Qt::QmlPrivate,INTERFACE_INCLUDE_DIRECTORIES> + $<TARGET_PROPERTY:${QT_CMAKE_EXPORT_NAMESPACE}::QmlPrivate,INTERFACE_INCLUDE_DIRECTORIES> ) endfunction() @@ -945,189 +1643,6 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endif() -# Enable the _qt_internal_quick_compiler_process_resources function in qt6_add_resource() -set(QT6_ADD_RESOURCE_DECLARATIVE_EXTENSIONS TRUE) - -# Inspect all files passed to a call to qt_add_resource. If there are any -# files present, invoke the quick compiler and return the remaining resource -# files that have not been processed in OUTPUT_REMAINING_RESOURCES as well as the new -# name for the resource in OUTPUT_RESOURCE_NAME. -function(_qt_internal_quick_compiler_process_resources target resource_name) - - cmake_parse_arguments(arg - "" "PREFIX;OUTPUT_REMAINING_RESOURCES;OUTPUT_RESOURCE_NAME;OUTPUT_GENERATED_TARGET" "FILES" ${ARGN} - ) - - set(qml_files) - set(resource_files) - # scan for qml files - foreach(file IN LISTS arg_FILES) - # check whether this resource should not be processed by the qt quick - # compiler - get_source_file_property(skip_compiler_check ${file} QT_SKIP_QUICKCOMPILER) - if (skip_compiler_check) - list(APPEND resource_files ${file}) - continue() - endif() - - if (${file} MATCHES "\.js$" - OR ${file} MATCHES "\.mjs$" - OR ${file} MATCHES "\.qml$") - list(APPEND qml_files ${file}) - endif() - list(APPEND resource_files ${file}) - endforeach() - - # Create a list of QML files for use with qmllint - if(qml_files) - get_target_property(qml_files_list ${target} QML_FILES) - if(NOT qml_files_list) - set(qml_files_list) - endif() - - list(APPEND qml_files_list ${qml_files}) - set_target_properties(${target} PROPERTIES QML_FILES "${qml_files_list}") - endif() - - if (NOT TARGET ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen AND qml_files) - message(WARNING "QT6_PROCESS_RESOURCE: Qml files were detected but the qmlcachgen target is not defined. Consider adding QmlTools to your find_package command.") - endif() - - if (TARGET ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen AND qml_files) - # Enable qt quick compiler support - if (resource_files) - set(chained_resource_name "${resource_name}_qmlcache") - set(qml_resource_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${chained_resource_name}.qrc") - else() - set(qml_resource_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/${resource_name}.qrc") - endif() - - get_target_property(import_path ${target} QT_QML_IMPORT_PATH) - if (import_path) - foreach(dir IN LISTS import_path) - list(APPEND qmlcachegen_extra_args "-I" "${dir}") - endforeach() - list(APPEND qmlcachegen_extra_args "-I" "${QT_INSTALL_DIR}/${INSTALL_QMLDIR}") - endif() - - get_target_property(qmltypes ${target} QT_QML_MODULE_PLUGIN_TYPES_FILE) - if (qmltypes) - list(APPEND qmlcachegen_extra_args "-i" ${qmltypes}) - endif() - - get_target_property(direct_calls ${target} QT_QMLCACHEGEN_DIRECT_CALLS) - if (direct_calls) - list(APPEND qmlcachegen_extra_args "--direct-calls") - endif() - - get_target_property(qmljs_runtime ${target} QT_QMLCACHEGEN_QMLJS_RUNTIME) - if (qmljs_runtime) - list(APPEND qmlcachegen_extra_args "--qmljs-runtime") - endif() - - foreach(file IN LISTS qml_files) - get_filename_component(file_absolute ${file} ABSOLUTE) - string(FIND "${file_absolute}" "${CMAKE_SOURCE_DIR}" start_index_of_source_dir) - if (start_index_of_source_dir EQUAL 0) - file(RELATIVE_PATH file_relative ${CMAKE_CURRENT_SOURCE_DIR} ${file_absolute}) - else() - file(RELATIVE_PATH file_relative ${CMAKE_CURRENT_BINARY_DIR} ${file_absolute}) - endif() - __qt_get_relative_resource_path_for_file(file_resource_path ${file}) - if (arg_PREFIX STREQUAL "/") - # TO_CMAKE_PATH does not clean up cases such as //Foo - set(file_resource_path "/${file_resource_path}") - else() - set(file_resource_path "${arg_PREFIX}/${file_resource_path}") - endif() - file(TO_CMAKE_PATH ${file_resource_path} file_resource_path) - list(APPEND file_resource_paths ${file_resource_path}) - string(REGEX REPLACE "\.js$" "_js" compiled_file ${file_relative}) - string(REGEX REPLACE "\.mjs$" "_mjs" compiled_file ${compiled_file}) - string(REGEX REPLACE "\.qml$" "_qml" compiled_file ${compiled_file}) - string(REGEX REPLACE "[\$#\?]+" "_" compiled_file ${compiled_file}) - set(compiled_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmlcache/${resource_name}/${compiled_file}.cpp") - get_filename_component(out_dir ${compiled_file} DIRECTORY) - if(NOT EXISTS ${out_dir}) - file(MAKE_DIRECTORY ${out_dir}) - endif() - add_custom_command( - OUTPUT ${compiled_file} - ${QT_TOOL_PATH_SETUP_COMMAND} - COMMAND - ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen - --resource-path "${file_resource_path}" - --resource "${qml_resource_file}" - ${qmlcachegen_extra_args} - -o "${compiled_file}" - "${file_absolute}" - DEPENDS - $<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen> - "${file_absolute}" - "$<$<BOOL:${qmltypes}>:${qmltypes}>" - "${qml_resource_file}" - ) - target_sources(${target} PRIVATE ${compiled_file}) - set_source_files_properties(${compiled_file} PROPERTIES - SKIP_AUTOGEN ON - ) - endforeach() - - set(qmlcache_loader_list "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmlcache/${resource_name}/qml_loader_file_list.rsp") - file(GENERATE - OUTPUT ${qmlcache_loader_list} - CONTENT "$<JOIN:${file_resource_paths},\n>" - ) - - set(qmlcache_loader_file "${CMAKE_CURRENT_BINARY_DIR}/.rcc/qmlcache/${resource_name}/qmlcache_loader.cpp") - set(resource_name_arg "${resource_name}.qrc") - if (chained_resource_name) - set(resource_name_arg "${resource_name_arg}=${chained_resource_name}") - endif() - - add_custom_command( - OUTPUT ${qmlcache_loader_file} - ${QT_TOOL_PATH_SETUP_COMMAND} - COMMAND - ${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen - --resource-name "${resource_name_arg}" - -o "${qmlcache_loader_file}" - "@${qmlcache_loader_list}" - DEPENDS - $<TARGET_FILE:${QT_CMAKE_EXPORT_NAMESPACE}::qmlcachegen> - "${qmlcache_loader_list}" - ) - - __qt_propagate_generated_resource(${target} - ${resource_name} - ${qmlcache_loader_file} - output_target) - - set(${arg_OUTPUT_GENERATED_TARGET} "${output_target}" PARENT_SCOPE) - - if (resource_files) - set(resource_name ${chained_resource_name}) - endif() - - # The generated qmlcache_loader source file uses private headers of Qml, so make sure - # if the object library was created, it depends on the Qml target. If there's no target, - # that means the target is a shared library and the sources are directly added to the target - # via target_sources, so add dependency in that case as well. - set(chosen_target "target") # shared library case - if(output_target) - set(chosen_target "output_target") # static library case. - endif() - target_link_libraries(${${chosen_target}} PRIVATE ${QT_CMAKE_EXPORT_NAMESPACE}::Qml) - else() - set(resource_files ${arg_FILES}) - endif() - - set(${arg_OUTPUT_REMAINING_RESOURCES} ${resource_files} PARENT_SCOPE) - set(${arg_OUTPUT_RESOURCE_NAME} ${resource_name} PARENT_SCOPE) -endfunction() - -include(CMakeParseArguments) - # This function is called as a finalizer in qt6_finalize_executable() for any # target that links against the Qml library for a statically built Qt. function(qt6_import_qml_plugins target) @@ -1151,6 +1666,9 @@ function(qt6_import_qml_plugins target) if(NOT arg_PATH_TO_SCAN) set(arg_PATH_TO_SCAN "${CMAKE_CURRENT_SOURCE_DIR}") endif() + if(arg_UNPARSED_ARGUMENTS) + message(FATAL_ERROR "Unknown/unexpected arguments: ${arg_UNPARSED_ARGUMENTS}") + endif() # Find location of qmlimportscanner. get_target_property(tool_path ${QT_CMAKE_EXPORT_NAMESPACE}::qmlimportscanner IMPORTED_LOCATION) @@ -1175,8 +1693,8 @@ but this file does not exist. Possible reasons include: endif() # Find location of qml dir. - # TODO: qt.prf implies that there might be more than one qml import path to pass to - # qmlimportscanner. + # TODO: qt.prf implies that there might be more than one qml import path to + # pass to qmlimportscanner. set(qml_path "${QT6_INSTALL_PREFIX}/${QT6_INSTALL_QML}") # Small macro to avoid duplicating code in two different loops. @@ -1185,31 +1703,62 @@ but this file does not exist. Possible reasons include: # the qmlimportscanner, not CMake code. set(entry_name "qml_import_scanner_import_${idx}") cmake_parse_arguments("entry" - "" - "CLASSNAME;NAME;PATH;PLUGIN;RELATIVEPATH;TYPE;VERSION;" "" - ${${entry_name}}) + "" + "CLASSNAME;NAME;PATH;PLUGIN;RELATIVEPATH;TYPE;VERSION;" "" + ${${entry_name}} + ) endmacro() # Run qmlimportscanner and include the generated cmake file. set(qml_imports_file_path - "${CMAKE_CURRENT_BINARY_DIR}/Qt6_QmlPlugins_Imports_${target}.cmake") + "${CMAKE_CURRENT_BINARY_DIR}/.qt_plugins/Qt6_QmlPlugins_Imports_${target}.cmake" + ) + file(MAKE_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/.qt_plugins) + + set(cmd_args + "${arg_PATH_TO_SCAN}" + -cmake-output + -importPath "${qml_path}" + ) + get_target_property(qml_import_path ${target} QT_QML_IMPORT_PATH) + if (qml_import_path) + list(APPEND cmd_args ${qml_import_path}) + endif() + + get_target_property(qml_files ${target} QT_QML_MODULE_FILES) + if (qml_files) + list(APPEND cmd_args "-qmlFiles" ${qml_files}) + endif() get_target_property(qrc_files ${target} _qt_generated_qrc_files) if (qrc_files) - list(APPEND qrcFilesArguments "-qrcFiles") - list(APPEND qrcFilesArguments ${qrc_files}) + list(APPEND cmd_args "-qrcFiles" ${qrc_files}) + endif() + + # Use a response file to avoid command line length issues if we have a lot + # of arguments on the command line + string(LENGTH "${cmd_args}" length) + if(length GREATER 240) + set(rsp_file ${CMAKE_CURRENT_BINARY_DIR}/.qt_plugins/Qt6_QmlPlugins_Imports_${target}.rsp) + list(JOIN cmd_args "\n" rsp_file_content) + file(WRITE ${rsp_file} "${rsp_file_content}") + set(cmd_args "@${rsp_file}") endif() - message(STATUS "Running qmlimportscanner to find used QML plugins. ") - execute_process(COMMAND - "${tool_path}" "${arg_PATH_TO_SCAN}" -importPath "${qml_path}" - ${qrcFilesArguments} - -cmake-output - OUTPUT_FILE "${qml_imports_file_path}") + get_target_property(target_source_dir ${target} SOURCE_DIR) + + message(VERBOSE "Running qmlimportscanner to find QML plugins needed by ${target}.") + execute_process(COMMAND ${QT_TOOL_COMMAND_WRAPPER_PATH} ${tool_path} ${cmd_args} + OUTPUT_FILE "${qml_imports_file_path}" + WORKING_DIRECTORY ${target_source_dir} + ) include("${qml_imports_file_path}" OPTIONAL RESULT_VARIABLE qml_imports_file_path_found) if(NOT qml_imports_file_path_found) - message(FATAL_ERROR "Could not find ${qml_imports_file_path} which was supposed to be generated by qmlimportscanner.") + message(FATAL_ERROR + "Could not find ${qml_imports_file_path} which was supposed to be " + "generated by qmlimportscanner after processing target ${target}." + ) endif() # Parse the generated cmake file. @@ -1226,11 +1775,34 @@ but this file does not exist. Possible reasons include: continue() endif() list(APPEND added_plugins "${entry_PLUGIN}") - - # Link against the Qml plugin. The assumption is that all Qml plugins are already - # find_package()'d by the Qml package, so we can safely link against the target. - target_link_libraries("${target}" PRIVATE - "${QT_CMAKE_EXPORT_NAMESPACE}::${entry_PLUGIN}") + # Link against the Qml plugin. For plugins provided by Qt, we + # assume those plugins are already defined (typically brought in + # via find_package(Qt6...) ). For other plugins, they can be + # from the project itself or some other external place. + if(TARGET "${QT_CMAKE_EXPORT_NAMESPACE}::${entry_PLUGIN}") + set(plugin_dep "${QT_CMAKE_EXPORT_NAMESPACE}::${entry_PLUGIN}") + elseif(TARGET ${entry_PLUGIN}) + set(plugin_dep ${entry_PLUGIN}) + else() + # We've been told where the plugin should be, but only have + # its basename. Let CMake work out the prefix and suffix. + find_library(${entry_PLUGIN}_LIBRARY ${entry_PLUGIN} + PATHS ${entry_PATH} + NO_DEFAULT_PATH + ) + if(${entry_PLUGIN}_LIBRARY) + set(plugin_dep ${${entry_PLUGIN}_LIBRARY}) + else() + message(FATAL_ERROR + "${entry_PLUGIN} is a dependency of ${target}, but " + "there is no target by that name and no library with " + "that name could be found at the expected location (" + ${entry_PATH} "). Consider making an imported target " + "for it so that its location is known." + ) + endif() + endif() + target_link_libraries("${target}" PRIVATE ${plugin_dep}) endif() endforeach() @@ -1244,22 +1816,31 @@ but this file does not exist. Possible reasons include: list(FIND added_imports "${entry_PLUGIN}" _index) if(_index EQUAL -1) string(APPEND qt_qml_import_cpp_file_content - "Q_IMPORT_PLUGIN(${entry_CLASSNAME})\n") + "Q_IMPORT_PLUGIN(${entry_CLASSNAME})\n" + ) list(APPEND added_imports "${entry_PLUGIN}") endif() else() + # If the qmldir file was generated by us, there should have + # been a CLASS_NAME automatically computed if one wasn't + # provided. Therefore, it is likely that this is a manually + # prepared qmldir and it is missing a classname entry. message(FATAL_ERROR - "Plugin ${entry_PLUGIN} is missing a classname entry, please add one to the qmldir file.") + "Plugin ${entry_PLUGIN} is missing a classname entry, " + "please add one to the qmldir file." + ) endif() endif() endforeach() # Write to the generated file, and include it as a source for the given target. set(generated_import_cpp_path - "${CMAKE_CURRENT_BINARY_DIR}/Qt6_QmlPlugins_Imports_${target}.cpp") + "${CMAKE_CURRENT_BINARY_DIR}/.qt_plugins/Qt6_QmlPlugins_Imports_${target}.cpp" + ) configure_file("${Qt6Qml_DIR}/Qt6QmlImportScannerTemplate.cpp.in" - "${generated_import_cpp_path}" - @ONLY) + "${generated_import_cpp_path}" + @ONLY + ) target_sources(${target} PRIVATE "${generated_import_cpp_path}") endif() endfunction() @@ -1273,63 +1854,3 @@ if(NOT QT_NO_CREATE_VERSIONLESS_FUNCTIONS) endif() endfunction() endif() - -# Wrapper around configure_file. Passes content collected in $directory-scoped property. -function(_qt_internal_configure_qmldir directory) - get_property(__qt_qmldir_content DIRECTORY "${directory}" PROPERTY _qt_internal_qmldir_content) - configure_file(${ARGN} @ONLY) -endfunction() - -# Collects content for target $filepath and use deferred call of 'configure_file' to avoid -# rebuilding of targets that depend on provided qmldir. -# Note: For cmake versions < 3.19.0 plain 'file' function call will be used. -function(_qt_internal_qmldir_defer_file command filepath content) - if(${CMAKE_VERSION} VERSION_LESS "3.19.0") - file(${ARGV}) - else() - if("${command}" STREQUAL "WRITE") - if("${__qt_qml_macros_module_base_dir}" STREQUAL "") - message(FATAL_ERROR "Unable to configure qml module. - \"find_package(Qt\${QT_VERSION_MAJOR} CONFIG COMPONENTS Qml)\" \ -is missing.") - endif() - # Wrap with EVAL CODE to evaluate and expand arguments - cmake_language(EVAL CODE - "cmake_language(DEFER DIRECTORY \"${CMAKE_CURRENT_SOURCE_DIR}\" CALL - \"_qt_internal_configure_qmldir\" - \"${CMAKE_CURRENT_SOURCE_DIR}\" - \"${__qt_qml_macros_module_base_dir}/Qt6qmldirTemplate.cmake.in\" - \"${filepath}\")") - set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - PROPERTY _qt_internal_qmldir_content "${content}") - elseif("${command}" STREQUAL "APPEND") - set_property(DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}" - APPEND_STRING - PROPERTY _qt_internal_qmldir_content "${content}") - else() - message(FATAL_ERROR "Unknown command ${command}. \ - _qt_internal_qmldir_defer_file only accepts \ - WRITE and APPEND commands.") - endif() - endif() -endfunction() - -# Adds a target called TARGET_qmllint that runs on all qml files compiled ahead-of-time. -function(qt6_target_enable_qmllint target) - get_target_property(target_source ${target} SOURCE_DIR) - get_target_property(import_path ${target} QT_QML_IMPORT_PATH) - get_target_property(files ${target} QML_FILES) - - set(import_args "") - if(import_path) - foreach(dir IN LISTS import_path) - list(APPEND import_args "-I" "${dir}") - endforeach() - list(APPEND import_args "-I" "${QT_INSTALL_DIR}/${INSTALL_QMLDIR}") - endif() - - add_custom_target(${target}_qmllint - ${QT_CMAKE_EXPORT_NAMESPACE}::qmllint ${files} ${import_args} - WORKING_DIRECTORY ${target_source} - ) -endfunction() diff --git a/src/qml/Qt6QmlPluginTemplate.cpp.in b/src/qml/Qt6QmlPluginTemplate.cpp.in index 9788932743..c96190dae1 100644 --- a/src/qml/Qt6QmlPluginTemplate.cpp.in +++ b/src/qml/Qt6QmlPluginTemplate.cpp.in @@ -1,5 +1,4 @@ -// This file is autogenerated by CMake. -// It facilitates usage of a pure QML module as a static QML plugin. +// This file is autogenerated by CMake. Do not edit. #include <QtQml/qqmlextensionplugin.h> @@ -13,7 +12,6 @@ class @qt_qml_plugin_class_name@ : public QQmlEngineExtensionPlugin public: @qt_qml_plugin_class_name@(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) { - Q_UNUSED(parent); @qt_qml_plugin_constructor_content@ } }; diff --git a/src/qmllocalstorage/CMakeLists.txt b/src/qmllocalstorage/CMakeLists.txt index adf07345dd..7285b84a8e 100644 --- a/src/qmllocalstorage/CMakeLists.txt +++ b/src/qmllocalstorage/CMakeLists.txt @@ -1,4 +1,8 @@ -qt_internal_add_module(QmlLocalStorage +qt_internal_add_qml_module(QmlLocalStorage + URI "QtQuick.LocalStorage" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmllocalstorageplugin + CLASS_NAME QQmlLocalStoragePlugin SOURCES qqmllocalstorage.cpp qqmllocalstorage_p.h qqmllocalstorageglobal_p.h @@ -9,14 +13,3 @@ qt_internal_add_module(QmlLocalStorage Qt::QmlPrivate Qt::Sql ) - -set_target_properties(QmlLocalStorage PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQuick.LocalStorage - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQuick/LocalStorage" -) - - -qt6_qml_type_registration(QmlLocalStorage) diff --git a/src/qmlmodels/CMakeLists.txt b/src/qmlmodels/CMakeLists.txt index 23edc3fc3f..3166e5d90c 100644 --- a/src/qmlmodels/CMakeLists.txt +++ b/src/qmlmodels/CMakeLists.txt @@ -1,10 +1,13 @@ -# Generated from qmlmodels.pro. - ##################################################################### ## QmlModels Module: ##################################################################### -qt_internal_add_module(QmlModels +qt_internal_add_qml_module(QmlModels + URI "QtQml.Models" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET modelsplugin + CLASS_NAME QtQmlModelsPlugin SOURCES qqmlchangeset.cpp qqmlchangeset_p.h qqmlmodelsmodule_p.h @@ -24,15 +27,6 @@ qt_internal_add_module(QmlModels Qt::QmlPrivate ) -#### Keys ignored in scope 1:.:.:qmlmodels.pro:<TRUE>: -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQml/Models" -# QML_IMPORT_NAME = "QtQml.Models" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -## Scopes: -##################################################################### - qt_internal_extend_target(QmlModels CONDITION QT_FEATURE_qml_object_model SOURCES qqmlinstantiator.cpp qqmlinstantiator_p.h @@ -65,14 +59,3 @@ qt_internal_extend_target(QmlModels CONDITION QT_FEATURE_qml_delegate_model qt_internal_add_docs(QmlModels doc/qtqmlmodels.qdocconf ) - - -set_target_properties(QmlModels PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQml.Models - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQml/Models" -) - -qt6_qml_type_registration(QmlModels) diff --git a/src/qmlmodels/doc/qtqmlmodels.qdocconf b/src/qmlmodels/doc/qtqmlmodels.qdocconf index 4a42d4a2d1..9a80e0f9b9 100644 --- a/src/qmlmodels/doc/qtqmlmodels.qdocconf +++ b/src/qmlmodels/doc/qtqmlmodels.qdocconf @@ -27,9 +27,7 @@ depends += qtcore qtqml qtquick qtdoc qtqmlworkerscript qtquickcontrols {headerdirs,sourcedirs} += \ .. \ - ../../labs/models \ - ../../imports/models \ - ../../imports/labsmodels + ../../labs/models exampledirs += .. \ snippets diff --git a/src/imports/models/plugin.cpp b/src/qmlmodels/doc/src/qtqmlmodel.qdoc index 288b64f014..33c648e87f 100644 --- a/src/imports/models/plugin.cpp +++ b/src/qmlmodels/doc/src/qtqmlmodel.qdoc @@ -3,9 +3,9 @@ ** Copyright (C) 2016 Research In Motion. ** Contact: https://www.qt.io/licensing/ ** -** This file is part of the plugins of the Qt Toolkit. +** This file is part of the documentation of the Qt Toolkit. ** -** $QT_BEGIN_LICENSE:LGPL$ +** $QT_BEGIN_LICENSE:FDL$ ** Commercial License Usage ** Licensees holding valid commercial Qt licenses may use this file in ** accordance with the commercial license agreement provided with the @@ -14,34 +14,17 @@ ** and conditions see https://www.qt.io/terms-conditions. For further ** information use the contact form at https://www.qt.io/contact-us. ** -** GNU Lesser General Public License Usage -** Alternatively, this file may be used under the terms of the GNU Lesser -** General Public License version 3 as published by the Free Software -** Foundation and appearing in the file LICENSE.LGPL3 included in the -** packaging of this file. Please review the following information to -** ensure the GNU Lesser General Public License version 3 requirements -** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 2.0 or (at your option) the GNU General -** Public license version 3 or any later version approved by the KDE Free -** Qt Foundation. The licenses are as published by the Free Software -** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-2.0.html and -** https://www.gnu.org/licenses/gpl-3.0.html. -** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. ** $QT_END_LICENSE$ ** ****************************************************************************/ -#include <QtQmlModels/private/qtqmlmodelsglobal_p.h> -#include <QtQml/qqmlextensionplugin.h> - -QT_BEGIN_NAMESPACE - /*! \qmlmodule QtQml.Models 2.\QtMinorVersion \title Qt QML Models QML Types @@ -76,20 +59,3 @@ QT_BEGIN_NAMESPACE \noautolist */ -//![class decl] -class QtQmlModelsPlugin : public QQmlEngineExtensionPlugin -{ - Q_OBJECT - Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) -public: - QtQmlModelsPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) - { - volatile auto registration = &qml_register_types_QtQml_Models; - Q_UNUSED(registration); - } -}; -//![class decl] - -QT_END_NAMESPACE - -#include "plugin.moc" diff --git a/src/qmltest/CMakeLists.txt b/src/qmltest/CMakeLists.txt index 5c14dacae5..e6b6ccfff0 100644 --- a/src/qmltest/CMakeLists.txt +++ b/src/qmltest/CMakeLists.txt @@ -1,10 +1,21 @@ -# Generated from qmltest.pro. - ##################################################################### ## QuickTest Module: ##################################################################### -qt_internal_add_module(QuickTest +set_source_files_properties(TestCase.qml SignalSpy.qml PROPERTIES + QT_QML_SOURCE_VERSION "1.0" +) +set_source_files_properties(testlogger.js PROPERTIES + QT_QML_SKIP_QMLDIR_ENTRY TRUE +) + +qt_internal_add_qml_module(QuickTest + URI "QtTest" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmltestplugin + CLASS_NAME QTestQmlModule + DEPENDENCIES + QtQuick.Window/2.0 CONFIG_MODULE_NAME qmltest QMAKE_MODULE_CONFIG $${QT.testlib.CONFIG} SOURCES @@ -14,10 +25,14 @@ qt_internal_add_module(QuickTest quicktestglobal.h quicktestglobal_p.h quicktestresult.cpp quicktestresult_p.h quicktestutil.cpp quicktestutil_p.h + QML_FILES + TestCase.qml + SignalSpy.qml + testlogger.js DEFINES QT_NO_FOREACH QT_NO_URL_CAST_FROM_STRING - QT_BUILD_QMLTEST_LIB # special case + QT_BUILD_QMLTEST_LIB LIBRARIES Qt::CorePrivate Qt::Gui @@ -32,16 +47,6 @@ qt_internal_add_module(QuickTest Qt::TestPrivate ) -#### Keys ignored in scope 1:.:.:qmltest.pro:<TRUE>: -# MODULE_CONFIG = "$${QT.testlib.CONFIG}" -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtTest" -# QML_IMPORT_NAME = "QtTest" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -## Scopes: -##################################################################### - qt_internal_extend_target(QuickTest CONDITION QT_FEATURE_qml_debug DEFINES QT_QML_DEBUG_NO_WARNING @@ -49,14 +54,3 @@ qt_internal_extend_target(QuickTest CONDITION QT_FEATURE_qml_debug qt_internal_add_docs(QuickTest doc/qtqmltest.qdocconf ) - - -set_target_properties(QuickTest PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtTest - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtTest" -) - -qt6_qml_type_registration(QuickTest) diff --git a/src/imports/testlib/SignalSpy.qml b/src/qmltest/SignalSpy.qml index 52ed83e261..52ed83e261 100644 --- a/src/imports/testlib/SignalSpy.qml +++ b/src/qmltest/SignalSpy.qml diff --git a/src/imports/testlib/TestCase.qml b/src/qmltest/TestCase.qml index 1c9011e01e..1c9011e01e 100644 --- a/src/imports/testlib/TestCase.qml +++ b/src/qmltest/TestCase.qml diff --git a/src/qmltest/doc/qtqmltest.qdocconf b/src/qmltest/doc/qtqmltest.qdocconf index a48e5fdef6..3c9fe3ba6e 100644 --- a/src/qmltest/doc/qtqmltest.qdocconf +++ b/src/qmltest/doc/qtqmltest.qdocconf @@ -33,8 +33,7 @@ depends += qtcore qtgui qttestlib qtqml qtquick qtdoc qmake qtcmake headerdirs += .. -sourcedirs += .. \ - ../../imports/testlib +sourcedirs += .. exampledirs += snippets diff --git a/src/imports/testlib/toucheventsequence.qdoc b/src/qmltest/doc/src/toucheventsequence.qdoc index 92c5836d49..92c5836d49 100644 --- a/src/imports/testlib/toucheventsequence.qdoc +++ b/src/qmltest/doc/src/toucheventsequence.qdoc diff --git a/src/imports/testlib/testlogger.js b/src/qmltest/testlogger.js index 52a79806b9..52a79806b9 100644 --- a/src/imports/testlib/testlogger.js +++ b/src/qmltest/testlogger.js diff --git a/src/qmlworkerscript/CMakeLists.txt b/src/qmlworkerscript/CMakeLists.txt index 6716301b90..3525107cfe 100644 --- a/src/qmlworkerscript/CMakeLists.txt +++ b/src/qmlworkerscript/CMakeLists.txt @@ -1,10 +1,13 @@ -# Generated from qmlworkerscript.pro. - ##################################################################### ## QmlWorkerScript Module: ##################################################################### -qt_internal_add_module(QmlWorkerScript +qt_internal_add_qml_module(QmlWorkerScript + URI "QtQml.WorkerScript" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET workerscriptplugin + CLASS_NAME QtQmlWorkerScriptPlugin SOURCES qquickworkerscript.cpp qquickworkerscript_p.h qtqmlworkerscriptglobal.h qtqmlworkerscriptglobal_p.h @@ -47,15 +50,6 @@ qt_internal_add_module(QmlWorkerScript Qt::QmlPrivate ) -#### Keys ignored in scope 1:.:.:qmlworkerscript.pro:<TRUE>: -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQml/WorkerScript" -# QML_IMPORT_NAME = "QtQml.WorkerScript" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -## Scopes: -##################################################################### - qt_internal_extend_target(QmlWorkerScript CONDITION WIN32 DEFINES NOMINMAX @@ -101,14 +95,3 @@ qt_internal_extend_target(QmlWorkerScript CONDITION GCC AND QT_COMPILER_VERSION_ qt_internal_add_docs(QmlWorkerScript doc/qtqmlworkerscript.qdocconf ) - - -set_target_properties(QmlWorkerScript PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQml.WorkerScript - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQml/WorkerScript" -) - -qt6_qml_type_registration(QmlWorkerScript) diff --git a/src/qmlworkerscript/doc/qtqmlworkerscript.qdocconf b/src/qmlworkerscript/doc/qtqmlworkerscript.qdocconf index e56e1759b3..303dee5261 100644 --- a/src/qmlworkerscript/doc/qtqmlworkerscript.qdocconf +++ b/src/qmlworkerscript/doc/qtqmlworkerscript.qdocconf @@ -27,8 +27,7 @@ depends += qtcore qtqml qtquick qtdoc headerdirs += .. -sourcedirs += .. \ - ../../imports/workerscript +sourcedirs += .. exampledirs += snippets diff --git a/src/qmlworkerscript/doc/src/qmlworkerscript.qdoc b/src/qmlworkerscript/doc/src/qmlworkerscript.qdoc new file mode 100644 index 0000000000..8f7f5e546c --- /dev/null +++ b/src/qmlworkerscript/doc/src/qmlworkerscript.qdoc @@ -0,0 +1,42 @@ +/**************************************************************************** +** +** Copyright (C) 2021 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the documentation of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:FDL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and The Qt Company. For licensing terms +** and conditions see https://www.qt.io/terms-conditions. For further +** information use the contact form at https://www.qt.io/contact-us. +** +** GNU Free Documentation License Usage +** Alternatively, this file may be used under the terms of the GNU Free +** Documentation License version 1.3 as published by the Free Software +** Foundation and appearing in the file included in the packaging of +** this file. Please review the following information to ensure +** the GNU Free Documentation License version 1.3 requirements +** will be met: https://www.gnu.org/licenses/fdl-1.3.html. +** $QT_END_LICENSE$ +** +****************************************************************************/ + +/*! + \qmlmodule QtQml.WorkerScript 2.\QtMinorVersion + \title Qt QML WorkerScript QML Types + \ingroup qmlmodules + \brief Provides QML types for worker scripts. + \since 5.14 + + This QML module contains types for using worker scripts. + + To use the types in this module, import the module with the following line: + + \qml + import QtQml.WorkerScript + \endqml +*/ diff --git a/src/qmlxmllistmodel/CMakeLists.txt b/src/qmlxmllistmodel/CMakeLists.txt index 453d0348fc..3a74462081 100644 --- a/src/qmlxmllistmodel/CMakeLists.txt +++ b/src/qmlxmllistmodel/CMakeLists.txt @@ -1,4 +1,10 @@ -qt_internal_add_module(QmlXmlListModel +qt_internal_add_qml_module(QmlXmlListModel + URI "QtQml.XmlListModel" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmlxmllistmodelplugin + CLASS_NAME QtQmlXmlListModelPlugin + DEPENDENCIES + QtQml SOURCES qqmlxmllistmodel_p.h qqmlxmllistmodel.cpp qtqmlxmllistmodelglobal_p.h @@ -16,13 +22,3 @@ qt_internal_add_module(QmlXmlListModel qt_internal_add_docs(QmlXmlListModel doc/qtqmlxmllistmodel.qdocconf ) - -set_target_properties(QmlXmlListModel PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQml.XmlListModel - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQml/XmlListModel" -) - -qt6_qml_type_registration(QmlXmlListModel) diff --git a/src/quick/CMakeLists.txt b/src/quick/CMakeLists.txt index 56c928b01e..2c2324d896 100644 --- a/src/quick/CMakeLists.txt +++ b/src/quick/CMakeLists.txt @@ -1,10 +1,16 @@ -# Generated from quick.pro. - ##################################################################### ## Quick Module: ##################################################################### -qt_internal_add_module(Quick +qt_internal_add_qml_module(Quick + URI "QtQuick" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET qtquick2plugin + NO_GENERATE_PLUGIN_SOURCE + CLASS_NAME QtQuick2Plugin + IMPORTS + QtQml/auto PLUGIN_TYPES scenegraph SOURCES handlers/qquickdragaxis.cpp handlers/qquickdragaxis_p.h @@ -218,6 +224,13 @@ qt_internal_add_module(Quick Qt::QmlPrivate ) +# We need to do additional initialization, so we have to provide our own +# plugin class rather than using the generated one +qt_internal_extend_target(qtquick2plugin + SOURCES qtquickplugin.cpp + LIBRARIES Qt::QuickPrivate +) + qt_internal_add_shaders(Quick "scenegraph_shaders" SILENT BATCHABLE @@ -287,17 +300,6 @@ if(ANDROID) ) endif() -#### Keys ignored in scope 1:.:.:quick.pro:<TRUE>: -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQuick" -# QML_IMPORT_NAME = "QtQuick" -# QML_IMPORT_VERSION = "$$QT_VERSION" -# qmldir.files = "$$PWD/../imports/window/qmldir" -# qmldir.path = "$$[QT_INSTALL_QML]/QtQuick/Window" - -## Scopes: -##################################################################### - qt_internal_extend_target(Quick CONDITION QT_FEATURE_qml_network LIBRARIES Qt::Network @@ -365,12 +367,6 @@ qt_internal_extend_target(Quick CONDITION QT_FEATURE_accessibility Qt::QmlPrivate ) -#### Keys ignored in scope 10:.:.:quick.pro:prefix_build: -# INSTALLS = "qmldir" - -#### Keys ignored in scope 11:.:.:quick.pro:else: -# COPIES = "qmldir" - qt_internal_extend_target(Quick CONDITION QT_FEATURE_qml_debug SOURCES util/qquickprofiler.cpp @@ -511,14 +507,4 @@ qt_internal_add_docs(Quick doc/qtquick.qdocconf ) - -set_target_properties(Quick PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQuick - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQuick" -) - -qt6_qml_type_registration(Quick) - +add_subdirectory(window) diff --git a/src/quick/doc/qtquick.qdocconf b/src/quick/doc/qtquick.qdocconf index c36c226cbc..7340413d3f 100644 --- a/src/quick/doc/qtquick.qdocconf +++ b/src/quick/doc/qtquick.qdocconf @@ -84,12 +84,6 @@ sourcedirs += ../../imports headerdirs += ../../plugins sourcedirs += ../../plugins -#exclude certain directories -excludedirs += ../../imports/models \ - ../../imports/labsmodels \ - ../../imports/testlib \ - ../../imports/workerscript - excludefiles += ../util/qquickpropertychanges_p.h examples.fileextensions += "*.qm" diff --git a/src/imports/qtquick2/plugin.cpp b/src/quick/qtquickplugin.cpp index 8ab49c882e..e4ceee15a9 100644 --- a/src/imports/qtquick2/plugin.cpp +++ b/src/quick/qtquickplugin.cpp @@ -58,4 +58,4 @@ public: QT_END_NAMESPACE -#include "plugin.moc" +#include "qtquickplugin.moc" diff --git a/src/quick/window/CMakeLists.txt b/src/quick/window/CMakeLists.txt new file mode 100644 index 0000000000..96bf8ee099 --- /dev/null +++ b/src/quick/window/CMakeLists.txt @@ -0,0 +1,13 @@ +# This qml module only exists to satisfy backward compatibility. +# The functionality was absorbed directly into QtQuick. + +qt_internal_add_qml_module(quickwindow + URI "QtQuick.Window" + VERSION "${PROJECT_VERSION}" + NO_PLUGIN_OPTIONAL + PLUGIN_TARGET quickwindow + CLASS_NAME QtQuick_WindowPlugin + IMPORTS + QtQuick/auto + PAST_MAJOR_VERSIONS 2 +) diff --git a/src/quicklayouts/CMakeLists.txt b/src/quicklayouts/CMakeLists.txt index ca5dbfad79..4717756587 100644 --- a/src/quicklayouts/CMakeLists.txt +++ b/src/quicklayouts/CMakeLists.txt @@ -1,4 +1,11 @@ - qt_internal_add_module(QuickLayouts +qt_internal_add_qml_module(QuickLayouts + URI "QtQuick.Layouts" + VERSION "${PROJECT_VERSION}" + DESIGNER_SUPPORTED + PLUGIN_TARGET qquicklayoutsplugin + CLASS_NAME QtQuickLayoutsPlugin + DEPENDENCIES + QtQuick SOURCES qquickgridlayoutengine.cpp qquickgridlayoutengine_p.h qquicklayout.cpp qquicklayout_p.h @@ -14,14 +21,3 @@ Qt::QuickPrivate Qt::Qml ) - - -set_target_properties(QuickLayouts PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQuick.Layouts - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQuick/Layouts" -) - -qt6_qml_type_registration(QuickLayouts) diff --git a/src/quickshapes/CMakeLists.txt b/src/quickshapes/CMakeLists.txt index b8838b6a18..0f842d79ac 100644 --- a/src/quickshapes/CMakeLists.txt +++ b/src/quickshapes/CMakeLists.txt @@ -1,10 +1,16 @@ -# Generated from quickshapes.pro. - ##################################################################### ## QuickShapes Module: ##################################################################### -qt_internal_add_module(QuickShapes +qt_internal_add_qml_module(QuickShapes + URI "QtQuick.Shapes" + VERSION "${PROJECT_VERSION}" + PLUGIN_TARGET qmlshapesplugin + NO_PLUGIN_OPTIONAL + NO_GENERATE_PLUGIN_SOURCE + CLASS_NAME QmlShapesPlugin + DEPENDENCIES + QtQuick INTERNAL_MODULE SOURCES qquickshape.cpp qquickshape_p.h @@ -19,6 +25,13 @@ qt_internal_add_module(QuickShapes Qt::QuickPrivate ) +# We need to do additional initialization, so we have to provide our own +# plugin class rather than using the generated one +qt_internal_extend_target(qmlshapesplugin + SOURCES qquickshapesplugin.cpp + LIBRARIES Qt::QuickShapesPrivate +) + # Resources: set(qtquickshapes_resource_files "shaders_ng/conicalgradient.frag.qsb" @@ -36,19 +49,3 @@ qt_internal_add_resource(QuickShapes "qtquickshapes" ${qtquickshapes_resource_files} ) - -#### Keys ignored in scope 1:.:.:quickshapes.pro:<TRUE>: -# QMLTYPES_FILENAME = "plugins.qmltypes" -# QMLTYPES_INSTALL_DIR = "$$[QT_INSTALL_QML]/QtQuick/Shapes" -# QML_IMPORT_NAME = "QtQuick.Shapes" -# QML_IMPORT_VERSION = "$$QT_VERSION" - -set_target_properties(QuickShapes PROPERTIES - QT_QML_MODULE_INSTALL_QMLTYPES TRUE - QT_QML_MODULE_VERSION ${PROJECT_VERSION} - QT_QML_MODULE_URI QtQuick.Shapes - QT_QMLTYPES_FILENAME plugins.qmltypes - QT_QML_MODULE_INSTALL_DIR "${INSTALL_QMLDIR}/QtQuick/Shapes" -) - -qt6_qml_type_registration(QuickShapes) diff --git a/src/imports/shapes/plugin.cpp b/src/quickshapes/qquickshapesplugin.cpp index 9a7f5dc77f..587c546fca 100644 --- a/src/imports/shapes/plugin.cpp +++ b/src/quickshapes/qquickshapesplugin.cpp @@ -49,8 +49,7 @@ class QmlShapesPlugin : public QQmlEngineExtensionPlugin Q_PLUGIN_METADATA(IID QQmlEngineExtensionInterface_iid) public: - QmlShapesPlugin(QObject *parent = nullptr) - : QQmlEngineExtensionPlugin(parent) + QmlShapesPlugin(QObject *parent = nullptr) : QQmlEngineExtensionPlugin(parent) { volatile auto registration = &qml_register_types_QtQuick_Shapes; volatile auto initialize = &QQuickShapes_initializeModule; @@ -61,4 +60,4 @@ public: QT_END_NAMESPACE -#include "plugin.moc" +#include "qquickshapesplugin.moc" diff --git a/tests/auto/qml/CMakeLists.txt b/tests/auto/qml/CMakeLists.txt index 6065144ed2..685d4fba02 100644 --- a/tests/auto/qml/CMakeLists.txt +++ b/tests/auto/qml/CMakeLists.txt @@ -53,7 +53,10 @@ endif() if(QT_FEATURE_private_tests) add_subdirectory(qqmlcpputils) add_subdirectory(qqmldirparser) - add_subdirectory(qmlcachegen) + if(CMAKE_VERSION VERSION_GREATER_EQUAL "3.19") + # Calls qt6_target_qml_sources() directly, which needs CMake 3.19+ + add_subdirectory(qmlcachegen) + endif() add_subdirectory(animation) add_subdirectory(qqmlecmascript) add_subdirectory(qqmlanybinding) diff --git a/tests/auto/qml/qmlcachegen/CMakeLists.txt b/tests/auto/qml/qmlcachegen/CMakeLists.txt index d03e277b93..4ef6aa8ce1 100644 --- a/tests/auto/qml/qmlcachegen/CMakeLists.txt +++ b/tests/auto/qml/qmlcachegen/CMakeLists.txt @@ -23,13 +23,20 @@ qt_internal_add_test(tst_qmlcachegen TESTDATA ${test_data} ) +qt6_add_qml_module(tst_qmlcachegen + URI cachegentest + VERSION 1.0 + NO_CREATE_PLUGIN_TARGET + NO_GENERATE_PLUGIN_SOURCE +) + # Resources: set(qmake_workerscripts_test_resource_files "data/worker.js" "data/worker.qml" ) -qt_internal_add_resource(tst_qmlcachegen "qmake_workerscripts_test" +qt6_target_qml_sources(tst_qmlcachegen PREFIX "/workerscripts" FILES @@ -50,33 +57,36 @@ set(trickypaths_resource_files "data/versionStyleSuffix-1.2-more.qml" ) -qt_internal_add_resource(tst_qmlcachegen "trickypaths" +qt6_target_qml_sources(tst_qmlcachegen PREFIX "/directory with spaces" FILES ${trickypaths_resource_files} ) + +set_source_files_properties("data/Retain.qml" + PROPERTIES QT_RESOURCE_ALIAS "Retain.qml" +) + set(retain_resource_files "data/Retain.qml" ) -qt_internal_add_resource(tst_qmlcachegen "retain" +qt6_target_qml_sources(tst_qmlcachegen PREFIX "/" - BASE - "data" FILES ${retain_resource_files} ) set_source_files_properties("data/SkipQmlCacheGen.qml" PROPERTIES QT_RESOURCE_ALIAS "Skip.qml" - QT_SKIP_QUICKCOMPILER 1 + QT_QML_SKIP_CACHEGEN 1 ) set(skip_resource_files "data/SkipQmlCacheGen.qml" ) -qt_internal_add_resource(tst_qmlcachegen "skip" +qt6_target_qml_sources(tst_qmlcachegen PREFIX "/not/" FILES @@ -96,7 +106,7 @@ set(qmake_immediate_resource_files "data/versionchecks.qml" ) -qt_internal_add_resource(tst_qmlcachegen "qmake_immediate" +qt6_target_qml_sources(tst_qmlcachegen PREFIX "/" FILES @@ -116,7 +126,7 @@ if(UNIX) "data/umlaut.qml" ) - qt_internal_add_resource(tst_qmlcachegen "trickypaths_umlaut" + qt6_target_qml_sources(tst_qmlcachegen PREFIX "/" FILES @@ -124,6 +134,19 @@ if(UNIX) ) endif() +# Add those files to the resource system so that they get copied to the data +# directory in the build directory, which is preferred by qFindTestData +# over the one in the source directory where they are always placed. +set(qml_additional_resources + "data/posthocrequired.qml" + "data/inlineComponentWithId.qml" +) + +qt6_target_qml_sources(tst_qmlcachegen + PREFIX "/" + FILES ${qml_additional_resources} +) + qt_internal_extend_target(tst_qmlcachegen CONDITION ANDROID OR IOS DEFINES QT_QMLTEST_DATADIR=\\\":/data\\\" diff --git a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp index 02f0ea95a2..8fdfecb379 100644 --- a/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp +++ b/tests/auto/qml/qmlcachegen/tst_qmlcachegen.cpp @@ -697,8 +697,9 @@ void tst_qmlcachegen::parameterAdjustment() void tst_qmlcachegen::inlineComponent() { - bool ok = generateCache(testFile("inlineComponentWithId.qml")); - QVERIFY(ok); + QByteArray errors; + bool ok = generateCache(testFile("inlineComponentWithId.qml"), &errors); + QVERIFY2(ok, errors); QQmlEngine engine; CleanlyLoadingComponent component(&engine, testFileUrl("inlineComponentWithId.qml")); QTest::ignoreMessage(QtMsgType::QtInfoMsg, "42"); diff --git a/tools/qml/CMakeLists.txt b/tools/qml/CMakeLists.txt index 96d030074d..099f3dc68d 100644 --- a/tools/qml/CMakeLists.txt +++ b/tools/qml/CMakeLists.txt @@ -48,15 +48,12 @@ qt_internal_add_resource(${target_name} "qml" ${qml_resource_files} ) - -#### Keys ignored in scope 1:.:.:qml.pro:<TRUE>: -# ICON = "resources/qml-64.png" -# QMAKE_TARGET_DESCRIPTION = "QML" "Runtime" -# QML_IMPORT_NAME = "QmlRuntime.Config" -# QML_IMPORT_VERSION = "1.0" - -## Scopes: -##################################################################### +# Turn the tool into its own self-contained qml module +qt6_add_qml_module(${target_name} + URI QmlRuntime.Config + VERSION 1.0 + NO_CREATE_PLUGIN_TARGET +) qt_internal_extend_target(${target_name} CONDITION TARGET Qt::Gui PUBLIC_LIBRARIES @@ -80,10 +77,3 @@ qt_internal_extend_target(${target_name} CONDITION QT_FEATURE_qml_debug DEFINES QT_QML_DEBUG_NO_WARNING ) - -set_target_properties(${target_name} PROPERTIES - QT_QML_MODULE_VERSION 1.0 - QT_QML_MODULE_URI QmlRuntime.Config -) - -qt6_qml_type_registration(${target_name}) diff --git a/tools/qmltime/CMakeLists.txt b/tools/qmltime/CMakeLists.txt index 1486885e33..e8d2ff8f57 100644 --- a/tools/qmltime/CMakeLists.txt +++ b/tools/qmltime/CMakeLists.txt @@ -17,22 +17,15 @@ qt_internal_add_tool(${target_name} Qt::QuickPrivate ) -#### Keys ignored in scope 1:.:.:qmltime.pro:<TRUE>: -# QMAKE_TARGET_DESCRIPTION = "QML" "Time" -# QML_IMPORT_NAME = "QmlTime" -# QML_IMPORT_VERSION = "1.0" - -## Scopes: -##################################################################### - # Don't set properties on a host tool when cross compiling, because it # is not being built. -if(NOT CMAKE_CROSSCOMPILING OR QT_BUILD_TOOLS_WHEN_CROSSCOMPILING) - -set_target_properties(${target_name} PROPERTIES - QT_QML_MODULE_VERSION 1.0 - QT_QML_MODULE_URI QmlTime -) -qt6_qml_type_registration(${target_name}) +if(CMAKE_CROSSCOMPILING AND NOT QT_BUILD_TOOLS_WHEN_CROSSCOMPILING) + return() endif() +# Turn the tool into its own self-contained qml module +qt6_add_qml_module(${target_name} + URI QmlTime + VERSION 1.0 + NO_CREATE_PLUGIN_TARGET +) |