diff --git a/src/plugins/projectexplorer/gnumakeparser.cpp b/src/plugins/projectexplorer/gnumakeparser.cpp index 1027b12374546dfcf7b2db9b0df4790326b697d6..719b167b8f3ccfbd3695da8e11d34fd41dfbcf7e 100644 --- a/src/plugins/projectexplorer/gnumakeparser.cpp +++ b/src/plugins/projectexplorer/gnumakeparser.cpp @@ -41,13 +41,16 @@ namespace { const char * const MAKE_PATTERN("^(mingw(32|64)-|g)?make(\\[\\d+\\])?:\\s"); } -GnuMakeParser::GnuMakeParser(const QString &dir) +GnuMakeParser::GnuMakeParser(const QString &dir) : + m_alreadyFatal(false) { m_makeDir.setPattern(QLatin1String(MAKE_PATTERN) + QLatin1String("(\\w+) directory .(.+).$")); m_makeDir.setMinimal(true); m_makeLine.setPattern(QLatin1String(MAKE_PATTERN) + QLatin1String("(.*)$")); m_makeLine.setMinimal(true); + m_makefileError.setPattern(QLatin1String("^(.*):(\\d+):\\s\\*\\*\\*\\s(.*)$")); + m_makefileError.setMinimal(true); addDirectory(dir); } @@ -62,18 +65,34 @@ void GnuMakeParser::stdOutput(const QString &line) addDirectory(m_makeDir.cap(5)); return; } + // Only ever report the first fatal message: + // Everything else will be follow-up issues. if (m_makeLine.indexIn(lne) > -1) { - QString message = m_makeLine.cap(4); - Task task(Task::Warning, - message, - QString() /* filename */, - -1, /* line */ - Constants::TASK_CATEGORY_BUILDSYSTEM); - if (message.startsWith(QLatin1String("*** "))) { - task.description = task.description.mid(4); - task.type = Task::Error; + if (!m_alreadyFatal) { + QString message = m_makeLine.cap(4); + Task task(Task::Warning, + message, + QString() /* filename */, + -1, /* line */ + Constants::TASK_CATEGORY_BUILDSYSTEM); + if (message.startsWith(QLatin1String("*** "))) { + task.description = task.description.mid(4); + task.type = Task::Error; + m_alreadyFatal = true; + } + addTask(task); + } + return; + } + if (m_makefileError.indexIn(lne) > -1) { + if (!m_alreadyFatal) { + m_alreadyFatal = true; + addTask(Task(Task::Error, + m_makefileError.cap(3), + m_makefileError.cap(1), + m_makefileError.cap(2).toInt(), + Constants::TASK_CATEGORY_BUILDSYSTEM)); } - addTask(task); return; } @@ -204,6 +223,32 @@ void ProjectExplorerPlugin::testGnuMakeParserParsing_data() Constants::TASK_CATEGORY_BUILDSYSTEM)) << QString() << QStringList(); + QTest::newRow("multiple fatals") + << QStringList() + << QString::fromLatin1("make[3]: *** [.obj/debug-shared/gnumakeparser.o] Error 1\n" + "make[3]: *** Waiting for unfinished jobs....\n" + "make[2]: *** [sub-projectexplorer-make_default] Error 2") + << OutputParserTester::STDOUT + << QString() << QString() + << (QList<Task>() + << Task(Task::Error, + QString::fromLatin1("[.obj/debug-shared/gnumakeparser.o] Error 1"), + QString(), -1, + Constants::TASK_CATEGORY_BUILDSYSTEM)) + << QString() + << QStringList(); + QTest::newRow("Makefile error") + << QStringList() + << QString::fromLatin1("Makefile:360: *** missing separator (did you mean TAB instead of 8 spaces?). Stop.") + << OutputParserTester::STDOUT + << QString() << QString() + << (QList<Task>() + << Task(Task::Error, + QString::fromLatin1("missing separator (did you mean TAB instead of 8 spaces?). Stop."), + QString::fromLatin1("Makefile"), 360, + Constants::TASK_CATEGORY_BUILDSYSTEM)) + << QString() + << QStringList(); } void ProjectExplorerPlugin::testGnuMakeParserParsing() diff --git a/src/plugins/projectexplorer/gnumakeparser.h b/src/plugins/projectexplorer/gnumakeparser.h index 433375622310a19f466fa4d47a44e755f1aee0bf..a86bba8f8d6c3d3ff17edba1829a4d8dba1d2452 100644 --- a/src/plugins/projectexplorer/gnumakeparser.h +++ b/src/plugins/projectexplorer/gnumakeparser.h @@ -57,12 +57,14 @@ private: QRegExp m_makeDir; QRegExp m_makeLine; + QRegExp m_makefileError; QStringList m_directories; #if defined WITH_TESTS friend class ProjectExplorerPlugin; #endif + bool m_alreadyFatal; }; } // namespace ProjectExplorer