aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrei Golubev <andrei.golubev@qt.io>2021-11-08 16:12:57 +0100
committerAndrei Golubev <andrei.golubev@qt.io>2021-11-10 14:59:46 +0100
commita45844d8740a6a3a18c84338f37114e3c7712467 (patch)
tree52d667123a968f561379bdd71682a05fcee6c6c7
parent615cc8111c1399232a8d5348bed573793eba806d (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.txt10
-rw-r--r--src/qmlcompiler/qqmljsimporter.cpp31
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