forked from qt-creator/qt-creator
QtSupport: Parallelize qt info fetching
Change-Id: Idd3748f4a3a85b46db10ac0eb4f15567fcf4e896 Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -46,6 +46,7 @@
|
|||||||
#include <QProcess>
|
#include <QProcess>
|
||||||
#include <QRegularExpression>
|
#include <QRegularExpression>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
#include <QtConcurrent>
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
|
|
||||||
@@ -1271,25 +1272,24 @@ void QtVersionPrivate::updateVersionInfo()
|
|||||||
m_data.hostDataPath = fileProperty("QT_HOST_DATA");
|
m_data.hostDataPath = fileProperty("QT_HOST_DATA");
|
||||||
m_data.hostPrefixPath = fileProperty("QT_HOST_PREFIX");
|
m_data.hostPrefixPath = fileProperty("QT_HOST_PREFIX");
|
||||||
|
|
||||||
// Now check for a qt that is configured with a prefix but not installed
|
struct CheckDir
|
||||||
if (!m_data.hostBinPath.isReadableDir())
|
{
|
||||||
m_data.installed = false;
|
FilePath *path;
|
||||||
|
bool *isReadable;
|
||||||
|
};
|
||||||
|
|
||||||
// Framework builds for Qt 4.8 don't use QT_INSTALL_HEADERS
|
QList<CheckDir> checkDirs = {
|
||||||
// so we don't check on mac
|
{&m_data.hostBinPath, &m_data.installed},
|
||||||
if (!HostOsInfo::isMacHost()) {
|
{&m_data.docsPath, &m_data.hasDocumentation},
|
||||||
if (!m_data.headerPath.isReadableDir())
|
{&m_data.examplesPath, &m_data.hasExamples},
|
||||||
m_data.installed = false;
|
{&m_data.demosPath, &m_data.hasDemos},
|
||||||
}
|
};
|
||||||
|
if (m_data.binPath.osType() != OsTypeMac)
|
||||||
|
checkDirs.push_back({&m_data.headerPath, &m_data.installed});
|
||||||
|
|
||||||
if (m_data.docsPath.isReadableDir())
|
QtConcurrent::map(checkDirs, [](CheckDir &checkDir) {
|
||||||
m_data.hasDocumentation = true;
|
*checkDir.isReadable = checkDir.path->isReadableDir();
|
||||||
|
}).waitForFinished();
|
||||||
if (m_data.examplesPath.isReadableDir())
|
|
||||||
m_data.hasExamples = true;
|
|
||||||
|
|
||||||
if (m_data.demosPath.isReadableDir())
|
|
||||||
m_data.hasDemos = true;
|
|
||||||
|
|
||||||
m_data.qtVersionString = qmakeProperty("QT_VERSION");
|
m_data.qtVersionString = qmakeProperty("QT_VERSION");
|
||||||
|
|
||||||
@@ -2227,17 +2227,23 @@ static Abi scanQtBinaryForBuildStringAndRefineAbi(const FilePath &library,
|
|||||||
|
|
||||||
Abis QtVersion::qtAbisFromLibrary(const FilePaths &coreLibraries)
|
Abis QtVersion::qtAbisFromLibrary(const FilePaths &coreLibraries)
|
||||||
{
|
{
|
||||||
Abis res;
|
auto filePathToAbiList = [](const FilePath &library) { // Fetch all abis from all libraries ...
|
||||||
for (const FilePath &library : coreLibraries) {
|
Abis abis = Abi::abisOfBinary(library);
|
||||||
for (const Abi &abi : Abi::abisOfBinary(library)) {
|
for (Abi &abi : abis) {
|
||||||
Abi tmp = abi;
|
|
||||||
if (abi.osFlavor() == Abi::UnknownFlavor)
|
if (abi.osFlavor() == Abi::UnknownFlavor)
|
||||||
tmp = scanQtBinaryForBuildStringAndRefineAbi(library, abi);
|
abi = scanQtBinaryForBuildStringAndRefineAbi(library, abi);
|
||||||
if (!res.contains(tmp))
|
|
||||||
res.append(tmp);
|
|
||||||
}
|
}
|
||||||
}
|
return abis;
|
||||||
return res;
|
};
|
||||||
|
|
||||||
|
auto uniqueAbis = [](Abis &result, const Abis &abis) { // ... merge the results into one list ...
|
||||||
|
for (const Abi &abi : abis) {
|
||||||
|
if (!result.contains(abi))
|
||||||
|
result.append(abi);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
return QtConcurrent::blockingMappedReduced(coreLibraries, filePathToAbiList, uniqueAbis);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtVersion::resetCache() const
|
void QtVersion::resetCache() const
|
||||||
|
Reference in New Issue
Block a user