diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-10-17 08:49:04 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2022-10-18 00:01:38 +0200 |
commit | ec6b22f67dc6133b280a8f3fe40d7d1cbef819bc (patch) | |
tree | 3c74dbdefcb6795867273b81968cc3dba2f66c62 /src/tools/windeployqt/main.cpp | |
parent | 2fd990b386c3555cf66cd3efff0d6a47cdc63763 (diff) |
windeployqt: Deploy Qt Designer plugins for QtUiTools
Make QtUiTools a known module with command line options and
plugin dependencies.
Note: There is no automated dependency checking for those
plugins as this can lead to undesired libraries being pulled.
Pick-to: 6.4
Fixes: QTBUG-104831
Change-Id: I31a0c3620460d6558edcf8245f43502f2bca7748
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/tools/windeployqt/main.cpp')
-rw-r--r-- | src/tools/windeployqt/main.cpp | 96 |
1 files changed, 63 insertions, 33 deletions
diff --git a/src/tools/windeployqt/main.cpp b/src/tools/windeployqt/main.cpp index a41ef6cac1..ed60f59e11 100644 --- a/src/tools/windeployqt/main.cpp +++ b/src/tools/windeployqt/main.cpp @@ -88,7 +88,8 @@ enum QtModule Qt3DAnimationModule = 0x0002000000000000, QtWebViewModule = 0x0004000000000000, Qt3DExtrasModule = 0x0008000000000000, - QtShaderToolsModule = 0x0010000000000000 + QtShaderToolsModule = 0x0010000000000000, + QtUiToolsModule = 0x0020000000000000 }; struct QtModuleEntry { @@ -149,7 +150,8 @@ static QtModuleEntry qtModuleEntries[] = { { QtTextToSpeechModule, "texttospeech", "Qt6TextToSpeech", nullptr }, { QtSerialBusModule, "serialbus", "Qt6SerialBus", nullptr }, { QtWebViewModule, "webview", "Qt6WebView", nullptr }, - { QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr } + { QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr }, + { QtUiToolsModule, "uitools", "Qt6UiTools", nullptr } }; enum QtPlugin { @@ -846,7 +848,8 @@ static const PluginModuleMapping pluginModuleMappings[] = {"renderers", Qt3DRendererModule | QtShaderToolsModule}, {"renderplugins", Qt3DRendererModule}, {"geometryloaders", Qt3DRendererModule}, - {"webview", QtWebViewModule} + {"webview", QtWebViewModule}, + {"designer", QtUiToolsModule}, }; static inline quint64 qtModuleForPlugin(const QString &subDirName) @@ -882,13 +885,63 @@ static quint64 qtModule(QString module, const QString &infix) return 0; } +// Return the path if a plugin is to be deployed +static QString deployPlugin(const QString &plugin, const QDir &subDir, + quint64 *usedQtModules, quint64 disabledQtModules, + unsigned disabledPlugins, + const QString &libraryLocation, const QString &infix, + Platform platform) +{ + // Filter out disabled plugins + if ((disabledPlugins & QtVirtualKeyboardPlugin) + && plugin.startsWith("qtvirtualkeyboardplugin"_L1)) { + return {}; + } + + const QString pluginPath = subDir.absoluteFilePath(plugin); + // Deploy QUiTools plugins as is without further dependency checking. + // The user needs to ensure all required libraries are present (would + // otherwise pull QtWebEngine for its plugin). + if (subDir.dirName() == u"designer") + return pluginPath; + + QStringList dependentQtLibs; + quint64 neededModules = 0; + QString errorMessage; + if (findDependentQtLibraries(libraryLocation, pluginPath, platform, + &errorMessage, &dependentQtLibs)) { + for (int d = 0; d < dependentQtLibs.size(); ++ d) + neededModules |= qtModule(dependentQtLibs.at(d), infix); + } else { + std::wcerr << "Warning: Cannot determine dependencies of " + << QDir::toNativeSeparators(pluginPath) << ": " << errorMessage << '\n'; + } + + if (const quint64 missingModules = neededModules & disabledQtModules) { + if (optVerboseLevel) { + std::wcout << "Skipping plugin " << plugin + << " due to disabled dependencies (" + << formatQtModules(missingModules).constData() << ").\n"; + } + return {}; + } + + if (const quint64 missingModules = (neededModules & ~*usedQtModules)) { + *usedQtModules |= missingModules; + if (optVerboseLevel) { + std::wcout << "Adding " << formatQtModules(missingModules).constData() + << " for " << plugin << '\n'; + } + } + return pluginPath; +} + QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, unsigned disabledPlugins, const QString &qtPluginsDirName, const QString &libraryLocation, const QString &infix, DebugMatchMode debugMatchModeIn, Platform platform, QString *platformPlugin) { - QString errorMessage; if (qtPluginsDirName.isEmpty()) return QStringList(); QDir pluginsDir(qtPluginsDirName); @@ -927,35 +980,12 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules, } const QStringList plugins = findSharedLibraries(subDir, platform, debugMatchMode, filter); for (const QString &plugin : plugins) { - // Filter out disabled plugins - if ((disabledPlugins & QtVirtualKeyboardPlugin) - && plugin.startsWith("qtvirtualkeyboardplugin"_L1)) { - continue; - } - const QString pluginPath = subDir.absoluteFilePath(plugin); - if (isPlatformPlugin) - *platformPlugin = pluginPath; - QStringList dependentQtLibs; - quint64 neededModules = 0; - if (findDependentQtLibraries(libraryLocation, pluginPath, platform, &errorMessage, &dependentQtLibs)) { - for (int d = 0; d < dependentQtLibs.size(); ++ d) - neededModules |= qtModule(dependentQtLibs.at(d), infix); - } else { - std::wcerr << "Warning: Cannot determine dependencies of " - << QDir::toNativeSeparators(pluginPath) << ": " << errorMessage << '\n'; - } - if (const quint64 missingModules = neededModules & disabledQtModules) { - if (optVerboseLevel) { - std::wcout << "Skipping plugin " << plugin - << " due to disabled dependencies (" - << formatQtModules(missingModules).constData() << ").\n"; - } - } else { - if (const quint64 missingModules = (neededModules & ~*usedQtModules)) { - *usedQtModules |= missingModules; - if (optVerboseLevel) - std::wcout << "Adding " << formatQtModules(missingModules).constData() << " for " << plugin << '\n'; - } + const QString pluginPath = + deployPlugin(plugin, subDir, usedQtModules, disabledQtModules, + disabledPlugins, libraryLocation, infix, platform); + if (!pluginPath.isEmpty()) { + if (isPlatformPlugin) + *platformPlugin = subDir.absoluteFilePath(plugin); result.append(pluginPath); } } // for filter |