aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJarek Kobus <jaroslaw.kobus@qt.io>2023-07-12 08:54:53 +0200
committerJarek Kobus <jaroslaw.kobus@qt.io>2023-07-13 09:53:54 +0000
commit2cc3c3b681677051b2d86f79941f01ff5ff1fe18 (patch)
tree54ee69b9d832beb177ae347b53b3028f3b0e7a1d
parent60ef6e167e085222ed8181d18c26e07b324c465a (diff)
CMakeBuildStep: Employ task tree for running
Remove emitting 100% progress on finish, as that's done automatically by the task tree. Task-number: QTCREATORBUG-29168 Change-Id: I468fd2c12ffda4c051a46e586fc18214598269f9 Reviewed-by: Cristian Adam <cristian.adam@qt.io>
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildstep.cpp87
-rw-r--r--src/plugins/cmakeprojectmanager/cmakebuildstep.h5
2 files changed, 49 insertions, 43 deletions
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
index be65426d5c..7c4539a5dc 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
+++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp
@@ -57,7 +57,24 @@ const char CLEAR_SYSTEM_ENVIRONMENT_KEY[] = "CMakeProjectManager.MakeStep.ClearS
const char USER_ENVIRONMENT_CHANGES_KEY[] = "CMakeProjectManager.MakeStep.UserEnvironmentChanges";
const char BUILD_PRESET_KEY[] = "CMakeProjectManager.MakeStep.BuildPreset";
-// CmakeProgressParser
+class ProjectParserTaskAdapter : public Tasking::TaskAdapter<QPointer<Target>>
+{
+public:
+ void start() final {
+ Target *target = *task();
+ if (!target) {
+ emit done(false);
+ return;
+ }
+ connect(target, &Target::parsingFinished, this, &TaskInterface::done);
+ }
+};
+
+} // namespace CMakeProjectManager::Internal
+
+TASKING_DECLARE_TASK(ProjectParserTask, CMakeProjectManager::Internal::ProjectParserTaskAdapter);
+
+namespace CMakeProjectManager::Internal {
class CmakeProgressParser : public Utils::OutputLineParser
{
@@ -253,11 +270,6 @@ CMakeBuildStep::CMakeBuildStep(BuildStepList *bsl, Id id) :
connect(target(), &Target::activeRunConfigurationChanged,
this, &CMakeBuildStep::updateBuildTargetsModel);
-
- setDoneHook([this](bool) {
- updateDeploymentData();
- emit progress(100, {});
- });
}
QVariantMap CMakeBuildStep::toMap() const
@@ -337,40 +349,39 @@ void CMakeBuildStep::setupOutputFormatter(Utils::OutputFormatter *formatter)
void CMakeBuildStep::doRun()
{
- // Make sure CMake state was written to disk before trying to build:
- auto bs = static_cast<CMakeBuildSystem *>(buildSystem());
- QString message;
- if (bs->persistCMakeState()) {
- message = Tr::tr("Persisting CMake state...");
- } else if (bs->isWaitingForParse()) {
- message = Tr::tr("Running CMake in preparation to build...");
- } else {
- runImpl();
- return;
- }
- emit addOutput(message, OutputFormat::NormalMessage);
- m_runTrigger = connect(target(), &Target::parsingFinished,
- this, [this](bool success) { handleProjectWasParsed(success); });
-}
-
-void CMakeBuildStep::runImpl()
-{
- // Do the actual build:
- CMakeAbstractProcessStep::doRun();
-}
-
-void CMakeBuildStep::handleProjectWasParsed(bool success)
-{
- disconnect(m_runTrigger);
- if (isCanceled()) {
- emit finished(false);
- } else if (success) {
- runImpl();
- } else {
+ using namespace Tasking;
+
+ const auto onParserSetup = [this](QPointer<Target> &parseTarget) {
+ // Make sure CMake state was written to disk before trying to build:
+ auto bs = qobject_cast<CMakeBuildSystem *>(buildSystem());
+ QTC_ASSERT(bs, return SetupResult::StopWithError);
+ QString message;
+ if (bs->persistCMakeState())
+ message = Tr::tr("Persisting CMake state...");
+ else if (bs->isWaitingForParse())
+ message = Tr::tr("Running CMake in preparation to build...");
+ else
+ return SetupResult::StopWithDone;
+ emit addOutput(message, OutputFormat::NormalMessage);
+ parseTarget = target();
+ return SetupResult::Continue;
+ };
+ const auto onParserError = [this](const QPointer<Target> &) {
emit addOutput(Tr::tr("Project did not parse successfully, cannot build."),
OutputFormat::ErrorMessage);
- emit finished(false);
- }
+ };
+ const auto onEnd = [this] {
+ updateDeploymentData();
+ };
+ const Group root {
+ ignoreReturnValue() ? finishAllAndDone : stopOnError,
+ ProjectParserTask(onParserSetup, {}, onParserError),
+ defaultProcessTask(),
+ onGroupDone(onEnd),
+ onGroupError(onEnd)
+ };
+
+ runTaskTree(root);
}
QString CMakeBuildStep::defaultBuildTarget() const
diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h
index e0f6f15d19..12d9a84712 100644
--- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h
+++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h
@@ -91,16 +91,11 @@ private:
QString defaultBuildTarget() const;
bool isCleanStep() const;
- void runImpl();
- void handleProjectWasParsed(bool success);
-
void handleBuildTargetsChanges(bool success);
void recreateBuildTargetsModel();
void updateBuildTargetsModel();
void updateDeploymentData();
- QMetaObject::Connection m_runTrigger;
-
friend class CMakeBuildStepConfigWidget;
QStringList m_buildTargets; // Convention: Empty string member signifies "Current executable"
Utils::StringAspect *m_cmakeArguments = nullptr;