diff options
author | Christian Kandeler <[email protected]> | 2020-03-05 16:42:04 +0100 |
---|---|---|
committer | Christian Kandeler <[email protected]> | 2020-03-09 12:40:18 +0000 |
commit | 2382a5e8e917013725977b37bbe227d9a19b1d39 (patch) | |
tree | d3ea94f18fb37792b9943131c49d625b0abd858b | |
parent | 1b3f4b0ac80c0b66eef2c03df4c4385044aa7ba6 (diff) |
Qt: Add support for the new QML type registration mechanism
This implements the Qt 5.15 type registration approach via
the qmltyperegistrar tool.
Fixes: QBS-1531
Change-Id: Id77572a521513dc1759b02a7f7299377c2bcaabb
Reviewed-by: Ulf Hermann <[email protected]>
Reviewed-by: Joerg Bornemann <[email protected]>
-rw-r--r-- | doc/reference/modules/qt-qml-module.qdoc | 70 | ||||
-rw-r--r-- | share/qbs/module-providers/Qt/setup-qt.js | 15 | ||||
-rw-r--r-- | share/qbs/module-providers/Qt/templates/qml.qbs | 70 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/qmltyperegistrar/example.qml | 58 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/qmltyperegistrar/main.cpp | 71 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.cpp | 78 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.h | 78 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata-qt/qmltyperegistrar/qmltyperegistrar.qbs | 33 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxqt.cpp | 34 | ||||
-rw-r--r-- | tests/auto/blackbox/tst_blackboxqt.h | 2 |
10 files changed, 507 insertions, 2 deletions
diff --git a/doc/reference/modules/qt-qml-module.qdoc b/doc/reference/modules/qt-qml-module.qdoc index 722a2eb41..3d5758fc3 100644 --- a/doc/reference/modules/qt-qml-module.qdoc +++ b/doc/reference/modules/qt-qml-module.qdoc @@ -60,10 +60,80 @@ \li 1.8 \li Source files with this tag serve as inputs to the QML plugin scanner. + \row + \li \c{"qt.qml.types"} + \li n/a + \li 1.16 + \li This tag is attached to the files created by the \c qmltyperegistrar + tool if the \l importName property is set. \endtable */ /*! + \qmlproperty string Qt.qml::importName + + Setting this value triggers QML type registration via the \c qmltyperegistrar tool, + which results in the creation of a file with the tag \c{"qt.qml.types"}. + The given string is the name under which the registered types can be imported + by QML code that wants to use them. + + \note This functionality is only available with Qt 5.15 or later. + + \since Qbs 1.16 + \nodefaultvalue +*/ + +/*! + \qmlproperty string Qt.qml::importVersion + + Specifies the version of the types to be registered. + Values consist of a major and an optional minor number, separated by dots. + This property has no effect if \l importName is not set. + + \since Qbs 1.16 + \defaultvalue \l {Product::version}{The product version} +*/ + +/*! + \qmlproperty string Qt.qml::typesFileName + + Specifies the name of the file that declares the types registered for this product. + Per default, it is called "app.qmltypes" for applications and "plugins.qmltypes" + otherwise. + \note The naming conventions are still in flux. + When in doubt, consult the Qt documentation. + + This property has no effect if \l importName is not set. + + \since Qbs 1.16 +*/ + +/*! + \qmlproperty string Qt.qml::typesInstallDir + + The directory to install the qmltypes file into. If this property is empty or undefined, + the file will not be installed. + This property has no effect if \l importName is not set. + + \since Qbs 1.16 + \nodefaultvalue +*/ + +/*! + \qmlproperty stringList Qt.qml::extraMetaTypesFiles + + Specifies extra metatypes files to pass to the \c qmltyperegistrar tool + via the \c{--foreign-types} option when registering QML types. + \note This property is only needed for external libraries, not products or modules + pulled via \c Depends items. In particular, you don't need to (and should not) + use it to collect the metatypes files of Qt modules. These are found automatically. + This property has no effect if \l importName is not set. + + \since Qbs 1.16 + \nodefaultvalue +*/ + +/*! \qmlproperty string Qt.qml::qmlImportScannerName The base name of the QML import scanner. diff --git a/share/qbs/module-providers/Qt/setup-qt.js b/share/qbs/module-providers/Qt/setup-qt.js index 4ade17627..67a4369ed 100644 --- a/share/qbs/module-providers/Qt/setup-qt.js +++ b/share/qbs/module-providers/Qt/setup-qt.js @@ -1413,10 +1413,21 @@ function replaceSpecialValues(content, module, qtProps, abi) { dict.className = toJSLiteral(module.pluginData.className); dict["extends"] = toJSLiteral(module.pluginData["extends"]); } + indent = " "; + var metaTypesFile = qtProps.libraryPath + "/metatypes/qt" + + qtProps.qtMajorVersion + module.qbsName + "_metatypes.json"; + if (File.exists(metaTypesFile)) { + if (additionalContent) + additionalContent += "\n" + indent; + additionalContent += "Group {\n"; + additionalContent += indent + indent + "files: " + JSON.stringify(metaTypesFile) + "\n" + + indent + indent + "filesAreTargets: true\n" + + indent + indent + "fileTags: [\"qt.core.metatypes\"]\n" + + indent + "}"; + } if (module.hasLibrary && !isFramework(module, qtProps)) { if (additionalContent) - additionalContent += "\n"; - indent = " "; + additionalContent += "\n" + indent; additionalContent += "Group {\n"; if (module.isPlugin) { additionalContent += indent + indent diff --git a/share/qbs/module-providers/Qt/templates/qml.qbs b/share/qbs/module-providers/Qt/templates/qml.qbs index c95c0f367..f6d3fbb1f 100644 --- a/share/qbs/module-providers/Qt/templates/qml.qbs +++ b/share/qbs/module-providers/Qt/templates/qml.qbs @@ -60,6 +60,60 @@ QtModule { fileTags: ["qt.qml.js"] } + // Type registration + property string importName + property string importVersion: product.version + readonly property stringList _importVersionParts: (importVersion || "").split(".") + property string typesFileName: { + if (product.type && product.type.contains("application")) + return "app.qmltypes"; + return "plugins.qmltypes"; + } + property string typesInstallDir + property stringList extraMetaTypesFiles + Properties { + condition: importName + Qt.core.generateMetaTypesFile: true + } + Qt.core.generateMetaTypesFile: original + Rule { + condition: importName + inputs: "qt.core.metatypes" + multiplex: true + explicitlyDependsOnFromDependencies: "qt.core.metatypes" + Artifact { + filePath: product.targetName.toLowerCase() + "_qmltyperegistrations.cpp" + fileTags: ["cpp", "unmocable"] + } + Artifact { + filePath: product.Qt.qml.typesFileName + fileTags: "qt.qml.types" + qbs.install: product.Qt.qml.typesInstallDir + qbs.installDir: product.Qt.qml.typesInstallDir + } + prepare: { + var versionParts = product.Qt.qml._importVersionParts; + var args = [ + "--generate-qmltypes=" + outputs["qt.qml.types"][0].filePath, + "--import-name=" + product.Qt.qml.importName, + "--major-version=" + versionParts[0], + "--minor-version=" + (versionParts.length > 1 ? versionParts[1] : "0") + ]; + var foreignTypes = product.Qt.qml.extraMetaTypesFiles || []; + var metaTypeArtifactsFromDeps = explicitlyDependsOn["qt.core.metatypes"] || []; + var filePathFromArtifact = function(a) { return a.filePath; }; + foreignTypes = foreignTypes.concat(metaTypeArtifactsFromDeps.map(filePathFromArtifact)); + if (foreignTypes.length > 0) + args.push("--foreign-types=" + foreignTypes.join(",")); + args.push("-o", outputs.cpp[0].filePath); + args = args.concat(inputs["qt.core.metatypes"].map(filePathFromArtifact)); + var cmd = new Command(product.Qt.core.binPath + "/qmltyperegistrar", args); + cmd.description = "running qmltyperegistrar"; + cmd.highlight = "codegen"; + return cmd; + } + } + Rule { condition: linkPlugins multiplex: true @@ -130,4 +184,20 @@ QtModule { return [cmd]; } } + + validate: { + if (importName) { + if (!importVersion) + throw "Qt.qml.importVersion must be set if Qt.qml.importName is set."; + var isInt = function(value) { + return !isNaN(value) && parseInt(Number(value)) == value + && !isNaN(parseInt(value, 10)); + } + if (!isInt(_importVersionParts[0]) + || (_importVersionParts.length > 1 && !isInt(_importVersionParts[1]))) { + throw "Qt.qml.importVersion must be of the form x.y, where x and y are integers."; + } + + } + } } diff --git a/tests/auto/blackbox/testdata-qt/qmltyperegistrar/example.qml b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/example.qml new file mode 100644 index 000000000..ef97df12d --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/example.qml @@ -0,0 +1,58 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +// ![0] +import People 1.0 + +Person { + name: "Bob Jones" + shoeSize: 12 +} +// ![0] diff --git a/tests/auto/blackbox/testdata-qt/qmltyperegistrar/main.cpp b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/main.cpp new file mode 100644 index 000000000..6c3920f04 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/main.cpp @@ -0,0 +1,71 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include <QCoreApplication> +#include <QQmlEngine> +#include <QQmlComponent> +#include <QDebug> +#include "person.h" + +int main(int argc, char ** argv) +{ + QCoreApplication app(argc, argv); + + QQmlEngine engine; + QQmlComponent component(&engine, QUrl("qrc:example.qml")); + auto *person = qobject_cast<Person *>(component.create()); + if (person) { + qWarning() << "The person's name is" << person->name(); + qWarning() << "They wear a" << person->shoeSize() << "sized shoe"; + } else { + qWarning() << component.errors(); + } + + return EXIT_SUCCESS; +} diff --git a/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.cpp b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.cpp new file mode 100644 index 000000000..de4a33dd0 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.cpp @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#include "person.h" + +// ![0] +Person::Person(QObject *parent) +: QObject(parent), m_shoeSize(0) +{ +} + +QString Person::name() const +{ + return m_name; +} + +void Person::setName(const QString &n) +{ + m_name = n; +} + +int Person::shoeSize() const +{ + return m_shoeSize; +} + +void Person::setShoeSize(int s) +{ + m_shoeSize = s; +} + +// ![0] diff --git a/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.h b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.h new file mode 100644 index 000000000..530c335de --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/person.h @@ -0,0 +1,78 @@ +/**************************************************************************** +** +** Copyright (C) 2017 The Qt Company Ltd. +** Contact: https://www.qt.io/licensing/ +** +** This file is part of the examples of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:BSD$ +** 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. +** +** BSD License Usage +** Alternatively, you may use this file under the terms of the BSD license +** as follows: +** +** "Redistribution and use in source and binary forms, with or without +** modification, are permitted provided that the following conditions are +** met: +** * Redistributions of source code must retain the above copyright +** notice, this list of conditions and the following disclaimer. +** * Redistributions in binary form must reproduce the above copyright +** notice, this list of conditions and the following disclaimer in +** the documentation and/or other materials provided with the +** distribution. +** * Neither the name of The Qt Company Ltd nor the names of its +** contributors may be used to endorse or promote products derived +** from this software without specific prior written permission. +** +** +** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +** "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +** LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +** OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +** DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +** THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +** (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef PERSON_H +#define PERSON_H + +#include <QObject> +#include <QtQml/qqml.h> + +//![0] +class Person : public QObject +{ + Q_OBJECT + Q_PROPERTY(QString name READ name WRITE setName) + Q_PROPERTY(int shoeSize READ shoeSize WRITE setShoeSize) + QML_ELEMENT +public: + Person(QObject *parent = nullptr); + + QString name() const; + void setName(const QString &); + + int shoeSize() const; + void setShoeSize(int); + +private: + QString m_name; + int m_shoeSize; +}; +//![0] + +#endif // PERSON_H diff --git a/tests/auto/blackbox/testdata-qt/qmltyperegistrar/qmltyperegistrar.qbs b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/qmltyperegistrar.qbs new file mode 100644 index 000000000..68dc83743 --- /dev/null +++ b/tests/auto/blackbox/testdata-qt/qmltyperegistrar/qmltyperegistrar.qbs @@ -0,0 +1,33 @@ +import qbs.Utilities + +CppApplication { + name: "myapp" + Depends { name: "Qt.qml" } + + Qt.qml.importVersion: "1" + cpp.includePaths: sourceDirectory + qbs.installPrefix: "" + + files: [ + "main.cpp", + "person.cpp", + "person.h", + ] + + Group { + files: "example.qml" + fileTags: "qt.core.resource_data" + } + + Probe { + id: versionProbe + property string version: Qt.core.version + configure: { + if (Utilities.versionCompare(version, "5.15") >= 0) + console.info("has registrar"); + else + console.info("does not have registrar"); + found = true; + } + } +} diff --git a/tests/auto/blackbox/tst_blackboxqt.cpp b/tests/auto/blackbox/tst_blackboxqt.cpp index dd2a4139d..33d0ba1b8 100644 --- a/tests/auto/blackbox/tst_blackboxqt.cpp +++ b/tests/auto/blackbox/tst_blackboxqt.cpp @@ -383,6 +383,40 @@ void TestBlackboxQt::qobjectInObjectiveCpp() QCOMPARE(runQbs(), 0); } +void TestBlackboxQt::qmlTypeRegistrar_data() +{ + QTest::addColumn<QString>("importName"); + QTest::addColumn<QString>("installDir"); + QTest::newRow("don't generate") << QString() << QString(); + QTest::newRow("don't generate with install info") << QString() << QString("blubb"); + QTest::newRow("generate only") << QString("People") << QString(); + QTest::newRow("generate and install") << QString("People") << QString("blubb"); +} + +void TestBlackboxQt::qmlTypeRegistrar() +{ + QDir::setCurrent(testDataDir + "/qmltyperegistrar"); + QFETCH(QString, importName); + QFETCH(QString, installDir); + rmDirR(relativeBuildDir()); + const QStringList args{"modules.Qt.qml.importName:" + importName, + "modules.Qt.qml.typesInstallDir:" + installDir}; + QCOMPARE(runQbs(QbsRunParameters("resolve", args)), 0); + const bool hasRegistrar = m_qbsStdout.contains("has registrar"); + const bool doesNotHaveRegistrar = m_qbsStdout.contains("does not have registrar"); + QVERIFY(hasRegistrar != doesNotHaveRegistrar); + if (doesNotHaveRegistrar) + QSKIP("Qt version too old"); + QCOMPARE(runQbs(), 0); + const bool enabled = !importName.isEmpty(); + QCOMPARE(m_qbsStdout.contains("running qmltyperegistrar"), enabled); + QCOMPARE(m_qbsStdout.contains("compiling myapp_qmltyperegistrations.cpp"), enabled); + const QString buildDir = relativeProductBuildDir("myapp"); + QCOMPARE(regularFileExists(buildDir + "/app.qmltypes"), enabled); + QCOMPARE(regularFileExists(relativeBuildDir() + "/install-root/" + installDir + + "/app.qmltypes"), enabled && !installDir.isEmpty()); +} + void TestBlackboxQt::qtKeywords() { QDir::setCurrent(testDataDir + "/qt-keywords"); diff --git a/tests/auto/blackbox/tst_blackboxqt.h b/tests/auto/blackbox/tst_blackboxqt.h index 150bcc4b7..4008b14ca 100644 --- a/tests/auto/blackbox/tst_blackboxqt.h +++ b/tests/auto/blackbox/tst_blackboxqt.h @@ -65,6 +65,8 @@ private slots: void pluginSupport(); void qmlDebugging(); void qobjectInObjectiveCpp(); + void qmlTypeRegistrar_data(); + void qmlTypeRegistrar(); void qtKeywords(); void quickCompiler(); void qtScxml(); |