diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp index def15f0bba6ace9e25c2c89f0a5eda5679360d92..0f92c8a53ff9eb1b7b02673758921bd7f86b27d4 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.cpp @@ -40,6 +40,8 @@ #include <QtCore/QtConcurrentRun> #include <QtCore/QSettings> #include <QtGui/QFormLayout> +#include <QtGui/QDesktopServices> +#include <QtGui/QApplication> using namespace CMakeProjectManager::Internal; @@ -134,7 +136,83 @@ QString CMakeManager::findCbpFile(const QDir &directory) return QString::null; } +// This code is duplicated from qtversionmanager +QString CMakeManager::qtVersionForQMake(const QString &qmakePath) +{ + QProcess qmake; + qmake.start(qmakePath, QStringList()<<"--version"); + if (!qmake.waitForFinished()) + return false; + QString output = qmake.readAllStandardOutput(); + QRegExp regexp("(QMake version|Qmake version:)[\\s]*([\\d.]*)"); + regexp.indexIn(output); + if (regexp.cap(2).startsWith("2.")) { + QRegExp regexp2("Using Qt version[\\s]*([\\d\\.]*)"); + regexp2.indexIn(output); + return regexp2.cap(1); + } + return QString(); +} +QString CMakeManager::findQtDir(const ProjectExplorer::Environment &env) +{ + QStringList possibleCommands; + // On windows noone has renamed qmake, right? +#ifdef Q_OS_WIN + possibleCommands << "qmake.exe"; +#endif + // On unix some distributions renamed qmake to avoid clashes + possibleCommands << "qmake-qt4" << "qmake4" << "qmake"; + + QStringList paths = env.path(); + foreach (const QString &path, paths) { + foreach (const QString &possibleCommand, possibleCommands) { + QFileInfo qmake(path + "/" + possibleCommand); + if (qmake.exists()) { + if (!qtVersionForQMake(qmake.absoluteFilePath()).isNull()) { + QDir dir(qmake.absoluteDir()); + dir.cdUp(); + return dir.absolutePath(); + } + } + } + } + return QString(); +} + +// This code is more or less duplicated in qtversionmanager +QString CMakeManager::findDumperLibrary(const ProjectExplorer::Environment &env) +{ + static ProjectExplorer::Environment lastenv; + static QString lastpath; + if (lastenv == env) + return lastpath; + QString qtdir = findQtDir(env); + if (qtdir.isEmpty()) + return QString(); + + uint hash = qHash(qtdir); + QStringList directories; + directories + << (qtdir + "/qtc-debugging-helper/") + << (QApplication::applicationDirPath() + "/../qtc-debugging-helper/" + QString::number(hash)) + "/" + << (QDesktopServices::storageLocation(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()) { + lastpath = fi.filePath(); + return lastpath; + } + } + lastpath = QString(); + return lastpath; +} ///// // CMakeRunner diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h index 2188edb6e99b536de5b429392739c45ca95ef2bc..f8c734c01147ad8c1319366bf8a8d85202341e63 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h +++ b/src/plugins/cmakeprojectmanager/cmakeprojectmanager.h @@ -32,6 +32,7 @@ #include <coreplugin/dialogs/ioptionspage.h> #include <projectexplorer/iprojectmanager.h> +#include <projectexplorer/environment.h> #include <utils/pathchooser.h> #include <QtCore/QFuture> #include <QtCore/QStringList> @@ -60,7 +61,11 @@ public: QProcess* createXmlFile(const QStringList &arguments, const QString &sourceDirectory, const QDir &buildDirectory); static QString findCbpFile(const QDir &); + + static QString findDumperLibrary(const ProjectExplorer::Environment &env); private: + static QString qtVersionForQMake(const QString &qmakePath); + static QString findQtDir(const ProjectExplorer::Environment &env); int m_projectContext; int m_projectLanguage; CMakeSettingsPage *m_settingsPage; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index 3a888a8c6784faf02cb1776a528e016521214683..6546207ce85c7bee00566320f88c8468042f5139 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -125,7 +125,7 @@ QWidget *CMakeRunConfiguration::configurationWidget() QString CMakeRunConfiguration::dumperLibrary() const { - return QString(); + return CMakeManager::findDumperLibrary(environment()); } // Factory diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp index 890edf9a1f1917baf8b899a6eef222338edcc234..3621c06ac9ece9cd90ff8e4c9a72b1a6b0ec1b2f 100644 --- a/src/plugins/qt4projectmanager/qtversionmanager.cpp +++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp @@ -917,7 +917,6 @@ QString QtVersion::dumperLibrary() const QFileInfo fi(directory + "libgdbmacros.dylib"); #else // generic UNIX QFileInfo fi(directory + "libgdbmacros.so"); - qDebug()<<"Trying"<<(directory + "libgdbmacros.so"); #endif if (fi.exists()) return fi.filePath();