From 1a6e6ed553d09c9d8647191216622c2b9c55a43a Mon Sep 17 00:00:00 2001 From: Robert Loehning Date: Fri, 6 Jan 2017 13:19:53 +0100 Subject: [PATCH 1/9] Squish: Configure C-toolchains for Linux Change-Id: Id2bd1768e2520bbcfdc918939722f7f5935b8fce Reviewed-by: Christian Stenger --- .../unix/QtProject/qtcreator/profiles.xml | 4 ++++ .../unix/QtProject/qtcreator/toolchains.xml | 22 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) 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 From 821bc8cdb1be581df6255a1cad2466a3c9fbd1bc Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Tue, 17 Jan 2017 15:10:39 +0100 Subject: [PATCH 2/9] QMake: fix filename normalization apart from various project tree related issues, we've also seen crashes. Task-number: QTCREATORBUG-17364 Change-Id: I61bb8aff301a048646ed97f8fa2c825cbff8d2cb Reviewed-by: Tim Jenssen --- src/shared/proparser/profileevaluator.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) 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; } } From 178430dcd1d58b9062f727245b66a6dfeeb01f95 Mon Sep 17 00:00:00 2001 From: Filipe Azevedo Date: Tue, 17 Jan 2017 13:27:14 +0100 Subject: [PATCH 3/9] Fix inferior pid not being propagated Change-Id: I373621f78bae04f7cdcc66fcf84712acb4245014 Reviewed-by: hjk --- src/plugins/debugger/debuggerprotocol.h | 1 + src/plugins/debugger/lldb/lldbengine.cpp | 2 ++ 2 files changed, 3 insertions(+) diff --git a/src/plugins/debugger/debuggerprotocol.h b/src/plugins/debugger/debuggerprotocol.h index ceb3c9206d5..63d1b0c6dfb 100644 --- a/src/plugins/debugger/debuggerprotocol.h +++ b/src/plugins/debugger/debuggerprotocol.h @@ -105,6 +105,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 1a8593686bd..363ca78aa56 100644 --- a/src/plugins/debugger/lldb/lldbengine.cpp +++ b/src/plugins/debugger/lldb/lldbengine.cpp @@ -488,6 +488,8 @@ void LldbEngine::handleResponse(const QString &response) handleLocationNotification(item); else if (name == "output") handleOutputNotification(item); + else if (name == "pid") + notifyInferiorPid(item.toLongLong()); } } From bdd0c8375125a618f930d869ff135bffcda76b36 Mon Sep 17 00:00:00 2001 From: Christian Stenger Date: Tue, 17 Jan 2017 13:52:45 +0100 Subject: [PATCH 4/9] Squish: Configure C-toolchains for macOS Change-Id: I3d4fcc25ecca8a02e8dbbace4fc063a72cd85a40 Reviewed-by: Robert Loehning --- .../mac/QtProject/qtcreator/profiles.xml | 20 ++++++++++ .../mac/QtProject/qtcreator/toolchains.xml | 37 ++++++++++++++++++- 2 files changed, 56 insertions(+), 1 deletion(-) 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 From ec5a669b395debbda2aab3fa04bdb8504d55eb9a Mon Sep 17 00:00:00 2001 From: hjk Date: Thu, 19 Jan 2017 10:22:38 +0100 Subject: [PATCH 5/9] ProjectExplorer: Disable copying steps to inactive kits This fixes a hard crash due to a Target nullptr. Change-Id: I3065ac61bc950413d8958bcad5420f5868afd35c Reviewed-by: Tobias Hunger --- src/plugins/projectexplorer/project.cpp | 1 + src/plugins/projectexplorer/targetsettingspanel.cpp | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/plugins/projectexplorer/project.cpp b/src/plugins/projectexplorer/project.cpp index b48f8d36dd6..945fef74aab 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 17121533018..c6c237e2e37 100644 --- a/src/plugins/projectexplorer/targetsettingspanel.cpp +++ b/src/plugins/projectexplorer/targetsettingspanel.cpp @@ -447,7 +447,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()); From 7071b61e02d6c90319435871533ea96a9e22f6b0 Mon Sep 17 00:00:00 2001 From: Eike Ziller Date: Thu, 19 Jan 2017 13:35:27 +0100 Subject: [PATCH 6/9] More change log Change-Id: I418bfad8e5a38be395018aed799d7b74dd43d6e2 Reviewed-by: Leena Miettinen --- dist/changes-4.2.1.md | 2 ++ 1 file changed, 2 insertions(+) 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 From 3df1d5ef39bd7360b6200fbcaad08ce159cda679 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 20 Jan 2017 09:30:24 +0100 Subject: [PATCH 7/9] Update qbs submodule To HEAD of 1.7 branch. Change-Id: I19362ac6ae99dcf3c8a00c3ccd187a2173652633 Reviewed-by: Jake Petroules --- src/shared/qbs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 From 68e5691047f3b89b1c88b7a9e7e45309b10c6bd1 Mon Sep 17 00:00:00 2001 From: Tobias Hunger Date: Fri, 13 Jan 2017 10:44:52 +0100 Subject: [PATCH 8/9] BaseQtVersion: Fix Qt build string parsing This fixes Qt build string parsing based on feedback from Thiago. Also adds unit test for the code that parses the build string so that we can be more sure that it actually works as expected. Change-Id: I23cff7125be4c7c87d5eba4b1db7cb47c2479b66 Reviewed-by: Thiago Macieira Reviewed-by: Tim Jenssen --- src/plugins/qtsupport/baseqtversion.cpp | 129 ++++++++++++++++++++---- src/plugins/qtsupport/qtsupportplugin.h | 4 + 2 files changed, 112 insertions(+), 21 deletions(-) diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index 1c1021a08f9..662ad029754 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -1746,7 +1746,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; @@ -1794,39 +1794,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(); @@ -1879,3 +1912,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(); From 014167c8e8fe642874a330ae41a444e6f3ed73a9 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 20 Jan 2017 11:30:49 +0100 Subject: [PATCH 9/9] QbsProjectManager: Remove duplicate include paths for the code model Task-number: QTCREATORBUG-17381 Change-Id: Iabf1cdfe7988181e0e20396c5a5ec02e51e27f44 Reviewed-by: Nikolai Kosjar --- src/plugins/qbsprojectmanager/qbsproject.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/plugins/qbsprojectmanager/qbsproject.cpp b/src/plugins/qbsprojectmanager/qbsproject.cpp index 7b8bc88d61d..3c3747d30c5 100644 --- a/src/plugins/qbsprojectmanager/qbsproject.cpp +++ b/src/plugins/qbsprojectmanager/qbsproject.cpp @@ -934,6 +934,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( @@ -944,6 +945,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(),