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>
This commit is contained in:
Jarek Kobus
2023-07-12 08:54:53 +02:00
parent 60ef6e167e
commit 2cc3c3b681
2 changed files with 48 additions and 42 deletions

View File

@@ -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()
{
using namespace Tasking;
const auto onParserSetup = [this](QPointer<Target> &parseTarget) {
// Make sure CMake state was written to disk before trying to build:
auto bs = static_cast<CMakeBuildSystem *>(buildSystem());
auto bs = qobject_cast<CMakeBuildSystem *>(buildSystem());
QTC_ASSERT(bs, return SetupResult::StopWithError);
QString message;
if (bs->persistCMakeState()) {
if (bs->persistCMakeState())
message = Tr::tr("Persisting CMake state...");
} else if (bs->isWaitingForParse()) {
else if (bs->isWaitingForParse())
message = Tr::tr("Running CMake in preparation to build...");
} else {
runImpl();
return;
}
else
return SetupResult::StopWithDone;
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 {
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

View File

@@ -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;