summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2013-11-08 16:03:21 +0100
committerThe Qt Project <gerrit-noreply@qt-project.org>2013-11-11 09:42:34 +0100
commitea2be9ffd6e38b13d4ae9de044cb63de5a86ffde (patch)
tree6b3d0ac24e0aad8886f06f1e2cf33b83eeb6cf0e
parentf0610b8b0811d459bb1a9d6c309c013c7e543f84 (diff)
windeployqt: Move finding shared libraries into a function in utils.
As it is also needed by qmlutils when scanning QML-imports. Change-Id: Ia9952171e4bab60984562eb0db860751fd54f572 Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r--src/windeployqt/main.cpp45
-rw-r--r--src/windeployqt/utils.cpp29
-rw-r--r--src/windeployqt/utils.h1
3 files changed, 39 insertions, 36 deletions
diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp
index d8d4f8bcf..b790f25a0 100644
--- a/src/windeployqt/main.cpp
+++ b/src/windeployqt/main.cpp
@@ -443,50 +443,25 @@ static bool findDependentQtLibraries(const QString &qtBinDir, const QString &bin
// Tries to pre-filter by namefilter and does check via PE.
class DllDirectoryFileEntryFunction {
public:
- explicit DllDirectoryFileEntryFunction(bool debug, const QString &prefix = QLatin1String("*")) :
- m_nameFilter(DllDirectoryFileEntryFunction::nameFilter(debug, prefix)),
- m_dllDebug(debug) {}
+ explicit DllDirectoryFileEntryFunction(Platform platform, bool debug, const QString &prefix = QString()) :
+ m_platform(platform), m_dllDebug(debug), m_prefix(prefix) {}
QStringList operator()(const QDir &dir) const
- {
- QStringList result;
- QString errorMessage;
- foreach (const QString &dll, m_nameFilter(dir)) {
- const QString dllPath = dir.absoluteFilePath(dll);
- bool debugDll;
- if (readPeExecutable(dllPath, &errorMessage, 0, 0, &debugDll)) {
- if (debugDll == m_dllDebug) {
- result.push_back(dll);
- }
- } else {
- std::fprintf(stderr, "Warning: Unable to read %s: %s",
- qPrintable(QDir::toNativeSeparators(dllPath)), qPrintable(errorMessage));
- }
- }
- return result;
- }
+ { return findSharedLibraries(dir, m_platform, m_dllDebug, m_prefix); }
private:
- static QStringList nameFilter(bool debug, const QString &prefix)
- {
- QString result = prefix;
- if (debug)
- result += QLatin1Char('d');
- result += QLatin1String(windowsSharedLibrarySuffix);
- return QStringList(result);
- }
-
- const NameFilterFileEntryFunction m_nameFilter;
+ const Platform m_platform;
const bool m_dllDebug;
+ const QString m_prefix;
};
// File entry filter function for updateFile() that returns a list of files for
// QML import trees: DLLs (matching debgug) and .qml/,js, etc.
class QmlDirectoryFileEntryFunction {
public:
- explicit QmlDirectoryFileEntryFunction(bool debug)
+ explicit QmlDirectoryFileEntryFunction(Platform platform, bool debug)
: m_qmlNameFilter(QStringList() << QStringLiteral("*.js") << QStringLiteral("qmldir") << QStringLiteral("*.qmltypes") << QStringLiteral("*.png"))
- , m_dllFilter(debug)
+ , m_dllFilter(platform, debug)
{}
QStringList operator()(const QDir &dir) const { return m_dllFilter(dir) + m_qmlNameFilter(dir); }
@@ -552,9 +527,7 @@ QStringList findQtPlugins(unsigned usedQtModules,
} else {
filter = QLatin1String("*");
}
- const QStringList plugins = (platform & WindowsBased) ?
- DllDirectoryFileEntryFunction(debug, filter)(subDir) :
- NameFilterFileEntryFunction(QStringList(filter + sharedLibrarySuffix(platform)))(subDir);
+ const QStringList plugins = findSharedLibraries(subDir, platform ,debug, filter);
foreach (const QString &plugin, plugins) {
const QString pluginPath = subDir.absoluteFilePath(plugin);
if (isPlatformPlugin)
@@ -816,7 +789,7 @@ static DeployResult deploy(const Options &options,
const bool usesQuick2 = (result.directlyUsedQtLibraries & QtQuickModule)
|| (options.additionalLibraries & QtQuickModule);
if (options.quickImports && (usesQuick1 || usesQuick2)) {
- const QmlDirectoryFileEntryFunction qmlFileEntryFunction(isDebug);
+ const QmlDirectoryFileEntryFunction qmlFileEntryFunction(options.platform, isDebug);
if (usesQuick2) {
const QString quick2ImportPath = qmakeVariables.value(QStringLiteral("QT_INSTALL_QML"));
QStringList quick2Imports;
diff --git a/src/windeployqt/utils.cpp b/src/windeployqt/utils.cpp
index c054fa7ff..51deba980 100644
--- a/src/windeployqt/utils.cpp
+++ b/src/windeployqt/utils.cpp
@@ -111,6 +111,35 @@ bool createDirectory(const QString &directory, QString *errorMessage)
return true;
}
+// Find shared libraries matching debug/Platform in a directory, return relative names.
+QStringList findSharedLibraries(const QDir &directory, Platform platform, bool debug, const QString &prefix)
+{
+ QString nameFilter = prefix;
+ if (nameFilter.isEmpty())
+ nameFilter += QLatin1Char('*');
+ if (debug && (platform & WindowsBased))
+ nameFilter += QLatin1Char('d');
+ nameFilter += sharedLibrarySuffix(platform);
+ QStringList result;
+ QString errorMessage;
+ foreach (const QString &dll, directory.entryList(QStringList(nameFilter), QDir::Files)) {
+ const QString dllPath = directory.absoluteFilePath(dll);
+ bool matches = true;
+ if (platform & WindowsBased) {
+ bool debugDll;
+ if (readPeExecutable(dllPath, &errorMessage, 0, 0, &debugDll)) {
+ matches = debugDll == debug;
+ } else {
+ std::fprintf(stderr, "Warning: Unable to read %s: %s",
+ qPrintable(QDir::toNativeSeparators(dllPath)), qPrintable(errorMessage));
+ }
+ } // Windows
+ if (matches)
+ result += dll;
+ } // for
+ return result;
+}
+
#ifdef Q_OS_WIN
QString winErrorMessage(unsigned long error)
{
diff --git a/src/windeployqt/utils.h b/src/windeployqt/utils.h
index 5f789c6d3..da951233e 100644
--- a/src/windeployqt/utils.h
+++ b/src/windeployqt/utils.h
@@ -111,6 +111,7 @@ bool createDirectory(const QString &directory, QString *errorMessage);
QString findInPath(const QString &file);
QMap<QString, QString> queryQMakeAll(QString *errorMessage);
QString queryQMake(const QString &variable, QString *errorMessage);
+QStringList findSharedLibraries(const QDir &directory, Platform platform, bool debug, const QString &prefix = QString());
bool updateFile(const QString &sourceFileName, const QStringList &nameFilters,
const QString &targetDirectory, JsonOutput *json, QString *errorMessage);