From dfacdbefa833468df1deb92e8e3adaca9fa5b49d Mon Sep 17 00:00:00 2001 From: Cristian Adam Date: Wed, 22 Dec 2021 15:18:00 +0100 Subject: [PATCH] CMakePM: Add ability to stop CMake run in Settings Previously the only way to stop the CMake run was to click on "x" button of the "Configure" progress bar. Now you can click in Settings on "Stop CMake". Change-Id: I167b86ba62679f197c194148b122ff0c87e87162 Reviewed-by: Reviewed-by: Eike Ziller --- .../cmakebuildconfiguration.cpp | 30 +++++++++++-------- .../cmakebuildconfiguration.h | 2 -- .../cmakeprojectmanager/cmakebuildsystem.cpp | 7 +++++ .../cmakeprojectmanager/cmakebuildsystem.h | 1 + .../cmakeprojectmanager/cmakeprocess.cpp | 8 +++++ .../cmakeprojectmanager/cmakeprocess.h | 1 + .../cmakeprojectmanager/fileapireader.cpp | 6 ++++ .../cmakeprojectmanager/fileapireader.h | 1 + 8 files changed, 42 insertions(+), 14 deletions(-) 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;