Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qtplugininfo.cpp
Go to the documentation of this file.
1// Copyright (C) 2023 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
3
4#include "qtplugininfo.h"
5
6#include <QDir>
7
8static PluginDetection determinePluginLibrary(const QDir &platformPluginDir, const QString &infix)
9{
10 // Use the platform plugin to determine which dlls are there (release/debug/both)
11 QString platformReleaseFilter(QStringLiteral("qwindows"));
12 if (!infix.isEmpty())
13 platformReleaseFilter += infix;
14 QString platformFilter = platformReleaseFilter + u'*';
15 platformFilter += sharedLibrarySuffix();
16
17 const QFileInfoList &dlls =
18 platformPluginDir.entryInfoList(QStringList(platformFilter), QDir::Files);
19 if (dlls.size() == 1) {
20 const QFileInfo dllFi = dlls.first();
21 const bool hasDebugDlls =
22 dllFi.fileName() == QString(platformReleaseFilter + sharedLibrarySuffix()) ? false
23 : true;
25 } else {
27 }
28}
29
30static QStringList findPluginNames(const QDir &pluginDir, const PluginDetection libraryType,
31 const Platform &platform)
32{
33 QString errorMessage{};
34 QStringList result{};
35 QString filter{};
36 filter += u"*";
37 filter += sharedLibrarySuffix();
38
39 const QFileInfoList &dlls =
40 pluginDir.entryInfoList(QStringList(filter), QDir::Files, QDir::Name);
41
42 for (const QFileInfo &dllFi : dlls) {
43 QString plugin = dllFi.fileName();
44 const int dotIndex = plugin.lastIndexOf(u'.');
45 // We don't need the .dll for the name
46 plugin = plugin.first(dotIndex);
47
48 if (libraryType == PluginDetection::DebugAndRelease) {
49 PeHeaderInfoStruct info;
50 if (!readPeExecutableInfo(dllFi.absoluteFilePath(), &errorMessage, &info)) {
51 std::wcerr << "Warning: Unable to read "
52 << QDir::toNativeSeparators(dllFi.absoluteFilePath()) << ": "
53 << errorMessage;
54 }
55 if (info.isDebug && platformHasDebugSuffix(platform))
56 plugin.removeLast();
57 }
58 else if (libraryType == PluginDetection::DebugOnly)
59 plugin.removeLast();
60
61 if (!result.contains(plugin))
62 result.append(plugin);
63 }
64 return result;
65}
66
67bool PluginInformation::isTypeForPlugin(const QString &type, const QString &plugin) const
68{
69 return m_pluginMap.at(plugin) == type;
70}
71
72void PluginInformation::populatePluginToType(const QDir &pluginDir, const QStringList &plugins)
73{
74 for (const QString &plugin : plugins)
75 m_pluginMap.insert({ plugin, pluginDir.dirName() });
76}
77
78void PluginInformation::generateAvailablePlugins(const QMap<QString, QString> &qtPathsVariables,
79 const Platform &platform)
80{
81 const QDir pluginTypesDir(qtPathsVariables.value(QLatin1String("QT_INSTALL_PLUGINS")));
82 const QDir platformPluginDir(pluginTypesDir.absolutePath() + QStringLiteral("/platforms"));
83 const QString infix(qtPathsVariables.value(QLatin1String(qmakeInfixKey)));
84 const PluginDetection debugDetection = determinePluginLibrary(platformPluginDir, infix);
85
86 const QFileInfoList &pluginTypes =
87 pluginTypesDir.entryInfoList(QDir::Dirs | QDir::NoDotAndDotDot);
88 for (const QFileInfo &pluginType : pluginTypes) {
89 const QString pluginTypeName = pluginType.baseName();
90 m_typeMap.insert({ pluginTypeName, QStringList{} });
91 const QStringList plugins =
92 findPluginNames(pluginType.absoluteFilePath(), debugDetection, platform);
93 m_typeMap.at(pluginTypeName) = plugins;
94 populatePluginToType(pluginTypeName, plugins);
95 }
96 if (!m_typeMap.size() || !m_pluginMap.size())
97 std::wcerr << "Warning: could not parse available plugins properly, plugin "
98 "inclusion/exclusion options will not work\n";
99}
void generateAvailablePlugins(const QMap< QString, QString > &qtPathsVariables, const Platform &platform)
void populatePluginToType(const QDir &pluginDir, const QStringList &plugins)
bool isTypeForPlugin(const QString &type, const QString &plugin) const
static PluginDetection determinePluginLibrary(const QDir &platformPluginDir, const QString &infix)
static QStringList findPluginNames(const QDir &pluginDir, const PluginDetection libraryType, const Platform &platform)
PluginDetection
const char * qmakeInfixKey
Definition utils.cpp:192