diff options
author | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2013-05-16 12:38:21 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@digia.com> | 2013-05-16 15:48:43 +0200 |
commit | 3dc3bf9a78140a6b4b91297f6a26cb0eb29c19fc (patch) | |
tree | 34e6b8490ba0b18c8798a62223975c265f2e5a09 | |
parent | edd64c781d653b76451b2815c92c26dda33d435c (diff) | |
download | qttools-3dc3bf9a78140a6b4b91297f6a26cb0eb29c19fc.tar.gz |
windeployqt: Query qmake once and store in map.
Change-Id: I4bb93404e4ceb97ce5b1a8c9979e06460bdeabda
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r-- | src/windeployqt/main.cpp | 9 | ||||
-rw-r--r-- | src/windeployqt/utils.cpp | 31 | ||||
-rw-r--r-- | src/windeployqt/utils.h | 2 |
3 files changed, 38 insertions, 4 deletions
diff --git a/src/windeployqt/main.cpp b/src/windeployqt/main.cpp index eecf64d5e..dcfe8b2d1 100644 --- a/src/windeployqt/main.cpp +++ b/src/windeployqt/main.cpp @@ -174,14 +174,15 @@ int main(int argc, char **argv) return 1; } QString errorMessage; - const QString qtBinDir = queryQMake(QStringLiteral("QT_INSTALL_BINS"), &errorMessage); - if (qtBinDir.isEmpty()) { - std::fprintf(stderr, "Unable to find Qt bin directory: %s\n", qPrintable(errorMessage)); + const QMap<QString, QString> qmakeVariables = queryQMakeAll(&errorMessage); + const QString qtBinDir = qmakeVariables.value(QStringLiteral("QT_INSTALL_BINS")); + if (qmakeVariables.isEmpty() || qtBinDir.isEmpty()) { + std::fprintf(stderr, "Unable to query qmake: %s\n", qPrintable(errorMessage)); return 1; } - QString xSpec = queryQMake(QStringLiteral("QMAKE_XSPEC"), &errorMessage); + const QString xSpec = qmakeVariables.value(QStringLiteral("QMAKE_XSPEC")); if (xSpec.startsWith(QLatin1String("winrt")) || xSpec.startsWith(QLatin1String("winphone"))) platform = WinRt; else diff --git a/src/windeployqt/utils.cpp b/src/windeployqt/utils.cpp index 8444c08c0..2ab3128b1 100644 --- a/src/windeployqt/utils.cpp +++ b/src/windeployqt/utils.cpp @@ -221,6 +221,37 @@ bool runProcess(const QString &commandLine, const QString &workingDirectory, return true; } +QMap<QString, QString> queryQMakeAll(QString *errorMessage) +{ + QByteArray stdOut; + QByteArray stdErr; + unsigned long exitCode = 0; + const QString commandLine = QStringLiteral("qmake.exe -query"); + if (!runProcess(commandLine, QString(), &exitCode, &stdOut, &stdErr, errorMessage)) + return QMap<QString, QString>(); + if (exitCode) { + *errorMessage = commandLine + QStringLiteral(" returns ") + QString::number(exitCode) + + QStringLiteral(": ") + QString::fromLocal8Bit(stdErr); + return QMap<QString, QString>(); + } + const QString output = QString::fromLocal8Bit(stdOut).trimmed(); + QMap<QString, QString> result; + int pos = 0; + while (true) { + const int colonPos = output.indexOf(QLatin1Char(':'), pos); + if (colonPos < 0) + break; + const int endPos = output.indexOf(QLatin1Char('\n'), colonPos + 1); + if (endPos < 0) + break; + const QString key = output.mid(pos, colonPos - pos); + const QString value = output.mid(colonPos + 1, endPos - colonPos - 2); // Skip '\r' + result.insert(key, value); + pos = endPos + 1; + } + return result; +} + QString queryQMake(const QString &variable, QString *errorMessage) { QByteArray stdOut; diff --git a/src/windeployqt/utils.h b/src/windeployqt/utils.h index 5ff2c5cf5..1a0532e17 100644 --- a/src/windeployqt/utils.h +++ b/src/windeployqt/utils.h @@ -43,6 +43,7 @@ #define UTILS_H #include <QString> +#include <QMap> QT_FORWARD_DECLARE_CLASS(QStringList) @@ -51,6 +52,7 @@ enum Platform { Windows, WinRt }; QString findInPath(const QString &file); QString normalizeFileName(const QString &name); QString findSdkTool(const QString &tool); +QMap<QString, QString> queryQMakeAll(QString *errorMessage); QString queryQMake(const QString &variable, QString *errorMessage); QStringList findDependentLibs(const QString &binary, QString *errorMessage); |