diff options
author | Sune Vuorela <sune@vuorela.dk> | 2014-10-16 13:52:28 +0200 |
---|---|---|
committer | Orgad Shaneh <orgads@gmail.com> | 2015-04-24 11:35:06 +0000 |
commit | 7b0c8b160a0e15edc40504a65a4f3fca52308153 (patch) | |
tree | 58474024034bea43597f2ee771a5065e75033a0b /src/plugins/qtsupport/qtversionmanager.cpp | |
parent | 7bc1af275d66f4615296463cdbaaaa9234baca58 (diff) |
Gather Qt versions from qtchooser on first run
Change-Id: I33ae062c3225fb3d7b7d1a62e0e287d326bb4276
Reviewed-by: Orgad Shaneh <orgads@gmail.com>
Reviewed-by: Adam Majer <adamm@zombino.com>
Reviewed-by: Daniel Teske <daniel.teske@theqtcompany.com>
Diffstat (limited to 'src/plugins/qtsupport/qtversionmanager.cpp')
-rw-r--r-- | src/plugins/qtsupport/qtversionmanager.cpp | 67 |
1 files changed, 59 insertions, 8 deletions
diff --git a/src/plugins/qtsupport/qtversionmanager.cpp b/src/plugins/qtsupport/qtversionmanager.cpp index f4daf2a5e14..7298eb319e8 100644 --- a/src/plugins/qtsupport/qtversionmanager.cpp +++ b/src/plugins/qtsupport/qtversionmanager.cpp @@ -54,6 +54,7 @@ #include <QDir> #include <QFile> #include <QSettings> +#include <QStandardPaths> #include <QTextStream> #include <QStringList> #include <QTimer> @@ -397,17 +398,67 @@ static void saveQtVersions() m_writer->save(data, Core::ICore::mainWindow()); } +// Executes qtchooser with arguments in a process and returns its output +static QList<QByteArray> runQtChooser(const QString &qtchooser, const QStringList &arguments) +{ + QProcess p; + p.start(qtchooser, arguments); + p.waitForFinished(); + const bool success = p.exitCode() == 0; + return success ? p.readAllStandardOutput().split('\n') : QList<QByteArray>(); +} + +// Asks qtchooser for the qmake path of a given version +static QString qmakePath(const QString &qtchooser, const QString &version) +{ + QList<QByteArray> outputs = runQtChooser(qtchooser, QStringList() + << QStringLiteral("-qt=%1").arg(version) + << QStringLiteral("-print-env")); + foreach (const QByteArray &output, outputs) { + if (output.startsWith("QTTOOLDIR=\"")) { + QByteArray withoutVarName = output.mid(11); // remove QTTOOLDIR=" + withoutVarName.chop(1); // remove trailing quote + return QStandardPaths::findExecutable(QStringLiteral("qmake"), QStringList() + << QString::fromLocal8Bit(withoutVarName)); + } + } + return QString(); +} + +static FileNameList gatherQmakePathsFromQtChooser() +{ + const QString qtchooser = QStandardPaths::findExecutable(QStringLiteral("qtchooser")); + if (qtchooser.isEmpty()) + return FileNameList(); + + QList<QByteArray> versions = runQtChooser(qtchooser, QStringList() << QStringLiteral("-l")); + QSet<FileName> foundQMakes; + foreach (const QByteArray &version, versions) { + FileName possibleQMake = FileName::fromString( + qmakePath(qtchooser, QString::fromLocal8Bit(version))); + if (!possibleQMake.isEmpty()) + foundQMakes << possibleQMake; + } + return foundQMakes.toList(); +} + static void findSystemQt() { + FileNameList systemQMakes; FileName systemQMakePath = BuildableHelperLibrary::findSystemQt(Environment::systemEnvironment()); - if (systemQMakePath.isNull()) - return; - - BaseQtVersion *version - = QtVersionFactory::createQtVersionFromQMakePath(systemQMakePath, false, QLatin1String("PATH")); - if (version) { - version->setUnexpandedDisplayName(BaseQtVersion::defaultUnexpandedDisplayName(systemQMakePath, true)); - m_versions.insert(version->uniqueId(), version); + if (!systemQMakePath.isEmpty()) + systemQMakes << systemQMakePath; + + systemQMakes.append(gatherQmakePathsFromQtChooser()); + systemQMakes.removeDuplicates(); + + foreach (const FileName &qmakePath, systemQMakes) { + BaseQtVersion *version + = QtVersionFactory::createQtVersionFromQMakePath(qmakePath, false, QLatin1String("PATH")); + if (version) { + version->setUnexpandedDisplayName(BaseQtVersion::defaultUnexpandedDisplayName(qmakePath, true)); + m_versions.insert(version->uniqueId(), version); + } } } |