diff options
author | Jarek Kobus <jaroslaw.kobus@qt.io> | 2023-07-12 08:54:53 +0200 |
---|---|---|
committer | Jarek Kobus <jaroslaw.kobus@qt.io> | 2023-07-13 09:53:54 +0000 |
commit | 2cc3c3b681677051b2d86f79941f01ff5ff1fe18 (patch) | |
tree | 54ee69b9d832beb177ae347b53b3028f3b0e7a1d | |
parent | 60ef6e167e085222ed8181d18c26e07b324c465a (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.cpp | 87 | ||||
-rw-r--r-- | src/plugins/cmakeprojectmanager/cmakebuildstep.h | 5 |
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; |