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.

Fixes: QTBUG-104831
Change-Id: I31a0c3620460d6558edcf8245f43502f2bca7748
Reviewed-by: Jörg Bornemann <joerg.bornemann@qt.io>
(cherry picked from commit ec6b22f67dc6133b280a8f3fe40d7d1cbef819bc)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Friedemann Kleint 2022-10-17 08:49:04 +02:00 committed by Qt Cherry-pick Bot
parent ae4f63613b
commit fa853a7715

View File

@ -86,7 +86,8 @@ enum QtModule
Qt3DAnimationModule = 0x0002000000000000, Qt3DAnimationModule = 0x0002000000000000,
QtWebViewModule = 0x0004000000000000, QtWebViewModule = 0x0004000000000000,
Qt3DExtrasModule = 0x0008000000000000, Qt3DExtrasModule = 0x0008000000000000,
QtShaderToolsModule = 0x0010000000000000 QtShaderToolsModule = 0x0010000000000000,
QtUiToolsModule = 0x0020000000000000
}; };
struct QtModuleEntry { struct QtModuleEntry {
@ -147,7 +148,8 @@ static QtModuleEntry qtModuleEntries[] = {
{ QtTextToSpeechModule, "texttospeech", "Qt6TextToSpeech", nullptr }, { QtTextToSpeechModule, "texttospeech", "Qt6TextToSpeech", nullptr },
{ QtSerialBusModule, "serialbus", "Qt6SerialBus", nullptr }, { QtSerialBusModule, "serialbus", "Qt6SerialBus", nullptr },
{ QtWebViewModule, "webview", "Qt6WebView", nullptr }, { QtWebViewModule, "webview", "Qt6WebView", nullptr },
{ QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr } { QtShaderToolsModule, "shadertools", "Qt6ShaderTools", nullptr },
{ QtUiToolsModule, "uitools", "Qt6UiTools", nullptr }
}; };
enum QtPlugin { enum QtPlugin {
@ -843,7 +845,8 @@ static const PluginModuleMapping pluginModuleMappings[] =
{"renderers", Qt3DRendererModule | QtShaderToolsModule}, {"renderers", Qt3DRendererModule | QtShaderToolsModule},
{"renderplugins", Qt3DRendererModule}, {"renderplugins", Qt3DRendererModule},
{"geometryloaders", Qt3DRendererModule}, {"geometryloaders", Qt3DRendererModule},
{"webview", QtWebViewModule} {"webview", QtWebViewModule},
{"designer", QtUiToolsModule},
}; };
static inline quint64 qtModuleForPlugin(const QString &subDirName) static inline quint64 qtModuleForPlugin(const QString &subDirName)
@ -879,13 +882,63 @@ static quint64 qtModule(QString module, const QString &infix)
return 0; 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, QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules,
unsigned disabledPlugins, unsigned disabledPlugins,
const QString &qtPluginsDirName, const QString &libraryLocation, const QString &qtPluginsDirName, const QString &libraryLocation,
const QString &infix, const QString &infix,
DebugMatchMode debugMatchModeIn, Platform platform, QString *platformPlugin) DebugMatchMode debugMatchModeIn, Platform platform, QString *platformPlugin)
{ {
QString errorMessage;
if (qtPluginsDirName.isEmpty()) if (qtPluginsDirName.isEmpty())
return QStringList(); return QStringList();
QDir pluginsDir(qtPluginsDirName); QDir pluginsDir(qtPluginsDirName);
@ -924,35 +977,12 @@ QStringList findQtPlugins(quint64 *usedQtModules, quint64 disabledQtModules,
} }
const QStringList plugins = findSharedLibraries(subDir, platform, debugMatchMode, filter); const QStringList plugins = findSharedLibraries(subDir, platform, debugMatchMode, filter);
for (const QString &plugin : plugins) { for (const QString &plugin : plugins) {
// Filter out disabled plugins const QString pluginPath =
if ((disabledPlugins & QtVirtualKeyboardPlugin) deployPlugin(plugin, subDir, usedQtModules, disabledQtModules,
&& plugin.startsWith("qtvirtualkeyboardplugin"_L1)) { disabledPlugins, libraryLocation, infix, platform);
continue; if (!pluginPath.isEmpty()) {
} if (isPlatformPlugin)
const QString pluginPath = subDir.absoluteFilePath(plugin); *platformPlugin = 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';
}
result.append(pluginPath); result.append(pluginPath);
} }
} // for filter } // for filter