diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp index fe7044f8d88..7e94c90a6ba 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.cpp @@ -411,13 +411,16 @@ CMakeBuildSettingsWidget::CMakeBuildSettingsWidget(CMakeBuildConfiguration *bc) }); connect(m_resetButton, &QPushButton::clicked, m_configModel, &ConfigModel::resetAllChanges); - connect(m_reconfigureButton, - &QPushButton::clicked, - m_buildConfiguration, - &CMakeBuildConfiguration::runCMakeWithExtraArguments); - connect(m_setButton, &QPushButton::clicked, this, [this]() { - setVariableUnsetFlag(false); + connect(m_reconfigureButton, &QPushButton::clicked, this, [this]() { + auto buildSystem = static_cast(m_buildConfiguration->buildSystem()); + if (!buildSystem->isParsing()) { + buildSystem->runCMakeWithExtraArguments(); + } else { + buildSystem->stopCMakeRun(); + m_reconfigureButton->setEnabled(false); + } }); + connect(m_setButton, &QPushButton::clicked, this, [this]() { setVariableUnsetFlag(false); }); connect(m_unsetButton, &QPushButton::clicked, this, [this]() { setVariableUnsetFlag(true); }); @@ -570,7 +573,15 @@ void CMakeBuildSettingsWidget::updateButtonState() }); m_resetButton->setEnabled(m_configModel->hasChanges() && !isParsing); - m_reconfigureButton->setEnabled(!configChanges.isEmpty() && !isParsing); + m_reconfigureButton->setEnabled(true); + + if (isParsing) + m_reconfigureButton->setText(tr("Stop CMake")); + else if (m_configModel->hasChanges()) + m_reconfigureButton->setText(tr("Apply Configuration Changes")); + else + m_reconfigureButton->setText(tr("Run CMake")); + m_buildConfiguration->setConfigurationChanges(configChanges); } @@ -1323,11 +1334,6 @@ BuildSystem *CMakeBuildConfiguration::buildSystem() const return m_buildSystem; } -void CMakeBuildConfiguration::runCMakeWithExtraArguments() -{ - m_buildSystem->runCMakeWithExtraArguments(); -} - void CMakeBuildConfiguration::setSourceDirectory(const FilePath &path) { aspect()->setValue(path.toString()); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h index c415e9e4e25..31f905cc525 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildconfiguration.h @@ -69,8 +69,6 @@ public: void buildTarget(const QString &buildTarget); ProjectExplorer::BuildSystem *buildSystem() const final; - void runCMakeWithExtraArguments(); - void setSourceDirectory(const Utils::FilePath& path); Utils::FilePath sourceDirectory() const; diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp index 1d0914c2b31..459052edb58 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.cpp @@ -434,6 +434,13 @@ void CMakeBuildSystem::runCMakeWithExtraArguments() | REPARSE_URGENT); } +void CMakeBuildSystem::stopCMakeRun() +{ + qCDebug(cmakeBuildSystemLog) << cmakeBuildConfiguration()->displayName() + << "stopping CMake's runb"; + m_reader.stopCMakeRun(); +} + void CMakeBuildSystem::buildCMakeTarget(const QString &buildTarget) { QTC_ASSERT(!buildTarget.isEmpty(), return); diff --git a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h index 542568b5a77..60b4f4e97dc 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildsystem.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildsystem.h @@ -77,6 +77,7 @@ public: void runCMake(); void runCMakeAndScanProjectTree(); void runCMakeWithExtraArguments(); + void stopCMakeRun(); bool persistCMakeState(); void clearCMakeCache(); diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp index e43db3176f9..90699b86213 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.cpp @@ -148,6 +148,14 @@ void CMakeProcess::run(const BuildDirParameters ¶meters, const QStringList & m_future = std::move(future); } +void CMakeProcess::terminate() +{ + if (m_process) { + m_processWasCanceled = true; + m_process->terminate(); + } +} + QProcess::ProcessState CMakeProcess::state() const { if (m_process) diff --git a/src/plugins/cmakeprojectmanager/cmakeprocess.h b/src/plugins/cmakeprojectmanager/cmakeprocess.h index 9daa1707b14..946687a4748 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprocess.h +++ b/src/plugins/cmakeprojectmanager/cmakeprocess.h @@ -51,6 +51,7 @@ public: ~CMakeProcess(); void run(const BuildDirParameters ¶meters, const QStringList &arguments); + void terminate(); QProcess::ProcessState state() const; diff --git a/src/plugins/cmakeprojectmanager/fileapireader.cpp b/src/plugins/cmakeprojectmanager/fileapireader.cpp index faa1717e71c..1aeff39d7dd 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.cpp +++ b/src/plugins/cmakeprojectmanager/fileapireader.cpp @@ -170,6 +170,12 @@ void FileApiReader::stop() m_isParsing = false; } +void FileApiReader::stopCMakeRun() +{ + if (m_cmakeProcess) + m_cmakeProcess->terminate(); +} + bool FileApiReader::isParsing() const { return m_isParsing; diff --git a/src/plugins/cmakeprojectmanager/fileapireader.h b/src/plugins/cmakeprojectmanager/fileapireader.h index 8e0c77278d2..298d3c0b973 100644 --- a/src/plugins/cmakeprojectmanager/fileapireader.h +++ b/src/plugins/cmakeprojectmanager/fileapireader.h @@ -64,6 +64,7 @@ public: void resetData(); void parse(bool forceCMakeRun, bool forceInitialConfiguration, bool forceExtraConfiguration); void stop(); + void stopCMakeRun(); bool isParsing() const;