diff --git a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp index f2aac00591b..b2d0811d8d2 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildconfiguration.cpp @@ -159,6 +159,14 @@ QbsBuildConfiguration::QbsBuildConfiguration(Target *target, Core::Id id) QbsBuildConfiguration::~QbsBuildConfiguration() { + for (BuildStep * const bs : buildSteps()->steps()) { + if (const auto qbs = qobject_cast(bs)) + qbs->dropSession(); + } + for (BuildStep * const cs : cleanSteps()->steps()) { + if (const auto qcs = qobject_cast(cs)) + qcs->dropSession(); + } delete m_buildSystem; } diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp index 9827cf672fb..239276de777 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.cpp +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.cpp @@ -539,6 +539,15 @@ QbsBuildStepData QbsBuildStep::stepData() const return data; } +void QbsBuildStep::dropSession() +{ + if (m_session) { + doCancel(); + m_session->disconnect(this); + m_session = nullptr; + } +} + // -------------------------------------------------------------------- // QbsBuildStepConfigWidget: diff --git a/src/plugins/qbsprojectmanager/qbsbuildstep.h b/src/plugins/qbsprojectmanager/qbsbuildstep.h index 3c5249dfb07..d6766768c4b 100644 --- a/src/plugins/qbsprojectmanager/qbsbuildstep.h +++ b/src/plugins/qbsprojectmanager/qbsbuildstep.h @@ -72,6 +72,8 @@ public: QbsBuildSystem *qbsBuildSystem() const; QbsBuildStepData stepData() const; + void dropSession(); + signals: void qbsConfigurationChanged(); void qbsBuildOptionsChanged(); diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.cpp b/src/plugins/qbsprojectmanager/qbscleanstep.cpp index f6753fa411f..07adf568d24 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.cpp +++ b/src/plugins/qbsprojectmanager/qbscleanstep.cpp @@ -85,6 +85,15 @@ QbsCleanStep::~QbsCleanStep() m_session->disconnect(this); } +void QbsCleanStep::dropSession() +{ + if (m_session) { + doCancel(); + m_session->disconnect(this); + m_session = nullptr; + } +} + bool QbsCleanStep::init() { if (buildSystem()->isParsing() || m_session) diff --git a/src/plugins/qbsprojectmanager/qbscleanstep.h b/src/plugins/qbsprojectmanager/qbscleanstep.h index 7af3d61fc72..f757afe9e04 100644 --- a/src/plugins/qbsprojectmanager/qbscleanstep.h +++ b/src/plugins/qbsprojectmanager/qbscleanstep.h @@ -46,6 +46,8 @@ public: QbsBuildStepData stepData() const; + void dropSession(); + private: bool init() override; void doRun() override;