diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.cpp b/src/plugins/cmakeprojectmanager/cmakeproject.cpp index 6d836388f025220554a703b084b117d52e885ae0..070aec39d62c08420691d34f7ff57953d51c268c 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeproject.cpp @@ -40,6 +40,7 @@ #include "cmakestep.h" #include "makestep.h" +#include <projectexplorer/projectexplorerconstants.h> #include <cpptools/cppmodelmanagerinterface.h> #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -103,7 +104,7 @@ void CMakeProject::parseCMakeLists() } else { // TODO hmm? } - if (newToolChain == m_toolChain) { + if (ProjectExplorer::ToolChain::equals(newToolChain, m_toolChain)) { delete newToolChain; newToolChain = 0; } else { @@ -158,6 +159,21 @@ void CMakeProject::parseCMakeLists() } } +QString CMakeProject::buildParser(const QString &buildConfiguration) const +{ + if (!m_toolChain) + return QString::null; + if (m_toolChain->type() == ProjectExplorer::ToolChain::GCC + || m_toolChain->type() == ProjectExplorer::ToolChain::LinuxICC + || m_toolChain->type() == ProjectExplorer::ToolChain::MinGW) { + return ProjectExplorer::Constants::BUILD_PARSER_GCC; + } else if (m_toolChain->type() == ProjectExplorer::ToolChain::MSVC + || m_toolChain->type() == ProjectExplorer::ToolChain::WINCE) { + return ProjectExplorer::Constants::BUILD_PARSER_MSVC; + } + return QString::null; +} + QStringList CMakeProject::targets() const { QStringList results; diff --git a/src/plugins/cmakeprojectmanager/cmakeproject.h b/src/plugins/cmakeprojectmanager/cmakeproject.h index 3494441489ef9be686fd14b1a25af23fcd97fb00..4c9b2e1d529c3241f2d2238cf694f3441ed217c7 100644 --- a/src/plugins/cmakeprojectmanager/cmakeproject.h +++ b/src/plugins/cmakeprojectmanager/cmakeproject.h @@ -105,6 +105,7 @@ public: MakeStep *makeStep() const; CMakeStep *cmakeStep() const; QStringList targets() const; + QString buildParser(const QString &buildConfiguration) const; private: void parseCMakeLists(); diff --git a/src/plugins/cmakeprojectmanager/makestep.cpp b/src/plugins/cmakeprojectmanager/makestep.cpp index 60f5d04903ebd5398b481d91ef70f5231678b335..44476f6fbe7b2860ae64c70d12bd264dd14e7d40 100644 --- a/src/plugins/cmakeprojectmanager/makestep.cpp +++ b/src/plugins/cmakeprojectmanager/makestep.cpp @@ -34,6 +34,7 @@ #include "makestep.h" #include "cmakeprojectconstants.h" #include "cmakeproject.h" +#include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> #include <QtGui/QFormLayout> @@ -42,6 +43,11 @@ #include <QtGui/QLineEdit> #include <QtGui/QListWidget> +namespace { +bool debug = false; +} + + using namespace CMakeProjectManager; using namespace CMakeProjectManager::Internal; @@ -52,10 +58,42 @@ MakeStep::MakeStep(CMakeProject *pro) MakeStep::~MakeStep() { + delete m_buildParser; + m_buildParser = 0; } bool MakeStep::init(const QString &buildConfiguration) { + // TODO figure out the correct build parser + delete m_buildParser; + m_buildParser = 0; + QString buildParser = m_pro->buildParser(buildConfiguration); + QList<ProjectExplorer::IBuildParserFactory *> buildParserFactories = + ExtensionSystem::PluginManager::instance()->getObjects<ProjectExplorer::IBuildParserFactory>(); + + foreach (ProjectExplorer::IBuildParserFactory * factory, buildParserFactories) + if (factory->canCreate(buildParser)) { + m_buildParser = factory->create(buildParser); + break; + } + if (m_buildParser) { + connect(m_buildParser, SIGNAL(addToOutputWindow(const QString &)), + this, SIGNAL(addToOutputWindow(const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(addToTaskWindow(const QString &, int, int, const QString &)), + this, SLOT(slotAddToTaskWindow(const QString &, int, int, const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(enterDirectory(const QString &)), + this, SLOT(addDirectory(const QString &)), + Qt::DirectConnection); + connect(m_buildParser, SIGNAL(leaveDirectory(const QString &)), + this, SLOT(removeDirectory(const QString &)), + Qt::DirectConnection); + } + + m_openDirectories.clear(); + addDirectory(m_pro->buildDirectory(buildConfiguration)); + setEnabled(buildConfiguration, true); setWorkingDirectory(buildConfiguration, m_pro->buildDirectory(buildConfiguration)); setCommand(buildConfiguration, "make"); // TODO give full path here? @@ -89,6 +127,79 @@ bool MakeStep::immutable() const return true; } +void MakeStep::stdOut(const QString &line) +{ + if (m_buildParser) + m_buildParser->stdOutput(line); + AbstractProcessStep::stdOut(line); +} + +void MakeStep::stdError(const QString &line) +{ + if (m_buildParser) + m_buildParser->stdError(line); + AbstractProcessStep::stdError(line); +} + +void MakeStep::slotAddToTaskWindow(const QString & fn, int type, int linenumber, const QString & description) +{ + QString filePath = fn; + if (!filePath.isEmpty() && !QDir::isAbsolutePath(filePath)) { + // We have no save way to decide which file in which subfolder + // is meant. Therefore we apply following heuristics: + // 1. Search for unique file in directories currently indicated as open by GNU make + // (Enter directory xxx, Leave directory xxx...) + current directory + // 3. Check if file is unique in whole project + // 4. Otherwise give up + + filePath = filePath.trimmed(); + + QList<QFileInfo> possibleFiles; + foreach (const QString &dir, m_openDirectories) { + QFileInfo candidate(dir + QLatin1Char('/') + filePath); + if (debug) + qDebug() << "Checking path " << candidate.filePath(); + if (candidate.exists() + && !possibleFiles.contains(candidate)) { + if (debug) + qDebug() << candidate.filePath() << "exists!"; + possibleFiles << candidate; + } + } + if (possibleFiles.count() == 0) { + if (debug) + qDebug() << "No success. Trying all files in project ..."; + QString fileName = QFileInfo(filePath).fileName(); + foreach (const QString &file, project()->files(ProjectExplorer::Project::AllFiles)) { + QFileInfo candidate(file); + if (candidate.fileName() == fileName) { + if (debug) + qDebug() << "Found " << file; + possibleFiles << candidate; + } + } + } + if (possibleFiles.count() == 1) + filePath = possibleFiles.first().filePath(); + else + qWarning() << "Could not find absolute location of file " << filePath; + } + emit addToTaskWindow(filePath, type, linenumber, description); +} + +void MakeStep::addDirectory(const QString &dir) +{ + if (!m_openDirectories.contains(dir)) + m_openDirectories.insert(dir); +} + +void MakeStep::removeDirectory(const QString &dir) +{ + if (m_openDirectories.contains(dir)) + m_openDirectories.remove(dir); +} + + CMakeProject *MakeStep::project() const { return m_pro; @@ -154,7 +265,6 @@ void MakeBuildStepConfigWidget::init(const QString &buildConfiguration) } // and connect again connect(m_targetsList, SIGNAL(itemChanged(QListWidgetItem*)), this, SLOT(itemChanged(QListWidgetItem*))); - } // diff --git a/src/plugins/cmakeprojectmanager/makestep.h b/src/plugins/cmakeprojectmanager/makestep.h index fbfc007dbe44362154e5ee06e05a41b6115254cc..012fb837bc61fd8f6516374c6510c7cf6376acbb 100644 --- a/src/plugins/cmakeprojectmanager/makestep.h +++ b/src/plugins/cmakeprojectmanager/makestep.h @@ -64,8 +64,17 @@ public: CMakeProject *project() const; bool buildsTarget(const QString &buildConfiguration, const QString &target) const; void setBuildTarget(const QString &buildConfiguration, const QString &target, bool on); +private slots: + void slotAddToTaskWindow(const QString & fn, int type, int linenumber, const QString & description); + void addDirectory(const QString &dir); + void removeDirectory(const QString &dir); +protected: + virtual void stdOut(const QString &line); + virtual void stdError(const QString &line); private: CMakeProject *m_pro; + ProjectExplorer::BuildParserInterface *m_buildParser; + QSet<QString> m_openDirectories; }; class MakeBuildStepConfigWidget :public ProjectExplorer::BuildStepConfigWidget diff --git a/src/plugins/qt4projectmanager/buildparserfactory.cpp b/src/plugins/projectexplorer/buildparserfactory.cpp similarity index 95% rename from src/plugins/qt4projectmanager/buildparserfactory.cpp rename to src/plugins/projectexplorer/buildparserfactory.cpp index 9b52fafb23be7c833addd046bd9309b9a1175882..2cad67e2145ec98f48f1e716d026a6122dd8a245 100644 --- a/src/plugins/qt4projectmanager/buildparserfactory.cpp +++ b/src/plugins/projectexplorer/buildparserfactory.cpp @@ -33,11 +33,11 @@ #include "buildparserfactory.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include "gccparser.h" #include "msvcparser.h" -using namespace Qt4ProjectManager::Internal; +using namespace ProjectExplorer::Internal; GccParserFactory::~GccParserFactory() { diff --git a/src/plugins/qt4projectmanager/buildparserfactory.h b/src/plugins/projectexplorer/buildparserfactory.h similarity index 94% rename from src/plugins/qt4projectmanager/buildparserfactory.h rename to src/plugins/projectexplorer/buildparserfactory.h index a52c33f719323800d01e77cc7a47d694ca220e75..98690d250764fdf76bd81f4dc75893ab8cc4bb00 100644 --- a/src/plugins/qt4projectmanager/buildparserfactory.h +++ b/src/plugins/projectexplorer/buildparserfactory.h @@ -36,14 +36,14 @@ #include <projectexplorer/buildparserinterface.h> -namespace Qt4ProjectManager { +namespace ProjectExplorer { namespace Internal { class GccParserFactory : public ProjectExplorer::IBuildParserFactory { Q_OBJECT public: - GccParserFactory() {}; + GccParserFactory() {} virtual ~GccParserFactory(); virtual bool canCreate(const QString & name) const; virtual ProjectExplorer::BuildParserInterface * create(const QString & name) const; @@ -53,13 +53,13 @@ class MsvcParserFactory : public ProjectExplorer::IBuildParserFactory { Q_OBJECT public: - MsvcParserFactory() {}; + MsvcParserFactory() {} virtual ~MsvcParserFactory(); virtual bool canCreate(const QString & name) const; virtual ProjectExplorer::BuildParserInterface * create(const QString & name) const; }; } // namespace Internal -} // namespace Qt4ProjectManager +} // namespace ProjectExplorer #endif // BUILDPARSERFACTORY_H diff --git a/src/plugins/qt4projectmanager/gccparser.cpp b/src/plugins/projectexplorer/gccparser.cpp similarity index 96% rename from src/plugins/qt4projectmanager/gccparser.cpp rename to src/plugins/projectexplorer/gccparser.cpp index b71a3362f55f12a07c4b559c7d66868542b47caf..97a358a0e4ccbc6ac396602e0dee5c014cd360be 100644 --- a/src/plugins/qt4projectmanager/gccparser.cpp +++ b/src/plugins/projectexplorer/gccparser.cpp @@ -32,11 +32,11 @@ ***************************************************************************/ #include "gccparser.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include <QDebug> -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; GccParser::GccParser() { @@ -56,7 +56,7 @@ GccParser::GccParser() QString GccParser::name() const { - return QLatin1String(Qt4ProjectManager::Constants::BUILD_PARSER_GCC); + return QLatin1String(ProjectExplorer::Constants::BUILD_PARSER_GCC); } void GccParser::stdOutput(const QString & line) diff --git a/src/plugins/qt4projectmanager/gccparser.h b/src/plugins/projectexplorer/gccparser.h similarity index 95% rename from src/plugins/qt4projectmanager/gccparser.h rename to src/plugins/projectexplorer/gccparser.h index 80796f4be2a11b2348b9893e3b81064ef33a3dd7..47e4aae4e136bd29f7ad0114915648f24408683a 100644 --- a/src/plugins/qt4projectmanager/gccparser.h +++ b/src/plugins/projectexplorer/gccparser.h @@ -34,11 +34,11 @@ #ifndef GCCPARSER_H #define GCCPARSER_H -#include <projectexplorer/buildparserinterface.h> +#include "buildparserinterface.h" #include <QtCore/QRegExp> -namespace Qt4ProjectManager { +namespace ProjectExplorer { class GccParser : public ProjectExplorer::BuildParserInterface { diff --git a/src/plugins/qt4projectmanager/msvcparser.cpp b/src/plugins/projectexplorer/msvcparser.cpp similarity index 95% rename from src/plugins/qt4projectmanager/msvcparser.cpp rename to src/plugins/projectexplorer/msvcparser.cpp index d4a23264c79c2782f2f71bd3e4c19ffaee25cd87..b089638dd1a218c05e59864105ee1dddc5d86634 100644 --- a/src/plugins/qt4projectmanager/msvcparser.cpp +++ b/src/plugins/projectexplorer/msvcparser.cpp @@ -32,11 +32,11 @@ ***************************************************************************/ #include "msvcparser.h" -#include "qt4projectmanagerconstants.h" +#include "projectexplorerconstants.h" #include <QtCore/QStringList> -using namespace Qt4ProjectManager; +using namespace ProjectExplorer; MsvcParser::MsvcParser() { @@ -48,7 +48,7 @@ MsvcParser::MsvcParser() QString MsvcParser::name() const { - return QLatin1String(Qt4ProjectManager::Constants::BUILD_PARSER_MSVC); + return QLatin1String(ProjectExplorer::Constants::BUILD_PARSER_MSVC); } void MsvcParser::stdError(const QString & line) diff --git a/src/plugins/qt4projectmanager/msvcparser.h b/src/plugins/projectexplorer/msvcparser.h similarity index 95% rename from src/plugins/qt4projectmanager/msvcparser.h rename to src/plugins/projectexplorer/msvcparser.h index 06e0c3e6d612497e803c70ad15f6327642532d5e..29587cadb6772e0d77e8d45b74ccafb2e92a7e5a 100644 --- a/src/plugins/qt4projectmanager/msvcparser.h +++ b/src/plugins/projectexplorer/msvcparser.h @@ -34,11 +34,11 @@ #ifndef MSVCPARSER_H #define MSVCPARSER_H -#include <projectexplorer/buildparserinterface.h> +#include "buildparserinterface.h" #include <QtCore/QRegExp> -namespace Qt4ProjectManager { +namespace ProjectExplorer { class MsvcParser : public ProjectExplorer::BuildParserInterface { diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 2380c9b61d644090d9dcb767e8f36ff8ae40a079..c4a94042df5363d56f209239ac2c9e06537cbb0e 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -59,6 +59,7 @@ #include "scriptwrappers.h" #include "session.h" #include "sessiondialog.h" +#include "buildparserfactory.h" #include <coreplugin/basemode.h> #include <coreplugin/coreconstants.h> @@ -233,6 +234,10 @@ bool ProjectExplorerPlugin::initialize(const QStringList &arguments, QString *er addAutoReleasedObject(new ProjectFileWizardExtension); + // Build parsers + addAutoReleasedObject(new GccParserFactory); + addAutoReleasedObject(new MsvcParserFactory); + // context menus Core::ActionContainer *msessionContextMenu = am->createMenu(Constants::M_SESSIONCONTEXT); diff --git a/src/plugins/projectexplorer/projectexplorer.pro b/src/plugins/projectexplorer/projectexplorer.pro index 2cfeecf47cfaac320856662220deeac7f576c998..1feeea4ebd87c6145a9c80537baa526ca7e075c9 100644 --- a/src/plugins/projectexplorer/projectexplorer.pro +++ b/src/plugins/projectexplorer/projectexplorer.pro @@ -54,7 +54,10 @@ HEADERS += projectexplorer.h \ projectmodels.h \ currentprojectfind.h \ toolchain.h \ - cesdkhandler.h + cesdkhandler.h\ + buildparserfactory.h\ + gccparser.h\ + msvcparser.h SOURCES += projectexplorer.cpp \ projectwindow.cpp \ buildmanager.cpp \ @@ -97,7 +100,10 @@ SOURCES += projectexplorer.cpp \ projectmodels.cpp \ currentprojectfind.cpp \ toolchain.cpp \ - cesdkhandler.cpp + cesdkhandler.cpp\ + buildparserfactory.cpp \ + gccparser.cpp\ + msvcparser.cpp FORMS += dependenciespanel.ui \ buildsettingspropertiespage.ui \ processstep.ui \ diff --git a/src/plugins/projectexplorer/projectexplorerconstants.h b/src/plugins/projectexplorer/projectexplorerconstants.h index e65ca54d099524d1f114829786d46f61f58a523b..183259be10d15d035a4b7e97dcc9642322b1961f 100644 --- a/src/plugins/projectexplorer/projectexplorerconstants.h +++ b/src/plugins/projectexplorer/projectexplorerconstants.h @@ -176,6 +176,11 @@ const char * const CPP_HEADER_MIMETYPE = "text/x-c++hdr"; const char * const FORM_MIMETYPE = "application/x-designer"; const char * const RESOURCE_MIMETYPE = "application/vnd.nokia.xml.qt.resource"; +// build parsers +const char * const BUILD_PARSER_MSVC = "BuildParser.MSVC"; +const char * const BUILD_PARSER_GCC = "BuildParser.Gcc"; + + } // namespace Constants } // namespace ProjectExplorer diff --git a/src/plugins/qt4projectmanager/makestep.cpp b/src/plugins/qt4projectmanager/makestep.cpp index 8e6eb1542d62a6420d2c59e6fa73ef8651508f9b..46683252d0bd420ce149adde9c1427c0fdfbc883 100644 --- a/src/plugins/qt4projectmanager/makestep.cpp +++ b/src/plugins/qt4projectmanager/makestep.cpp @@ -36,6 +36,8 @@ #include "qt4project.h" #include "qt4projectmanagerconstants.h" +#include <projectexplorer/projectexplorerconstants.h> + #include <extensionsystem/pluginmanager.h> #include <utils/qtcassert.h> @@ -71,9 +73,9 @@ ProjectExplorer::BuildParserInterface *MakeStep::buildParser(const QtVersion * c QString buildParser; ProjectExplorer::ToolChain::ToolChainType type = version->toolchainType(); if ( type == ProjectExplorer::ToolChain::MSVC || type == ProjectExplorer::ToolChain::WINCE) - buildParser = Constants::BUILD_PARSER_MSVC; + buildParser = ProjectExplorer::Constants::BUILD_PARSER_MSVC; else - buildParser = Constants::BUILD_PARSER_GCC; + buildParser = ProjectExplorer::Constants::BUILD_PARSER_GCC; QList<IBuildParserFactory *> buildParserFactories = ExtensionSystem::PluginManager::instance()->getObjects<ProjectExplorer::IBuildParserFactory>(); diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 5e18e1f9d483f888d5287af1446be66f8409777e..04ac5d8067be1459f3427055fda69ed6bf792b4c 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -28,9 +28,6 @@ HEADERS = qt4projectmanagerplugin.h \ makestep.h \ qmakestep.h \ qmakebuildstepfactory.h \ - gccparser.h \ - msvcparser.h \ - buildparserfactory.h \ deployhelper.h \ embeddedpropertiespage.h \ qt4runconfiguration.h \ @@ -63,9 +60,6 @@ SOURCES = qt4projectmanagerplugin.cpp \ makestep.cpp \ qmakestep.cpp \ qmakebuildstepfactory.cpp \ - gccparser.cpp \ - msvcparser.cpp \ - buildparserfactory.cpp \ deployhelper.cpp \ embeddedpropertiespage.cpp \ qt4runconfiguration.cpp \ diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index 1ef68a68f5f89bb9301c982360fb983ed6e0ccb8..7261310ff5fbc3a9471cb190b120b29f1ae01968 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -79,10 +79,6 @@ const char * const GDBMACROSBUILDSTEP = "trolltech.qt4projectmanager.gdbmaros"; const char * const QT4RUNSTEP = "trolltech.qt4projectmanager.qt4runstep"; const char * const DEPLOYHELPERRUNSTEP = "trolltech.qt4projectmanager.deployhelperrunstep"; -// build parsers -const char * const BUILD_PARSER_MSVC = "BuildParser.MSVC"; -const char * const BUILD_PARSER_GCC = "BuildParser.Gcc"; - // views const char * const VIEW_DETAILED = "Qt4.View.Detailed"; const char * const VIEW_PROFILESONLY = "Qt4.View.ProjectHierarchy"; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index 0d90983aa88f389999da2c8a909283490364ec23..f1df421b6263c8b27971b3577c2115b8598c0e12 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -41,7 +41,6 @@ #include "qt4projectmanagerconstants.h" #include "qt4project.h" #include "qmakebuildstepfactory.h" -#include "buildparserfactory.h" #include "qtversionmanager.h" #include "embeddedpropertiespage.h" #include "qt4runconfiguration.h" @@ -133,9 +132,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new MakeBuildStepFactory); addAutoReleasedObject(new GdbMacrosBuildStepFactory); - addAutoReleasedObject(new GccParserFactory); - addAutoReleasedObject(new MsvcParserFactory); - m_qtVersionManager = new QtVersionManager; addObject(m_qtVersionManager);