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:
Tobias Hunger
2016-12-01 15:25:32 +01:00
parent 5a88e4c9ad
commit 63c0fbc4e4
8 changed files with 16 additions and 19 deletions

View File

@@ -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.

View File

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

View File

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

View File

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

View File

@@ -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,

View File

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

View File

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

View File

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