diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp index aa9c3f6e6ec..287514c4dff 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.cpp @@ -268,33 +268,45 @@ QString CMakeBuildStep::defaultBuildTarget() const return allTarget(); } -void CMakeBuildStep::stdOutput(const QString &line) +void CMakeBuildStep::stdOutput(const QString &output) { - if (m_percentProgress.indexIn(line) != -1) { - AbstractProcessStep::stdOutput(line); - bool ok = false; - int percent = m_percentProgress.cap(1).toInt(&ok); - if (ok) - emit progress(percent, QString()); - return; - } else if (m_ninjaProgress.indexIn(line) != -1) { - AbstractProcessStep::stdOutput(line); - m_useNinja = true; - bool ok = false; - int done = m_ninjaProgress.cap(1).toInt(&ok); - if (ok) { - int all = m_ninjaProgress.cap(2).toInt(&ok); - if (ok && all != 0) { - const int percent = static_cast(100.0 * done/all); - emit progress(percent, QString()); - } + int offset = 0; + while (offset != -1) { + const int newlinePos = output.indexOf('\n', offset); + QString line; + if (newlinePos == -1) { + line = output.mid(offset); + offset = -1; + } else { + line = output.mid(offset, newlinePos - offset + 1); + offset = newlinePos + 1; } - return; + if (m_percentProgress.indexIn(line) != -1) { + AbstractProcessStep::stdOutput(line); + bool ok = false; + int percent = m_percentProgress.cap(1).toInt(&ok); + if (ok) + emit progress(percent, QString()); + continue; + } else if (m_ninjaProgress.indexIn(line) != -1) { + AbstractProcessStep::stdOutput(line); + m_useNinja = true; + bool ok = false; + int done = m_ninjaProgress.cap(1).toInt(&ok); + if (ok) { + int all = m_ninjaProgress.cap(2).toInt(&ok); + if (ok && all != 0) { + const int percent = static_cast(100.0 * done/all); + emit progress(percent, QString()); + } + } + continue; + } + if (m_useNinja) + AbstractProcessStep::stdError(line); + else + AbstractProcessStep::stdOutput(line); } - if (m_useNinja) - AbstractProcessStep::stdError(line); - else - AbstractProcessStep::stdOutput(line); } QString CMakeBuildStep::buildTarget() const diff --git a/src/plugins/cmakeprojectmanager/cmakebuildstep.h b/src/plugins/cmakeprojectmanager/cmakebuildstep.h index 1e5a4e71009..f2a650fe788 100644 --- a/src/plugins/cmakeprojectmanager/cmakebuildstep.h +++ b/src/plugins/cmakeprojectmanager/cmakebuildstep.h @@ -77,7 +77,7 @@ protected: bool fromMap(const QVariantMap &map) override; // For parsing [ 76%] - void stdOutput(const QString &line) override; + void stdOutput(const QString &output) override; private: void ctor(ProjectExplorer::BuildStepList *bsl);