From 62e4c92f26787db3cf364836d571b397c957d141 Mon Sep 17 00:00:00 2001
From: Tobias Hunger <tobias.hunger@nokia.com>
Date: Fri, 9 Apr 2010 15:04:20 +0200
Subject: [PATCH] Stop build on fatal make errors

... ignoring a error code of 0 from Make. This is necessary to
detect build failures on symbian

Do not show errors when ignoring the return value of a BuildStep
either.

Task-number: QTCREATORBUG-985
Reviewed-by: dt
---
 src/plugins/projectexplorer/gnumakeparser.cpp | 10 +++++++++-
 src/plugins/projectexplorer/gnumakeparser.h   |  4 ++++
 src/plugins/qt4projectmanager/makestep.cpp    | 10 ++++++++++
 src/plugins/qt4projectmanager/makestep.h      |  2 ++
 4 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp
index 972f79fd417..92025f3ff3a 100644
--- a/src/plugins/projectexplorer/gnumakeparser.cpp
+++ b/src/plugins/projectexplorer/gnumakeparser.cpp
@@ -43,7 +43,8 @@ namespace {
 }
 
 GnuMakeParser::GnuMakeParser(const QString &dir) :
-    m_suppressIssues(false)
+    m_suppressIssues(false),
+    m_fatalErrorCount(0)
 {
     m_makeDir.setPattern(QLatin1String(MAKE_PATTERN) +
                          QLatin1String("(\\w+) directory .(.+).$"));
@@ -55,6 +56,11 @@ GnuMakeParser::GnuMakeParser(const QString &dir) :
     addDirectory(dir);
 }
 
+int GnuMakeParser::fatalErrors() const
+{
+    return m_fatalErrorCount;
+}
+
 void GnuMakeParser::stdOutput(const QString &line)
 {
     QString lne = line.trimmed();
@@ -75,6 +81,7 @@ void GnuMakeParser::stdError(const QString &line)
     QString lne = line.trimmed();
 
     if (m_makefileError.indexIn(lne) > -1) {
+        ++m_fatalErrorCount;
         if (!m_suppressIssues) {
             m_suppressIssues = true;
             addTask(Task(Task::Error,
@@ -86,6 +93,7 @@ void GnuMakeParser::stdError(const QString &line)
         return;
     }
     if (m_makeLine.indexIn(lne) > -1) {
+        ++m_fatalErrorCount;
         if (!m_suppressIssues) {
             m_suppressIssues = true;
             addTask(Task(Task::Error,
diff --git a/src/plugins/projectexplorer/gnumakeparser.h b/src/plugins/projectexplorer/gnumakeparser.h
index ca1b041ae04..f5c693e519f 100644
--- a/src/plugins/projectexplorer/gnumakeparser.h
+++ b/src/plugins/projectexplorer/gnumakeparser.h
@@ -49,6 +49,8 @@ public:
 
     QStringList searchDirectories() const;
 
+    int fatalErrors() const;
+
 public slots:
     virtual void taskAdded(const ProjectExplorer::Task &task);
 
@@ -66,6 +68,8 @@ private:
     friend class ProjectExplorerPlugin;
 #endif
     bool m_suppressIssues;
+
+    int m_fatalErrorCount;
 };
 
 } // namespace ProjectExplorer
diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp
index 04fa070e504..fb3184ac82b 100644
--- a/src/plugins/qt4projectmanager/makestep.cpp
+++ b/src/plugins/qt4projectmanager/makestep.cpp
@@ -187,6 +187,16 @@ void MakeStep::run(QFutureInterface<bool> & fi)
     AbstractProcessStep::run(fi);
 }
 
+bool MakeStep::processSucceeded(int exitCode, QProcess::ExitStatus status)
+{
+    // Symbian does retun 0, even on failed makes! So we check for fatal make errors here.
+    ProjectExplorer::GnuMakeParser *parser = qobject_cast<ProjectExplorer::GnuMakeParser *>(outputParser());
+    if (parser && parser->fatalErrors() != 0)
+        return false;
+
+    return AbstractProcessStep::processSucceeded(exitCode, status);
+}
+
 bool MakeStep::immutable() const
 {
     return false;
diff --git a/src/plugins/qt4projectmanager/makestep.h b/src/plugins/qt4projectmanager/makestep.h
index 133cd784ee8..8fe405f078a 100644
--- a/src/plugins/qt4projectmanager/makestep.h
+++ b/src/plugins/qt4projectmanager/makestep.h
@@ -86,6 +86,8 @@ public:
 
     virtual bool init();
     virtual void run(QFutureInterface<bool> &);
+    bool processSucceeded(int exitCode, QProcess::ExitStatus status);
+
     virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget();
     virtual bool immutable() const;
     QStringList userArguments();
-- 
GitLab