diff --git a/bin/qtcreator b/bin/qtcreator index 931b3dd4616a041f57ad6e7e7795df1896604aa3..b915628c3e518e3311883f3fe57adb71d939180b 100755 --- a/bin/qtcreator +++ b/bin/qtcreator @@ -1,5 +1,9 @@ #!/bin/sh bindir=$(dirname "$0") -libdir=$(cd ${bindir}/../lib ; pwd) +if test "$(uname -m)" = "x86_64" ; then + libdir=$(cd ${bindir}/../lib64 ; pwd) +else + libdir=$(cd ${bindir}/../lib ; pwd) +fi LD_LIBRARY_PATH="${libdir}:${LD_LIBRARY_PATH}" "${bindir}/qtcreator.bin" ${1+"$@"} diff --git a/src/app/main.cpp b/src/app/main.cpp index d1f5db1232df079065762d5dd196e93fa1034f35..655095956a76f1439114e7d6dee82f7b0cea4ee1 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -179,7 +179,11 @@ static inline QStringList getPluginPaths() // 1) "plugins" (Win/Linux) QString pluginPath = rootDirPath; pluginPath += QDir::separator(); +#ifdef QT_ARCH_X86_64 + pluginPath += QLatin1String("lib64"); +#else pluginPath += QLatin1String("lib"); +#endif pluginPath += QDir::separator(); pluginPath += QLatin1String("qtcreator"); pluginPath += QDir::separator(); diff --git a/src/plugins/debugger/debuggeractions.cpp b/src/plugins/debugger/debuggeractions.cpp index 7c42474b7513b6a5b6fb436ca1e5fa9f188cc9b3..d1aa6ff33cb8603b88582a17db0df18e48a10f36 100644 --- a/src/plugins/debugger/debuggeractions.cpp +++ b/src/plugins/debugger/debuggeractions.cpp @@ -32,6 +32,7 @@ #include <utils/qtcassert.h> #include <utils/pathchooser.h> +#include <QtCore/QDebug> #include <QtCore/QSettings> #include <QtGui/QAction> #include <QtGui/QAbstractButton> @@ -39,9 +40,11 @@ #include <QtGui/QCheckBox> #include <QtGui/QLineEdit> + namespace Debugger { namespace Internal { + ////////////////////////////////////////////////////////////////////////// // // DebuggerAction @@ -119,6 +122,14 @@ void DebuggerAction::setTextPattern(const QString &value) m_textPattern = value; } +QString DebuggerAction::toString() const +{ + return "value: " + m_value.toString() + + " defaultvalue: " + m_defaultValue.toString() + + " settingskey: " + m_settingsGroup + '/' + m_settingsKey + + " deferedValue: " + m_deferedValue.toString(); +} + QAction *DebuggerAction::updatedAction(const QString &text0) { QString text = text0; @@ -155,7 +166,7 @@ void DebuggerAction::writeSettings(QSettings *settings) return; settings->beginGroup(m_settingsGroup); settings->setValue(m_settingsKey, m_value); - //qDebug() << "WRITING: " << m_settingsKey << " -> " << m_value; + //qDebug() << "WRITING: " << m_settingsKey << " -> " << toString(); settings->endGroup(); } @@ -424,6 +435,7 @@ DebuggerSettings *theDebuggerSettings() item = new DebuggerAction(instance); instance->insertItem(BuildDumpersOnTheFly, item); + item->setDefaultValue(true); item->setSettingsKey("DebugMode", "BuildDumpersOnTheFly"); item->setCheckable(true); diff --git a/src/plugins/debugger/debuggeractions.h b/src/plugins/debugger/debuggeractions.h index a319fa668c2cce1ecebf8f5024a6ccb5abc37769..b635840df06921815ceb02aa708f4ba5e397f447 100644 --- a/src/plugins/debugger/debuggeractions.h +++ b/src/plugins/debugger/debuggeractions.h @@ -80,6 +80,8 @@ public: virtual QString textPattern() const; Q_SLOT virtual void setTextPattern(const QString &value); + QString toString() const; + signals: void valueChanged(const QVariant &newValue); void boolValueChanged(bool newValue); diff --git a/src/plugins/debugger/debuggerplugin.cpp b/src/plugins/debugger/debuggerplugin.cpp index 76b3033d6857fce8d74da410ceb502d267236bf2..2a66c1422e73e3b9fdb5adcc3e9c7f2ac9f06a65 100644 --- a/src/plugins/debugger/debuggerplugin.cpp +++ b/src/plugins/debugger/debuggerplugin.cpp @@ -375,9 +375,16 @@ QWidget *DumperOptionPage::createPage(QWidget *parent) m_ui.dumperLocationChooser->setExpectedKind(Core::Utils::PathChooser::Command); m_ui.dumperLocationChooser->setPromptDialogTitle(tr("Choose Dumper Location")); + m_ui.dumperLocationChooser->setInitialBrowsePathBackup( + Core::ICore::instance()->resourcePath() + "../../lib"); + + connect(m_ui.radioButtonUsePrebuiltDumpers, SIGNAL(toggled(bool)), + m_ui.dumperLocationChooser, SLOT(setEnabled(bool))); theDebuggerAction(UsePrebuiltDumpers) ->connectWidget(m_ui.radioButtonUsePrebuiltDumpers); + theDebuggerAction(BuildDumpersOnTheFly) + ->connectWidget(m_ui.radioButtonBuildDumpersOnTheFly); theDebuggerAction(PrebuiltDumpersLocation) ->connectWidget(m_ui.dumperLocationChooser); @@ -388,8 +395,6 @@ QWidget *DumperOptionPage::createPage(QWidget *parent) m_ui.dumperLocationChooser-> setEnabled(theDebuggerAction(UsePrebuiltDumpers)->value().toBool()); - connect(m_ui.radioButtonUsePrebuiltDumpers, SIGNAL(toggled(bool)), - m_ui.dumperLocationChooser, SLOT(setEnabled(bool))); #ifndef QT_DEBUG #if 0 @@ -410,6 +415,7 @@ void DumperOptionPage::apply() theDebuggerAction(UseDumpers)->apply(s); theDebuggerAction(UsePrebuiltDumpers)->apply(s); + theDebuggerAction(BuildDumpersOnTheFly)->apply(s); theDebuggerAction(PrebuiltDumpersLocation)->apply(s); theDebuggerAction(DebugDumpers)->apply(s); } @@ -1019,7 +1025,7 @@ void DebuggerPlugin::focusCurrentEditor(IMode *mode) void DebuggerPlugin::showSettingsDialog() { - Core::ICore::instance()->showOptionsDialog("Debugger", "Gdb"); + Core::ICore::instance()->showOptionsDialog("Debugger", "General"); } #include "debuggerplugin.moc" diff --git a/src/plugins/debugger/dumperoptionpage.ui b/src/plugins/debugger/dumperoptionpage.ui index f89cff0e38c125a3a9d2859a4954b7e3d37e0e04..0219fe898b5acec3b5ad85d1ca9a6ec6cf997658 100644 --- a/src/plugins/debugger/dumperoptionpage.ui +++ b/src/plugins/debugger/dumperoptionpage.ui @@ -21,7 +21,7 @@ </property> <layout class="QGridLayout" name="gridLayout"> <item row="0" column="0"> - <widget class="QRadioButton" name="radioButtonDumpersOnTheFly"> + <widget class="QRadioButton" name="radioButtonBuildDumpersOnTheFly"> <property name="toolTip"> <string>This is the slowest but safest option.</string> </property> diff --git a/src/plugins/debugger/gdbengine.cpp b/src/plugins/debugger/gdbengine.cpp index 8b5ed5ea018d2c05d3a4bff9f7d9fd602e560667..c2c18dec377a78eee63a68d55dab30f4889cd0e0 100644 --- a/src/plugins/debugger/gdbengine.cpp +++ b/src/plugins/debugger/gdbengine.cpp @@ -4230,6 +4230,19 @@ void GdbEngine::assignValueInDebugger(const QString &expression, const QString & sendCommand("-var-assign assign " + value, WatchVarAssign); } +QString GdbEngine::dumperLibraryName() const +{ + if (theDebuggerAction(UsePrebuiltDumpers)) + return theDebuggerAction(PrebuiltDumpersLocation)->value().toString(); +#if defined(Q_OS_WIN) + return q->m_buildDir + "/qtc-gdbmacros/debug/gdbmacros.dll"; +#elif defined(Q_OS_MAC) + return q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.dylib"; +#else // generic UNIX + return q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.so"; +#endif +} + void GdbEngine::tryLoadCustomDumpers() { if (m_dataDumperState != DataDumperUninitialized) @@ -4237,26 +4250,18 @@ void GdbEngine::tryLoadCustomDumpers() PENDING_DEBUG("TRY LOAD CUSTOM DUMPERS"); m_dataDumperState = DataDumperUnavailable; + QString lib = dumperLibraryName(); -#if defined(Q_OS_LINUX) - QString lib = q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.so"; if (QFileInfo(lib).exists()) { +#if defined(Q_OS_WIN) m_dataDumperState = DataDumperLoadTried; - //sendCommand("p dlopen"); - QString flag = QString::number(RTLD_NOW); - sendCommand("sharedlibrary libc"); // for malloc - sendCommand("sharedlibrary libdl"); // for dlopen - sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", - WatchDumpCustomSetup); - // some older systems like CentOS 4.6 prefer this: - sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")", + sendCommand("sharedlibrary .*"); // for LoadLibraryA + //sendCommand("handle SIGSEGV pass stop print"); + //sendCommand("set unwindonsignal off"); + sendCommand("call LoadLibraryA(\"" + lib + "\")", WatchDumpCustomSetup); sendCommand("sharedlibrary " + dotEscape(lib)); - } -#endif -#if defined(Q_OS_MAC) - QString lib = q->m_buildDir + "/qtc-gdbmacros/libgdbmacros.dylib"; - if (QFileInfo(lib).exists()) { +#elif defined(Q_OS_MAC) m_dataDumperState = DataDumperLoadTried; //sendCommand("sharedlibrary libc"); // for malloc //sendCommand("sharedlibrary libdl"); // for dlopen @@ -4264,20 +4269,20 @@ void GdbEngine::tryLoadCustomDumpers() sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", WatchDumpCustomSetup); //sendCommand("sharedlibrary " + dotEscape(lib)); - } -#endif -#if defined(Q_OS_WIN) - QString lib = q->m_buildDir + "/qtc-gdbmacros/debug/gdbmacros.dll"; - if (QFileInfo(lib).exists()) { m_dataDumperState = DataDumperLoadTried; - sendCommand("sharedlibrary .*"); // for LoadLibraryA - //sendCommand("handle SIGSEGV pass stop print"); - //sendCommand("set unwindonsignal off"); - sendCommand("call LoadLibraryA(\"" + lib + "\")", +#else + //sendCommand("p dlopen"); + QString flag = QString::number(RTLD_NOW); + sendCommand("sharedlibrary libc"); // for malloc + sendCommand("sharedlibrary libdl"); // for dlopen + sendCommand("call (void)dlopen(\"" + lib + "\", " + flag + ")", + WatchDumpCustomSetup); + // some older systems like CentOS 4.6 prefer this: + sendCommand("call (void)__dlopen(\"" + lib + "\", " + flag + ")", WatchDumpCustomSetup); sendCommand("sharedlibrary " + dotEscape(lib)); - } #endif + } if (m_dataDumperState == DataDumperLoadTried) { // retreive list of dumpable classes diff --git a/src/plugins/debugger/gdbengine.h b/src/plugins/debugger/gdbengine.h index d0186493972a9ab1d7d32fe81fbb8fe3c22e2c60..20c9c222877b92dfbdb544ba90f5dfd8990a03f3 100644 --- a/src/plugins/debugger/gdbengine.h +++ b/src/plugins/debugger/gdbengine.h @@ -199,6 +199,7 @@ private: void handleQuerySources(const GdbResultRecord &response); void handleTargetCore(const GdbResultRecord &response); void debugMessage(const QString &msg); + QString dumperLibraryName() const; OutputCollector m_outputCollector; QTextCodec *m_outputCodec; diff --git a/src/plugins/debugger/gdbmi.cpp b/src/plugins/debugger/gdbmi.cpp index e2e11e07ba13a7b28bebb6a79e44f5e05f2c4e89..2e778cb8e83c9b6965f56ccc7c81d6a0cf65def8 100644 --- a/src/plugins/debugger/gdbmi.cpp +++ b/src/plugins/debugger/gdbmi.cpp @@ -37,7 +37,7 @@ namespace Debugger { namespace Internal { -QTextStream & operator<<(QTextStream & os, const GdbMi & mi) +QTextStream &operator<<(QTextStream &os, const GdbMi &mi) { return os << mi.toString(); } diff --git a/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp index 75fa4ee25c2af9c7475e35a9e11aacf6bbcf3a5e..07e8857e0c06a4bca8b7859ff2ff491ea11fb2d6 100644 --- a/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp +++ b/src/plugins/qt4projectmanager/qt4buildconfigwidget.cpp @@ -187,6 +187,7 @@ void Qt4BuildConfigWidget::updateImportLabel() void Qt4BuildConfigWidget::shadowBuildLineEditTextChanged() { if (m_pro->value(m_buildConfiguration, "buildDirectory").toString() == m_ui->shadowBuildDirEdit->path()) + return; m_pro->setValue(m_buildConfiguration, "buildDirectory", m_ui->shadowBuildDirEdit->path()); // if the directory already exists // check if we have a build in there and diff --git a/src/qworkbench.pri b/src/qworkbench.pri index deda9ae21f0ec8ed72248ce31370394dfc24af33..762713bbb156aca3a18cb68ba41f318454ba9fe8 100644 --- a/src/qworkbench.pri +++ b/src/qworkbench.pri @@ -6,6 +6,12 @@ isEmpty(TEST):CONFIG(debug, debug|release) { } } +linux-g++-64 { + IDE_LIBRARY_BASENAME = lib64 +} else { + IDE_LIBRARY_BASENAME = lib +} + equals(TEST, 1) { QT +=testlib DEFINES += WITH_TESTS @@ -21,7 +27,7 @@ macx { contains(QT_CONFIG, ppc):CONFIG += ppc x86 } else { IDE_APP_TARGET = qtcreator.bin - IDE_LIBRARY_PATH = $$IDE_BUILD_TREE/lib/qtcreator + IDE_LIBRARY_PATH = $$IDE_BUILD_TREE/$$IDE_LIBRARY_BASENAME/qtcreator IDE_PLUGIN_PATH = $$IDE_LIBRARY_PATH/plugins/ } IDE_APP_PATH = $$IDE_BUILD_TREE/bin diff --git a/src/qworkbenchlibrary.pri b/src/qworkbenchlibrary.pri index a8af3d7edbdcaf1e018c585a9109e449023696b9..7a04fe45558581ed98d492f36173844ae3175287 100644 --- a/src/qworkbenchlibrary.pri +++ b/src/qworkbenchlibrary.pri @@ -14,6 +14,6 @@ TARGET = $$qtLibraryTarget($$TARGET) contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols linux-* { - target.path = /lib/qtcreator + target.path = /$$IDE_LIBRARY_BASENAME/qtcreator INSTALLS += target - } +} diff --git a/src/qworkbenchplugin.pri b/src/qworkbenchplugin.pri index bdf17469aa8c0fd79da68c7304ea89894c3823dd..d7c9a64b68b181b03bf2ea058e0812fb41d7ac1f 100644 --- a/src/qworkbenchplugin.pri +++ b/src/qworkbenchplugin.pri @@ -17,7 +17,7 @@ isEmpty(TARGET) { error("qworkbenchplugin.pri: You must provide a TARGET") } -# Copy the pluginspec file to the liberary directyory. +# Copy the pluginspec file to the library directory. # Note: On Windows/MinGW with some sh.exe in the path, # QMAKE_COPY is some cp command that does not understand # "\". Force the standard windows copy. @@ -54,8 +54,8 @@ contains(QT_CONFIG, reduce_exports):CONFIG += hide_symbols CONFIG += plugin plugin_with_soname linux-* { - target.path = /lib/qtcreator/plugins/$$PROVIDER + target.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER pluginspec.files += $${TARGET}.pluginspec - pluginspec.path = /lib/qtcreator/plugins/$$PROVIDER + pluginspec.path = /$$IDE_LIBRARY_BASENAME/qtcreator/plugins/$$PROVIDER INSTALLS += target pluginspec } diff --git a/src/rpath.pri b/src/rpath.pri index 8b026982c96c5158c5e6564585bf410f059abbd5..e11b171c8e4779c8472602a1b2ec8ae71e918c56 100644 --- a/src/rpath.pri +++ b/src/rpath.pri @@ -3,7 +3,7 @@ macx { } else:linux-* { #do the rpath by hand since it's not possible to use ORIGIN in QMAKE_RPATHDIR # this expands to $ORIGIN (after qmake and make), it does NOT read a qmake var - QMAKE_RPATHDIR += \$\$ORIGIN/../lib/qtcreator + QMAKE_RPATHDIR += \$\$ORIGIN/../$$IDE_LIBRARY_BASENAME/qtcreator IDE_PLUGIN_RPATH = $$join(QMAKE_RPATHDIR, ":") QMAKE_LFLAGS += -Wl,-z,origin \'-Wl,-rpath,$${IDE_PLUGIN_RPATH}\' diff --git a/tests/manual/gdbdebugger/simple/app.cpp b/tests/manual/gdbdebugger/simple/app.cpp index 50191f91d12cfb52225e01126961544ca2b744a0..4115a49a50853b155ed20815b97609922075f05b 100644 --- a/tests/manual/gdbdebugger/simple/app.cpp +++ b/tests/manual/gdbdebugger/simple/app.cpp @@ -702,7 +702,6 @@ void testStdVector() void testQString() { - int i = 0; QString str = "Hello "; str += " big, "; str += " fat ";