forked from qt-creator/qt-creator
CMake: Cache cmake configuration only once
This fixes saves memory and fixes some update issues with the cmake configuration, where the three layers of caches used to interfere with each other. Task-number: QTCREATORBUG-17360 Change-Id: I5564bbe46ca8de6b38dd710100bfc18fad98eac5 Reviewed-by: Tim Jenssen <tim.jenssen@qt.io>
This commit is contained in:
@@ -148,6 +148,8 @@ void BuildDirManager::parseOnceReaderReady(bool force)
|
||||
m_scanFuture = fi->future();
|
||||
m_futureWatcher.setFuture(m_scanFuture);
|
||||
|
||||
m_cmakeCache.clear();
|
||||
|
||||
Core::ProgressManager::addTask(fi->future(), "Scan CMake project tree", "CMake.Scan.Tree");
|
||||
Utils::runAsync([this, fi]() { BuildDirManager::asyncScanForFiles(fi); });
|
||||
|
||||
@@ -411,7 +413,7 @@ CMakeConfig BuildDirManager::parsedConfiguration() const
|
||||
if (!m_reader)
|
||||
return m_cmakeCache;
|
||||
if (m_cmakeCache.isEmpty())
|
||||
m_cmakeCache = m_reader->parsedConfiguration();
|
||||
m_cmakeCache = m_reader->takeParsedConfiguration();
|
||||
return m_cmakeCache;
|
||||
}
|
||||
|
||||
@@ -421,7 +423,7 @@ void BuildDirManager::checkConfiguration()
|
||||
return;
|
||||
|
||||
Kit *k = m_buildConfiguration->target()->kit();
|
||||
const CMakeConfig cache = m_reader->parsedConfiguration();
|
||||
const CMakeConfig cache = parsedConfiguration();
|
||||
if (cache.isEmpty())
|
||||
return; // No cache file yet.
|
||||
|
||||
|
||||
@@ -100,7 +100,7 @@ public:
|
||||
virtual bool isParsing() const = 0;
|
||||
virtual bool hasData() const = 0;
|
||||
|
||||
virtual CMakeConfig parsedConfiguration() const = 0;
|
||||
virtual CMakeConfig takeParsedConfiguration() = 0;
|
||||
virtual QList<CMakeBuildTarget> buildTargets() const = 0;
|
||||
virtual void generateProjectTree(CMakeListsNode *root,
|
||||
const QList<ProjectExplorer::FileNode *> &allFiles) = 0;
|
||||
|
||||
@@ -146,7 +146,7 @@ void CMakeBuildConfiguration::ctor()
|
||||
connect(m_buildDirManager.get(), &BuildDirManager::errorOccured,
|
||||
this, &CMakeBuildConfiguration::setError);
|
||||
connect(m_buildDirManager.get(), &BuildDirManager::configurationStarted,
|
||||
this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); });
|
||||
this, &CMakeBuildConfiguration::parsingStarted);
|
||||
|
||||
connect(this, &CMakeBuildConfiguration::environmentChanged,
|
||||
m_buildDirManager.get(), &BuildDirManager::forceReparse);
|
||||
@@ -259,10 +259,7 @@ QList<ConfigModel::DataItem> CMakeBuildConfiguration::completeCMakeConfiguration
|
||||
if (!m_buildDirManager || m_buildDirManager->isParsing())
|
||||
return QList<ConfigModel::DataItem>();
|
||||
|
||||
if (m_completeConfigurationCache.isEmpty())
|
||||
m_completeConfigurationCache = m_buildDirManager->parsedConfiguration();
|
||||
|
||||
return Utils::transform(m_completeConfigurationCache,
|
||||
return Utils::transform(m_buildDirManager->parsedConfiguration(),
|
||||
[this](const CMakeConfigItem &i) {
|
||||
ConfigModel::DataItem j;
|
||||
j.key = QString::fromUtf8(i.key);
|
||||
|
||||
@@ -118,8 +118,6 @@ private:
|
||||
QString m_error;
|
||||
QString m_warning;
|
||||
|
||||
mutable QList<CMakeConfigItem> m_completeConfigurationCache;
|
||||
|
||||
std::unique_ptr<BuildDirManager> m_buildDirManager;
|
||||
|
||||
friend class CMakeBuildSettingsWidget;
|
||||
|
||||
@@ -213,9 +213,11 @@ QList<CMakeBuildTarget> ServerModeReader::buildTargets() const
|
||||
return result;
|
||||
}
|
||||
|
||||
CMakeConfig ServerModeReader::parsedConfiguration() const
|
||||
CMakeConfig ServerModeReader::takeParsedConfiguration()
|
||||
{
|
||||
return m_cmakeCache;
|
||||
CMakeConfig config = m_cmakeCache;
|
||||
m_cmakeCache.clear();
|
||||
return config;
|
||||
}
|
||||
|
||||
FolderNode *setupCMakeVFolder(FolderNode *base, const Utils::FileName &basePath, int priority,
|
||||
|
||||
@@ -63,7 +63,7 @@ public:
|
||||
bool hasData() const final;
|
||||
|
||||
QList<CMakeBuildTarget> buildTargets() const final;
|
||||
CMakeConfig parsedConfiguration() const final;
|
||||
CMakeConfig takeParsedConfiguration() final;
|
||||
void generateProjectTree(CMakeListsNode *root, const QList<ProjectExplorer::FileNode *> &allFiles) final;
|
||||
QSet<Core::Id> updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final;
|
||||
|
||||
|
||||
@@ -163,7 +163,6 @@ void TeaLeafReader::resetData()
|
||||
qDeleteAll(m_watchedFiles);
|
||||
m_watchedFiles.clear();
|
||||
|
||||
m_cmakeCache.clear();
|
||||
m_projectName.clear();
|
||||
m_buildTargets.clear();
|
||||
qDeleteAll(m_files);
|
||||
@@ -221,7 +220,7 @@ QList<CMakeBuildTarget> TeaLeafReader::buildTargets() const
|
||||
return m_buildTargets;
|
||||
}
|
||||
|
||||
CMakeConfig TeaLeafReader::parsedConfiguration() const
|
||||
CMakeConfig TeaLeafReader::takeParsedConfiguration()
|
||||
{
|
||||
CMakeConfig result;
|
||||
FileName cacheFile = m_parameters.buildDirectory;
|
||||
@@ -229,11 +228,11 @@ CMakeConfig TeaLeafReader::parsedConfiguration() const
|
||||
if (!cacheFile.exists())
|
||||
return result;
|
||||
QString errorMessage;
|
||||
m_cmakeCache = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage);
|
||||
result = CMakeConfigItem::itemsFromFile(cacheFile, &errorMessage);
|
||||
if (!errorMessage.isEmpty())
|
||||
emit errorOccured(errorMessage);
|
||||
const FileName sourceOfBuildDir
|
||||
= FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", m_cmakeCache));
|
||||
= FileName::fromUtf8(CMakeConfigItem::valueOf("CMAKE_HOME_DIRECTORY", result));
|
||||
const FileName canonicalSourceOfBuildDir = FileUtils::canonicalPath(sourceOfBuildDir);
|
||||
const FileName canonicalSourceDirectory = FileUtils::canonicalPath(m_parameters.sourceDirectory);
|
||||
if (canonicalSourceOfBuildDir != canonicalSourceDirectory) { // Uses case-insensitive compare where appropriate
|
||||
|
||||
@@ -55,7 +55,7 @@ public:
|
||||
bool hasData() const final;
|
||||
|
||||
QList<CMakeBuildTarget> buildTargets() const final;
|
||||
CMakeConfig parsedConfiguration() const final;
|
||||
CMakeConfig takeParsedConfiguration() final;
|
||||
void generateProjectTree(CMakeListsNode *root,
|
||||
const QList<ProjectExplorer::FileNode *> &allFiles) final;
|
||||
QSet<Core::Id> updateCodeModel(CppTools::ProjectPartBuilder &ppBuilder) final;
|
||||
@@ -82,7 +82,6 @@ private:
|
||||
|
||||
bool m_hasData = false;
|
||||
|
||||
mutable CMakeConfig m_cmakeCache;
|
||||
QSet<Utils::FileName> m_cmakeFiles;
|
||||
QString m_projectName;
|
||||
QList<CMakeBuildTarget> m_buildTargets;
|
||||
|
||||
Reference in New Issue
Block a user