summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEike Ziller <eike.ziller@qt.io>2021-06-10 10:31:53 +0200
committerEike Ziller <eike.ziller@qt.io>2021-06-15 13:51:04 +0000
commitfa6490efbcc486edbb8c344bc83c1370826d9fc3 (patch)
treee5b4c45dda16bb3865f38fd465ef67e4499927c4
parent65870f804ba34344d71da076f3b15938bf321869 (diff)
downloadqt-creator-fa6490efbcc486edbb8c344bc83c1370826d9fc3.tar.gz
CMake: Avoid iterating project tree for each build target
Reduces lock-up in main thread after loading projects Task-number: QTCREATORBUG-25783 Change-Id: Ie769074f1689698379bd6fd60f74957086cfce37 Reviewed-by: hjk <hjk@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp22
1 files changed, 13 insertions, 9 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
index 243fdb83f9..3f90ec7a4c 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp
@@ -623,18 +623,22 @@ void CMakeBuildSystem::updateProjectData()
if (newRoot) {
setRootProjectNode(std::move(newRoot));
- const FilePath buildDir = cmakeBuildConfiguration()->buildDirectory();
- if (p->rootProjectNode()) {
+ if (QTC_GUARD(p->rootProjectNode())) {
const QString nodeName = p->rootProjectNode()->displayName();
p->setDisplayName(nodeName);
- }
- for (const CMakeBuildTarget &bt : qAsConst(m_buildTargets)) {
- const QString buildKey = bt.title;
- if (ProjectNode *node = p->findNodeForBuildKey(buildKey)) {
- if (auto targetNode = dynamic_cast<CMakeTargetNode *>(node))
- targetNode->setConfig(patchedConfig);
- }
+ // set config on target nodes
+ const QSet<QString> buildKeys = Utils::transform<QSet>(m_buildTargets,
+ &CMakeBuildTarget::title);
+ p->rootProjectNode()->forEachProjectNode(
+ [patchedConfig, buildKeys](const ProjectNode *node) {
+ if (buildKeys.contains(node->buildKey())) {
+ auto targetNode = const_cast<CMakeTargetNode *>(
+ dynamic_cast<const CMakeTargetNode *>(node));
+ if (QTC_GUARD(targetNode))
+ targetNode->setConfig(patchedConfig);
+ }
+ });
}
}
}