diff options
Diffstat (limited to 'tools/qmlcachegen')
-rw-r--r-- | tools/qmlcachegen/generateloader.cpp | 20 | ||||
-rw-r--r-- | tools/qmlcachegen/qmlcachegen.cpp | 18 | ||||
-rw-r--r-- | tools/qmlcachegen/qtquickcompiler.prf | 23 |
3 files changed, 46 insertions, 15 deletions
diff --git a/tools/qmlcachegen/generateloader.cpp b/tools/qmlcachegen/generateloader.cpp index 68aacf78ce..5b8fc34455 100644 --- a/tools/qmlcachegen/generateloader.cpp +++ b/tools/qmlcachegen/generateloader.cpp @@ -26,6 +26,7 @@ ** ****************************************************************************/ #include <QByteArray> +#include <QRegExp> #include <QString> #include <QStringList> #include <QTextStream> @@ -35,6 +36,8 @@ #include <QFileInfo> #include <QSaveFile> +#include <algorithm> + /*! * \internal * Mangles \a str to be a unique C++ identifier. Characters that are invalid for C++ identifiers @@ -260,7 +263,8 @@ private: } }; -static QByteArray generateResourceDirectoryTree(QTextStream &code, const QStringList &qrcFiles) +static QByteArray generateResourceDirectoryTree(QTextStream &code, const QStringList &qrcFiles, + const QStringList &sortedRetainedFiles) { QByteArray call; if (qrcFiles.isEmpty()) @@ -269,14 +273,15 @@ static QByteArray generateResourceDirectoryTree(QTextStream &code, const QString VirtualDirectoryEntry resourceDirs; resourceDirs.name = QStringLiteral("/"); - foreach (const QString &entry, qrcFiles) { + for (const QString &entry : qrcFiles) { const QStringList segments = entry.split(QLatin1Char('/'), QString::SkipEmptyParts); VirtualDirectoryEntry *dirEntry = &resourceDirs; for (int i = 0; i < segments.count() - 1; ++i) dirEntry = dirEntry->append(segments.at(i)); - dirEntry->appendEmptyFile(segments.last()); + if (!std::binary_search(sortedRetainedFiles.begin(), sortedRetainedFiles.end(), entry)) + dirEntry->appendEmptyFile(segments.last()); } if (resourceDirs.isEmpty()) @@ -327,7 +332,9 @@ static QString qtResourceNameForFile(const QString &fileName) return name; } -bool generateLoader(const QStringList &compiledFiles, const QString &outputFileName, const QStringList &resourceFileMappings, QString *errorString) +bool generateLoader(const QStringList &compiledFiles, const QStringList &sortedRetainedFiles, + const QString &outputFileName, const QStringList &resourceFileMappings, + QString *errorString) { QByteArray generatedLoaderCode; @@ -338,13 +345,14 @@ bool generateLoader(const QStringList &compiledFiles, const QString &outputFileN stream << "#include <QtCore/qurl.h>\n"; stream << "\n"; - QByteArray resourceRegisterCall = generateResourceDirectoryTree(stream, compiledFiles); + QByteArray resourceRegisterCall = generateResourceDirectoryTree(stream, compiledFiles, + sortedRetainedFiles); stream << "namespace QmlCacheGeneratedCode {\n"; for (int i = 0; i < compiledFiles.count(); ++i) { const QString compiledFile = compiledFiles.at(i); const QString ns = symbolNamespaceForPath(compiledFile); - stream << "namespace " << symbolNamespaceForPath(compiledFile) << " { \n"; + stream << "namespace " << ns << " { \n"; stream << " extern const unsigned char qmlData[];\n"; stream << " const QQmlPrivate::CachedQmlUnit unit = {\n"; stream << " reinterpret_cast<const QV4::CompiledData::Unit*>(&qmlData), nullptr, nullptr\n"; diff --git a/tools/qmlcachegen/qmlcachegen.cpp b/tools/qmlcachegen/qmlcachegen.cpp index b6b80a4461..df7468eaef 100644 --- a/tools/qmlcachegen/qmlcachegen.cpp +++ b/tools/qmlcachegen/qmlcachegen.cpp @@ -43,8 +43,12 @@ #include "resourcefilemapper.h" +#include <algorithm> + int filterResourceFile(const QString &input, const QString &output); -bool generateLoader(const QStringList &compiledFiles, const QString &output, const QStringList &resourceFileMappings, QString *errorString); +bool generateLoader(const QStringList &compiledFiles, const QStringList &retainedFiles, + const QString &output, const QStringList &resourceFileMappings, + QString *errorString); QString symbolNamespaceForPath(const QString &relativePath); QSet<QString> illegalNames; @@ -104,7 +108,7 @@ static void annotateListElements(QmlIR::Document *document) { QStringList listElementNames; - foreach (const QV4::CompiledData::Import *import, document->imports) { + for (const QV4::CompiledData::Import *import : qAsConst(document->imports)) { const QString uri = document->stringAt(import->uriIndex); if (uri != QStringLiteral("QtQml.Models") && uri != QStringLiteral("QtQuick")) continue; @@ -121,7 +125,7 @@ static void annotateListElements(QmlIR::Document *document) if (listElementNames.isEmpty()) return; - foreach (QmlIR::Object *object, document->objects) { + for (QmlIR::Object *object : qAsConst(document->objects)) { if (!listElementNames.contains(document->stringAt(object->inheritedTypeNameIndex))) continue; for (QmlIR::Binding *binding = object->firstBinding(); binding; binding = binding->next) { @@ -420,6 +424,8 @@ int main(int argc, char **argv) parser.addOption(resourceFileMappingOption); QCommandLineOption resourceOption(QStringLiteral("resource"), QCoreApplication::translate("main", "Qt resource file that might later contain one of the compiled files"), QCoreApplication::translate("main", "resource-file-name")); parser.addOption(resourceOption); + QCommandLineOption retainOption(QStringLiteral("retain"), QCoreApplication::translate("main", "Qt resource file the contents of which should not be replaced by empty stubs"), QCoreApplication::translate("main", "resource-file-name")); + parser.addOption(retainOption); QCommandLineOption resourcePathOption(QStringLiteral("resource-path"), QCoreApplication::translate("main", "Qt resource file path corresponding to the file being compiled"), QCoreApplication::translate("main", "resource-path")); parser.addOption(resourcePathOption); @@ -467,9 +473,13 @@ int main(int argc, char **argv) if (target == GenerateLoader) { ResourceFileMapper mapper(sources); + ResourceFileMapper retain(parser.values(retainOption)); Error error; - if (!generateLoader(mapper.qmlCompilerFiles(), outputFileName, parser.values(resourceFileMappingOption), &error.message)) { + QStringList retainedFiles = retain.qmlCompilerFiles(); + std::sort(retainedFiles.begin(), retainedFiles.end()); + if (!generateLoader(mapper.qmlCompilerFiles(), retainedFiles, outputFileName, + parser.values(resourceFileMappingOption), &error.message)) { error.augment(QLatin1String("Error generating loader stub: ")).print(); return EXIT_FAILURE; } diff --git a/tools/qmlcachegen/qtquickcompiler.prf b/tools/qmlcachegen/qtquickcompiler.prf index dd526f13a3..9c8c7a7b1e 100644 --- a/tools/qmlcachegen/qtquickcompiler.prf +++ b/tools/qmlcachegen/qtquickcompiler.prf @@ -16,6 +16,13 @@ defineReplace(qmlCacheResourceFileOutputName) { return($${name}) } +defineTest(qtQuickRetainSources) { + for(retainedRes, QTQUICK_COMPILER_RETAINED_RESOURCES) { + equals(1, $$retainedRes): return(true) + } + return(false) +} + defineTest(qtQuickSkippedResourceFile) { for(skippedRes, QTQUICK_COMPILER_SKIPPED_RESOURCES) { equals(1, $$skippedRes): return(true) @@ -40,12 +47,18 @@ for(res, RESOURCES) { contains(rccContents,.*\\.js$)|contains(rccContents,.*\\.qml$)|contains(rccContents,.*\\.mjs$) { new_resource = $$qmlCacheResourceFileOutputName($$res) mkpath($$dirname(new_resource)) - remaining_files = $$system($$QML_CACHEGEN_FILTER -filter-resource-file -o $$system_quote($$new_resource) $$system_quote($$absRes),lines) - !isEmpty(remaining_files) { - NEWRESOURCES += $$new_resource - QMLCACHE_LOADER_FLAGS += --resource-file-mapping=$$shell_quote($$absRes=$$new_resource) + qtQuickRetainSources($$res) { + NEWRESOURCES += $$res + QMLCACHE_LOADER_FLAGS += --retain=$$shell_quote($$absRes) } else { - QMLCACHE_LOADER_FLAGS += --resource-file-mapping=$$shell_quote($$absRes) + remaining_files = $$system($$QML_CACHEGEN_FILTER -filter-resource-file \ + -o $$system_quote($$new_resource) $$system_quote($$absRes),lines) + !isEmpty(remaining_files) { + NEWRESOURCES += $$new_resource + QMLCACHE_LOADER_FLAGS += --resource-file-mapping=$$shell_quote($$absRes=$$new_resource) + } else { + QMLCACHE_LOADER_FLAGS += --resource-file-mapping=$$shell_quote($$absRes) + } } QMLCACHE_RESOURCE_FILES += $$absRes |