diff options
| author | Tobias Hunger <tobias.hunger@theqtcompany.com> | 2016-03-30 13:43:16 +0200 |
|---|---|---|
| committer | Tobias Hunger <tobias.hunger@theqtcompany.com> | 2016-03-30 13:05:06 +0000 |
| commit | 82b9e9ed37fe15619c80d1a9f656bfe2ea6e1f94 (patch) | |
| tree | ffdae014e1acce043d6f3b54e15d181bb07013c5 /src | |
| parent | 2c822ae3c168ac6b45a31afea023d44920fbaf8b (diff) | |
| download | qt-creator-82b9e9ed37fe15619c80d1a9f656bfe2ea6e1f94.tar.gz | |
CMake: Do not crash when cloning cmake buildconfigurations
Change-Id: I832981cdea16ab058f92758c9bae9b64b904d573
Task-number: QTCREATORBUG-15926
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp | 63 | ||||
| -rw-r--r-- | src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h | 1 |
2 files changed, 35 insertions, 29 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 7f73a321f7..d77e5efa90 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -63,33 +63,7 @@ const char CONFIGURATION_KEY[] = "CMake.Configuration"; CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent) : BuildConfiguration(parent, Core::Id(Constants::CMAKE_BC_ID)) { - auto project = static_cast<CMakeProject *>(parent->project()); - setBuildDirectory(shadowBuildDirectory(project->projectFilePath(), - parent->kit(), - displayName(), BuildConfiguration::Unknown)); - - m_buildDirManager = new BuildDirManager(this); - connect(m_buildDirManager, &BuildDirManager::dataAvailable, - this, &CMakeBuildConfiguration::dataAvailable); - connect(m_buildDirManager, &BuildDirManager::errorOccured, - this, &CMakeBuildConfiguration::setError); - connect(m_buildDirManager, &BuildDirManager::configurationStarted, - this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); - - connect(this, &CMakeBuildConfiguration::environmentChanged, - m_buildDirManager, &BuildDirManager::forceReparse); - connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, - m_buildDirManager, &BuildDirManager::forceReparse); - connect(target(), &Target::kitChanged, this, [this]() { - ProjectExplorer::Kit *k = target()->kit(); - CMakeConfig config = cmakeConfiguration(); - config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... - setCMakeConfiguration(config); - m_buildDirManager->maybeForceReparse(); - }); - - connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); - connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); + ctor(); } CMakeBuildConfiguration::~CMakeBuildConfiguration() @@ -112,7 +86,7 @@ CMakeBuildConfiguration::CMakeBuildConfiguration(ProjectExplorer::Target *parent BuildConfiguration(parent, source), m_configuration(source->m_configuration) { - Q_ASSERT(parent); + ctor(); cloneSteps(source); } @@ -155,6 +129,37 @@ bool CMakeBuildConfiguration::fromMap(const QVariantMap &map) return true; } +void CMakeBuildConfiguration::ctor() +{ + auto project = static_cast<CMakeProject *>(target()->project()); + setBuildDirectory(shadowBuildDirectory(project->projectFilePath(), + target()->kit(), + displayName(), BuildConfiguration::Unknown)); + + m_buildDirManager = new BuildDirManager(this); + connect(m_buildDirManager, &BuildDirManager::dataAvailable, + this, &CMakeBuildConfiguration::dataAvailable); + connect(m_buildDirManager, &BuildDirManager::errorOccured, + this, &CMakeBuildConfiguration::setError); + connect(m_buildDirManager, &BuildDirManager::configurationStarted, + this, [this]() { m_completeConfigurationCache.clear(); emit parsingStarted(); }); + + connect(this, &CMakeBuildConfiguration::environmentChanged, + m_buildDirManager, &BuildDirManager::forceReparse); + connect(this, &CMakeBuildConfiguration::buildDirectoryChanged, + m_buildDirManager, &BuildDirManager::forceReparse); + connect(target(), &Target::kitChanged, this, [this]() { + ProjectExplorer::Kit *k = target()->kit(); + CMakeConfig config = cmakeConfiguration(); + config.append(CMakeConfigurationKitInformation::configuration(k)); // last value wins... + setCMakeConfiguration(config); + m_buildDirManager->maybeForceReparse(); + }); + + connect(this, &CMakeBuildConfiguration::parsingStarted, project, &CMakeProject::handleParsingStarted); + connect(this, &CMakeBuildConfiguration::dataAvailable, project, &CMakeProject::parseCMakeOutput); +} + BuildDirManager *CMakeBuildConfiguration::buildDirManager() const { return m_buildDirManager; @@ -197,7 +202,7 @@ FileName CMakeBuildConfiguration::shadowBuildDirectory(const FileName &projectFi QList<ConfigModel::DataItem> CMakeBuildConfiguration::completeCMakeConfiguration() const { - if (m_buildDirManager->isParsing()) + if (!m_buildDirManager && m_buildDirManager->isParsing()) return QList<ConfigModel::DataItem>(); if (m_completeConfigurationCache.isEmpty()) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 1bd00c3b64..62f0913f7d 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -92,6 +92,7 @@ protected: bool fromMap(const QVariantMap &map) override; private: + void ctor(); QList<ConfigModel::DataItem> completeCMakeConfiguration() const; void setCurrentCMakeConfiguration(const QList<ConfigModel::DataItem> &items); |
