diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 6ca7e210787247545b2e9384106dd457611e6c03..e49ccb539ceb2038abfe600c783e60a87c0fb8ff 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -35,6 +35,8 @@ #include "qt4buildconfiguration.h" #include "qt4projectmanagerconstants.h" #include "qtparser.h" +#include "qt-s60/abldparser.h" +#include "qt-s60/sbsv2parser.h" #include <projectexplorer/buildsteplist.h> #include <projectexplorer/gnumakeparser.h> @@ -171,8 +173,19 @@ bool MakeStep::init() setEnabled(true); setArguments(args); - setOutputParser(new QtParser); - appendOutputParser(new ProjectExplorer::GnuMakeParser(workingDirectory)); + if (bc->qtVersion()->supportsTargetId(Qt4ProjectManager::Constants::S60_DEVICE_TARGET_ID) || + bc->qtVersion()->supportsTargetId(Qt4ProjectManager::Constants::S60_EMULATOR_TARGET_ID)) { + if (bc->qtVersion()->isBuildWithSymbianSbsV2()) { + setOutputParser(new SbsV2Parser); + } else { + setOutputParser(new AbldParser); + appendOutputParser(new ProjectExplorer::GnuMakeParser(workingDirectory)); + } + } else { + setOutputParser(new ProjectExplorer::GnuMakeParser(workingDirectory)); + } + appendOutputParser(new QtParser); + if (toolchain) appendOutputParser(toolchain->outputParser()); diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri index 428376e5096ce3c560a385865c5c6a1047e1b370..1dfbb5d8afcd9a03213631a1bc440bfd750d8bb7 100644 --- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri +++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri @@ -4,6 +4,7 @@ SOURCES += $$PWD/s60devices.cpp \ $$PWD/s60devicespreferencepane.cpp \ $$PWD/s60manager.cpp \ + $$PWD/sbsv2parser.cpp \ $$PWD/winscwtoolchain.cpp \ $$PWD/gccetoolchain.cpp \ $$PWD/s60emulatorrunconfiguration.cpp \ @@ -22,6 +23,7 @@ SOURCES += $$PWD/s60devices.cpp \ HEADERS += $$PWD/s60devices.h \ $$PWD/s60devicespreferencepane.h \ $$PWD/s60manager.h \ + $$PWD/sbsv2parser.h \ $$PWD/winscwtoolchain.h \ $$PWD/gccetoolchain.h \ $$PWD/s60emulatorrunconfiguration.h \ diff --git a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp index f5856ad29a86028ae5a912702bc4c0dac6460eab..e876e4f1db9653d79ebb10f293673b0e8fb005c1 100644 --- a/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp +++ b/src/plugins/qt4projectmanager/qt-s60/s60createpackagestep.cpp @@ -34,6 +34,7 @@ #include "qt4nodes.h" #include "qt4project.h" #include "abldparser.h" +#include "sbsv2parser.h" #include "signsisparser.h" #include "passphraseforkeydialog.h" @@ -190,8 +191,11 @@ bool S60CreatePackageStep::init() } delete m_outputParserChain; - m_outputParserChain = new ProjectExplorer::GnuMakeParser; - m_outputParserChain->appendOutputParser(new Qt4ProjectManager::AbldParser); + if (qt4BuildConfiguration()->qtVersion()->isBuildWithSymbianSbsV2()) + m_outputParserChain = new Qt4ProjectManager::SbsV2Parser; + else + m_outputParserChain = new Qt4ProjectManager::AbldParser; + m_outputParserChain->appendOutputParser(new ProjectExplorer::GnuMakeParser); m_outputParserChain->appendOutputParser(new Qt4ProjectManager::SignsisParser); connect(m_outputParserChain, SIGNAL(addOutput(QString, ProjectExplorer::BuildStep::OutputFormat)), diff --git a/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.cpp b/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.cpp new file mode 100644 index 0000000000000000000000000000000000000000..8d0fa8f94926e759ca50b202040462df5c4341ac --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.cpp @@ -0,0 +1,228 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "sbsv2parser.h" + +#include <extensionsystem/pluginmanager.h> +#include <projectexplorer/gnumakeparser.h> +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/taskhub.h> +#include <projectexplorer/taskwindow.h> + +#include <QtCore/QFile> +#include <QtCore/QFileInfo> + +using namespace Qt4ProjectManager; +using namespace ProjectExplorer; +using namespace ProjectExplorer::Constants; + +/* + * This parser takes a somewhat unusal approach of just eating most of its + * input :-) + * + * Only when the XML-based log file generated by SBSv2 is announced it will + * open that file and parse that. Tasks will then get generated by passing + * any CDATA found in the XML file on to its child parsers (using STDERR). + * + * In additon <error> and <warning> tags are reported, too. + */ + +SbsV2Parser::SbsV2Parser() : + m_hub(0) +{ + setObjectName(QLatin1String("SbsV2Parser")); + ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); + m_hub = pm->getObject<TaskHub>(); +} + +void SbsV2Parser::stdOutput(const QString &line) +{ + // Eat most output! + if (line.startsWith(QLatin1String("sbs: build log in "))) { + QString logfile = line.mid(18).trimmed(); + parseLogFile(logfile); + addTask(ProjectExplorer::Task(Task::Unknown, tr("SBSv2 build log"), + logfile, -1, + QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))); + } +} + +void SbsV2Parser::stdError(const QString &line) +{ + // Eat all output! + Q_UNUSED(line); +} + +void SbsV2Parser::taskAdded(const ProjectExplorer::Task &task) +{ + // Fix pathes: + ProjectExplorer::Task tmp(task); + + if (!tmp.file.isEmpty()) { + QFileInfo fi(tmp.file); + if (!fi.isAbsolute()) { + if (m_currentSource.exists(tmp.file)) + tmp.file = m_currentSource.absoluteFilePath(tmp.file); + else if (m_currentTarget.exists(tmp.file)) + tmp.file = m_currentTarget.absoluteFilePath(tmp.file); + } + } + + // Do not report tasks from our children via the normal channel: + // We do not want them get registered with the Compile output window! + m_hub->addTask(tmp); +} + +void SbsV2Parser::parseLogFile(const QString &file) +{ + QFile logFile(file); + logFile.open(QIODevice::ReadOnly); + m_log.setDevice(&logFile); + + if (m_log.readNextStartElement()) { + if (m_log.name() == QLatin1String("buildlog")) + readBuildLog(); + else + m_log.raiseError(QObject::tr("The file is not SBSv2 log file.")); + } +} + +void SbsV2Parser::readBuildLog() +{ + Q_ASSERT(m_log.isStartElement() && m_log.name() == QLatin1String("buildlog")); + + while (m_log.readNextStartElement()) { + if (m_log.name() == QLatin1String("error")) + readError(); + else if (m_log.name() == QLatin1String("warning")) + readWarning(); + else if (m_log.name() == QLatin1String("recipe")) + readRecipe(); + else + m_log.skipCurrentElement(); + } +} + +void SbsV2Parser::readError() +{ + Q_ASSERT(m_log.isStartElement() && m_log.name() == QLatin1String("error")); + + QString error = m_log.readElementText(); + addTask(Task(Task::Error, error, QString(), -1, Constants::TASK_CATEGORY_BUILDSYSTEM)); +} + +void SbsV2Parser::readWarning() +{ + Q_ASSERT(m_log.isStartElement() && m_log.name() == QLatin1String("warning")); + + QString warning = m_log.readElementText(); + addTask(Task(Task::Warning, warning, QString(), -1, Constants::TASK_CATEGORY_BUILDSYSTEM)); +} + +void SbsV2Parser::readRecipe() +{ + Q_ASSERT(m_log.isStartElement() && m_log.name() == QLatin1String("recipe")); + const QString name = m_log.attributes().value(QLatin1String("name")).toString(); + + if (name == QLatin1String("compile") || + name == QLatin1String("qmake_extra_pre_targetdep")) { + m_currentSource = QDir(m_log.attributes().value("source").toString()).absolutePath(); + m_currentTarget = QDir(m_log.attributes().value("target").toString()).absolutePath(); + qDebug() << "SOURCE:" << m_currentSource.absolutePath(); + qDebug() << "TARGET:" << m_currentTarget.absolutePath(); + + QStringList output = m_log.readElementText().split(QChar('\n')); + foreach (const QString &line, output) { + if (line.isEmpty() || line.startsWith(QChar('+'))) + continue; + IOutputParser::stdError(line); + } + } else { + m_log.skipCurrentElement(); + } +} + +// Unit tests: + +#ifdef WITH_TESTS +# include <QTest> + +# include "qt4projectmanagerplugin.h" + +# include "projectexplorer/outputparser_test.h" + +using namespace Qt4ProjectManager::Internal; + +void Qt4ProjectManagerPlugin::testSbsV2OutputParsers_data() +{ + QTest::addColumn<QString>("input"); + QTest::addColumn<OutputParserTester::Channel>("inputChannel"); + QTest::addColumn<QString>("childStdOutLines"); + QTest::addColumn<QString>("childStdErrLines"); + QTest::addColumn<QList<ProjectExplorer::Task> >("tasks"); + QTest::addColumn<QString>("outputLines"); + + + QTest::newRow("eat stdout") + << QString::fromLatin1(" Sometext") << OutputParserTester::STDOUT + << QString() << QString() + << QList<ProjectExplorer::Task>() + << QString(); + QTest::newRow("eat stderr") + << QString::fromLatin1(" Sometext") << OutputParserTester::STDERR + << QString() << QString() + << QList<ProjectExplorer::Task>() + << QString(); + + QTest::newRow("build log") + << QString::fromLatin1("sbs: build log in X:/epoc32/build/Makefile.2010-08-10-15-25-52.log") << OutputParserTester::STDOUT + << QString() << QString() + << (QList<ProjectExplorer::Task>() + << ProjectExplorer::Task(Task::Unknown, QLatin1String("SBSv2 build log"), + QLatin1String("X:/epoc32/build/Makefile.2010-08-10-15-25-52.log"), -1, + QLatin1String(ProjectExplorer::Constants::TASK_CATEGORY_BUILDSYSTEM))) + << QString(); +} + +void Qt4ProjectManagerPlugin::testSbsV2OutputParsers() +{ + OutputParserTester testbench; + testbench.appendOutputParser(new SbsV2Parser); + QFETCH(QString, input); + QFETCH(OutputParserTester::Channel, inputChannel); + QFETCH(QList<Task>, tasks); + QFETCH(QString, childStdOutLines); + QFETCH(QString, childStdErrLines); + QFETCH(QString, outputLines); + + testbench.testParsing(input, inputChannel, + tasks, childStdOutLines, childStdErrLines, + outputLines); +} +#endif diff --git a/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.h b/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.h new file mode 100644 index 0000000000000000000000000000000000000000..f6bf1e21fcafd100ca4f40332fb11a33516fd20a --- /dev/null +++ b/src/plugins/qt4projectmanager/qt-s60/sbsv2parser.h @@ -0,0 +1,72 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#ifndef SBSV2PARSER_H +#define SBSV2PARSER_H + +#include <projectexplorer/ioutputparser.h> + +#include <QtCore/QDir> +#include <QtXml/QXmlStreamReader> + +namespace ProjectExplorer { +class TaskHub; +} + +namespace Qt4ProjectManager { + +class SbsV2Parser : public ProjectExplorer::IOutputParser +{ + Q_OBJECT + +public: + SbsV2Parser(); + + virtual void stdOutput(const QString & line); + virtual void stdError(const QString & line); + +public slots: + virtual void taskAdded(const ProjectExplorer::Task &task); + +private: + void parseLogFile(const QString &file); + void readBuildLog(); + void readError(); + void readWarning(); + void readRecipe(); + + QXmlStreamReader m_log; + QDir m_currentSource; + QDir m_currentTarget; + ProjectExplorer::TaskHub *m_hub; +}; + +} // namespace Qt4ProjectExplorer + +#endif // SBSV2PARSER_H diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 1015ea4989d9767f52ff73cff2af842ec0f3d385..8fc4b18e6480c6d5d26c7b02b3861dc11f62aa10 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -286,7 +286,6 @@ void Qt4ProjectManagerPlugin::buildStateChanged(ProjectExplorer::Project *pro) #ifdef WITH_TESTS void Qt4ProjectManagerPlugin::testBasicProjectLoading() { - QString testDirectory = ExtensionSystem::PluginManager::instance()->testDataDirectory() + "/qt4projectmanager/"; QString test1 = testDirectory + "test1/test1.pro"; m_projectExplorer->openProject(test1); diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h index 0a771d4db2a2422027bae41d760e716ae97b5072..b5c41ecc71a6b55e44b4969f1a07d848a0c5bc91 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.h @@ -76,12 +76,14 @@ private slots: void buildStateChanged(ProjectExplorer::Project *pro); #ifdef WITH_TESTS - void testBasicProjectLoading(); + void testBasicProjectLoading(); // Test fails! void testAbldOutputParsers_data(); void testAbldOutputParsers(); void testQtOutputParser_data(); void testQtOutputParser(); + void testSbsV2OutputParsers_data(); + void testSbsV2OutputParsers(); #endif private: