Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
8
static
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
;
24
return
(hasDebugDlls ?
PluginDetection
::
DebugOnly
:
PluginDetection
::
ReleaseOnly
);
25
}
else
{
26
return
PluginDetection
::
DebugAndRelease
;
27
}
28
}
29
30
static
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
67
bool
PluginInformation
::
isTypeForPlugin
(
const
QString &type,
const
QString &plugin)
const
68
{
69
return
m_pluginMap.at(plugin) == type;
70
}
71
72
void
PluginInformation
::
populatePluginToType
(
const
QDir &pluginDir,
const
QStringList &plugins)
73
{
74
for
(
const
QString &plugin : plugins)
75
m_pluginMap.insert({ plugin, pluginDir.dirName() });
76
}
77
78
void
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
}
PluginInformation
Definition
qtplugininfo.h:30
PluginInformation::generateAvailablePlugins
void generateAvailablePlugins(const QMap< QString, QString > &qtPathsVariables, const Platform &platform)
Definition
qtplugininfo.cpp:78
PluginInformation::populatePluginToType
void populatePluginToType(const QDir &pluginDir, const QStringList &plugins)
Definition
qtplugininfo.cpp:72
PluginInformation::isTypeForPlugin
bool isTypeForPlugin(const QString &type, const QString &plugin) const
Definition
qtplugininfo.cpp:67
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
determinePluginLibrary
static PluginDetection determinePluginLibrary(const QDir &platformPluginDir, const QString &infix)
Definition
qtplugininfo.cpp:8
findPluginNames
static QStringList findPluginNames(const QDir &pluginDir, const PluginDetection libraryType, const Platform &platform)
Definition
qtplugininfo.cpp:30
qmakeInfixKey
const char * qmakeInfixKey
Definition
utils.cpp:192
PluginDetection
PluginDetection
Definition
qtplugininfo.h:15
PluginDetection::DebugOnly
@ DebugOnly
Definition
qtplugininfo.h:16
PluginDetection::ReleaseOnly
@ ReleaseOnly
Definition
qtplugininfo.h:17
PluginDetection::DebugAndRelease
@ DebugAndRelease
Definition
qtplugininfo.h:18
qtbase
src
tools
windeployqt
qtplugininfo.cpp
Generated on
for Qt by
1.18.0