From: Friedemann Kleint Date: Fri, 8 Nov 2013 15:03:21 +0000 (+0100) Subject: windeployqt: Move finding shared libraries into a function in utils. X-Git-Tag: accepted/tizen/20131212.181521~16 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=ea2be9ffd6e38b13d4ae9de044cb63de5a86ffde;p=platform%2Fupstream%2Fqttools.git 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 --- diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp index d8d4f8b..b790f25 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 c054fa7..51deba9 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 5f789c6..da95123 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 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);