diff options
author | Andrei Golubev <andrei.golubev@qt.io> | 2021-11-08 16:12:57 +0100 |
---|---|---|
committer | Andrei Golubev <andrei.golubev@qt.io> | 2021-11-10 14:59:46 +0100 |
commit | a45844d8740a6a3a18c84338f37114e3c7712467 (patch) | |
tree | 52d667123a968f561379bdd71682a05fcee6c6c7 | |
parent | 615cc8111c1399232a8d5348bed573793eba806d (diff) |
Make QML builtins files available in resource file system
Thus ensuring that the builtins are always present, even if the
Qt build/installation is weird
(Kind of) amends 363c23357501bdbacf9407ef46e7808261486aa8
Task-number: QTBUG-97986
Change-Id: I7cf41781ec37bf531d1b45ae95296fcb3546673d
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
(cherry picked from commit 7f018794beebf360bf375e065d2547c71150fdf6)
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/qmlcompiler/CMakeLists.txt | 10 | ||||
-rw-r--r-- | src/qmlcompiler/qqmljsimporter.cpp | 31 |
2 files changed, 32 insertions, 9 deletions
diff --git a/src/qmlcompiler/CMakeLists.txt b/src/qmlcompiler/CMakeLists.txt index a853eea59b..50ad39a099 100644 --- a/src/qmlcompiler/CMakeLists.txt +++ b/src/qmlcompiler/CMakeLists.txt @@ -21,6 +21,16 @@ qt_internal_add_module(QmlCompilerPrivate Qt::CorePrivate ) +qt_internal_add_resource(QmlCompilerPrivate "builtins" + PREFIX + "/qt-project.org/qml/builtins" + BASE + "${CMAKE_CURRENT_SOURCE_DIR}/../imports/builtins/" + FILES + "${CMAKE_CURRENT_SOURCE_DIR}/../imports/builtins/builtins.qmltypes" + "${CMAKE_CURRENT_SOURCE_DIR}/../imports/builtins/jsroot.qmltypes" +) + add_dependencies(QmlCompilerPrivate QmlDevToolsPrivate) get_target_property(devtools_includes QmlDevToolsPrivate EXTRA_INCLUDE_DIRECTORIES) target_include_directories(QmlCompilerPrivate PUBLIC ${devtools_includes}) diff --git a/src/qmlcompiler/qqmljsimporter.cpp b/src/qmlcompiler/qqmljsimporter.cpp index aedac622a1..2e321d21f7 100644 --- a/src/qmlcompiler/qqmljsimporter.cpp +++ b/src/qmlcompiler/qqmljsimporter.cpp @@ -321,19 +321,32 @@ QQmlJSImporter::AvailableTypes QQmlJSImporter::builtinImportHelper() QStringList qmltypesFiles = { QStringLiteral("builtins.qmltypes"), QStringLiteral("jsroot.qmltypes") }; + const auto importBuiltins = [&](const QStringList &imports) { + for (auto const &dir : imports) { + QDirIterator it { dir, qmltypesFiles, QDir::NoFilter, QDirIterator::Subdirectories }; + while (it.hasNext() && !qmltypesFiles.isEmpty()) { + readQmltypes(it.next(), &result.objects, &result.dependencies); + qmltypesFiles.removeOne(it.fileName()); + } - for (auto const &dir : m_importPaths) { - QDirIterator it { dir, qmltypesFiles, QDir::NoFilter, QDirIterator::Subdirectories }; - while (it.hasNext() && !qmltypesFiles.isEmpty()) { - readQmltypes(it.next(), &result.objects, &result.dependencies); - qmltypesFiles.removeOne(it.fileName()); - } + importDependencies(result, &m_builtins); - importDependencies(result, &m_builtins); + if (qmltypesFiles.isEmpty()) + return; + } + }; - if (qmltypesFiles.isEmpty()) - break; + importBuiltins(m_importPaths); + if (!qmltypesFiles.isEmpty()) { + const QString pathsString = + m_importPaths.isEmpty() ? u"<empty>"_qs : m_importPaths.join(u"\n\t"); + m_warnings.append({ QStringLiteral("Failed to find the following builtins: %1 (so will use " + "qrc). Import paths used:\n\t%2") + .arg(qmltypesFiles.join(u", "), pathsString), + QtWarningMsg, QQmlJS::SourceLocation() }); + importBuiltins({ u":/qt-project.org/qml/builtins"_qs }); // use qrc as a "last resort" } + Q_ASSERT(qmltypesFiles.isEmpty()); // since qrc must cover it in all the bad cases // Process them together since there they have interdependencies that wouldn't get resolved // otherwise |