diff --git a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
index 1bfb6cee658..10f03133850 100644
--- a/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakesettingspage.cpp
@@ -113,7 +113,7 @@ public:
CMakeTool cmake(m_autodetected ? CMakeTool::AutoDetection
: CMakeTool::ManualDetection, m_id);
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("Supports fileApi: %1").arg(m_isSupported ? Tr::tr("yes") : Tr::tr("no"));
diff --git a/src/plugins/cmakeprojectmanager/cmaketool.cpp b/src/plugins/cmakeprojectmanager/cmaketool.cpp
index 580db212507..67067555653 100644
--- a/src/plugins/cmakeprojectmanager/cmaketool.cpp
+++ b/src/plugins/cmakeprojectmanager/cmaketool.cpp
@@ -10,6 +10,7 @@
#include
#include
+#include
#include
#include
@@ -151,13 +152,13 @@ FilePath CMakeTool::filePath() const
return m_executable;
}
-bool CMakeTool::isValid() const
+bool CMakeTool::isValid(bool ignoreCache) const
{
if (!m_id.isValid() || !m_introspection)
return false;
if (!m_introspection->m_didAttemptToRun)
- readInformation();
+ readInformation(ignoreCache);
return m_introspection->m_didRun && !m_introspection->m_fileApis.isEmpty();
}
@@ -274,9 +275,9 @@ TextEditor::Keywords CMakeTool::keywords()
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
@@ -388,7 +389,7 @@ void CMakeTool::openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl)
Core::HelpManager::showHelpUrl(linkUrl.arg(documentationUrl(version, online)));
}
-void CMakeTool::readInformation() const
+void CMakeTool::readInformation(bool ignoreCache) const
{
QTC_ASSERT(m_introspection, return );
if (!m_introspection->m_didRun && m_introspection->m_didAttemptToRun)
@@ -396,7 +397,7 @@ void CMakeTool::readInformation() const
m_introspection->m_didAttemptToRun = true;
- fetchFromCapabilities();
+ fetchFromCapabilities(ignoreCache);
}
static QStringList parseDefinition(const QString &definition)
@@ -490,8 +491,17 @@ QStringList CMakeTool::parseVariableOutput(const QString &output)
return result;
}
-void CMakeTool::fetchFromCapabilities() const
+void CMakeTool::fetchFromCapabilities(bool ignoreCache) const
{
+ expected_str cache = PersistentCacheStore::byKey(
+ keyFromString("CMake_" + cmakeExecutable().toUserOutput()));
+
+ if (cache && !ignoreCache) {
+ m_introspection->m_didRun = true;
+ parseFromCapabilities(cache->value("CleanedStdOut").toString());
+ return;
+ }
+
Process cmake;
runCMake(cmake, {"-E", "capabilities"});
@@ -502,6 +512,12 @@ void CMakeTool::fetchFromCapabilities() const
qCCritical(cmakeToolLog) << "Fetching capabilities failed: " << cmake.allOutput() << cmake.error();
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)
@@ -529,26 +545,23 @@ void CMakeTool::parseFromCapabilities(const QString &input) const
gen.value("toolsetSupport").toBool()));
}
- {
- const QVariantMap fileApis = data.value("fileApi").toMap();
- const QVariantList requests = fileApis.value("requests").toList();
- for (const QVariant &r : requests) {
- const QVariantMap object = r.toMap();
- const QString kind = object.value("kind").toString();
- const QVariantList versionList = object.value("version").toList();
- std::pair highestVersion{-1, -1};
- for (const QVariant &v : versionList) {
- const QVariantMap versionObject = v.toMap();
- const std::pair version{getVersion(versionObject, "major"),
- getVersion(versionObject, "minor")};
- if (version.first > highestVersion.first
- || (version.first == highestVersion.first
- && version.second > highestVersion.second))
- highestVersion = version;
- }
- if (!kind.isNull() && highestVersion.first != -1 && highestVersion.second != -1)
- m_introspection->m_fileApis.append({kind, highestVersion});
+ const QVariantMap fileApis = data.value("fileApi").toMap();
+ const QVariantList requests = fileApis.value("requests").toList();
+ for (const QVariant &r : requests) {
+ const QVariantMap object = r.toMap();
+ const QString kind = object.value("kind").toString();
+ const QVariantList versionList = object.value("version").toList();
+ std::pair highestVersion{-1, -1};
+ for (const QVariant &v : versionList) {
+ const QVariantMap versionObject = v.toMap();
+ const std::pair version{getVersion(versionObject, "major"),
+ getVersion(versionObject, "minor")};
+ if (version.first > highestVersion.first
+ || (version.first == highestVersion.first && version.second > highestVersion.second))
+ highestVersion = version;
}
+ if (!kind.isNull() && highestVersion.first != -1 && highestVersion.second != -1)
+ m_introspection->m_fileApis.append({kind, highestVersion});
}
const QVariantMap versionInfo = data.value("version").toMap();
diff --git a/src/plugins/cmakeprojectmanager/cmaketool.h b/src/plugins/cmakeprojectmanager/cmaketool.h
index 838e9cf07e8..4ae2ab1f998 100644
--- a/src/plugins/cmakeprojectmanager/cmaketool.h
+++ b/src/plugins/cmakeprojectmanager/cmaketool.h
@@ -57,7 +57,7 @@ public:
static Utils::Id createId();
- bool isValid() const;
+ bool isValid(bool ignoreCache = false) const;
Utils::Id id() const { return m_id; }
Utils::Store toMap () const;
@@ -74,7 +74,7 @@ public:
bool autoCreateBuildDirectory() const;
QList supportedGenerators() const;
TextEditor::Keywords keywords();
- bool hasFileApi() const;
+ bool hasFileApi(bool ignoreCache = false) const;
Version version() const;
QString versionDisplay() const;
@@ -96,13 +96,13 @@ public:
static void openCMakeHelpUrl(const CMakeTool *tool, const QString &linkUrl);
private:
- void readInformation() const;
+ void readInformation(bool ignoreCache = false) const;
void runCMake(Utils::Process &proc, const QStringList &args, int timeoutS = 1) const;
void parseFunctionDetailsOutput(const QString &output);
QStringList parseVariableOutput(const QString &output);
- void fetchFromCapabilities() const;
+ void fetchFromCapabilities(bool ignoreCache = false) const;
void parseFromCapabilities(const QString &input) const;
// Note: New items here need also be handled in CMakeToolItemModel::apply()