diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 28213df1e897948312824f0f89f0a32cc348d723..3a888a8c6784faf02cb1776a528e016521214683 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -123,6 +123,11 @@ QWidget *CMakeRunConfiguration::configurationWidget() return new QWidget(); } +QString CMakeRunConfiguration::dumperLibrary() const +{ + return QString(); +} + // Factory CMakeRunConfigurationFactory::CMakeRunConfigurationFactory() { diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h index d2a142ff9f498b4533c3c5ef4f930d3564a77ee5..8e01eb9d6459387fd5f5721ecea058134de1a26d 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.h @@ -59,6 +59,7 @@ public: virtual void save(ProjectExplorer::PersistentSettingsWriter &writer) const; virtual void restore(const ProjectExplorer::PersistentSettingsReader &reader); + virtual QString dumperLibrary() const; private: RunMode m_runMode; QString m_target; diff --git a/src/plugins/debugger/debuggerrunner.cpp b/src/plugins/debugger/debuggerrunner.cpp index 3cc74138f408a9919f178e166e9688259cb44804..e5eefdc096e102576e64e730c13d66a259a10e51 100644 --- a/src/plugins/debugger/debuggerrunner.cpp +++ b/src/plugins/debugger/debuggerrunner.cpp @@ -132,8 +132,6 @@ void DebuggerRunControl::start() project->buildDirectory(project->activeBuildConfiguration()); m_manager->m_useTerminal = rc->runMode() == ApplicationRunConfiguration::Console; - //<daniel> andre: + "\qtc-gdbmacros\" - //emit addToOutputWindow(this, tr("Debugging %1").arg(m_executable)); if (m_manager->startNewDebugger(StartInternal)) emit started(); diff --git a/src/plugins/projectexplorer/applicationrunconfiguration.h b/src/plugins/projectexplorer/applicationrunconfiguration.h index 6fd9c993c1566095662926feb1e4c48957396426..e23818c1f9fedd956a7ca560d1b48b7cfce40ac0 100644 --- a/src/plugins/projectexplorer/applicationrunconfiguration.h +++ b/src/plugins/projectexplorer/applicationrunconfiguration.h @@ -54,6 +54,7 @@ public: virtual QString workingDirectory() const = 0; virtual QStringList commandLineArguments() const = 0; virtual Environment environment() const = 0; + virtual QString dumperLibrary() const = 0; virtual void save(PersistentSettingsWriter &writer) const; virtual void restore(const PersistentSettingsReader &reader); diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index 06ab960e35690090a4deac6826c6cb03d2dba7c9..47a1748f4e72ddc99aebfbfcc51974ee22de4e1a 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -308,6 +308,13 @@ void CustomExecutableRunConfiguration::setUserName(const QString &name) emit changed(); } +QString CustomExecutableRunConfiguration::dumperLibrary() const +{ + return QString(); +} + + + // Factory CustomExecutableRunConfigurationFactory::CustomExecutableRunConfigurationFactory() diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.h b/src/plugins/projectexplorer/customexecutablerunconfiguration.h index 6d2ca1755a35e2f62e3c3753a8734effaeb78d87..107c889f954c4e9e72128612af856ababa7f03ca 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.h +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.h @@ -86,6 +86,7 @@ public: virtual void restore(const PersistentSettingsReader &reader); virtual QWidget *configurationWidget(); + virtual QString dumperLibrary() const; signals: void changed(); diff --git a/src/plugins/qt4projectmanager/gdbmacrosbuildstep.cpp b/src/plugins/qt4projectmanager/gdbmacrosbuildstep.cpp deleted file mode 100644 index 4fe0dc00045c8b9ad57e9e72eedcb5a8edcac8a3..0000000000000000000000000000000000000000 --- a/src/plugins/qt4projectmanager/gdbmacrosbuildstep.cpp +++ /dev/null @@ -1,229 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** -**************************************************************************/ - -#include "gdbmacrosbuildstep.h" - -#include "makestep.h" -#include "qmakestep.h" -#include "qt4project.h" -#include "qt4projectmanagerconstants.h" - -#include <coreplugin/icore.h> -#include <utils/qtcassert.h> - -#include <QFileInfo> - -using namespace Qt4ProjectManager; -using namespace Qt4ProjectManager::Internal; - -GdbMacrosBuildStep::GdbMacrosBuildStep(Qt4Project *project) - : BuildStep(project), m_project(project) -{ -} - -GdbMacrosBuildStep::~GdbMacrosBuildStep() -{ -} - -bool GdbMacrosBuildStep::init(const QString &buildConfiguration) -{ - m_buildDirectory = m_project->buildDirectory(buildConfiguration); - m_qmake = m_project->qtVersion(buildConfiguration)->qmakeCommand(); - m_buildConfiguration = buildConfiguration; - return true; -} - -void GdbMacrosBuildStep::run(QFutureInterface<bool> & fi) -{ - QStringList files; - files << "gdbmacros.cpp" << "gdbmacros.pro" - << "LICENSE.LGPL" << "LGPL_EXCEPTION.TXT"; - - QVariant v = value("clean"); - if (v.isNull() || v.toBool() == false) { - addToOutputWindow("<b>Creating gdb macros library...</b>"); - // Normal run - QString dumperPath = Core::ICore::instance()->resourcePath() + "/gdbmacros/"; - QString destDir = m_buildDirectory + "/qtc-gdbmacros/"; - QDir dir; - dir.mkpath(destDir); - foreach (const QString &file, files) { - QString source = dumperPath + file; - QString dest = destDir + file; - QFileInfo destInfo(dest); - if (destInfo.exists()) { - if (destInfo.lastModified() >= QFileInfo(source).lastModified()) - continue; - QFile::remove(dest); - } - QFile::copy(source, dest); - } - - Qt4Project *qt4Project = static_cast<Qt4Project *>(project()); - - QProcess qmake; - qmake.setEnvironment(qt4Project->environment(m_buildConfiguration).toStringList()); - qmake.setWorkingDirectory(destDir); - QStringList configarguments; - QStringList makeArguments; - - // Find qmake step... - QMakeStep *qmakeStep = qt4Project->qmakeStep(); - // Find out which configuration is used in this build configuration - // and what kind of CONFIG we need to pass to qmake for that - if (qmakeStep->value(m_buildConfiguration, "buildConfiguration").isValid()) { - QtVersion::QmakeBuildConfig defaultBuildConfiguration = qt4Project->qtVersion(m_buildConfiguration)->defaultBuildConfig(); - QtVersion::QmakeBuildConfig projectBuildConfiguration = QtVersion::QmakeBuildConfig(qmakeStep->value(m_buildConfiguration, "buildConfiguration").toInt()); - if ((defaultBuildConfiguration & QtVersion::BuildAll) && !(projectBuildConfiguration & QtVersion::BuildAll)) - configarguments << "CONFIG-=debug_and_release"; - if (!(defaultBuildConfiguration & QtVersion::BuildAll) && (projectBuildConfiguration & QtVersion::BuildAll)) - configarguments << "CONFIG+=debug_and_release"; - if ((defaultBuildConfiguration & QtVersion::DebugBuild) && !(projectBuildConfiguration & QtVersion::DebugBuild)) - configarguments << "CONFIG+=release"; - if (!(defaultBuildConfiguration & QtVersion::DebugBuild) && (projectBuildConfiguration & QtVersion::DebugBuild)) - configarguments << "CONFIG+=debug"; - if (projectBuildConfiguration & QtVersion::BuildAll) - makeArguments << (projectBuildConfiguration & QtVersion::DebugBuild ? "debug" : "release"); - - } else { - // Old style with CONFIG+=debug_and_release - configarguments << "CONFIG+=debug_and_release"; - const MakeStep *ms = qt4Project->makeStep(); - QStringList makeargs = ms->value(m_buildConfiguration, "makeargs").toStringList(); - if (makeargs.contains("debug")) { - makeArguments << "debug"; - } else if (makeargs.contains("release")) { - makeArguments << "release"; - } - } - - QString mkspec = qt4Project->qtVersion(m_buildConfiguration)->mkspec(); - qmake.start(m_qmake, QStringList()<<"-spec"<<mkspec<<configarguments<<"gdbmacros.pro"); - qmake.waitForFinished(); - - QString makeCmd = qt4Project->makeCommand(m_buildConfiguration); - if (!value(m_buildConfiguration, "makeCmd").toString().isEmpty()) - makeCmd = value(m_buildConfiguration, "makeCmd").toString(); - if (!QFileInfo(makeCmd).isAbsolute()) { - // Try to detect command in environment - QString tmp = qt4Project->environment(m_buildConfiguration).searchInPath(makeCmd); - makeCmd = tmp; - } - qmake.start(makeCmd, makeArguments); - qmake.waitForFinished(); - - fi.reportResult(true); - } else { - // Clean step, we want to remove the directory - QString destDir = m_buildDirectory + "/qtc-gdbmacros/"; - Qt4Project *qt4Project = static_cast<Qt4Project *>(project()); - - QProcess make; - make.setEnvironment(qt4Project->environment(m_buildConfiguration).toStringList()); - make.setWorkingDirectory(destDir); - make.start(qt4Project->makeCommand(m_buildConfiguration), QStringList()<<"distclean"); - make.waitForFinished(); - - QStringList directories; - directories << "debug" - << "release"; - - foreach(const QString &file, files) { - QFile destination(destDir + file); - destination.remove(); - } - - foreach(const QString &dir, directories) { - QDir destination(destDir + dir); - destination.rmdir(destDir + dir); - } - - QDir(destDir).rmdir(destDir); - fi.reportResult(true); - } -} - -QString GdbMacrosBuildStep::name() -{ - return Constants::GDBMACROSBUILDSTEP; -} - -QString GdbMacrosBuildStep::displayName() -{ - return "Gdb Macros Build"; -} - -ProjectExplorer::BuildStepConfigWidget *GdbMacrosBuildStep::createConfigWidget() -{ - return new GdbMacrosBuildStepConfigWidget; -} - -bool GdbMacrosBuildStep::immutable() const -{ - return false; -} - -bool GdbMacrosBuildStepFactory::canCreate(const QString &name) const -{ - return name == Constants::GDBMACROSBUILDSTEP; -} - -ProjectExplorer::BuildStep *GdbMacrosBuildStepFactory::create(ProjectExplorer::Project *pro, const QString &name) const -{ - Q_ASSERT(name == Constants::GDBMACROSBUILDSTEP); - Qt4Project *qt4project = qobject_cast<Qt4Project *>(pro); - Q_ASSERT(qt4project); - return new GdbMacrosBuildStep(qt4project); -} - -QStringList GdbMacrosBuildStepFactory::canCreateForProject(ProjectExplorer::Project *pro) const -{ - QStringList results; - if (qobject_cast<Qt4Project *>(pro)) - results << Constants::GDBMACROSBUILDSTEP; - return results; -} - -QString GdbMacrosBuildStepFactory::displayNameForName(const QString &name) const -{ - if (name == Constants::GDBMACROSBUILDSTEP) - return "Gdb Macros Build"; - else - return QString::null; -} - -QString GdbMacrosBuildStepConfigWidget::displayName() const -{ - return "Gdb Macros Build"; -} - -void GdbMacrosBuildStepConfigWidget::init(const QString & /*buildConfiguration*/) -{ - // TODO -} diff --git a/src/plugins/qt4projectmanager/gdbmacrosbuildstep.h b/src/plugins/qt4projectmanager/gdbmacrosbuildstep.h deleted file mode 100644 index ba78a0f6321564df173af8c35d5a61b705212ebb..0000000000000000000000000000000000000000 --- a/src/plugins/qt4projectmanager/gdbmacrosbuildstep.h +++ /dev/null @@ -1,79 +0,0 @@ -/************************************************************************** -** -** This file is part of Qt Creator -** -** Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies). -** -** Contact: Qt Software Information (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 qt-sales@nokia.com. -** -**************************************************************************/ - -#ifndef GDBMACROSBUILDSTEP_H -#define GDBMACROSBUILDSTEP_H - -#include <projectexplorer/buildstep.h> - -namespace Qt4ProjectManager { -class Qt4Project; -namespace Internal { -class GdbMacrosBuildStepConfigWidget; - -class GdbMacrosBuildStep : public ProjectExplorer::BuildStep -{ - Q_OBJECT -public: - GdbMacrosBuildStep(Qt4Project * project); - virtual ~GdbMacrosBuildStep(); - virtual bool init(const QString &buildConfiguration); - virtual void run(QFutureInterface<bool> &); - virtual QString name(); - virtual QString displayName(); - virtual ProjectExplorer::BuildStepConfigWidget *createConfigWidget(); - virtual bool immutable() const; -private: - Qt4Project *m_project; - QString m_buildDirectory; - QString m_qmake; - QString m_buildConfiguration; -}; - -class GdbMacrosBuildStepFactory : public ProjectExplorer::IBuildStepFactory -{ - Q_OBJECT -public: - virtual bool canCreate(const QString &name) const; - virtual ProjectExplorer::BuildStep *create(ProjectExplorer::Project *pro, const QString &name) const; - virtual QStringList canCreateForProject(ProjectExplorer::Project *pro) const; - virtual QString displayNameForName(const QString &name) const; - -}; - -class GdbMacrosBuildStepConfigWidget : public ProjectExplorer::BuildStepConfigWidget -{ - virtual QString displayName() const; - virtual void init(const QString &buildConfiguration); -}; - -} // namespace Internal -} // namespace Qt4ProjectManager - -#endif // GDBMACROSBUILDSTEP_H diff --git a/src/plugins/qt4projectmanager/qt4project.cpp b/src/plugins/qt4projectmanager/qt4project.cpp index cf496f991bbc8b84e64ec82e268310130b6a47a0..36901bbc1c395f31e845ca7cff87f15147914f8d 100644 --- a/src/plugins/qt4projectmanager/qt4project.cpp +++ b/src/plugins/qt4projectmanager/qt4project.cpp @@ -42,7 +42,6 @@ #include "qt4buildenvironmentwidget.h" #include "qt4projectmanagerconstants.h" #include "projectloadwizard.h" -#include "gdbmacrosbuildstep.h" #include <coreplugin/icore.h> #include <coreplugin/messagemanager.h> @@ -656,10 +655,6 @@ void Qt4Project::addDefaultBuild() //TODO have a better check wheter there is already a configuration? QMakeStep *qmakeStep = 0; MakeStep *makeStep = 0; - GdbMacrosBuildStep *gdbmacrostep; - - gdbmacrostep = new GdbMacrosBuildStep(this); - insertBuildStep(0, gdbmacrostep); qmakeStep = new QMakeStep(this); qmakeStep->setValue("mkspec", ""); @@ -668,10 +663,6 @@ void Qt4Project::addDefaultBuild() makeStep = new MakeStep(this); insertBuildStep(2, makeStep); - GdbMacrosBuildStep *gdbmacrosCleanStep = new GdbMacrosBuildStep(this); - gdbmacrosCleanStep->setValue("clean", true); - insertCleanStep(0, gdbmacrosCleanStep); - MakeStep* cleanStep = new MakeStep(this); cleanStep->setValue("clean", true); insertCleanStep(1, cleanStep); @@ -680,25 +671,6 @@ void Qt4Project::addDefaultBuild() wizard.execDialog(); } else { // Restoring configuration - // Do we already have a gdbmacrobuildstep? - // If not add it and disable linking of debugging helper - - // Check for old link debugging helper setting in each buildConfiguration - // We add a gdbmacrosbuildstep if at least one has it - // TODO remove migration code from pre beta - foreach(const QString &bc, buildConfigurations()) { - QVariant v = value(bc, "addQDumper"); - if (v.isValid() && v.toBool()) { - GdbMacrosBuildStep *gdbmacrostep = new GdbMacrosBuildStep(this); - insertBuildStep(0, gdbmacrostep); - - GdbMacrosBuildStep *gdbmacrosCleanStep = new GdbMacrosBuildStep(this); - gdbmacrosCleanStep->setValue("clean", true); - insertCleanStep(0, gdbmacrosCleanStep ); - break; - } - } - foreach(const QString &bc, buildConfigurations()) { setValue(bc, "addQDumper", QVariant()); } diff --git a/src/plugins/qt4projectmanager/qt4projectmanager.pro b/src/plugins/qt4projectmanager/qt4projectmanager.pro index 04ac5d8067be1459f3427055fda69ed6bf792b4c..98e9527470688f5d15613d73434569a9ce1f42ad 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanager.pro +++ b/src/plugins/qt4projectmanager/qt4projectmanager.pro @@ -35,8 +35,7 @@ HEADERS = qt4projectmanagerplugin.h \ qt4buildconfigwidget.h \ qt4buildenvironmentwidget.h \ projectloadwizard.h \ - directorywatcher.h \ - gdbmacrosbuildstep.h + directorywatcher.h SOURCES = qt4projectmanagerplugin.cpp \ qt4projectmanager.cpp \ qtversionmanager.cpp \ @@ -67,8 +66,7 @@ SOURCES = qt4projectmanagerplugin.cpp \ qt4buildconfigwidget.cpp \ qt4buildenvironmentwidget.cpp \ projectloadwizard.cpp \ - directorywatcher.cpp \ - gdbmacrosbuildstep.cpp + directorywatcher.cpp FORMS = qtversionmanager.ui \ envvariablespage.ui \ enveditdialog.ui \ @@ -77,7 +75,8 @@ FORMS = qtversionmanager.ui \ qmakestep.ui \ qt4buildconfigwidget.ui \ embeddedpropertiespage.ui \ - qt4buildenvironmentwidget.ui + qt4buildenvironmentwidget.ui \ + showbuildlog.ui RESOURCES = qt4projectmanager.qrc \ wizards/wizards.qrc include(../../shared/proparser/proparser.pri) diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h index f916effd0cf5f3d075db1a1ad15aa9a86188ec5c..14f77bdbbb6e464f34b846e3702063e1d98079a3 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h +++ b/src/plugins/qt4projectmanager/qt4projectmanagerconstants.h @@ -71,7 +71,6 @@ const char * const GC_COMPILER = "Qt4.Compiler"; // qmakestep const char * const QMAKESTEP = "trolltech.qt4projectmanager.qmake"; const char * const MAKESTEP = "trolltech.qt4projectmanager.make"; -const char * const GDBMACROSBUILDSTEP = "trolltech.qt4projectmanager.gdbmaros"; const char * const QT4RUNSTEP = "trolltech.qt4projectmanager.qt4runstep"; const char * const DEPLOYHELPERRUNSTEP = "trolltech.qt4projectmanager.deployhelperrunstep"; diff --git a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp index cc37449efc1cec27df3e880c884df46bffea136a..529a927279487d3c0b44dc189b5ab8e35ecbd107 100644 --- a/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp +++ b/src/plugins/qt4projectmanager/qt4projectmanagerplugin.cpp @@ -41,7 +41,6 @@ #include "embeddedpropertiespage.h" #include "qt4runconfiguration.h" #include "profilereader.h" -#include "gdbmacrosbuildstep.h" #include <coreplugin/icore.h> #include <extensionsystem/pluginmanager.h> @@ -125,7 +124,6 @@ bool Qt4ProjectManagerPlugin::initialize(const QStringList &arguments, QString * addAutoReleasedObject(new QMakeBuildStepFactory); addAutoReleasedObject(new MakeBuildStepFactory); - addAutoReleasedObject(new GdbMacrosBuildStepFactory); m_qtVersionManager = new QtVersionManager; addObject(m_qtVersionManager); diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp index fea2b436ee0fb003a0549eacf9449acd5b1f1610..4469df560709b47001ccf1713beeda29d29ca0ec 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.cpp +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.cpp @@ -370,6 +370,14 @@ void Qt4RunConfiguration::invalidateCachedTargetInformation() emit effectiveTargetInformationChanged(); } +QString Qt4RunConfiguration::dumperLibrary() const +{ + Qt4Project *pro = qobject_cast<Qt4Project *>(project()); + QtVersion *version = pro->qtVersion(pro->activeBuildConfiguration()); + return version->dumperLibrary(); +} + + /// /// Qt4RunConfigurationFactory /// This class is used to restore run settings (saved in .user files) diff --git a/src/plugins/qt4projectmanager/qt4runconfiguration.h b/src/plugins/qt4projectmanager/qt4runconfiguration.h index 30ff16a294fbe2d6540faeb9d5425e006daa2b90..30e2878522ca153abae0d9b8e56db00f3a255150 100644 --- a/src/plugins/qt4projectmanager/qt4runconfiguration.h +++ b/src/plugins/qt4projectmanager/qt4runconfiguration.h @@ -70,6 +70,7 @@ public: virtual QString workingDirectory() const; virtual QStringList commandLineArguments() const; virtual ProjectExplorer::Environment environment() const; + virtual QString dumperLibrary() const; QString proFilePath() const; diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index d8628d5699225d0eb562e40244669fb21caf4f0a..e1f9bc12a361e369e557d61fbe3dc6b8febc24a2 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -30,6 +30,7 @@ #include "qtversionmanager.h" #include "qt4projectmanagerconstants.h" +#include "ui_showbuildlog.h" #include <coreplugin/icore.h> #include <coreplugin/coreconstants.h> @@ -48,6 +49,12 @@ #include <QtGui/QFileDialog> #include <QtGui/QHeaderView> #include <QtGui/QMessageBox> +#include <QtGui/QPushButton> +#include <QtGui/QToolButton> +#include <QtGui/QApplication> +#include <QtGui/QDesktopServices> +#include <QtGui/QHBoxLayout> +#include <QtGui/QLabel> using namespace Qt4ProjectManager::Internal; @@ -57,6 +64,43 @@ static const char *QtVersionsSectionName = "QtVersions"; static const char *defaultQtVersionKey = "DefaultQtVersion"; static const char *newQtVersionsKey = "NewQtVersions"; +DebuggingHelperWidget::DebuggingHelperWidget() +{ + setLayout(new QHBoxLayout()); + m_statusLabel = new QLabel(this); + + layout()->addWidget(m_statusLabel); + + m_showLog = new QPushButton(this); + m_showLog->setText("Show Log"); + layout()->addWidget(m_showLog); + + m_rebuild = new QPushButton(this); + m_rebuild->setText("Rebuild"); + layout()->addWidget(m_rebuild); + + connect(m_showLog, SIGNAL(clicked()), this, SIGNAL(showLogClicked())); + connect(m_rebuild, SIGNAL(clicked()), this, SIGNAL(rebuildClicked())); +} + +void DebuggingHelperWidget::setState(State s) +{ + bool validQt = true; + if (s & InvalidQt) + validQt = false; + m_statusLabel->setVisible(validQt); + m_showLog->setVisible(validQt); + m_rebuild->setVisible(validQt); + if (!validQt) + return; + if (s & Error) + m_statusLabel->setPixmap(QPixmap(":/extensionsystem/images/error.png")); + else + m_statusLabel->setPixmap(QPixmap(":/extensionsystem/images/ok.png")); + m_showLog->setVisible(s & ShowLog); +} + + QtVersionManager::QtVersionManager() : m_emptyVersion(new QtVersion) { @@ -370,7 +414,6 @@ QtVersion *QtVersionManager::currentQtVersion() const } //----------------------------------------------------- - QtDirWidget::QtDirWidget(QWidget *parent, QList<QtVersion *> versions, int defaultVersion) : QWidget(parent) , m_defaultVersion(defaultVersion) @@ -398,6 +441,17 @@ QtDirWidget::QtDirWidget(QWidget *parent, QList<QtVersion *> versions, int defau item->setText(0, version->name()); item->setText(1, version->path()); item->setData(0, Qt::UserRole, version->uniqueId()); + + DebuggingHelperWidget *dhw = new DebuggingHelperWidget(); + m_ui.qtdirList->setItemWidget(item, 2, dhw); + if (version->hasDebuggingHelper()) + dhw->setState(DebuggingHelperWidget::Ok); + else + dhw->setState(DebuggingHelperWidget::Error); + + connect(dhw, SIGNAL(rebuildClicked()), this, SLOT(buildDebuggingHelper())); + connect(dhw, SIGNAL(showLogClicked()), this, SLOT(showDebuggingBuildLog())); + m_ui.defaultCombo->addItem(version->name()); if (i == m_defaultVersion) m_ui.defaultCombo->setCurrentIndex(i); @@ -434,6 +488,51 @@ QtDirWidget::QtDirWidget(QWidget *parent, QList<QtVersion *> versions, int defau updateState(); } +void QtDirWidget::buildDebuggingHelper() +{ + // Find the qt version for this button.. + int index = indexForWidget(qobject_cast<QWidget *>(sender()); + if (index == -1) + return; + + QString result = m_versions.at(index)->buildDebuggingHelperLibrary(); + QTreeWidgetItem *item = m_ui.qtdirList->topLevelItem(index); + item->setData(2, Qt::UserRole, result); + + DebuggingHelperWidget *dhw = qobject_cast<DebuggingHelperWidget *>(m_ui.qtdirList->itemWidget(item, 2)); + if (dhw) { + if (m_versions.at(index)->hasDebuggingHelper()) + dhw->setState(DebuggingHelperWidget::State(DebuggingHelperWidget::Ok | DebuggingHelperWidget::ShowLog)); + else + dhw->setState(DebuggingHelperWidget::State(DebuggingHelperWidget::Error | DebuggingHelperWidget::ShowLog)); + } +} + +int QtDirWidget::indexFor(QWidget *debuggingHelperWidget) const +{ + int index = -1; + for(int i=0; i < m_ui.qtdirList->topLevelItemCount(); ++i) { + if (m_ui.qtdirList->itemWidget(m_ui.qtdirList->topLevelItem(i), 2) == widget) { + index = i; + break; + } + } + return index; +} + +void QtDirWidget::showDebuggingBuildLog() +{ + int index = indexForWidget(qobject_cast<QWidget *>(sender()); + if (index == -1) + return; + + QDialog dlg; + ::Ui::ShowBuildLog ui; + ui.setupUi(&dlg); + ui.log->setPlainText(m_ui.qtdirList->topLevelItem(index)->data(2, Qt::UserRole).toString()); + dlg.exec(); +} + QtDirWidget::~QtDirWidget() { qDeleteAll(m_versions); @@ -449,6 +548,16 @@ void QtDirWidget::addQtDir() item->setText(1, newVersion->path()); item->setData(0, Qt::UserRole, newVersion->uniqueId()); + DebuggingHelperWidget *dhw = new DebuggingHelperWidget(); + m_ui.qtdirList->setItemWidget(item, 2, dhw); + if (newVersion->hasDebuggingHelper()) + dhw->setState(DebuggingHelperWidget::Ok); + else + dhw->setState(DebuggingHelperWidget::Error); + connect(dhw, SIGNAL(rebuildClicked()), this, SLOT(buildDebuggingHelper())); + connect(dhw, SIGNAL(showLogClicked()), this, SLOT(showDebuggingBuildLog())); + m_ui.qtdirList->setItemWidget(item, 2, dhw); + m_ui.qtdirList->setCurrentItem(item); m_ui.nameEdit->setText(newVersion->name()); @@ -506,19 +615,14 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item) ProjectExplorer::ToolChain::ToolChainType t = m_versions.at(index)->toolchainType(); if (t == ProjectExplorer::ToolChain::MinGW) { m_ui.msvcComboBox->setVisible(false); - m_ui.msvcLabel->setVisible(false); makeMingwVisible(true); m_ui.mingwPath->setPath(m_versions.at(index)->mingwDirectory()); } else if (t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE){ m_ui.msvcComboBox->setVisible(false); - m_ui.msvcLabel->setVisible(true); makeMingwVisible(false); QStringList msvcEnvironments = ProjectExplorer::ToolChain::availableMSVCVersions(); if (msvcEnvironments.count() == 0) { - m_ui.msvcLabel->setText(tr("No Visual Studio Installation found")); } else if (msvcEnvironments.count() == 1) { - //TODO m_ui.msvcLabel->setText( msvcEnvironments.at(0).description()); - m_ui.msvcLabel->setText(""); } else { m_ui.msvcComboBox->setVisible(true); bool block = m_ui.msvcComboBox->blockSignals(true); @@ -527,14 +631,12 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item) m_ui.msvcComboBox->addItem(msvcenv); if (msvcenv == m_versions.at(index)->msvcVersion()) { m_ui.msvcComboBox->setCurrentIndex(m_ui.msvcComboBox->count() - 1); - m_ui.msvcLabel->setText(""); //TODO } } m_ui.msvcComboBox->blockSignals(block); } } else if (t == ProjectExplorer::ToolChain::INVALID) { m_ui.msvcComboBox->setVisible(false); - m_ui.msvcLabel->setVisible(false); makeMingwVisible(false); if (!m_versions.at(index)->isInstalled()) m_ui.errorLabel->setText(tr("The Qt Version is not installed. Run make install") @@ -543,7 +645,6 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item) m_ui.errorLabel->setText(tr("%1 is not a valid qt directory").arg(m_versions.at(index)->path())); } else { //ProjectExplorer::ToolChain::GCC m_ui.msvcComboBox->setVisible(false); - m_ui.msvcLabel->setVisible(false); makeMingwVisible(false); m_ui.errorLabel->setText("Found Qt version " + m_versions.at(index)->qtVersionString() @@ -552,7 +653,6 @@ void QtDirWidget::showEnvironmentPage(QTreeWidgetItem *item) } } else { m_ui.msvcComboBox->setVisible(false); - m_ui.msvcLabel->setVisible(false); makeMingwVisible(false); } } @@ -665,10 +765,24 @@ void QtDirWidget::updateCurrentQtPath() QTreeWidgetItem *currentItem = m_ui.qtdirList->currentItem(); Q_ASSERT(currentItem); int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); + if (m_versions[currentItemIndex]->path() == m_ui.qtPath->path()) + return; m_versions[currentItemIndex]->setPath(m_ui.qtPath->path()); currentItem->setText(1, m_versions[currentItemIndex]->path()); showEnvironmentPage(currentItem); + + DebuggingHelperWidget *dhw = qobject_cast<DebuggingHelperWidget *>(m_ui.qtdirList->itemWidget(currentItem, 2)); + if (m_versions[currentItemIndex]->isValid()) { + DebuggingHelperWidget::State s = DebuggingHelperWidget::Ok; + if (!m_versions[currentItemIndex]->hasDebuggingHelper()) + s = DebuggingHelperWidget::State(s | DebuggingHelperWidget::Error); + if (!currentItem->data(2, Qt::UserRole).toString().isEmpty()) + s = DebuggingHelperWidget::State(s | DebuggingHelperWidget::ShowLog); + dhw->setState(s); + } else { + dhw->setState(DebuggingHelperWidget::InvalidQt); + } } void QtDirWidget::updateCurrentMingwDirectory() @@ -686,16 +800,6 @@ void QtDirWidget::msvcVersionChanged() Q_ASSERT(currentItem); int currentItemIndex = m_ui.qtdirList->indexOfTopLevelItem(currentItem); m_versions[currentItemIndex]->setMsvcVersion(msvcVersion); - - //get descriptionx - //TODO -// QList<MSVCEnvironment> msvcEnvironments = MSVCEnvironment::availableVersions(); -// foreach(const MSVCEnvironment &msvcEnv, msvcEnvironments) { -// if (msvcEnv.name() == msvcVersion) { -// m_ui.msvcLabel->setText(msvcEnv.description()); -// break; -// } -// } } QList<QtVersion *> QtDirWidget::versions() const @@ -713,7 +817,12 @@ int QtDirWidget::defaultVersion() const /// QtVersion::QtVersion(const QString &name, const QString &path, int id, bool isSystemVersion) - : m_name(name), m_isSystemVersion(isSystemVersion), m_notInstalled(false), m_defaultConfigIsDebug(true), m_defaultConfigIsDebugAndRelease(true) + : m_name(name), + m_isSystemVersion(isSystemVersion), + m_notInstalled(false), + m_defaultConfigIsDebug(true), + m_defaultConfigIsDebugAndRelease(true), + m_hasDebuggingHelper(false) { setPath(path); if (id == -1) @@ -726,7 +835,8 @@ QtVersion::QtVersion(const QString &name, const QString &path) : m_name(name), m_versionInfoUpToDate(false), m_mkspecUpToDate(false), - m_isSystemVersion(false) + m_isSystemVersion(false), + m_hasDebuggingHelper(false) { setPath(path); m_id = getUniqueId(); @@ -783,6 +893,30 @@ void QtVersion::setPath(const QString &path) m_versionInfoUpToDate = false; m_mkspecUpToDate = false; m_qmakeCommand = QString::null; +// TODO do i need to optimize this? + m_hasDebuggingHelper = !dumperLibrary().isEmpty(); +} + +QString QtVersion::dumperLibrary() const +{ + uint hash = qHash(path()); + QStringList directories; + directories + << (path() + "/qtc-debugging-helper/") + << (QApplication::applicationDirPath() + "../qtc-debugging-helper/" + QString::number(hash)) + << (QDesktopServices::StandardLocation(QDesktopServices::DataLocation) + "/qtc-debugging-helper/" + QString::number(hash)); + foreach(const QString &directory, directories) { +#if defined(Q_OS_WIN) + QFileInfo fi(directory + "/debug/gdbmacros.dll"); +#elif defined(Q_OS_MAC) + QFileInfo fi(directory + "/libgdbmacros.dylib"); +#else // generic UNIX + QFileInfo fi(directory + "/libgdbmacros.so"); +#endif + if (fi.exists()) + return fi.filePath(); + } + return QString(); } void QtVersion::updateSourcePath() @@ -1263,3 +1397,94 @@ QtVersion::QmakeBuildConfig QtVersion::defaultBuildConfig() const result = QtVersion::QmakeBuildConfig(result | QtVersion::DebugBuild); return result; } + +bool QtVersion::hasDebuggingHelper() const +{ + return m_hasDebuggingHelper; +} + +QString QtVersion::buildDebuggingHelperLibrary() +{ +// Locations to try: +// $QTDIR/qtc-debugging-helper +// $APPLICATION-DIR/qtc-debugging-helper/$hash +// $USERDIR/qtc-debugging-helper/$hash + + QString output; + uint hash = qHash(path()); + QStringList directories; + directories + << path() + "/qtc-debugging-helper/" + << QApplication::applicationDirPath() + "/../qtc-debugging-helper/" + QString::number(hash) + << QDesktopServices::storageLocation (QDesktopServices::DataLocation) + "/qtc-debugging-helper/" + QString::number(hash); + + QStringList files; + files << "gdbmacros.cpp" << "gdbmacros.pro" + << "LICENSE.LGPL" << "LGPL_EXCEPTION.TXT"; + + foreach(const QString &directory, directories) { + QString dumperPath = Core::ICore::instance()->resourcePath() + "/gdbmacros/"; + bool success = true; + QDir().mkpath(directory); + foreach (const QString &file, files) { + QString source = dumperPath + file; + QString dest = directory + file; + QFileInfo destInfo(dest); + if (destInfo.exists()) { + if (destInfo.lastModified() >= QFileInfo(source).lastModified()) + continue; + success &= QFile::remove(dest); + } + success &= QFile::copy(source, dest); + } + if (!success) + continue; + + output += QString("Building debugging helper library in %1\n").arg(directory); + output += "\n"; + output += "Runinng qmake...\n"; + + QProcess qmake; + ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment(); + addToEnvironment(env); + + qmake.setEnvironment(env.toStringList()); + qmake.setWorkingDirectory(directory); + qmake.setProcessChannelMode(QProcess::MergedChannels); + + qmake.start(qmakeCommand(), QStringList()<<"-spec"<<"default"<<"gdbmacros.pro"); + qmake.waitForFinished(); + + output += qmake.readAll(); + + // TODO this is butt ugly + // only qt4projects have a toolchain() method. (Reason mostly, that in order to create + // the toolchain, we need to have the path to gcc + // which might depend on environment settings of the project + // so we hardcode the toolchainType to make conversation here + // and think about how to fix that later + + QString make; + ProjectExplorer::ToolChain::ToolChainType t = toolchainType(); + if (t == ProjectExplorer::ToolChain::MinGW) + make = "mingw32-make.exe"; + else if(t == ProjectExplorer::ToolChain::MSVC || t == ProjectExplorer::ToolChain::WINCE) + make = "nmake.exe"; + else if (t == ProjectExplorer::ToolChain::GCC || t == ProjectExplorer::ToolChain::LinuxICC) + make = "make"; + + QString makeFullPath = env.searchInPath(make); + output += "\n"; + if (!makeFullPath.isEmpty()) { + output += QString("Running %1...\n").arg(makeFullPath); + qmake.start(makeFullPath, QStringList()); + qmake.waitForFinished(); + output += qmake.readAll(); + } else { + output += QString("%1 not found in PATH\n").arg(make); + } + break; + } + m_hasDebuggingHelper = !dumperLibrary().isEmpty(); + return output; +} diff --git a/src/plugins/qt4projectmanager/qtversionmanager.h b/src/plugins/qt4projectmanager/qtversionmanager.h index 7252a698cd4c5b07f44d6cb16870d3f78eb52859..7c9673ce38ec9c8836ba1b31f704b3fa2b65ff50 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.h +++ b/src/plugins/qt4projectmanager/qtversionmanager.h @@ -38,6 +38,7 @@ #include <QtCore/QPointer> #include <QtGui/QWidget> +#include <QtGui/QPushButton> namespace Qt4ProjectManager { namespace Internal { @@ -79,6 +80,10 @@ public: QString wincePlatform() const; void setMsvcVersion(const QString &version); void addToEnvironment(ProjectExplorer::Environment &env); + bool hasDebuggingHelper() const; + // Builds a debugging library + // returns the output of the commands + QString buildDebuggingHelperLibrary(); int uniqueId() const; @@ -90,6 +95,7 @@ public: }; QmakeBuildConfig defaultBuildConfig() const; + QString dumperLibrary() const; private: static int getUniqueId(); void setName(const QString &name); @@ -117,6 +123,7 @@ private: // This is updated on first call to qmakeCommand // That function is called from updateVersionInfo() mutable QString m_qtVersionString; + bool m_hasDebuggingHelper; }; @@ -132,6 +139,7 @@ public: private: void showEnvironmentPage(QTreeWidgetItem * item); void fixQtVersionName(int index); + int indexFor(QWidget *debuggingHelperWidget) const; Ui::QtVersionManager m_ui; QList<QtVersion *> m_versions; int m_defaultVersion; @@ -151,6 +159,8 @@ private slots: void updateCurrentQtPath(); void updateCurrentMingwDirectory(); void msvcVersionChanged(); + void buildDebuggingHelper(); + void showDebuggingBuildLog(); }; class QtVersionManager : public Core::IOptionsPage @@ -212,6 +222,27 @@ private: int m_idcount; }; +class DebuggingHelperWidget : public QWidget +{ + Q_OBJECT +public: + DebuggingHelperWidget(); + enum State { + Ok = 0, + Error = 1, + ShowLog = 2, + InvalidQt = 4 + }; + void setState(State s); +signals: + void rebuildClicked(); + void showLogClicked(); +private: + QLabel *m_statusLabel; + QPushButton *m_showLog; + QPushButton *m_rebuild; +}; + } // namespace Internal } // namespace Qt4ProjectManager diff --git a/src/plugins/qt4projectmanager/qtversionmanager.ui b/src/plugins/qt4projectmanager/qtversionmanager.ui index 0d3941d03883d42c30d26d08b5350134b4c932c5..fd61e92f4bbb6286bb83eeed45105a210b1a7b53 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.ui +++ b/src/plugins/qt4projectmanager/qtversionmanager.ui @@ -78,7 +78,7 @@ <bool>false</bool> </property> <property name="columnCount"> - <number>2</number> + <number>3</number> </property> <column> <property name="text"> @@ -90,6 +90,11 @@ <string>Path</string> </property> </column> + <column> + <property name="text"> + <string>Debugging Helper</string> + </property> + </column> </widget> </item> <item row="1" column="0"> @@ -116,21 +121,14 @@ </property> </widget> </item> - <item row="4" column="0" colspan="3"> - <widget class="QLabel" name="msvcLabel"> - <property name="text"> - <string/> - </property> - </widget> - </item> - <item row="7" column="0" colspan="4"> + <item row="6" column="0" colspan="4"> <widget class="QLabel" name="errorLabel"> <property name="text"> <string/> </property> </widget> </item> - <item row="5" column="1" colspan="2"> + <item row="4" column="1" colspan="2"> <widget class="QComboBox" name="msvcComboBox"/> </item> <item row="2" column="1" colspan="2"> diff --git a/src/plugins/qt4projectmanager/showbuildlog.ui b/src/plugins/qt4projectmanager/showbuildlog.ui new file mode 100644 index 0000000000000000000000000000000000000000..98c61b360e7d1b59c27b4bdc748d742365c5bee0 --- /dev/null +++ b/src/plugins/qt4projectmanager/showbuildlog.ui @@ -0,0 +1,74 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>ShowBuildLog</class> + <widget class="QDialog" name="ShowBuildLog"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>400</width> + <height>300</height> + </rect> + </property> + <property name="windowTitle"> + <string>Dialog</string> + </property> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QPlainTextEdit" name="log"> + <property name="tabChangesFocus"> + <bool>true</bool> + </property> + <property name="readOnly"> + <bool>true</bool> + </property> + </widget> + </item> + <item> + <widget class="QDialogButtonBox" name="buttonBox"> + <property name="orientation"> + <enum>Qt::Horizontal</enum> + </property> + <property name="standardButtons"> + <set>QDialogButtonBox::Ok</set> + </property> + </widget> + </item> + </layout> + </widget> + <resources/> + <connections> + <connection> + <sender>buttonBox</sender> + <signal>accepted()</signal> + <receiver>ShowBuildLog</receiver> + <slot>accept()</slot> + <hints> + <hint type="sourcelabel"> + <x>248</x> + <y>254</y> + </hint> + <hint type="destinationlabel"> + <x>157</x> + <y>274</y> + </hint> + </hints> + </connection> + <connection> + <sender>buttonBox</sender> + <signal>rejected()</signal> + <receiver>ShowBuildLog</receiver> + <slot>reject()</slot> + <hints> + <hint type="sourcelabel"> + <x>316</x> + <y>260</y> + </hint> + <hint type="destinationlabel"> + <x>286</x> + <y>274</y> + </hint> + </hints> + </connection> + </connections> +</ui>