From 2cc3c3b681677051b2d86f79941f01ff5ff1fe18 Mon Sep 17 00:00:00 2001 From: Jarek Kobus Date: Wed, 12 Jul 2023 08:54:53 +0200 Subject: [PATCH] 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 --- .../cmakeprojectmanager/cmakebuildstep.cpp | 85 +++++++++++-------- .../cmakeprojectmanager/cmakebuildstep.h | 5 -- 2 files changed, 48 insertions(+), 42 deletions(-) diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index be65426d5c3..7c4539a5dc4 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> +{ +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(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); }); -} + using namespace Tasking; -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 { + const auto onParserSetup = [this](QPointer &parseTarget) { + // Make sure CMake state was written to disk before trying to build: + auto bs = qobject_cast(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 &) { 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 e0f6f15d19c..12d9a847129 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;