summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@digia.com>2013-05-16 12:38:21 +0200
committerFriedemann Kleint <Friedemann.Kleint@digia.com>2013-05-16 15:48:43 +0200
commit3dc3bf9a78140a6b4b91297f6a26cb0eb29c19fc (patch)
tree34e6b8490ba0b18c8798a62223975c265f2e5a09
parentedd64c781d653b76451b2815c92c26dda33d435c (diff)
downloadqttools-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.cpp9
-rw-r--r--src/windeployqt/utils.cpp31
-rw-r--r--src/windeployqt/utils.h2
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);