aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-04-25 13:37:40 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-04-29 10:49:08 +0200
commita75eb428f44ade0bd179846160726986378ff427 (patch)
tree85b71eeed85a030309e6b2c2f6ff27836717d4f3
parent19f62f82e63ce633d55e32c6c3cfc4e2be773ced (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.cpp9
-rw-r--r--src/lib/language/testdata/modules.qbs5
-rw-r--r--src/lib/language/tst_language.cpp3
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();
}