windeployqt: Deploy Qt dependencies of local non Qt dependencies
Before this patch we ignored every non Qt dependency we encountered while scannig the binaries. That led to missing Qt dependencies for more complex setups. With this patch we also take "local non Qt dependencies" into consideration. One example would be: - A developer has a project that consists of an executable and a dll, where both are built/copied into the same folder before deployment - The dll has different/additional Qt dependencies The old approach just ignored these additional Qt dependencies. The new approach checks for these local dependencies and finds the dll in the same folder as the executable. In this case windeployqt will now also scan this dll (and other local dlls) for Qt dependencies and deploy these as well as their plugins. [ChangeLog][Tools][Windeployqt] windeployqt now takes local non Qt dependencies into consideration during deployment. Fixes: QTBUG-135079 Pick-to: 6.8 Change-Id: Ia916dea78c6a5707ccecb61d996a0b7490215798 Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io> (cherry picked from commit 5ce44934b3cf07f4bfbf006bb4666cd481577c2c) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
parent
189d5ebbda
commit
95f659aeda
@ -806,8 +806,9 @@ static inline bool isQtModule(const QString &libName)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Helper for recursively finding all dependent Qt libraries.
|
// Helper for recursively finding all dependent Qt libraries.
|
||||||
static bool findDependentQtLibraries(const QString &qtBinDir, const QString &binary, Platform platform,
|
static bool findDependentQtLibraries(const QString &qtBinDir, const QString &binary,
|
||||||
QString *errorMessage, QStringList *result,
|
Platform platform, QString *errorMessage,
|
||||||
|
QStringList *qtDependencies, QStringList *nonQtDependencies,
|
||||||
unsigned *wordSize = nullptr, bool *isDebug = nullptr,
|
unsigned *wordSize = nullptr, bool *isDebug = nullptr,
|
||||||
unsigned short *machineArch = nullptr,
|
unsigned short *machineArch = nullptr,
|
||||||
int *directDependencyCount = nullptr, int recursionDepth = 0)
|
int *directDependencyCount = nullptr, int recursionDepth = 0)
|
||||||
@ -823,20 +824,23 @@ static bool findDependentQtLibraries(const QString &qtBinDir, const QString &bin
|
|||||||
}
|
}
|
||||||
// Filter out the Qt libraries. Note that depends.exe finds libs from optDirectory if we
|
// Filter out the Qt libraries. Note that depends.exe finds libs from optDirectory if we
|
||||||
// are run the 2nd time (updating). We want to check against the Qt bin dir libraries
|
// are run the 2nd time (updating). We want to check against the Qt bin dir libraries
|
||||||
const int start = result->size();
|
const int start = qtDependencies->size();
|
||||||
for (const QString &lib : std::as_const(dependentLibs)) {
|
for (const QString &lib : std::as_const(dependentLibs)) {
|
||||||
if (isQtModule(lib)) {
|
if (isQtModule(lib)) {
|
||||||
const QString path = normalizeFileName(qtBinDir + u'/' + QFileInfo(lib).fileName());
|
const QString path = normalizeFileName(qtBinDir + u'/' + QFileInfo(lib).fileName());
|
||||||
if (!result->contains(path))
|
if (!qtDependencies->contains(path))
|
||||||
result->append(path);
|
qtDependencies->append(path);
|
||||||
|
} else if (nonQtDependencies && !nonQtDependencies->contains(lib)) {
|
||||||
|
nonQtDependencies->append(lib);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const int end = result->size();
|
const int end = qtDependencies->size();
|
||||||
if (directDependencyCount)
|
if (directDependencyCount)
|
||||||
*directDependencyCount = end - start;
|
*directDependencyCount = end - start;
|
||||||
// Recurse
|
// Recurse
|
||||||
for (int i = start; i < end; ++i)
|
for (int i = start; i < end; ++i)
|
||||||
if (!findDependentQtLibraries(qtBinDir, result->at(i), platform, errorMessage, result,
|
if (!findDependentQtLibraries(qtBinDir, qtDependencies->at(i), platform, errorMessage,
|
||||||
|
qtDependencies, nonQtDependencies,
|
||||||
nullptr, nullptr, nullptr, nullptr, recursionDepth + 1))
|
nullptr, nullptr, nullptr, nullptr, recursionDepth + 1))
|
||||||
return false;
|
return false;
|
||||||
return true;
|
return true;
|
||||||
@ -1030,7 +1034,7 @@ static QString deployPlugin(const QString &plugin, const QDir &subDir, const boo
|
|||||||
QStringList dependentQtLibs;
|
QStringList dependentQtLibs;
|
||||||
QString errorMessage;
|
QString errorMessage;
|
||||||
if (findDependentQtLibraries(libraryLocation, pluginPath, platform,
|
if (findDependentQtLibraries(libraryLocation, pluginPath, platform,
|
||||||
&errorMessage, &dependentQtLibs)) {
|
&errorMessage, &dependentQtLibs, nullptr)) {
|
||||||
for (int d = 0; d < dependentQtLibs.size(); ++d) {
|
for (int d = 0; d < dependentQtLibs.size(); ++d) {
|
||||||
const qint64 module = qtModule(dependentQtLibs.at(d), infix);
|
const qint64 module = qtModule(dependentQtLibs.at(d), infix);
|
||||||
if (module >= 0)
|
if (module >= 0)
|
||||||
@ -1474,17 +1478,37 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString>
|
|||||||
std::wcout << "Qt binaries in " << QDir::toNativeSeparators(qtBinDir) << '\n';
|
std::wcout << "Qt binaries in " << QDir::toNativeSeparators(qtBinDir) << '\n';
|
||||||
|
|
||||||
QStringList dependentQtLibs;
|
QStringList dependentQtLibs;
|
||||||
|
QStringList dependentNonQtLibs;
|
||||||
bool detectedDebug;
|
bool detectedDebug;
|
||||||
unsigned wordSize;
|
unsigned wordSize;
|
||||||
unsigned short machineArch;
|
unsigned short machineArch;
|
||||||
int directDependencyCount = 0;
|
int directDependencyCount = 0;
|
||||||
if (!findDependentQtLibraries(libraryLocation, options.binaries.first(), options.platform, errorMessage, &dependentQtLibs, &wordSize,
|
if (!findDependentQtLibraries(libraryLocation, options.binaries.first(), options.platform,
|
||||||
|
errorMessage, &dependentQtLibs, &dependentNonQtLibs, &wordSize,
|
||||||
&detectedDebug, &machineArch, &directDependencyCount)) {
|
&detectedDebug, &machineArch, &directDependencyCount)) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
for (int b = 1; b < options.binaries.size(); ++b) {
|
for (int b = 1; b < options.binaries.size(); ++b) {
|
||||||
if (!findDependentQtLibraries(libraryLocation, options.binaries.at(b), options.platform, errorMessage, &dependentQtLibs,
|
if (!findDependentQtLibraries(libraryLocation, options.binaries.at(b), options.platform,
|
||||||
nullptr, nullptr, nullptr)) {
|
errorMessage, &dependentQtLibs, &dependentNonQtLibs,
|
||||||
|
nullptr, nullptr, nullptr, nullptr)) {
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Also check Qt dependencies of "local non Qt dependencies" (dlls located in the same folder)
|
||||||
|
for (const QString &nonQtLib : dependentNonQtLibs) {
|
||||||
|
const QFileInfo fi(options.binaries.first());
|
||||||
|
const QString path = fi.canonicalPath() + u'/' + nonQtLib;
|
||||||
|
if (!QFileInfo::exists(path))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (optVerboseLevel)
|
||||||
|
std::wcout << "Adding local dependency" << path << '\n';
|
||||||
|
|
||||||
|
if (!findDependentQtLibraries(libraryLocation, path, options.platform,
|
||||||
|
errorMessage, &dependentQtLibs, &dependentNonQtLibs,
|
||||||
|
nullptr, nullptr, nullptr, nullptr)) {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1603,7 +1627,7 @@ static DeployResult deploy(const Options &options, const QMap<QString, QString>
|
|||||||
qmlScanResult.append(scanResult);
|
qmlScanResult.append(scanResult);
|
||||||
// Additional dependencies of QML plugins.
|
// Additional dependencies of QML plugins.
|
||||||
for (const QString &plugin : std::as_const(qmlScanResult.plugins)) {
|
for (const QString &plugin : std::as_const(qmlScanResult.plugins)) {
|
||||||
if (!findDependentQtLibraries(libraryLocation, plugin, options.platform, errorMessage, &dependentQtLibs, &wordSize, &detectedDebug, &machineArch))
|
if (!findDependentQtLibraries(libraryLocation, plugin, options.platform, errorMessage, &dependentQtLibs, nullptr, &wordSize, &detectedDebug, &machineArch))
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
if (optVerboseLevel >= 1) {
|
if (optVerboseLevel >= 1) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user