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:
Marcus Tillmanns
2023-09-05 14:11:33 +02:00
parent 0c157b4ba6
commit 77cc79b7b0
3 changed files with 44 additions and 31 deletions

View File

@@ -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"));

View File

@@ -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();

View File

@@ -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()