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::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 += "<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/environment.h>
|
||||
#include <utils/persistentcachestore.h>
|
||||
#include <utils/process.h>
|
||||
#include <utils/qtcassert.h>
|
||||
|
||||
@@ -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<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;
|
||||
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,7 +545,6 @@ 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) {
|
||||
@@ -542,14 +557,12 @@ void CMakeTool::parseFromCapabilities(const QString &input) const
|
||||
const std::pair<int, int> version{getVersion(versionObject, "major"),
|
||||
getVersion(versionObject, "minor")};
|
||||
if (version.first > highestVersion.first
|
||||
|| (version.first == highestVersion.first
|
||||
&& version.second > highestVersion.second))
|
||||
|| (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();
|
||||
m_introspection->m_version.major = versionInfo.value("major").toInt();
|
||||
|
@@ -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<Generator> 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()
|
||||
|
Reference in New Issue
Block a user