diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-04-25 13:37:40 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-04-29 10:49:08 +0200 |
commit | a75eb428f44ade0bd179846160726986378ff427 (patch) | |
tree | 85b71eeed85a030309e6b2c2f6ff27836717d4f3 | |
parent | 19f62f82e63ce633d55e32c6c3cfc4e2be773ced (diff) |
do not load the same module multiple times
If there are multiple Depends items for the same module name then
we must load the module only once.
This can easily happen when using item inheritance.
Autotest included.
Change-Id: I1b592ecce8de21d2c4cd66097b16a4fe7cca71bb
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
-rw-r--r-- | src/lib/language/moduleloader.cpp | 9 | ||||
-rw-r--r-- | src/lib/language/testdata/modules.qbs | 5 | ||||
-rw-r--r-- | src/lib/language/tst_language.cpp | 3 |
3 files changed, 17 insertions, 0 deletions
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp index dcd689e2f..960299f1f 100644 --- a/src/lib/language/moduleloader.cpp +++ b/src/lib/language/moduleloader.cpp @@ -298,12 +298,21 @@ void ModuleLoader::resolveDependencies(DependsContext *dependsContext, Item *ite &productDependencies); // Check Depends conditions after all modules are loaded. + QSet<QString> loadedModuleNames; for (QHash<Item *, ItemModuleList>::const_iterator it = loadedModules.constBegin(); it != loadedModules.constEnd(); ++it) { Item *dependsItem = it.key(); if (checkItemCondition(dependsItem)) { foreach (const Item::Module &module, it.value()) { + const QString fullName = fullModuleName(module.name); + if (loadedModuleNames.contains(fullName)) { + m_logger.qbsWarning() + << Tr::tr("Duplicate dependency '%1' at %2.").arg( + fullName, item->location().toString()); + continue; + } + loadedModuleNames.insert(fullName); item->modules() += module; resolveProbes(module.item); } diff --git a/src/lib/language/testdata/modules.qbs b/src/lib/language/testdata/modules.qbs index 0f97d2e97..7841def35 100644 --- a/src/lib/language/testdata/modules.qbs +++ b/src/lib/language/testdata/modules.qbs @@ -26,4 +26,9 @@ Project { submodules: ["gui", "network"] } } + Product { + name: "dummy_twice" + Depends { name: "dummy" } + Depends { name: "dummy" } + } } diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp index d28d0385f..336719cf4 100644 --- a/src/lib/language/tst_language.cpp +++ b/src/lib/language/tst_language.cpp @@ -669,6 +669,9 @@ void TestLanguage::modules_data() << (QStringList() << "qbs" << "dummy" << "dummyqt/core" << "dummyqt/gui" << "dummyqt/network") << QString("guiProperty,networkProperty"); + QTest::newRow("dummy_twice") + << (QStringList() << "qbs" << "dummy") + << QString(); QTest::newRow("cleanup") << QStringList(); } |