Revert "QtSupport: Add support to register Qt versions via qtpaths"

The patch breaks several plugin unit tests; at the very least QtSupport,
AutoTest and ClangCodeModel.

This reverts commit 72aa77ced7.

Change-Id: Iaa7f452d0f43d0072b0bbcf8934fa0dcd6f9b240
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
Christian Kandeler
2022-06-01 14:18:50 +02:00
parent c926ca2321
commit 958531adbf
28 changed files with 266 additions and 337 deletions

View File

@@ -32121,16 +32121,16 @@ Spustil jste Qemu?</translation>
<translation>Qt %1 (%2)</translation> <translation>Qt %1 (%2)</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>Soubor %1 neexistuje nebo není spustitelný</translation> <translation>Soubor qmake neexistuje nebo není spustitelný</translation>
</message> </message>
<message> <message>
<source>Qt version is not properly installed, please run make install</source> <source>Qt version is not properly installed, please run make install</source>
<translation>Verze Qt není správně nainstalována. Proveďte, prosím, příkaz &quot;make install&quot;</translation> <translation>Verze Qt není správně nainstalována. Proveďte, prosím, příkaz &quot;make install&quot;</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Cestu ke spustitelným souborům instalace Qt se nepodařilo určit. Možná je cesta k %1 chybná?</translation> <translation>Cestu ke spustitelným souborům instalace Qt se nepodařilo určit. Možná je cesta k qmake chybná?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -35382,16 +35382,16 @@ For flere detaljer, se /etc/sysctl.d/10-ptrace.conf
<translation>Ingen qmake-sti sat</translation> <translation>Ingen qmake-sti sat</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 findes ikke eller er ikke eksekverbar</translation> <translation>qmake findes ikke eller er ikke eksekverbar</translation>
</message> </message>
<message> <message>
<source>Qt version is not properly installed, please run make install</source> <source>Qt version is not properly installed, please run make install</source>
<translation>Qt version er ikke ordentligt installeret, kør venligst make install</translation> <translation>Qt version er ikke ordentligt installeret, kør venligst make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Kunne ikke beslutte stien til binærene af Qt installationen, måske er %1-stien forkert?</translation> <translation>Kunne ikke beslutte stien til binærene af Qt installationen, måske er qmake-stien forkert?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -10113,8 +10113,8 @@ Dies ist unabhängig vom Wert der Eigenschaft &quot;visible&quot; in QML.</trans
<translation>Es ist keine qmake-Pfad gesetzt</translation> <translation>Es ist keine qmake-Pfad gesetzt</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>Die %1-Datei existiert nicht oder ist nicht ausführbar</translation> <translation>Die qmake-Datei existiert nicht oder ist nicht ausführbar</translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -10141,8 +10141,8 @@ Dies ist unabhängig vom Wert der Eigenschaft &quot;visible&quot; in QML.</trans
<translation>Die Qt-Version ist nicht richtig installiert, führen Sie bitte make install aus</translation> <translation>Die Qt-Version ist nicht richtig installiert, führen Sie bitte make install aus</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Der Pfad zu den ausführbaren Dateien der Qt-Installation konnte nicht bestimmt werden, möglicherweise ist der Pfad zu %1 falsch?</translation> <translation>Der Pfad zu den ausführbaren Dateien der Qt-Installation konnte nicht bestimmt werden, möglicherweise ist der Pfad zu qmake falsch?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -33604,8 +33604,8 @@ Nous allons essayer de travailler avec cela mais vous pourrez rencontrer des pro
<translation>Chemin de qmake non spécifié</translation> <translation>Chemin de qmake non spécifié</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 n&apos;existe pas ou n&apos;est pas exécutable</translation> <translation>qmake n&apos;existe pas ou n&apos;est pas exécutable</translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -33633,8 +33633,8 @@ Nous allons essayer de travailler avec cela mais vous pourrez rencontrer des pro
<translation>La version de Qt n&apos;est pas correctement installée, veuillez exécuter make install</translation> <translation>La version de Qt n&apos;est pas correctement installée, veuillez exécuter make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Impossible de déterminer le chemin vers les programmes de Qt, peut-être que le chemin vers %1 est faux ?</translation> <translation>Impossible de déterminer le chemin vers les programmes de Qt, peut-être que le chemin vers qmake est faux ?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -41628,7 +41628,7 @@ Saving failed.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
@@ -41636,7 +41636,7 @@ Saving failed.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>

View File

@@ -26108,16 +26108,16 @@ Do you want to save the data first?</source>
<translation>qmake </translation> <translation>qmake </translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 </translation> <translation>qmake </translation>
</message> </message>
<message> <message>
<source>Qt version is not properly installed, please run make install</source> <source>Qt version is not properly installed, please run make install</source>
<translation>Qt make install </translation> <translation>Qt make install </translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Qt %1 </translation> <translation>Qt qmake </translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -12382,8 +12382,8 @@ Dla projektów CMake, upewnij się, że zmienna QML_IMPORT_PATH jest obecna w CM
<translation>Nie ustawiono ścieżki do qmake</translation> <translation>Nie ustawiono ścieżki do qmake</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>Brak %1 lub nie jest on plikiem wykonywalnym</translation> <translation>Brak qmake lub nie jest on plikiem wykonywalnym</translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -12410,8 +12410,8 @@ Dla projektów CMake, upewnij się, że zmienna QML_IMPORT_PATH jest obecna w CM
<translation>Wersja Qt zainstalowana niepoprawnie, uruchom komendę: make install</translation> <translation>Wersja Qt zainstalowana niepoprawnie, uruchom komendę: make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Nie można określić ścieżki do plików binarnych instalacji Qt. Sprawdź ścieżkę do %1.</translation> <translation>Nie można określić ścieżki do plików binarnych instalacji Qt. Sprawdź ścieżkę do qmake.</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -45319,8 +45319,8 @@ For more details, see /etc/sysctl.d/10-ptrace.conf
<translation>Путь к qmake не указан</translation> <translation>Путь к qmake не указан</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 отсутствует или не запускается</translation> <translation>qmake отсутствует или не запускается</translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -45347,8 +45347,8 @@ For more details, see /etc/sysctl.d/10-ptrace.conf
<translation>Профиль Qt не установлен, пожалуйста выполните make install</translation> <translation>Профиль Qt не установлен, пожалуйста выполните make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Не удалось определить путь к утилитам Qt. Может путь к %1 неверен?</translation> <translation>Не удалось определить путь к утилитам Qt. Может путь к qmake неверен?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -21803,8 +21803,8 @@ Projekte programov QML izvede pregledovalnik QML in jih ni potrebno zgraditi.</t
</message> </message>
<message> <message>
<location line="+58"/> <location line="+58"/>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>Datoteka »%1« ne obstaja ali pa ni izvršljiva</translation> <translation>Datoteka »qmake« ne obstaja ali pa ni izvršljiva</translation>
</message> </message>
<message> <message>
<location line="+2"/> <location line="+2"/>
@@ -21813,8 +21813,8 @@ Projekte programov QML izvede pregledovalnik QML in jih ni potrebno zgraditi.</t
</message> </message>
<message> <message>
<location line="+2"/> <location line="+2"/>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Ni bilo moč ugotoviti poti do programov namestitve Qt. Morda je pot do %1 napačna?</translation> <translation>Ni bilo moč ugotoviti poti do programov namestitve Qt. Morda je pot do qmake napačna?</translation>
</message> </message>
<message> <message>
<location line="+3"/> <location line="+3"/>

View File

@@ -22711,8 +22711,8 @@ For more details, see /etc/sysctl.d/10-ptrace.conf
<translation>Шлях до qmake не задано</translation> <translation>Шлях до qmake не задано</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 не існує або не є виконуваним модулем</translation> <translation>qmake не існує або не є виконуваним модулем</translation>
</message> </message>
<message> <message>
<source>ABI detection failed: Make sure to use a matching compiler when building.</source> <source>ABI detection failed: Make sure to use a matching compiler when building.</source>
@@ -22763,8 +22763,8 @@ For more details, see /etc/sysctl.d/10-ptrace.conf
<translation>Версія Qt не встановлена як слід, будь ласка, запустіть make install</translation> <translation>Версія Qt не встановлена як слід, будь ласка, запустіть make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Не вдалось визначити шлях до виконуваних модулів встановлення Qt, можливо, шлях до %1 помилковий?</translation> <translation>Не вдалось визначити шлях до виконуваних модулів встановлення Qt, можливо, шлях до qmake помилковий?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -27948,8 +27948,8 @@ Did you start Qemu?</source>
<translation>qmake路径</translation> <translation>qmake路径</translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1</translation> <translation>qmake不存在或者不可执</translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -27976,8 +27976,8 @@ Did you start Qemu?</source>
<translation>Qt没有被正确安装make install</translation> <translation>Qt没有被正确安装make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation>Qt安装的二进制所在的路径%1?</translation> <translation>Qt安装的二进制所在的路径qmake的路径设置出现了错?</translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -15636,8 +15636,8 @@ Requires &lt;b&gt;Qt 4.7.4&lt;/b&gt; or newer.</source>
<translation> qmake </translation> <translation> qmake </translation>
</message> </message>
<message> <message>
<source>%1 does not exist or is not executable</source> <source>qmake does not exist or is not executable</source>
<translation>%1 </translation> <translation>qmake </translation>
</message> </message>
<message> <message>
<source>Qt version has no name</source> <source>Qt version has no name</source>
@@ -15664,8 +15664,8 @@ Requires &lt;b&gt;Qt 4.7.4&lt;/b&gt; or newer.</source>
<translation>Qt make install</translation> <translation>Qt make install</translation>
</message> </message>
<message> <message>
<source>Could not determine the path to the binaries of the Qt installation, maybe the %1 path is wrong?</source> <source>Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?</source>
<translation> Qt %1 </translation> <translation> Qt qmake </translation>
</message> </message>
<message> <message>
<source>The default mkspec symlink is broken.</source> <source>The default mkspec symlink is broken.</source>

View File

@@ -41,61 +41,7 @@ bool BuildableHelperLibrary::isQtChooser(const FilePath &filePath)
return filePath.symLinkTarget().endsWith("/qtchooser"); return filePath.symLinkTarget().endsWith("/qtchooser");
} }
static const QStringList &queryToolNames() FilePath BuildableHelperLibrary::qtChooserToQmakePath(const FilePath &qtChooser)
{
static const QStringList names = {"qmake", "qtpaths"};
return names;
}
static bool isQueryTool(FilePath path)
{
if (path.isEmpty())
return false;
if (BuildableHelperLibrary::isQtChooser(path))
path = BuildableHelperLibrary::qtChooserToQueryToolPath(path.symLinkTarget());
if (!path.exists())
return false;
QtcProcess proc;
proc.setCommand({path, {"-query"}});
proc.runBlocking();
if (proc.result() != ProcessResult::FinishedWithSuccess)
return false;
const QString output = proc.stdOut();
// Exemplary output of "[qmake|qtpaths] -query":
// QT_SYSROOT:...
// QT_INSTALL_PREFIX:...
// [...]
// QT_VERSION:6.4.0
return output.contains("QT_VERSION:");
}
static FilePath findQueryToolInDir(const FilePath &dir)
{
if (dir.isEmpty())
return {};
for (const QString &queryTool : queryToolNames()) {
FilePath queryToolPath = dir.pathAppended(queryTool).withExecutableSuffix();
if (queryToolPath.exists()) {
if (isQueryTool(queryToolPath))
return queryToolPath;
}
// Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order.
const FilePaths candidates = dir.dirEntries(
{BuildableHelperLibrary::possibleQtQueryTools(queryTool), QDir::Files},
QDir::Name | QDir::Reversed);
for (const FilePath &candidate : candidates) {
if (candidate == queryToolPath)
continue;
if (isQueryTool(candidate))
return candidate;
}
}
return {};
}
FilePath BuildableHelperLibrary::qtChooserToQueryToolPath(const FilePath &qtChooser)
{ {
const QString toolDir = QLatin1String("QTTOOLDIR=\""); const QString toolDir = QLatin1String("QTTOOLDIR=\"");
QtcProcess proc; QtcProcess proc;
@@ -105,10 +51,6 @@ FilePath BuildableHelperLibrary::qtChooserToQueryToolPath(const FilePath &qtChoo
if (proc.result() != ProcessResult::FinishedWithSuccess) if (proc.result() != ProcessResult::FinishedWithSuccess)
return {}; return {};
const QString output = proc.stdOut(); const QString output = proc.stdOut();
// Exemplary output of "qtchooser -print-env":
// QT_SELECT="default"
// QTTOOLDIR="/usr/lib/qt5/bin"
// QTLIBDIR="/usr/lib/x86_64-linux-gnu"
int pos = output.indexOf(toolDir); int pos = output.indexOf(toolDir);
if (pos == -1) if (pos == -1)
return {}; return {};
@@ -117,13 +59,44 @@ FilePath BuildableHelperLibrary::qtChooserToQueryToolPath(const FilePath &qtChoo
if (end == -1) if (end == -1)
return {}; return {};
FilePath queryToolPath = qtChooser; FilePath qmake = qtChooser;
for (const QString &queryTool : queryToolNames()) { qmake.setPath(output.mid(pos, end - pos) + "/qmake");
queryToolPath.setPath(output.mid(pos, end - pos) + "/" + queryTool); return qmake;
if (queryToolPath.exists())
return queryToolPath;
} }
return queryToolPath;
static bool isQmake(FilePath path)
{
if (path.isEmpty())
return false;
if (BuildableHelperLibrary::isQtChooser(path))
path = BuildableHelperLibrary::qtChooserToQmakePath(path.symLinkTarget());
if (!path.exists())
return false;
return !BuildableHelperLibrary::qtVersionForQMake(path).isEmpty();
}
static FilePath findQmakeInDir(const FilePath &dir)
{
if (dir.isEmpty())
return {};
FilePath qmakePath = dir.pathAppended("qmake").withExecutableSuffix();
if (qmakePath.exists()) {
if (isQmake(qmakePath))
return qmakePath;
}
// Prefer qmake-qt5 to qmake-qt4 by sorting the filenames in reverse order.
const FilePaths candidates = dir.dirEntries(
{BuildableHelperLibrary::possibleQMakeCommands(), QDir::Files},
QDir::Name | QDir::Reversed);
for (const FilePath &candidate : candidates) {
if (candidate == qmakePath)
continue;
if (isQmake(candidate))
return candidate;
}
return {};
} }
FilePath BuildableHelperLibrary::findSystemQt(const Environment &env) FilePath BuildableHelperLibrary::findSystemQt(const Environment &env)
@@ -134,55 +107,86 @@ FilePath BuildableHelperLibrary::findSystemQt(const Environment &env)
FilePaths BuildableHelperLibrary::findQtsInEnvironment(const Environment &env, int maxCount) FilePaths BuildableHelperLibrary::findQtsInEnvironment(const Environment &env, int maxCount)
{ {
FilePaths queryToolList; FilePaths qmakeList;
std::set<QString> canonicalEnvPaths; std::set<QString> canonicalEnvPaths;
const FilePaths paths = env.path(); const FilePaths paths = env.path();
for (const FilePath &path : paths) { for (const FilePath &path : paths) {
if (!canonicalEnvPaths.insert(path.toFileInfo().canonicalFilePath()).second) if (!canonicalEnvPaths.insert(path.toFileInfo().canonicalFilePath()).second)
continue; continue;
const FilePath queryTool = findQueryToolInDir(path); const FilePath qmake = findQmakeInDir(path);
if (queryTool.isEmpty()) if (qmake.isEmpty())
continue; continue;
queryToolList << queryTool; qmakeList << qmake;
if (maxCount != -1 && queryToolList.size() == maxCount) if (maxCount != -1 && qmakeList.size() == maxCount)
break; break;
} }
return queryToolList; return qmakeList;
} }
QString BuildableHelperLibrary::filterForQtQueryToolsFileDialog() QString BuildableHelperLibrary::qtVersionForQMake(const FilePath &qmakePath)
{ {
QStringList toolFilters; if (qmakePath.isEmpty())
for (const QString &queryTool : queryToolNames()) { return QString();
for (const QString &tool: BuildableHelperLibrary::possibleQtQueryTools(queryTool)) {
QString toolFilter; QtcProcess qmake;
qmake.setTimeoutS(5);
qmake.setCommand({qmakePath, {"--version"}});
qmake.runBlocking();
if (qmake.result() != ProcessResult::FinishedWithSuccess) {
qWarning() << qmake.exitMessage();
return QString();
}
const QString output = qmake.allOutput();
static const QRegularExpression regexp("(QMake version:?)[\\s]*([\\d.]*)",
QRegularExpression::CaseInsensitiveOption);
const QRegularExpressionMatch match = regexp.match(output);
const QString qmakeVersion = match.captured(2);
if (qmakeVersion.startsWith(QLatin1String("2."))
|| qmakeVersion.startsWith(QLatin1String("3."))) {
static const QRegularExpression regexp2("Using Qt version[\\s]*([\\d\\.]*)",
QRegularExpression::CaseInsensitiveOption);
const QRegularExpressionMatch match2 = regexp2.match(output);
const QString version = match2.captured(1);
return version;
}
return QString();
}
QString BuildableHelperLibrary::filterForQmakeFileDialog()
{
QString filter = QLatin1String("qmake (");
const QStringList commands = possibleQMakeCommands();
for (int i = 0; i < commands.size(); ++i) {
if (i)
filter += QLatin1Char(' ');
if (HostOsInfo::isMacHost()) if (HostOsInfo::isMacHost())
// work around QTBUG-7739 that prohibits filters that don't start with * // work around QTBUG-7739 that prohibits filters that don't start with *
toolFilter += QLatin1Char('*'); filter += QLatin1Char('*');
toolFilter += tool; filter += commands.at(i);
if (HostOsInfo::isAnyUnixHost() && !HostOsInfo::isMacHost()) if (HostOsInfo::isAnyUnixHost() && !HostOsInfo::isMacHost())
// kde bug, we need at least one wildcard character // kde bug, we need at least one wildcard character
// see QTCREATORBUG-7771 // see QTCREATORBUG-7771
toolFilter += QLatin1Char('*'); filter += QLatin1Char('*');
toolFilters.append(toolFilter);
} }
} filter += QLatin1Char(')');
return queryToolNames().join(", ") + " (" + toolFilters.join(" ") + ")"; return filter;
} }
QStringList BuildableHelperLibrary::possibleQtQueryTools(const QString &tool)
QStringList BuildableHelperLibrary::possibleQMakeCommands()
{ {
// On Windows it is "<queryTool>.exe" or "<queryTool>.bat" // On Windows it is always "qmake.exe"
// On Unix some distributions renamed qmake with a postfix to avoid clashes // On Unix some distributions renamed qmake with a postfix to avoid clashes
// On OS X, Qt 4 binary packages also has renamed qmake. There are also symbolic links that are // On OS X, Qt 4 binary packages also has renamed qmake. There are also symbolic links that are
// named <tool>, but the file dialog always checks against resolved links (native Cocoa issue) // named "qmake", but the file dialog always checks against resolved links (native Cocoa issue)
QStringList tools(HostOsInfo::withExecutableSuffix(tool + "*")); QStringList commands(HostOsInfo::withExecutableSuffix("qmake*"));
// Qt 6 CMake built targets, such as Android, are dependent on the host installation // Qt 6 CMake built targets, such as Android, are dependent on the host installation
// and use a script wrapper around the host queryTool executable // and use a script wrapper around the host qmake executable
if (HostOsInfo::isWindowsHost()) if (HostOsInfo::isWindowsHost())
tools.append(tool + "*.bat"); commands.append("qmake*.bat");
return tools; return commands;
} }
} // namespace Utils } // namespace Utils

View File

@@ -45,11 +45,12 @@ public:
static FilePath findSystemQt(const Environment &env); static FilePath findSystemQt(const Environment &env);
static FilePaths findQtsInEnvironment(const Environment &env, int maxCount = -1); static FilePaths findQtsInEnvironment(const Environment &env, int maxCount = -1);
static bool isQtChooser(const FilePath &filePath); static bool isQtChooser(const FilePath &filePath);
static FilePath qtChooserToQueryToolPath(const FilePath &path); static FilePath qtChooserToQmakePath(const FilePath &path);
// returns something like qmake4, qmake, qmake-qt4, qtpaths // return true if the qmake at qmakePath is a Qt (used by QtVersion)
// or whatever distributions have chosen (used by QtVersion) static QString qtVersionForQMake(const FilePath &qmakePath);
static QStringList possibleQtQueryTools(const QString &tool); // returns something like qmake4, qmake, qmake-qt4 or whatever distributions have chosen (used by QtVersion)
static QString filterForQtQueryToolsFileDialog(); static QStringList possibleQMakeCommands();
static QString filterForQmakeFileDialog();
}; };
} // Utils } // Utils

View File

@@ -1196,7 +1196,7 @@ Tasks CMakeConfigurationKitAspect::validate(const Kit *k) const
if (!version || !version->isValid()) { if (!version || !version->isValid()) {
addWarning(tr("CMake configuration has a path to a qmake binary set, " addWarning(tr("CMake configuration has a path to a qmake binary set, "
"even though the kit has no valid Qt version.")); "even though the kit has no valid Qt version."));
} else if (qmakePath != version->queryToolFilePath() && isQt4) { } else if (qmakePath != version->qmakeFilePath() && isQt4) {
addWarning(tr("CMake configuration has a path to a qmake binary set " addWarning(tr("CMake configuration has a path to a qmake binary set "
"that does not match the qmake binary path " "that does not match the qmake binary path "
"configured in the Qt version.")); "configured in the Qt version."));

View File

@@ -214,7 +214,7 @@ QtVersions KitDetectorPrivate::autoDetectQtVersions() const
QString error; QString error;
const auto handleQmake = [this, &qtVersions, &error](const FilePath &qmake) { const auto handleQmake = [this, &qtVersions, &error](const FilePath &qmake) {
if (QtVersion *qtVersion = QtVersionFactory::createQtVersionFromQueryToolPath(qmake, if (QtVersion *qtVersion = QtVersionFactory::createQtVersionFromQMakePath(qmake,
false, false,
m_sharedId, m_sharedId,
&error)) { &error)) {
@@ -227,7 +227,7 @@ QtVersions KitDetectorPrivate::autoDetectQtVersions() const
qtVersions.append(qtVersion); qtVersions.append(qtVersion);
QtVersionManager::addVersion(qtVersion); QtVersionManager::addVersion(qtVersion);
emit q->logOutput( emit q->logOutput(
tr("Found \"%1\"").arg(qtVersion->queryToolFilePath().toUserOutput())); tr("Found \"%1\"").arg(qtVersion->qmakeFilePath().toUserOutput()));
} }
} }
} }

View File

@@ -181,7 +181,7 @@ void QbsProfileManager::addProfileFromKit(const ProjectExplorer::Kit *k)
data = provider->properties(k, data); data = provider->properties(k, data);
} }
if (const QtSupport::QtVersion * const qt = QtSupport::QtKitAspect::qtVersion(k)) if (const QtSupport::QtVersion * const qt = QtSupport::QtKitAspect::qtVersion(k))
data.insert("moduleProviders.Qt.qmakeFilePaths", qt->queryToolFilePath().toString()); data.insert("moduleProviders.Qt.qmakeFilePaths", qt->qmakeFilePath().toString());
if (QbsSettings::qbsVersion() < QVersionNumber({1, 20})) { if (QbsSettings::qbsVersion() < QVersionNumber({1, 20})) {
const QString keyPrefix = "profiles." + name + "."; const QString keyPrefix = "profiles." + name + ".";

View File

@@ -745,9 +745,6 @@ Tasks QmakeProject::projectIssues(const Kit *k) const
result.append(createProjectTask(Task::TaskType::Error, tr("Qt version is invalid."))); result.append(createProjectTask(Task::TaskType::Error, tr("Qt version is invalid.")));
if (!ToolChainKitAspect::cxxToolChain(k)) if (!ToolChainKitAspect::cxxToolChain(k))
result.append(createProjectTask(Task::TaskType::Error, tr("No C++ compiler set in kit."))); result.append(createProjectTask(Task::TaskType::Error, tr("No C++ compiler set in kit.")));
if (!qtFromKit->qmakeFilePath().isExecutableFile())
result.append(createProjectTask(Task::TaskType::Error,
tr("Qmake was not found or is not executable.")));
// A project can be considered part of more than one Qt version, for instance if it is an // A project can be considered part of more than one Qt version, for instance if it is an
// example shipped via the installer. // example shipped via the installer.

View File

@@ -103,8 +103,7 @@ QMakeStep::QMakeStep(BuildStepList *bsl, Id id)
auto updateSummary = [this] { auto updateSummary = [this] {
QtVersion *qtVersion = QtKitAspect::qtVersion(target()->kit()); QtVersion *qtVersion = QtKitAspect::qtVersion(target()->kit());
if (!qtVersion) if (!qtVersion)
return tr("<b>Query tool:</b> No Qt version set. " return tr("<b>qmake:</b> No Qt version set. Cannot run qmake.");
"Cannot run neither qmake nor qtpaths.");
const QString program = qtVersion->qmakeFilePath().fileName(); const QString program = qtVersion->qmakeFilePath().fileName();
return tr("<b>qmake:</b> %1 %2").arg(program, project()->projectFilePath().fileName()); return tr("<b>qmake:</b> %1 %2").arg(program, project()->projectFilePath().fileName());
}; };
@@ -165,7 +164,7 @@ QString QMakeStep::allArguments(const QtVersion *v, ArgumentFlags flags) const
QString args = ProcessArgs::joinArgs(arguments); QString args = ProcessArgs::joinArgs(arguments);
// User arguments // User arguments
ProcessArgs::addArgs(&args, userArguments()); ProcessArgs::addArgs(&args, userArguments());
for (const QString &arg : qAsConst(m_extraArgs)) for (QString arg : qAsConst(m_extraArgs))
ProcessArgs::addArgs(&args, arg); ProcessArgs::addArgs(&args, arg);
return (flags & ArgumentFlag::Expand) ? bc->macroExpander()->expand(args) : args; return (flags & ArgumentFlag::Expand) ? bc->macroExpander()->expand(args) : args;
} }
@@ -215,8 +214,7 @@ bool QMakeStep::init()
else else
workingDirectory = qmakeBc->buildDirectory(); workingDirectory = qmakeBc->buildDirectory();
m_qmakeCommand = m_qmakeCommand = CommandLine{qtVersion->qmakeFilePath(), allArguments(qtVersion), CommandLine::Raw};
CommandLine{qtVersion->qmakeFilePath(), allArguments(qtVersion), CommandLine::Raw};
m_runMakeQmake = (qtVersion->qtVersion() >= QtVersionNumber(5, 0 ,0)); m_runMakeQmake = (qtVersion->qtVersion() >= QtVersionNumber(5, 0 ,0));
// The Makefile is used by qmake and make on the build device, from that // The Makefile is used by qmake and make on the build device, from that

View File

@@ -610,7 +610,7 @@ QString PuppetCreator::qmakeCommand() const
{ {
QtSupport::QtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_target->kit()); QtSupport::QtVersion *currentQtVersion = QtSupport::QtKitAspect::qtVersion(m_target->kit());
if (currentQtVersion) if (currentQtVersion)
return currentQtVersion->queryToolFilePath().toString(); return currentQtVersion->qmakeFilePath().toString();
return QString(); return QString();
} }

View File

@@ -81,7 +81,6 @@ const char QTVERSIONAUTODETECTED[] = "isAutodetected";
const char QTVERSIONDETECTIONSOURCE[] = "autodetectionSource"; const char QTVERSIONDETECTIONSOURCE[] = "autodetectionSource";
const char QTVERSION_OVERRIDE_FEATURES[] = "overrideFeatures"; const char QTVERSION_OVERRIDE_FEATURES[] = "overrideFeatures";
const char QTVERSIONQMAKEPATH[] = "QMakePath"; const char QTVERSIONQMAKEPATH[] = "QMakePath";
const char QTVERSIONQUERYTOOLPATH[] = "QueryToolPath";
const char QTVERSIONSOURCEPATH[] = "SourcePath"; const char QTVERSIONSOURCEPATH[] = "SourcePath";
const char QTVERSION_ABIS[] = "Abis"; const char QTVERSION_ABIS[] = "Abis";
@@ -188,7 +187,7 @@ public:
FilePath findHostBinary(HostBinaries binary) const; FilePath findHostBinary(HostBinaries binary) const;
void updateMkspec(); void updateMkspec();
QHash<ProKey, ProString> versionInfo(); QHash<ProKey, ProString> versionInfo();
static bool queryQtPaths(const FilePath &queryTool, static bool queryQMakeVariables(const FilePath &binary,
const Environment &env, const Environment &env,
QHash<ProKey, ProString> *versionInfo, QHash<ProKey, ProString> *versionInfo,
QString *error = nullptr); QString *error = nullptr);
@@ -198,9 +197,9 @@ public:
const QByteArray &name, const QByteArray &name,
PropertyVariant variant = PropertyVariantGet); PropertyVariant variant = PropertyVariantGet);
static FilePath mkspecDirectoryFromVersionInfo(const QHash<ProKey, ProString> &versionInfo, static FilePath mkspecDirectoryFromVersionInfo(const QHash<ProKey, ProString> &versionInfo,
const FilePath &queryTool); const FilePath &qmakeCommand);
static FilePath mkspecFromVersionInfo(const QHash<ProKey,ProString> &versionInfo, static FilePath mkspecFromVersionInfo(const QHash<ProKey,ProString> &versionInfo,
const FilePath &queryTool); const FilePath &qmakeCommand);
static FilePath sourcePath(const QHash<ProKey,ProString> &versionInfo); static FilePath sourcePath(const QHash<ProKey,ProString> &versionInfo);
void setId(int id); // used by the qtversionmanager for legacy restore void setId(int id); // used by the qtversionmanager for legacy restore
// and by the qtoptionspage to replace Qt versions // and by the qtoptionspage to replace Qt versions
@@ -222,7 +221,7 @@ public:
bool m_defaultConfigIsDebugAndRelease = true; bool m_defaultConfigIsDebugAndRelease = true;
bool m_frameworkBuild = false; bool m_frameworkBuild = false;
bool m_versionInfoUpToDate = false; bool m_versionInfoUpToDate = false;
bool m_queryToolIsExecutable = true; bool m_qmakeIsExecutable = true;
QString m_detectionSource; QString m_detectionSource;
QSet<Utils::Id> m_overrideFeatures; QSet<Utils::Id> m_overrideFeatures;
@@ -234,7 +233,6 @@ public:
QHash<ProKey, ProString> m_versionInfo; QHash<ProKey, ProString> m_versionInfo;
FilePath m_queryTool;
FilePath m_qmakeCommand; FilePath m_qmakeCommand;
FilePath m_rccPath; FilePath m_rccPath;
@@ -348,12 +346,12 @@ QtVersion::~QtVersion()
QString QtVersion::defaultUnexpandedDisplayName() const QString QtVersion::defaultUnexpandedDisplayName() const
{ {
QString location; QString location;
if (queryToolFilePath().isEmpty()) { if (qmakeFilePath().isEmpty()) {
location = QCoreApplication::translate("QtVersion", "<unknown>"); location = QCoreApplication::translate("QtVersion", "<unknown>");
} else { } else {
// Deduce a description from '/foo/qt-folder/[qtbase]/bin/qmake' -> '/foo/qt-folder'. // Deduce a description from '/foo/qt-folder/[qtbase]/bin/qmake' -> '/foo/qt-folder'.
// '/usr' indicates System Qt 4.X on Linux. // '/usr' indicates System Qt 4.X on Linux.
for (FilePath dir = queryToolFilePath().parentDir(); !dir.isEmpty(); dir = dir.parentDir()) { for (FilePath dir = qmakeFilePath().parentDir(); !dir.isEmpty(); dir = dir.parentDir()) {
const QString dirName = dir.fileName(); const QString dirName = dir.fileName();
if (dirName == "usr") { // System-installed Qt. if (dirName == "usr") { // System-installed Qt.
location = QCoreApplication::translate("QtVersion", "System"); location = QCoreApplication::translate("QtVersion", "System");
@@ -727,23 +725,20 @@ void QtVersion::fromMap(const QVariantMap &map)
d->m_isAutodetected = map.value(QTVERSIONAUTODETECTED).toBool(); d->m_isAutodetected = map.value(QTVERSIONAUTODETECTED).toBool();
d->m_detectionSource = map.value(QTVERSIONDETECTIONSOURCE).toString(); d->m_detectionSource = map.value(QTVERSIONDETECTIONSOURCE).toString();
d->m_overrideFeatures = Utils::Id::fromStringList(map.value(QTVERSION_OVERRIDE_FEATURES).toStringList()); d->m_overrideFeatures = Utils::Id::fromStringList(map.value(QTVERSION_OVERRIDE_FEATURES).toStringList());
d->m_queryTool = FilePath::fromVariant(map.value(QTVERSIONQUERYTOOLPATH, d->m_qmakeCommand = FilePath::fromVariant(map.value(QTVERSIONQMAKEPATH));
map.value(QTVERSIONQMAKEPATH)));
if (!d->m_queryTool.baseName().contains("qtpaths"))
d->m_qmakeCommand = d->m_queryTool;
FilePath queryTool = d->m_queryTool; FilePath qmake = d->m_qmakeCommand;
// FIXME: Check this is still needed or whether ProcessArgs::splitArg handles it. // FIXME: Check this is still needed or whether ProcessArgs::splitArg handles it.
QString string = d->m_queryTool.path(); QString string = d->m_qmakeCommand.path();
if (string.startsWith('~')) if (string.startsWith('~'))
string.remove(0, 1).prepend(QDir::homePath()); string.remove(0, 1).prepend(QDir::homePath());
queryTool.setPath(string); qmake.setPath(string);
if (!d->m_queryTool.needsDevice()) { if (!d->m_qmakeCommand.needsDevice()) {
if (BuildableHelperLibrary::isQtChooser(queryTool)) { if (BuildableHelperLibrary::isQtChooser(qmake)) {
// we don't want to treat qtchooser as a normal qmake // we don't want to treat qtchooser as a normal qmake
// see e.g. QTCREATORBUG-9841, also this lead to users changing what // see e.g. QTCREATORBUG-9841, also this lead to users changing what
// qtchooser forwards too behind our backs, which will inadvertly lead to bugs // qtchooser forwards too behind our backs, which will inadvertly lead to bugs
d->m_queryTool = BuildableHelperLibrary::qtChooserToQueryToolPath(queryTool); d->m_qmakeCommand = BuildableHelperLibrary::qtChooserToQmakePath(qmake);
} }
} }
@@ -774,7 +769,6 @@ QVariantMap QtVersion::toMap() const
result.insert(QTVERSION_OVERRIDE_FEATURES, Utils::Id::toStringList(d->m_overrideFeatures)); result.insert(QTVERSION_OVERRIDE_FEATURES, Utils::Id::toStringList(d->m_overrideFeatures));
result.insert(QTVERSIONQMAKEPATH, qmakeFilePath().toVariant()); result.insert(QTVERSIONQMAKEPATH, qmakeFilePath().toVariant());
result.insert(QTVERSIONQUERYTOOLPATH, queryToolFilePath().toVariant());
return result; return result;
} }
@@ -785,8 +779,8 @@ bool QtVersion::isValid() const
d->updateVersionInfo(); d->updateVersionInfo();
d->updateMkspec(); d->updateMkspec();
return !queryToolFilePath().isEmpty() && d->m_data.installed && !binPath().isEmpty() return !qmakeFilePath().isEmpty() && d->m_data.installed && !binPath().isEmpty()
&& !d->m_mkspecFullPath.isEmpty() && d->m_queryToolIsExecutable; && !d->m_mkspecFullPath.isEmpty() && d->m_qmakeIsExecutable;
} }
QtVersion::Predicate QtVersion::isValidPredicate(const QtVersion::Predicate &predicate) QtVersion::Predicate QtVersion::isValidPredicate(const QtVersion::Predicate &predicate)
@@ -800,18 +794,15 @@ QString QtVersion::invalidReason() const
{ {
if (displayName().isEmpty()) if (displayName().isEmpty())
return QCoreApplication::translate("QtVersion", "Qt version has no name"); return QCoreApplication::translate("QtVersion", "Qt version has no name");
if (queryToolFilePath().isEmpty()) if (qmakeFilePath().isEmpty())
return QCoreApplication::translate("QtVersion", "No Qt query tool path set"); return QCoreApplication::translate("QtVersion", "No qmake path set");
if (!d->m_queryToolIsExecutable) if (!d->m_qmakeIsExecutable)
return QCoreApplication::translate("QtVersion", "%1 does not exist or is not executable") return QCoreApplication::translate("QtVersion", "qmake does not exist or is not executable");
.arg(queryToolFilePath().baseName());
if (!d->m_data.installed) if (!d->m_data.installed)
return QCoreApplication::translate("QtVersion", "Qt version is not properly installed, please run make install"); return QCoreApplication::translate("QtVersion", "Qt version is not properly installed, please run make install");
if (binPath().isEmpty()) if (binPath().isEmpty())
return QCoreApplication::translate("QtVersion", return QCoreApplication::translate("QtVersion",
"Could not determine the path to the binaries of the " "Could not determine the path to the binaries of the Qt installation, maybe the qmake path is wrong?");
"Qt installation, maybe the %1 path is wrong?")
.arg(queryToolFilePath().baseName());
if (d->m_mkspecUpToDate && d->m_mkspecFullPath.isEmpty()) if (d->m_mkspecUpToDate && d->m_mkspecFullPath.isEmpty())
return QCoreApplication::translate("QtVersion", "The default mkspec symlink is broken."); return QCoreApplication::translate("QtVersion", "The default mkspec symlink is broken.");
return QString(); return QString();
@@ -829,20 +820,8 @@ QStringList QtVersion::warningReason() const
return ret; return ret;
} }
FilePath QtVersion::queryToolFilePath() const
{
return d->m_queryTool;
}
FilePath QtVersion::qmakeFilePath() const FilePath QtVersion::qmakeFilePath() const
{ {
if (d->m_qmakeCommand.isEmpty() && d->m_queryTool.baseName().contains("qtpaths")) {
// TODO: might need a less lazy implementation
const FilePath qmake =
FilePath::fromString(d->m_queryTool.toString().replace("qtpaths", "qmake"));
if (qmake.exists())
d->m_qmakeCommand = qmake;
}
return d->m_qmakeCommand; return d->m_qmakeCommand;
} }
@@ -876,7 +855,7 @@ bool QtVersion::hasAbi(ProjectExplorer::Abi::OS os, ProjectExplorer::Abi::OSFlav
bool QtVersion::equals(QtVersion *other) bool QtVersion::equals(QtVersion *other)
{ {
if (d->m_queryTool != other->d->m_queryTool) if (d->m_qmakeCommand != other->d->m_qmakeCommand)
return false; return false;
if (type() != other->type()) if (type() != other->type())
return false; return false;
@@ -954,15 +933,13 @@ QString QtVersion::toHtml(bool verbose) const
str << "<td>" << abis.at(i).toString() << "</td></tr>"; str << "<td>" << abis.at(i).toString() << "</td></tr>";
} }
} }
const OsType osType = d->m_queryTool.osType(); const OsType osType = d->m_qmakeCommand.osType();
str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "Source:") str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "Source:")
<< "</b></td><td>" << sourcePath().toUserOutput() << "</td></tr>"; << "</b></td><td>" << sourcePath().toUserOutput() << "</td></tr>";
str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "mkspec:") str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "mkspec:")
<< "</b></td><td>" << QDir::toNativeSeparators(mkspec()) << "</td></tr>"; << "</b></td><td>" << QDir::toNativeSeparators(mkspec()) << "</td></tr>";
str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "qmake:") str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "qmake:")
<< "</b></td><td>" << qmakeFilePath().toUserOutput() << "</td></tr>"; << "</b></td><td>" << d->m_qmakeCommand.toUserOutput() << "</td></tr>";
str << "<tr><td><b>" << QCoreApplication::translate("QtVersion", "Query tool:")
<< "</b></td><td>" << d->m_queryTool.toUserOutput() << "</td></tr>";
ensureMkSpecParsed(); ensureMkSpecParsed();
if (!mkspecPath().isEmpty()) { if (!mkspecPath().isEmpty()) {
if (d->m_defaultConfigIsDebug || d->m_defaultConfigIsDebugAndRelease) { if (d->m_defaultConfigIsDebug || d->m_defaultConfigIsDebugAndRelease) {
@@ -1187,13 +1164,13 @@ void QtVersionPrivate::updateMkspec()
return; return;
m_mkspecUpToDate = true; m_mkspecUpToDate = true;
m_mkspecFullPath = mkspecFromVersionInfo(versionInfo(), m_queryTool); m_mkspecFullPath = mkspecFromVersionInfo(versionInfo(), m_qmakeCommand);
m_mkspec = m_mkspecFullPath; m_mkspec = m_mkspecFullPath;
if (m_mkspecFullPath.isEmpty()) if (m_mkspecFullPath.isEmpty())
return; return;
FilePath baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo(), m_queryTool); FilePath baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo(), m_qmakeCommand);
if (m_mkspec.isChildOf(baseMkspecDir)) { if (m_mkspec.isChildOf(baseMkspecDir)) {
m_mkspec = m_mkspec.relativeChildPath(baseMkspecDir); m_mkspec = m_mkspec.relativeChildPath(baseMkspecDir);
@@ -1220,7 +1197,7 @@ void QtVersion::ensureMkSpecParsed() const
QMakeVfs vfs; QMakeVfs vfs;
QMakeGlobals option; QMakeGlobals option;
applyProperties(&option); applyProperties(&option);
Environment env = d->m_queryTool.deviceEnvironment(); Environment env = d->m_qmakeCommand.deviceEnvironment();
setupQmakeRunEnvironment(env); setupQmakeRunEnvironment(env);
option.environment = env.toProcessEnvironment(); option.environment = env.toProcessEnvironment();
ProMessageHandler msgHandler(true); ProMessageHandler msgHandler(true);
@@ -1333,7 +1310,7 @@ QtVersionNumber QtVersion::qtVersion() const
void QtVersionPrivate::updateVersionInfo() void QtVersionPrivate::updateVersionInfo()
{ {
if (m_versionInfoUpToDate || !m_queryToolIsExecutable || m_isUpdating) if (m_versionInfoUpToDate || !m_qmakeIsExecutable || m_isUpdating)
return; return;
m_isUpdating = true; m_isUpdating = true;
@@ -1344,16 +1321,16 @@ void QtVersionPrivate::updateVersionInfo()
m_data.hasExamples = false; m_data.hasExamples = false;
m_data.hasDocumentation = false; m_data.hasDocumentation = false;
if (!queryQtPaths(m_queryTool, q->qmakeRunEnvironment(), &m_versionInfo)) { if (!queryQMakeVariables(m_qmakeCommand, q->qmakeRunEnvironment(), &m_versionInfo)) {
m_queryToolIsExecutable = false; m_qmakeIsExecutable = false;
qWarning("Cannot update Qt version information: %s cannot be run.", qWarning("Cannot update Qt version information: %s cannot be run.",
qPrintable(m_queryTool.toString())); qPrintable(m_qmakeCommand.toString()));
return; return;
} }
m_queryToolIsExecutable = true; m_qmakeIsExecutable = true;
auto fileProperty = [this](const QByteArray &name) { auto fileProperty = [this](const QByteArray &name) {
return FilePath::fromUserInput(qmakeProperty(name)).onDevice(m_queryTool); return FilePath::fromUserInput(qmakeProperty(name)).onDevice(m_qmakeCommand);
}; };
m_data.prefix = fileProperty("QT_INSTALL_PREFIX"); m_data.prefix = fileProperty("QT_INSTALL_PREFIX");
@@ -1751,7 +1728,7 @@ void QtVersion::addToEnvironment(const Kit *k, Environment &env) const
Environment QtVersion::qmakeRunEnvironment() const Environment QtVersion::qmakeRunEnvironment() const
{ {
Environment env = d->m_queryTool.deviceEnvironment(); Environment env = d->m_qmakeCommand.deviceEnvironment();
setupQmakeRunEnvironment(env); setupQmakeRunEnvironment(env);
return env; return env;
} }
@@ -1779,7 +1756,7 @@ Tasks QtVersion::reportIssuesImpl(const QString &proFile, const QString &buildDi
results.append(BuildSystemTask(Task::Error, msg)); results.append(BuildSystemTask(Task::Error, msg));
} }
FilePath qmake = queryToolFilePath(); FilePath qmake = qmakeFilePath();
if (!qmake.isExecutableFile()) { if (!qmake.isExecutableFile()) {
//: %1: Path to qmake executable //: %1: Path to qmake executable
const QString msg = QCoreApplication::translate("QmakeProjectManager::QtVersion", const QString msg = QCoreApplication::translate("QmakeProjectManager::QtVersion",
@@ -1839,21 +1816,20 @@ static QByteArray runQmakeQuery(const FilePath &binary, const Environment &env,
return process.readAllStandardOutput(); return process.readAllStandardOutput();
} }
bool QtVersionPrivate::queryQtPaths(const FilePath &queryTool, const Environment &env, bool QtVersionPrivate::queryQMakeVariables(const FilePath &binary, const Environment &env,
QHash<ProKey, ProString> *versionInfo, QString *error) QHash<ProKey, ProString> *versionInfo, QString *error)
{ {
QString tmp; QString tmp;
if (!error) if (!error)
error = &tmp; error = &tmp;
if (!queryTool.isExecutableFile()) { if (!binary.isExecutableFile()) {
*error = QCoreApplication::translate("QtVersion", "\"%1\" is not an executable.") *error = QCoreApplication::translate("QtVersion", "qmake \"%1\" is not an executable.").arg(binary.toUserOutput());
.arg(queryTool.toUserOutput());
return false; return false;
} }
QByteArray output; QByteArray output;
output = runQmakeQuery(queryTool, env, error); output = runQmakeQuery(binary, env, error);
if (!output.contains("QMAKE_VERSION:")) { if (!output.contains("QMAKE_VERSION:")) {
// Some setups pass error messages via stdout, fooling the logic below. // Some setups pass error messages via stdout, fooling the logic below.
@@ -1871,14 +1847,14 @@ bool QtVersionPrivate::queryQtPaths(const FilePath &queryTool, const Environment
// Try running qmake with all kinds of tool chains set up in the environment. // Try running qmake with all kinds of tool chains set up in the environment.
// This is required to make non-static qmakes work on windows where every tool chain // This is required to make non-static qmakes work on windows where every tool chain
// tries to be incompatible with any other. // tries to be incompatible with any other.
const Abis abiList = Abi::abisOfBinary(queryTool); const Abis abiList = Abi::abisOfBinary(binary);
const Toolchains tcList = ToolChainManager::toolchains([&abiList](const ToolChain *t) { const Toolchains tcList = ToolChainManager::toolchains([&abiList](const ToolChain *t) {
return abiList.contains(t->targetAbi()); return abiList.contains(t->targetAbi());
}); });
for (ToolChain *tc : tcList) { for (ToolChain *tc : tcList) {
Environment realEnv = env; Environment realEnv = env;
tc->addToEnvironment(realEnv); tc->addToEnvironment(realEnv);
output = runQmakeQuery(queryTool, realEnv, error); output = runQmakeQuery(binary, realEnv, error);
if (error->isEmpty()) if (error->isEmpty())
break; break;
} }
@@ -1900,18 +1876,18 @@ QString QtVersionPrivate::qmakeProperty(const QByteArray &name,
} }
FilePath QtVersionPrivate::mkspecDirectoryFromVersionInfo(const QHash<ProKey, ProString> &versionInfo, FilePath QtVersionPrivate::mkspecDirectoryFromVersionInfo(const QHash<ProKey, ProString> &versionInfo,
const FilePath &queryTool) const FilePath &qmakeCommand)
{ {
QString dataDir = qmakeProperty(versionInfo, "QT_HOST_DATA", PropertyVariantSrc); QString dataDir = qmakeProperty(versionInfo, "QT_HOST_DATA", PropertyVariantSrc);
if (dataDir.isEmpty()) if (dataDir.isEmpty())
return FilePath(); return FilePath();
return FilePath::fromUserInput(dataDir + "/mkspecs").onDevice(queryTool); return FilePath::fromUserInput(dataDir + "/mkspecs").onDevice(qmakeCommand);
} }
FilePath QtVersionPrivate::mkspecFromVersionInfo(const QHash<ProKey, ProString> &versionInfo, FilePath QtVersionPrivate::mkspecFromVersionInfo(const QHash<ProKey, ProString> &versionInfo,
const FilePath &queryTool) const FilePath &qmakeCommand)
{ {
FilePath baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo, queryTool); FilePath baseMkspecDir = mkspecDirectoryFromVersionInfo(versionInfo, qmakeCommand);
if (baseMkspecDir.isEmpty()) if (baseMkspecDir.isEmpty())
return FilePath(); return FilePath();
@@ -2343,16 +2319,14 @@ void QtVersion::resetCache() const
static QList<QtVersionFactory *> g_qtVersionFactories; static QList<QtVersionFactory *> g_qtVersionFactories;
QtVersion *QtVersionFactory::createQtVersionFromQueryToolPath(const FilePath &queryTool, QtVersion *QtVersionFactory::createQtVersionFromQMakePath
bool isAutoDetected, (const FilePath &qmakePath, bool isAutoDetected, const QString &detectionSource, QString *error)
const QString &detectionSource,
QString *error)
{ {
QHash<ProKey, ProString> versionInfo; QHash<ProKey, ProString> versionInfo;
const Environment env = queryTool.deviceEnvironment(); const Environment env = qmakePath.deviceEnvironment();
if (!QtVersionPrivate::queryQtPaths(queryTool, env, &versionInfo, error)) if (!QtVersionPrivate::queryQMakeVariables(qmakePath, env, &versionInfo, error))
return nullptr; return nullptr;
FilePath mkspec = QtVersionPrivate::mkspecFromVersionInfo(versionInfo, queryTool); FilePath mkspec = QtVersionPrivate::mkspecFromVersionInfo(versionInfo, qmakePath);
QMakeVfs vfs; QMakeVfs vfs;
QMakeGlobals globals; QMakeGlobals globals;
@@ -2368,7 +2342,7 @@ QtVersion *QtVersionFactory::createQtVersionFromQueryToolPath(const FilePath &qu
return l->m_priority > r->m_priority; return l->m_priority > r->m_priority;
}); });
if (!queryTool.isExecutableFile()) if (!qmakePath.isExecutableFile())
return nullptr; return nullptr;
QtVersionFactory::SetupData setup; QtVersionFactory::SetupData setup;
@@ -2381,8 +2355,8 @@ QtVersion *QtVersionFactory::createQtVersionFromQueryToolPath(const FilePath &qu
QtVersion *ver = factory->create(); QtVersion *ver = factory->create();
QTC_ASSERT(ver, continue); QTC_ASSERT(ver, continue);
ver->d->m_id = QtVersionManager::getUniqueId(); ver->d->m_id = QtVersionManager::getUniqueId();
QTC_CHECK(ver->d->m_queryTool.isEmpty()); // Should only be used once. QTC_CHECK(ver->d->m_qmakeCommand.isEmpty()); // Should only be used once.
ver->d->m_queryTool = queryTool; ver->d->m_qmakeCommand = qmakePath;
ver->d->m_detectionSource = detectionSource; ver->d->m_detectionSource = detectionSource;
ver->d->m_isAutodetected = isAutoDetected; ver->d->m_isAutodetected = isAutoDetected;
ver->updateDefaultDisplayName(); ver->updateDefaultDisplayName();
@@ -2393,7 +2367,7 @@ QtVersion *QtVersionFactory::createQtVersionFromQueryToolPath(const FilePath &qu
ProFileCacheManager::instance()->decRefCount(); ProFileCacheManager::instance()->decRefCount();
if (error) { if (error) {
*error = QCoreApplication::translate("QtSupport::QtVersionFactory", *error = QCoreApplication::translate("QtSupport::QtVersionFactory",
"No factory found for query tool \"%1\"").arg(queryTool.toUserOutput()); "No factory found for qmake: \"%1\"").arg(qmakePath.toUserOutput());
} }
return nullptr; return nullptr;
} }

View File

@@ -150,8 +150,6 @@ public:
bool hasDocs() const; bool hasDocs() const;
bool hasDemos() const; bool hasDemos() const;
Utils::FilePath queryToolFilePath() const;
// former local functions // former local functions
Utils::FilePath qmakeFilePath() const; Utils::FilePath qmakeFilePath() const;

View File

@@ -324,11 +324,6 @@ void QtKitAspect::addToMacroExpander(Kit *kit, MacroExpander *expander) const
QtVersion *version = qtVersion(kit); QtVersion *version = qtVersion(kit);
return version ? version->qmakeFilePath().path() : QString(); return version ? version->qmakeFilePath().path() : QString();
}); });
expander->registerVariable("Qt:queryToolExecutable", tr("Path to the query tool executable"),
[kit]() -> QString {
QtVersion *version = qtVersion(kit);
return version ? version->queryToolFilePath().path() : QString();
});
} }
Id QtKitAspect::id() Id QtKitAspect::id()

View File

@@ -51,7 +51,6 @@
#include <utils/hostosinfo.h> #include <utils/hostosinfo.h>
#include <utils/pathchooser.h> #include <utils/pathchooser.h>
#include <utils/qtcassert.h> #include <utils/qtcassert.h>
#include <utils/qtcprocess.h>
#include <utils/runextensions.h> #include <utils/runextensions.h>
#include <utils/treemodel.h> #include <utils/treemodel.h>
#include <utils/utilsicons.h> #include <utils/utilsicons.h>
@@ -112,7 +111,7 @@ public:
if (column == 0) if (column == 0)
return m_version->displayName(); return m_version->displayName();
if (column == 1) if (column == 1)
return m_version->queryToolFilePath().toUserOutput(); return m_version->qmakeFilePath().toUserOutput();
} }
if (role == Qt::FontRole && m_changed) { if (role == Qt::FontRole && m_changed) {
@@ -129,8 +128,7 @@ public:
"<dd>%2</dd>"; "<dd>%2</dd>";
return QString("<dl style=\"white-space:pre\">" return QString("<dl style=\"white-space:pre\">"
+ row.arg(tr("Qt Version"), m_version->qtVersionString()) + row.arg(tr("Qt Version"), m_version->qtVersionString())
+ row.arg(tr("Location of the query tool"), + row.arg(tr("Location of qmake"), m_version->qmakeFilePath().toUserOutput())
m_version->queryToolFilePath().toUserOutput())
+ "</dl>"); + "</dl>");
} }
@@ -602,43 +600,28 @@ QtOptionsPageWidget::~QtOptionsPageWidget()
delete m_configurationWidget; delete m_configurationWidget;
} }
static bool isIncompatibleQtPathsTool(const FilePath &tool)
{
if (!tool.baseName().startsWith("qtpaths"))
return false;
QtcProcess process;
process.setTimeoutS(1);
process.setCommand({tool, {"-query"}});
process.runBlocking();
return process.result() != ProcessResult::FinishedWithSuccess;
}
void QtOptionsPageWidget::addQtDir() void QtOptionsPageWidget::addQtDir()
{ {
FilePath qtQueryTool = FilePath qtVersion = FileUtils::getOpenFilePath(this,
FileUtils::getOpenFilePath(this, tr("Select a qmake Executable"),
tr("Select a qmake or qtpaths Executable"),
{}, {},
BuildableHelperLibrary::filterForQtQueryToolsFileDialog(), BuildableHelperLibrary::filterForQmakeFileDialog(),
0, 0,
QFileDialog::DontResolveSymlinks); QFileDialog::DontResolveSymlinks);
if (qtQueryTool.isEmpty()) if (qtVersion.isEmpty())
return; return;
if (isIncompatibleQtPathsTool(qtQueryTool))
qtQueryTool = qtQueryTool.parentDir() / HostOsInfo::withExecutableSuffix("qmake");
// should add all qt versions here ? // should add all qt versions here ?
if (BuildableHelperLibrary::isQtChooser(qtQueryTool)) if (BuildableHelperLibrary::isQtChooser(qtVersion))
qtQueryTool = BuildableHelperLibrary::qtChooserToQueryToolPath(qtQueryTool.symLinkTarget()); qtVersion = BuildableHelperLibrary::qtChooserToQmakePath(qtVersion.symLinkTarget());
auto checkAlreadyExists = [qtQueryTool](TreeItem *parent) { auto checkAlreadyExists = [qtVersion](TreeItem *parent) {
for (int i = 0; i < parent->childCount(); ++i) { for (int i = 0; i < parent->childCount(); ++i) {
auto item = static_cast<QtVersionItem *>(parent->childAt(i)); auto item = static_cast<QtVersionItem *>(parent->childAt(i));
// Compare parent dirs, since it could be either qmake or qtpaths if (item->version()->qmakeFilePath() == qtVersion) {
if (item->version()->queryToolFilePath().parentDir() == qtQueryTool.parentDir())
return std::make_pair(true, item->version()->displayName()); return std::make_pair(true, item->version()->displayName());
} }
}
return std::make_pair(false, QString()); return std::make_pair(false, QString());
}; };
@@ -657,8 +640,7 @@ void QtOptionsPageWidget::addQtDir()
} }
QString error; QString error;
QtVersion *version = QtVersionFactory::createQtVersionFromQueryToolPath(qtQueryTool, false, QtVersion *version = QtVersionFactory::createQtVersionFromQMakePath(qtVersion, false, QString(), &error);
QString(), &error);
if (version) { if (version) {
auto item = new QtVersionItem(version); auto item = new QtVersionItem(version);
item->setIcon(version->isValid()? m_validVersionIcon : m_invalidVersionIcon); item->setIcon(version->isValid()? m_validVersionIcon : m_invalidVersionIcon);
@@ -668,9 +650,8 @@ void QtOptionsPageWidget::addQtDir()
m_versionUi.nameEdit->setFocus(); m_versionUi.nameEdit->setFocus();
m_versionUi.nameEdit->selectAll(); m_versionUi.nameEdit->selectAll();
} else { } else {
QMessageBox::warning(this, tr("Not Executable"), QMessageBox::warning(this, tr("Qmake Not Executable"),
tr("The executable %1 could not be added: %2").arg( tr("The qmake executable %1 could not be added: %2").arg(qtVersion.toUserOutput()).arg(error));
qtQueryTool.toUserOutput()).arg(error));
return; return;
} }
updateCleanUpButton(); updateCleanUpButton();
@@ -690,16 +671,16 @@ void QtOptionsPageWidget::removeQtDir()
void QtOptionsPageWidget::editPath() void QtOptionsPageWidget::editPath()
{ {
QtVersion *current = currentVersion(); QtVersion *current = currentVersion();
const FilePath queryTool = FilePath qtVersion =
FileUtils::getOpenFilePath(this, FileUtils::getOpenFilePath(this,
tr("Select a qmake or qtpaths Executable"), tr("Select a qmake Executable"),
current->queryToolFilePath().absolutePath(), current->qmakeFilePath().absolutePath(),
BuildableHelperLibrary::filterForQtQueryToolsFileDialog(), BuildableHelperLibrary::filterForQmakeFileDialog(),
nullptr, nullptr,
QFileDialog::DontResolveSymlinks); QFileDialog::DontResolveSymlinks);
if (queryTool.isEmpty()) if (qtVersion.isEmpty())
return; return;
QtVersion *version = QtVersionFactory::createQtVersionFromQueryToolPath(queryTool); QtVersion *version = QtVersionFactory::createQtVersionFromQMakePath(qtVersion);
if (!version) if (!version)
return; return;
// Same type? then replace! // Same type? then replace!
@@ -787,7 +768,7 @@ void QtOptionsPageWidget::updateWidgets()
QtVersion *version = currentVersion(); QtVersion *version = currentVersion();
if (version) { if (version) {
m_versionUi.nameEdit->setText(version->unexpandedDisplayName()); m_versionUi.nameEdit->setText(version->unexpandedDisplayName());
m_versionUi.queryToolPath->setText(version->queryToolFilePath().toUserOutput()); m_versionUi.qmakePath->setText(version->qmakeFilePath().toUserOutput());
m_configurationWidget = version->createConfigurationWidget(); m_configurationWidget = version->createConfigurationWidget();
if (m_configurationWidget) { if (m_configurationWidget) {
m_versionUi.formLayout->addRow(m_configurationWidget); m_versionUi.formLayout->addRow(m_configurationWidget);
@@ -797,7 +778,7 @@ void QtOptionsPageWidget::updateWidgets()
} }
} else { } else {
m_versionUi.nameEdit->clear(); m_versionUi.nameEdit->clear();
m_versionUi.queryToolPath->clear(); m_versionUi.qmakePath->clear();
} }
const bool enabled = version != nullptr; const bool enabled = version != nullptr;

View File

@@ -57,7 +57,7 @@ QtProjectImporter::QtVersionData
QtProjectImporter::findOrCreateQtVersion(const Utils::FilePath &qmakePath) const QtProjectImporter::findOrCreateQtVersion(const Utils::FilePath &qmakePath) const
{ {
QtVersionData result; QtVersionData result;
result.qt = QtVersionManager::version(Utils::equal(&QtVersion::queryToolFilePath, qmakePath)); result.qt = QtVersionManager::version(Utils::equal(&QtVersion::qmakeFilePath, qmakePath));
if (result.qt) { if (result.qt) {
// Check if version is a temporary qt // Check if version is a temporary qt
const int qtId = result.qt->uniqueId(); const int qtId = result.qt->uniqueId();
@@ -67,7 +67,7 @@ QtProjectImporter::findOrCreateQtVersion(const Utils::FilePath &qmakePath) const
// Create a new version if not found: // Create a new version if not found:
// Do not use the canonical path here... // Do not use the canonical path here...
result.qt = QtVersionFactory::createQtVersionFromQueryToolPath(qmakePath); result.qt = QtVersionFactory::createQtVersionFromQMakePath(qmakePath);
result.isTemporary = true; result.isTemporary = true;
if (result.qt) { if (result.qt) {
UpdateGuard guard(*this); UpdateGuard guard(*this);
@@ -281,7 +281,7 @@ static QStringList additionalFilesToCopy(const QtVersion *qt)
} else if (HostOsInfo::isWindowsHost()) { } else if (HostOsInfo::isWindowsHost()) {
const QString release = QString("bin/Qt%1Core.dll").arg(major); const QString release = QString("bin/Qt%1Core.dll").arg(major);
const QString debug = QString("bin/Qt%1Cored.dll").arg(major); const QString debug = QString("bin/Qt%1Cored.dll").arg(major);
const FilePath base = qt->queryToolFilePath().parentDir().parentDir(); const FilePath base = qt->qmakeFilePath().parentDir().parentDir();
if (base.pathAppended(release).exists()) if (base.pathAppended(release).exists())
return {release}; return {release};
if (base.pathAppended(debug).exists()) if (base.pathAppended(debug).exists())
@@ -289,7 +289,7 @@ static QStringList additionalFilesToCopy(const QtVersion *qt)
return {release}; return {release};
} else if (HostOsInfo::isLinuxHost()) { } else if (HostOsInfo::isLinuxHost()) {
const QString core = QString("lib/libQt%1Core.so.%1").arg(major); const QString core = QString("lib/libQt%1Core.so.%1").arg(major);
const QDir base(qt->queryToolFilePath().parentDir().parentDir().pathAppended("lib").toString()); const QDir base(qt->qmakeFilePath().parentDir().parentDir().pathAppended("lib").toString());
const QStringList icuLibs = Utils::transform(base.entryList({"libicu*.so.*"}), [](const QString &lib) { return QString("lib/" + lib); }); const QStringList icuLibs = Utils::transform(base.entryList({"libicu*.so.*"}), [](const QString &lib) { return QString("lib/" + lib); });
return QStringList(core) + icuLibs; return QStringList(core) + icuLibs;
} }
@@ -300,7 +300,7 @@ static QStringList additionalFilesToCopy(const QtVersion *qt)
static Utils::FilePath setupQmake(const QtVersion *qt, const QString &path) static Utils::FilePath setupQmake(const QtVersion *qt, const QString &path)
{ {
// This is a hack and only works with local, "standard" installations of Qt // This is a hack and only works with local, "standard" installations of Qt
const FilePath qmake = qt->queryToolFilePath().canonicalPath(); const FilePath qmake = qt->qmakeFilePath().canonicalPath();
const QString qmakeFile = "bin/" + qmake.fileName(); const QString qmakeFile = "bin/" + qmake.fileName();
const FilePath source = qmake.parentDir().parentDir(); const FilePath source = qmake.parentDir().parentDir();
const FilePath target = FilePath::fromString(path); const FilePath target = FilePath::fromString(path);

View File

@@ -51,7 +51,7 @@ public:
/// the desktop factory claims to handle all paths /// the desktop factory claims to handle all paths
int priority() const { return m_priority; } int priority() const { return m_priority; }
static QtVersion *createQtVersionFromQueryToolPath(const Utils::FilePath &qmakePath, static QtVersion *createQtVersionFromQMakePath(const Utils::FilePath &qmakePath,
bool isAutoDetected = false, bool isAutoDetected = false,
const QString &detectionSource = {}, const QString &detectionSource = {},
QString *error = nullptr); QString *error = nullptr);

View File

@@ -39,14 +39,14 @@
<item row="1" column="0"> <item row="1" column="0">
<widget class="QLabel" name="pathLabel"> <widget class="QLabel" name="pathLabel">
<property name="text"> <property name="text">
<string>Query tool path:</string> <string>qmake path:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="1" column="1"> <item row="1" column="1">
<layout class="QHBoxLayout" name="horizontalLayout"> <layout class="QHBoxLayout" name="horizontalLayout">
<item> <item>
<widget class="QLabel" name="queryToolPath"> <widget class="QLabel" name="qmakePath">
<property name="sizePolicy"> <property name="sizePolicy">
<sizepolicy hsizetype="Expanding" vsizetype="Preferred"> <sizepolicy hsizetype="Expanding" vsizetype="Preferred">
<horstretch>0</horstretch> <horstretch>0</horstretch>

View File

@@ -265,8 +265,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal)
if (log().isDebugEnabled()) { if (log().isDebugEnabled()) {
qCDebug(log) << "======= Existing Qt versions ======="; qCDebug(log) << "======= Existing Qt versions =======";
for (QtVersion *version : qAsConst(m_versions)) { for (QtVersion *version : qAsConst(m_versions)) {
qCDebug(log) << version->queryToolFilePath().toUserOutput() qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:"<<version->uniqueId();
<< "id:" <<version->uniqueId();
qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << " autodetection source:" << version->detectionSource();
qCDebug(log) << ""; qCDebug(log) << "";
} }
@@ -342,8 +341,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal)
if (log().isDebugEnabled()) { if (log().isDebugEnabled()) {
qCDebug(log) << "======= Before removing outdated sdk versions ======="; qCDebug(log) << "======= Before removing outdated sdk versions =======";
for (QtVersion *version : qAsConst(m_versions)) { for (QtVersion *version : qAsConst(m_versions)) {
qCDebug(log) << version->queryToolFilePath().toUserOutput() qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:" << version->uniqueId();
<< "id:" << version->uniqueId();
qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << " autodetection source:" << version->detectionSource();
qCDebug(log) << ""; qCDebug(log) << "";
} }
@@ -362,8 +360,7 @@ void QtVersionManager::updateFromInstaller(bool emitSignal)
if (log().isDebugEnabled()) { if (log().isDebugEnabled()) {
qCDebug(log)<< "======= End result ======="; qCDebug(log)<< "======= End result =======";
for (QtVersion *version : qAsConst(m_versions)) { for (QtVersion *version : qAsConst(m_versions)) {
qCDebug(log) << version->queryToolFilePath().toUserOutput() qCDebug(log) << version->qmakeFilePath().toUserOutput() << "id:" << version->uniqueId();
<< "id:" << version->uniqueId();
qCDebug(log) << " autodetection source:" << version->detectionSource(); qCDebug(log) << " autodetection source:" << version->detectionSource();
qCDebug(log) << ""; qCDebug(log) << "";
} }
@@ -404,20 +401,14 @@ static QList<QByteArray> runQtChooser(const QString &qtchooser, const QStringLis
} }
// Asks qtchooser for the qmake path of a given version // Asks qtchooser for the qmake path of a given version
// TODO: Extend to qtpaths if qtchooser is also used for Qt 6
static QString qmakePath(const QString &qtchooser, const QString &version) static QString qmakePath(const QString &qtchooser, const QString &version)
{ {
const QList<QByteArray> outputs = runQtChooser(qtchooser, const QList<QByteArray> outputs = runQtChooser(qtchooser,
{QStringLiteral("-qt=%1").arg(version), {QStringLiteral("-qt=%1").arg(version),
QStringLiteral("-print-env")}); QStringLiteral("-print-env")});
// Exemplary output of "qtchooser -qt=qt5-x86_64-linux-gnu -print-env":
// QT_SELECT="qt5-x86_64-linux-gnu"
// QTTOOLDIR="/usr/lib/qt5/bin"
// QTLIBDIR="/usr/lib/x86_64-linux-gnu"
const QByteArray qtToolDirPrefix("QTTOOLDIR=\"");
for (const QByteArray &output : outputs) { for (const QByteArray &output : outputs) {
if (output.startsWith(qtToolDirPrefix)) { if (output.startsWith("QTTOOLDIR=\"")) {
QByteArray withoutVarName = output.mid(qtToolDirPrefix.size()); // remove QTTOOLDIR=" QByteArray withoutVarName = output.mid(11); // remove QTTOOLDIR="
withoutVarName.chop(1); // remove trailing quote withoutVarName.chop(1); // remove trailing quote
return QStandardPaths::findExecutable(QStringLiteral("qmake"), QStringList() return QStandardPaths::findExecutable(QStringLiteral("qmake"), QStringList()
<< QString::fromLocal8Bit(withoutVarName)); << QString::fromLocal8Bit(withoutVarName));
@@ -433,15 +424,6 @@ static FilePaths gatherQmakePathsFromQtChooser()
return FilePaths(); return FilePaths();
const QList<QByteArray> versions = runQtChooser(qtchooser, QStringList("-l")); const QList<QByteArray> versions = runQtChooser(qtchooser, QStringList("-l"));
// Exemplary output of "qtchooser -l":
// 4
// 5
// default
// qt4-x86_64-linux-gnu
// qt4
// qt5-x86_64-linux-gnu
// qt5
// ""
QSet<FilePath> foundQMakes; QSet<FilePath> foundQMakes;
for (const QByteArray &version : versions) { for (const QByteArray &version : versions) {
FilePath possibleQMake = FilePath::fromString( FilePath possibleQMake = FilePath::fromString(
@@ -454,20 +436,19 @@ static FilePaths gatherQmakePathsFromQtChooser()
static void findSystemQt() static void findSystemQt()
{ {
FilePaths systemQueryTools FilePaths systemQMakes
= BuildableHelperLibrary::findQtsInEnvironment(Environment::systemEnvironment()); = BuildableHelperLibrary::findQtsInEnvironment(Environment::systemEnvironment());
systemQueryTools.append(gatherQmakePathsFromQtChooser()); systemQMakes.append(gatherQmakePathsFromQtChooser());
for (const FilePath &queryToolPath : qAsConst(systemQueryTools)) { for (const FilePath &qmakePath : qAsConst(systemQMakes)) {
if (BuildableHelperLibrary::isQtChooser(queryToolPath)) if (BuildableHelperLibrary::isQtChooser(qmakePath))
continue; continue;
const auto isSameQueryTool = [queryToolPath](const QtVersion *version) { const auto isSameQmake = [qmakePath](const QtVersion *version) {
return Environment::systemEnvironment(). return Environment::systemEnvironment().
isSameExecutable(queryToolPath.toString(), isSameExecutable(qmakePath.toString(), version->qmakeFilePath().toString());
version->queryToolFilePath().toString());
}; };
if (contains(m_versions, isSameQueryTool)) if (contains(m_versions, isSameQmake))
continue; continue;
QtVersion *version = QtVersionFactory::createQtVersionFromQueryToolPath(queryToolPath, QtVersion *version = QtVersionFactory::createQtVersionFromQMakePath(qmakePath,
false, false,
"PATH"); "PATH");
if (version) if (version)