diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index 7f73a321f79..d77e5efa90a 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(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(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 CMakeBuildConfiguration::completeCMakeConfiguration() const { - if (m_buildDirManager->isParsing()) + if (!m_buildDirManager && m_buildDirManager->isParsing()) return QList(); if (m_completeConfigurationCache.isEmpty()) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index 1bd00c3b646..62f0913f7d3 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 completeCMakeConfiguration() const; void setCurrentCMakeConfiguration(const QList &items);