forked from qt-creator/qt-creator
CMake: Cache CMakeTool capabilities
Change-Id: Ie81347a7864abeeb64aa2af6dee3f9def241fed8 Reviewed-by: hjk <hjk@qt.io> Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Cristian Adam <cristian.adam@qt.io>
This commit is contained in:
@@ -113,7 +113,7 @@ public:
|
|||||||
CMakeTool cmake(m_autodetected ? CMakeTool::AutoDetection
|
CMakeTool cmake(m_autodetected ? CMakeTool::AutoDetection
|
||||||
: CMakeTool::ManualDetection, m_id);
|
: CMakeTool::ManualDetection, m_id);
|
||||||
cmake.setFilePath(m_executable);
|
cmake.setFilePath(m_executable);
|
||||||
m_isSupported = cmake.hasFileApi();
|
m_isSupported = cmake.hasFileApi(true);
|
||||||
|
|
||||||
m_tooltip = Tr::tr("Version: %1").arg(cmake.versionDisplay());
|
m_tooltip = Tr::tr("Version: %1").arg(cmake.versionDisplay());
|
||||||
m_tooltip += "<br>" + Tr::tr("Supports fileApi: %1").arg(m_isSupported ? Tr::tr("yes") : Tr::tr("no"));
|
m_tooltip += "<br>" + Tr::tr("Supports fileApi: %1").arg(m_isSupported ? Tr::tr("yes") : Tr::tr("no"));
|
||||||
|
@@ -10,6 +10,7 @@
|
|||||||
|
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
|
#include <utils/persistentcachestore.h>
|
||||||
#include <utils/process.h>
|
#include <utils/process.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
@@ -151,13 +152,13 @@ FilePath CMakeTool::filePath() const
|
|||||||
return m_executable;
|
return m_executable;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMakeTool::isValid() const
|
bool CMakeTool::isValid(bool ignoreCache) const
|
||||||
{
|
{
|
||||||
if (!m_id.isValid() || !m_introspection)
|
if (!m_id.isValid() || !m_introspection)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!m_introspection->m_didAttemptToRun)
|
if (!m_introspection->m_didAttemptToRun)
|
||||||
readInformation();
|
readInformation(ignoreCache);
|
||||||
|
|
||||||
return m_introspection->m_didRun && !m_introspection->m_fileApis.isEmpty();
|
return m_introspection->m_didRun && !m_introspection->m_fileApis.isEmpty();
|
||||||
}
|
}
|
||||||
@@ -274,9 +275,9 @@ TextEditor::Keywords CMakeTool::keywords()
|
|||||||
m_introspection->m_functionArgs);
|
m_introspection->m_functionArgs);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool CMakeTool::hasFileApi() const
|
bool CMakeTool::hasFileApi(bool ignoreCache) const
|
||||||
{
|
{
|
||||||
return isValid() ? !m_introspection->m_fileApis.isEmpty() : false;
|
return isValid(ignoreCache) ? !m_introspection->m_fileApis.isEmpty() : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
CMakeTool::Version CMakeTool::version() const
|
CMakeTool::Version CMakeTool::version() const
|
||||||
@@ -388,7 +389,7 @@ void CMakeTool::openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl)
|
|||||||
Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(version, online)));
|
Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(version, online)));
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMakeTool::readInformation() const
|
void CMakeTool::readInformation(bool ignoreCache) const
|
||||||
{
|
{
|
||||||
QTC_ASSERT(m_introspection, return );
|
QTC_ASSERT(m_introspection, return );
|
||||||
if (!m_introspection->m_didRun && m_introspection->m_didAttemptToRun)
|
if (!m_introspection->m_didRun && m_introspection->m_didAttemptToRun)
|
||||||
@@ -396,7 +397,7 @@ void CMakeTool::readInformation() const
|
|||||||
|
|
||||||
m_introspection->m_didAttemptToRun = true;
|
m_introspection->m_didAttemptToRun = true;
|
||||||
|
|
||||||
fetchFromCapabilities();
|
fetchFromCapabilities(ignoreCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
static QStringList parseDefinition(const QString &definition)
|
static QStringList parseDefinition(const QString &definition)
|
||||||
@@ -490,8 +491,17 @@ QStringList CMakeTool::parseVariableOutput(const QString &output)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMakeTool::fetchFromCapabilities() const
|
void CMakeTool::fetchFromCapabilities(bool ignoreCache) const
|
||||||
{
|
{
|
||||||
|
expected_str<Utils::Store> cache = PersistentCacheStore::byKey(
|
||||||
|
keyFromString("CMake_" + cmakeExecutable().toUserOutput()));
|
||||||
|
|
||||||
|
if (cache && !ignoreCache) {
|
||||||
|
m_introspection->m_didRun = true;
|
||||||
|
parseFromCapabilities(cache->value("CleanedStdOut").toString());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Process cmake;
|
Process cmake;
|
||||||
runCMake(cmake, {"-E", "capabilities"});
|
runCMake(cmake, {"-E", "capabilities"});
|
||||||
|
|
||||||
@@ -502,6 +512,12 @@ void CMakeTool::fetchFromCapabilities() const
|
|||||||
qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error();
|
qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error();
|
||||||
m_introspection->m_didRun = false;
|
m_introspection->m_didRun = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Store newData{{"CleanedStdOut", cmake.cleanedStdOut()}};
|
||||||
|
const auto result
|
||||||
|
= PersistentCacheStore::write(keyFromString("CMake_" + cmakeExecutable().toUserOutput()),
|
||||||
|
newData);
|
||||||
|
QTC_ASSERT_EXPECTED(result, return);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int getVersion(const QVariantMap &obj, const QString value)
|
static int getVersion(const QVariantMap &obj, const QString value)
|
||||||
@@ -529,7 +545,6 @@ void CMakeTool::parseFromCapabilities(const QString &input) const
|
|||||||
gen.value("toolsetSupport").toBool()));
|
gen.value("toolsetSupport").toBool()));
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
|
||||||
const QVariantMap fileApis = data.value("fileApi").toMap();
|
const QVariantMap fileApis = data.value("fileApi").toMap();
|
||||||
const QVariantList requests = fileApis.value("requests").toList();
|
const QVariantList requests = fileApis.value("requests").toList();
|
||||||
for (const QVariant &r : requests) {
|
for (const QVariant &r : requests) {
|
||||||
@@ -542,14 +557,12 @@ void CMakeTool::parseFromCapabilities(const QString &input) const
|
|||||||
const std::pair<int, int> version{getVersion(versionObject, "major"),
|
const std::pair<int, int> version{getVersion(versionObject, "major"),
|
||||||
getVersion(versionObject, "minor")};
|
getVersion(versionObject, "minor")};
|
||||||
if (version.first > highestVersion.first
|
if (version.first > highestVersion.first
|
||||||
|| (version.first == highestVersion.first
|
|| (version.first == highestVersion.first && version.second > highestVersion.second))
|
||||||
&& version.second > highestVersion.second))
|
|
||||||
highestVersion = version;
|
highestVersion = version;
|
||||||
}
|
}
|
||||||
if (!kind.isNull() && highestVersion.first != -1 && highestVersion.second != -1)
|
if (!kind.isNull() && highestVersion.first != -1 && highestVersion.second != -1)
|
||||||
m_introspection->m_fileApis.append({kind, highestVersion});
|
m_introspection->m_fileApis.append({kind, highestVersion});
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
const QVariantMap versionInfo = data.value("version").toMap();
|
const QVariantMap versionInfo = data.value("version").toMap();
|
||||||
m_introspection->m_version.major = versionInfo.value("major").toInt();
|
m_introspection->m_version.major = versionInfo.value("major").toInt();
|
||||||
|
@@ -57,7 +57,7 @@ public:
|
|||||||
|
|
||||||
static Utils::Id createId();
|
static Utils::Id createId();
|
||||||
|
|
||||||
bool isValid() const;
|
bool isValid(bool ignoreCache = false) const;
|
||||||
|
|
||||||
Utils::Id id() const { return m_id; }
|
Utils::Id id() const { return m_id; }
|
||||||
Utils::Store toMap () const;
|
Utils::Store toMap () const;
|
||||||
@@ -74,7 +74,7 @@ public:
|
|||||||
bool autoCreateBuildDirectory() const;
|
bool autoCreateBuildDirectory() const;
|
||||||
QList<Generator> supportedGenerators() const;
|
QList<Generator> supportedGenerators() const;
|
||||||
TextEditor::Keywords keywords();
|
TextEditor::Keywords keywords();
|
||||||
bool hasFileApi() const;
|
bool hasFileApi(bool ignoreCache = false) const;
|
||||||
Version version() const;
|
Version version() const;
|
||||||
QString versionDisplay() const;
|
QString versionDisplay() const;
|
||||||
|
|
||||||
@@ -96,13 +96,13 @@ public:
|
|||||||
static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl);
|
static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void readInformation() const;
|
void readInformation(bool ignoreCache = false) const;
|
||||||
|
|
||||||
void runCMake(Utils::Process &proc, const QStringList &args, int timeoutS = 1) const;
|
void runCMake(Utils::Process &proc, const QStringList &args, int timeoutS = 1) const;
|
||||||
void parseFunctionDetailsOutput(const QString &output);
|
void parseFunctionDetailsOutput(const QString &output);
|
||||||
QStringList parseVariableOutput(const QString &output);
|
QStringList parseVariableOutput(const QString &output);
|
||||||
|
|
||||||
void fetchFromCapabilities() const;
|
void fetchFromCapabilities(bool ignoreCache = false) const;
|
||||||
void parseFromCapabilities(const QString &input) const;
|
void parseFromCapabilities(const QString &input) const;
|
||||||
|
|
||||||
// Note: New items here need also be handled in CMakeToolItemModel::apply()
|
// Note: New items here need also be handled in CMakeToolItemModel::apply()
|
||||||
|
Reference in New Issue
Block a user