diff --git a/dist/changes-4.2.1.md b/dist/changes-4.2.1.md index c9380a24888..0d670fef2f2 100644 --- a/dist/changes-4.2.1.md +++ b/dist/changes-4.2.1.md @@ -24,6 +24,7 @@ All Projects * Fixed issue with upgrading tool chain settings in auto-detected kits * Fixed crash when setting custom executable (QTCREATORBUG-17505) +* Fixed MSVC support on Windows Vista and earlier (QTCREATORBUG-17501) QMake Projects @@ -32,6 +33,7 @@ QMake Projects (QTCREATORBUG-17462, QTCREATORBUG-17477) * Fixed that `OTHER_FILES` and `DISTFILES` in subdirs projects were no longer shown in project tree (QTCREATORBUG-17473) +* Fixed crash caused by unnormalized file paths (QTCREATORBUG-17364) Qbs Projects diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index 39f66269085..d17beecafa2 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -152,6 +152,7 @@ public: QString toString(bool multiline = false, int indent = 0) const; qulonglong toAddress() const; int toInt() const { return m_data.toInt(); } + qint64 toLongLong() const { return m_data.toLongLong(); } void fromString(const QString &str); void fromStringMultiple(const QString &str); diff --git a/src/plugins/debugger/lldb/lldbengine.cpp b/src/plugins/debugger/lldb/lldbengine.cpp index 651a4396ae8..5a625c45d50 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -489,6 +489,8 @@ void LldbEngine::handleResponse(const QString &response) handleLocationNotification(item); else if (name == "output") handleOutputNotification(item); + else if (name == "pid") + notifyInferiorPid(item.toLongLong()); } } diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index 5d6536c78ee..bc9f0e5dc0b 100644 --- a/src/plugins/projectexplorer/project.cpp +++ b/src/plugins/projectexplorer/project.cpp @@ -276,6 +276,7 @@ Target *Project::createTarget(Kit *k) bool Project::copySteps(Target *sourceTarget, Target *newTarget) { + QTC_ASSERT(newTarget, return false); bool fatalError = false; QStringList buildconfigurationError; QStringList deployconfigurationError; diff --git a/src/plugins/projectexplorer/targetsettingspanel.cpp b/src/plugins/projectexplorer/targetsettingspanel.cpp index 75fd0db57fd..f7ccbf62e8f 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -443,7 +443,7 @@ public: }); QMenu *copyMenu = menu->addMenu(tr("Copy Steps From Other Kit...")); - if (m_kitId.isValid()) { + if (m_kitId.isValid() && m_project->target(m_kitId)) { const QList kits = KitManager::kits(); for (Kit *kit : kits) { QAction *copyAction = copyMenu->addAction(kit->displayName()); diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index d0cdf78780a..a46866d63de 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -936,6 +936,7 @@ void QbsProject::updateCppCodeModel() QLatin1String(CONFIG_INCLUDEPATHS)); list.append(props.getModulePropertiesAsStringList(QLatin1String(CONFIG_CPP_MODULE), QLatin1String(CONFIG_SYSTEM_INCLUDEPATHS))); + list.removeDuplicates(); CppTools::ProjectPartHeaderPaths grpHeaderPaths; foreach (const QString &p, list) grpHeaderPaths += CppTools::ProjectPartHeaderPath( @@ -946,6 +947,7 @@ void QbsProject::updateCppCodeModel() QLatin1String(CONFIG_FRAMEWORKPATHS)); list.append(props.getModulePropertiesAsStringList(QLatin1String(CONFIG_CPP_MODULE), QLatin1String(CONFIG_SYSTEM_FRAMEWORKPATHS))); + list.removeDuplicates(); foreach (const QString &p, list) grpHeaderPaths += CppTools::ProjectPartHeaderPath( FileName::fromUserInput(p).toString(), diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 72e0dcda212..a9bdd2899d2 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -1740,7 +1740,7 @@ static QByteArray scanQtBinaryForBuildString(const FileName &library) const size_t oneMiB = 1024 * 1024; const size_t keepSpace = 4096; const size_t bufferSize = oneMiB + keepSpace; - QByteArray buffer(bufferSize, '\0'); + QByteArray buffer(bufferSize, Qt::Uninitialized); char *const readStart = buffer.data() + keepSpace; auto readStartIt = buffer.begin() + keepSpace; @@ -1788,39 +1788,72 @@ static QByteArray scanQtBinaryForBuildString(const FileName &library) return buildString; } -static Abi refineAbiFromBuildString(const QByteArray &buildString, const Abi &probableAbi) +static QStringList extractFieldsFromBuildString(const QByteArray &buildString) { if (buildString.isEmpty() || buildString.count() > 4096) - return Abi(); + return QStringList(); const QRegularExpression buildStringMatcher("^Qt " - "([\\d\\.a-zA-Z]*) " // Qt version + "([\\d\\.a-zA-Z]*) " // Qt version "\\(" - "([a-z\\d_]*)-" // CPU - "(big|little)_endian-" - "([a-z]+(?:32|64))" // pointer information - "(?:-(qreal|))?" // extra information like -qreal - "(?:-([^-]+))? " // ABI information + "([\\w_-]+) " // Abi information "(shared|static) (?:\\(dynamic\\) )?" "(debug|release)" " build; by " - "(.*)" // compiler with extra info + "(.*)" // compiler with extra info "\\)$"); QTC_ASSERT(buildStringMatcher.isValid(), qWarning() << buildStringMatcher.errorString()); - const QRegularExpressionMatch match = buildStringMatcher.match(QString::fromUtf8(buildString)); - QTC_ASSERT(match.hasMatch(), return Abi()); - // const QString qtVersion = match.captured(1); - // const QString cpu = match.captured(2); - // const bool littleEndian = (match.captured(3) == "little"); - // const QString pointer = match.captured(4); - // const QString extra = match.captured(5); - // const QString abiString = match.captured(6); - // const QString linkage = match.captured(7); - // const QString buildType = match.captured(8); - const QString compiler = match.captured(9); + const QRegularExpressionMatch match = buildStringMatcher.match(QString::fromUtf8(buildString)); + if (!match.hasMatch()) + return QStringList(); + + QStringList result; + result.append(match.captured(1)); // qtVersion + + // Abi info string: + QStringList abiInfo = match.captured(2).split('-', QString::SkipEmptyParts); + + result.append(abiInfo.takeFirst()); // cpu + + const QString endian = abiInfo.takeFirst(); + QTC_ASSERT(endian.endsWith("_endian"), return QStringList()); + result.append(endian.left(endian.count() - 7)); // without the "_endian" + + result.append(abiInfo.takeFirst()); // pointer + + if (abiInfo.isEmpty()) { + // no extra info whatsoever: + result.append(""); // qreal is unset + result.append(""); // extra info is unset + } else { + const QString next = abiInfo.at(0); + if (next.startsWith("qreal_")) { + abiInfo.takeFirst(); + result.append(next.mid(6)); // qreal: without the "qreal_" part; + } else { + result.append(""); // qreal is unset! + } + + result.append(abiInfo.join('-')); // extra abi strings + } + + result.append(match.captured(3)); // linkage + result.append(match.captured(4)); // buildType + result.append(match.captured(5)); // compiler + + return result; +} + +static Abi refineAbiFromBuildString(const QByteArray &buildString, const Abi &probableAbi) +{ + QStringList buildStringData = extractFieldsFromBuildString(buildString); + if (buildStringData.count() != 9) + return probableAbi; + + const QString compiler = buildStringData.at(8); Abi::Architecture arch = probableAbi.architecture(); Abi::OS os = probableAbi.os(); @@ -1873,3 +1906,57 @@ QList BaseQtVersion::qtAbisFromLibrary(const FileNameList &coreLibraries) } return res; } + +#if defined(WITH_TESTS) + +#include + +#include "qtsupportplugin.h" + +void QtSupportPlugin::testQtBuildStringParsing_data() +{ + QTest::addColumn("buildString"); + QTest::addColumn("expected"); + + QTest::newRow("invalid build string") + << QByteArray("Qt with invalid buildstring") << QString(); + QTest::newRow("empty build string") + << QByteArray("") << QString(); + QTest::newRow("huge build string") + << QByteArray(8192, 'x') << QString(); + + QTest::newRow("valid build string") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64 shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;;;shared;release;GCC 6.2.1 20160830"; + + QTest::newRow("with qreal") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64-qreal___fp16 shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;__fp16;;shared;release;GCC 6.2.1 20160830"; + QTest::newRow("with qreal and abi") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64-qreal___fp16-eabi shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;__fp16;eabi;shared;release;GCC 6.2.1 20160830"; + QTest::newRow("with qreal, eabi and softfloat") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64-qreal___fp16-eabi-softfloat shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;__fp16;eabi-softfloat;shared;release;GCC 6.2.1 20160830"; + QTest::newRow("with eabi") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64-eabi shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;;eabi;shared;release;GCC 6.2.1 20160830"; + QTest::newRow("with eabi and softfloat") + << QByteArray("Qt 5.7.1 (x86_64-little_endian-lp64-eabi-softfloat shared (dynamic) release build; by GCC 6.2.1 20160830)") + << "5.7.1;x86_64;little;lp64;;eabi-softfloat;shared;release;GCC 6.2.1 20160830"; +} + +void QtSupportPlugin::testQtBuildStringParsing() +{ + QFETCH(QByteArray, buildString); + QFETCH(QString, expected); + + QStringList expectedList; + if (!expected.isEmpty()) + expectedList = expected.split(';'); + + QStringList actual = extractFieldsFromBuildString(buildString); + QCOMPARE(expectedList, actual); +} + +#endif // WITH_TESTS diff --git a/src/plugins/qtsupport/qtsupportplugin.h b/src/plugins/qtsupport/qtsupportplugin.h index fe0585c50fc..1756b2a1c45 100644 --- a/src/plugins/qtsupport/qtsupportplugin.h +++ b/src/plugins/qtsupport/qtsupportplugin.h @@ -53,6 +53,10 @@ private slots: void testQtProjectImporter_oneProject_data(); void testQtProjectImporter_oneProject(); + + void testQtBuildStringParsing_data(); + void testQtBuildStringParsing(); + #if 0 void testQtProjectImporter_oneProjectExistingKit(); void testQtProjectImporter_oneProjectNewKitExistingQt(); diff --git a/src/shared/proparser/profileevaluator.cpp b/src/shared/proparser/profileevaluator.cpp index f60c6afa2c8..99f4fe02625 100644 --- a/src/shared/proparser/profileevaluator.cpp +++ b/src/shared/proparser/profileevaluator.cpp @@ -83,7 +83,7 @@ QVector ProFileEvaluator::fixifiedValues( foreach (const ProString &str, d->values(ProKey(variable))) { const QString &el = d->m_option->expandEnvVars(str.toQString()); if (IoUtils::isAbsolutePath(el)) { - result << SourceFile{ el, str.sourceFile() }; + result << SourceFile{ QDir::cleanPath(el), str.sourceFile() }; } else { QString fn = QDir::cleanPath(baseDirectory + QLatin1Char('/') + el); if (IoUtils::exists(fn)) @@ -132,16 +132,17 @@ QVector ProFileEvaluator::absoluteFileValues( const QString &el = d->m_option->expandEnvVars(str.toQString()); QString absEl; if (IoUtils::isAbsolutePath(el)) { - if (m_vfs->exists(el, flags)) { - result << SourceFile{ el, str.sourceFile() }; + QString fn = QDir::cleanPath(el); + if (m_vfs->exists(fn, flags)) { + result << SourceFile{ fn, str.sourceFile() }; goto next; } - absEl = el; + absEl = fn; } else { foreach (const QString &dir, searchDirs) { QString fn = QDir::cleanPath(dir + QLatin1Char('/') + el); if (m_vfs->exists(fn, flags)) { - result << SourceFile{ QDir::cleanPath(fn), str.sourceFile() }; + result << SourceFile{ fn, str.sourceFile() }; goto next; } } diff --git a/src/shared/qbs b/src/shared/qbs index a64a0ef5fc4..3fec40fad03 160000 --- a/src/shared/qbs +++ b/src/shared/qbs @@ -1 +1 @@ -Subproject commit a64a0ef5fc454b18a9474b39517a100d8f1fdf3c +Subproject commit 3fec40fad03aa1c4c7bb85a435c6aa9abe3a6bb7 diff --git a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml index 124113a2651..6e254742aba 100644 --- a/tests/system/settings/mac/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/mac/QtProject/qtcreator/profiles.xml @@ -13,6 +13,10 @@ Desktop ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + + {461bb8dc-22ff-461f-82fe-ebe8b21b697f} + ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + 4 @@ -97,6 +101,10 @@ GenericLinuxOsType ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + + {461bb8dc-22ff-461f-82fe-ebe8b21b697f} + ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + 4 @@ -119,6 +127,10 @@ Desktop ProjectExplorer.ToolChain.Clang:{6afe7dea-8caa-424e-b370-b7b0a34015fb} + + {0db093b8-890b-4fad-a4bc-9078124fe866} + ProjectExplorer.ToolChain.Clang:{6afe7dea-8caa-424e-b370-b7b0a34015fb} + 9 @@ -141,6 +153,10 @@ Desktop ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + + {461bb8dc-22ff-461f-82fe-ebe8b21b697f} + ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + 2 @@ -163,6 +179,10 @@ Desktop ProjectExplorer.ToolChain.Clang:{6afe7dea-8caa-424e-b370-b7b0a34015fb} + + {0db093b8-890b-4fad-a4bc-9078124fe866} + ProjectExplorer.ToolChain.Clang:{6afe7dea-8caa-424e-b370-b7b0a34015fb} + 11 diff --git a/tests/system/settings/mac/QtProject/qtcreator/toolchains.xml b/tests/system/settings/mac/QtProject/qtcreator/toolchains.xml index 672ebb50fb9..69bbde66b7e 100644 --- a/tests/system/settings/mac/QtProject/qtcreator/toolchains.xml +++ b/tests/system/settings/mac/QtProject/qtcreator/toolchains.xml @@ -15,6 +15,7 @@ false GCC ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + 2 @@ -28,6 +29,7 @@ false GCC for Fremantle ProjectExplorer.ToolChain.Gcc:{32ee0a53-87d9-4f17-b8a5-a7642101e803} + 2 @@ -41,6 +43,7 @@ false GCC for Harmattan ProjectExplorer.ToolChain.Gcc:{9be34a3b-acf0-4570-be0d-34cd224d8efe} + 2 @@ -55,11 +58,43 @@ false Clang (x86 64bit) ProjectExplorer.ToolChain.Clang:{6afe7dea-8caa-424e-b370-b7b0a34015fb} + 2 + + + + ToolChain.4 + + /usr/bin/clang + + x86-macos-generic-mach_o-64bit + x86-macos-generic-mach_o-32bit + + SET_BY_SQUISH + false + Clang [C] + ProjectExplorer.ToolChain.Clang:{0db093b8-890b-4fad-a4bc-9078124fe866} + 1 + + + + ToolChain.5 + + /usr/bin/gcc + + x86-linux-generic-elf-64bit + x86-linux-generic-elf-32bit + x86-macos-generic-mach_o-64bit + + SET_BY_SQUISH + false + GCC [C] + ProjectExplorer.ToolChain.Gcc:{461bb8dc-22ff-461f-82fe-ebe8b21b697f} + 1 ToolChain.Count - 4 + 6 Version diff --git a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml index 6526ccdc57b..aac3728ef36 100644 --- a/tests/system/settings/unix/QtProject/qtcreator/profiles.xml +++ b/tests/system/settings/unix/QtProject/qtcreator/profiles.xml @@ -97,6 +97,10 @@ GenericLinuxOsType ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + + {7bfd4fd4-e64a-417f-b10f-20602e1719d1} + ProjectExplorer.ToolChain.Gcc:{c3f59b87-6997-4bd8-8067-ee04dc536371} + 4 diff --git a/tests/system/settings/unix/QtProject/qtcreator/toolchains.xml b/tests/system/settings/unix/QtProject/qtcreator/toolchains.xml index 5c9c9b48c8f..20194d2fba9 100644 --- a/tests/system/settings/unix/QtProject/qtcreator/toolchains.xml +++ b/tests/system/settings/unix/QtProject/qtcreator/toolchains.xml @@ -1,6 +1,6 @@ - + ToolChain.0 @@ -43,9 +43,27 @@ ProjectExplorer.ToolChain.Gcc:{9be34a3b-acf0-4570-be0d-34cd224d8efe} + + ToolChain.3 + + x86_64-linux-gnu + /usr/bin/gcc + + + + x86-linux-generic-elf-64bit + x86-linux-generic-elf-32bit + + SET_BY_SQUISH + false + GCC + ProjectExplorer.ToolChain.Gcc:{7bfd4fd4-e64a-417f-b10f-20602e1719d1} + 1 + + ToolChain.Count - 3 + 4 Version