summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-03-21 12:14:26 +0100
committerChristian Kandeler <christian.kandeler@digia.com>2013-03-21 14:16:03 +0100
commit33552c7bb7547c9492fdde7de9eecc6404a1328a (patch)
treed17b90a9ebd772661791517738f81525cdb647e0
parent4d0e80bb4d6b1e50199683e9807027ea2558d094 (diff)
downloadqbs-33552c7bb7547c9492fdde7de9eecc6404a1328a.tar.gz
evaluate Depends.condition for product dependencies
Autotest added. Task-number: QBS-231 Change-Id: Ie818043d3cf9fa65c5aff96abad084414f69601a Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
-rw-r--r--src/lib/language/moduleloader.cpp19
-rw-r--r--src/lib/language/moduleloader.h5
-rw-r--r--src/lib/language/testdata/conditionaldepends.qbs5
-rw-r--r--src/lib/language/tst_language.cpp5
4 files changed, 29 insertions, 5 deletions
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp
index efbda634e..dfccdae63 100644
--- a/src/lib/language/moduleloader.cpp
+++ b/src/lib/language/moduleloader.cpp
@@ -286,9 +286,11 @@ void ModuleLoader::resolveDependencies(DependsContext *dependsContext, const Ite
// Resolve all Depends items.
QHash<ItemPtr, ItemModuleList> loadedModules;
+ ProductDependencyResults productDependencies;
foreach (const ItemPtr &child, item->children())
if (child->typeName() == QLatin1String("Depends"))
- resolveDependsItem(dependsContext, item, child, &loadedModules[child]);
+ resolveDependsItem(dependsContext, item, child, &loadedModules[child],
+ &productDependencies);
// Check Depends conditions after all modules are loaded.
for (QHash<ItemPtr, ItemModuleList>::const_iterator it = loadedModules.constBegin();
@@ -302,10 +304,19 @@ void ModuleLoader::resolveDependencies(DependsContext *dependsContext, const Ite
}
}
}
+
+ // Check Depends conditions for all product dependencies.
+ for (ProductDependencyResults::const_iterator it = productDependencies.constBegin();
+ it != productDependencies.constEnd(); ++it) {
+ const ItemPtr &dependsItem = it->first;
+ if (checkItemCondition(dependsItem))
+ dependsContext->productDependencies->append(it->second);
+ }
}
void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, const ItemPtr &item,
- const ItemPtr &dependsItem, ItemModuleList *results)
+ const ItemPtr &dependsItem, ItemModuleList *moduleResults,
+ ProductDependencyResults *productResults)
{
checkCancelation();
const QString name = m_evaluator->property(dependsItem, "name").toString().toLower();
@@ -351,14 +362,14 @@ void ModuleLoader::resolveDependsItem(DependsContext *dependsContext, const Item
m_logger.qbsTrace() << "module loaded: " << fullModuleName(qualifiedModuleName);
result.name = qualifiedModuleName;
result.item = moduleItem;
- results->append(result);
+ moduleResults->append(result);
} else {
ModuleLoaderResult::ProductInfo::Dependency dependency;
dependency.name = moduleName;
dependency.required = m_evaluator->property(item, QLatin1String("required")).toBool();
dependency.failureMessage
= m_evaluator->property(item, QLatin1String("failureMessage")).toString();
- dependsContext->productDependencies->append(dependency);
+ productResults->append(ProductDependencyResult(dependsItem, dependency));
}
}
}
diff --git a/src/lib/language/moduleloader.h b/src/lib/language/moduleloader.h
index b6b035784..2bfe77423 100644
--- a/src/lib/language/moduleloader.h
+++ b/src/lib/language/moduleloader.h
@@ -123,6 +123,9 @@ private:
QList<ModuleLoaderResult::ProductInfo::Dependency> *productDependencies;
};
+ typedef QPair<ItemPtr, ModuleLoaderResult::ProductInfo::Dependency> ProductDependencyResult;
+ typedef QList<ProductDependencyResult> ProductDependencyResults;
+
void handleProject(ModuleLoaderResult *loadResult, const ItemPtr &item);
void handleProduct(ProjectContext *projectContext, const ItemPtr &item);
void createAdditionalModuleInstancesInProduct(ProductContext *productContext);
@@ -132,7 +135,7 @@ private:
void propagateModulesFromProduct(ProductContext *productContext, const ItemPtr &item);
void resolveDependencies(DependsContext *productContext, const ItemPtr &item);
class ItemModuleList;
- void resolveDependsItem(DependsContext *dependsContext, const ItemPtr &item, const ItemPtr &dependsItem, ItemModuleList *results);
+ void resolveDependsItem(DependsContext *dependsContext, const ItemPtr &item, const ItemPtr &dependsItem, ItemModuleList *moduleResults, ProductDependencyResults *productResults);
static ItemPtr moduleInstanceItem(const ItemPtr &item, const QStringList &moduleName);
ItemPtr loadModule(ProductContext *productContext, const ItemPtr &item, const QString &moduleId, const QStringList &moduleName);
ItemPtr searchAndLoadModuleFile(ProductContext *productContext, const QStringList &moduleName, const QStringList &extraSearchPaths);
diff --git a/src/lib/language/testdata/conditionaldepends.qbs b/src/lib/language/testdata/conditionaldepends.qbs
index 71a763dc9..8ad3660ec 100644
--- a/src/lib/language/testdata/conditionaldepends.qbs
+++ b/src/lib/language/testdata/conditionaldepends.qbs
@@ -59,4 +59,9 @@ Project {
Depends { condition: true; name: "dummy" } // this one wins
Depends { condition: false; name: "dummy" }
}
+
+ Product {
+ name: "unknown_dependency_condition_false"
+ Depends { condition: false; name: "doesonlyexistifhellfreezesover" }
+ }
}
diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp
index aad1737bf..2add6874e 100644
--- a/src/lib/language/tst_language.cpp
+++ b/src/lib/language/tst_language.cpp
@@ -186,6 +186,11 @@ void TestLanguage::conditionalDepends()
QVERIFY(product);
dependency = findModuleByName(product, "dummy");
QVERIFY(dependency);
+
+ product = products.value("unknown_dependency_condition_false");
+ QVERIFY(product);
+ dependency = findModuleByName(product, "doesonlyexistifhellfreezesover");
+ QVERIFY(!dependency);
} catch (const Error &e) {
exceptionCaught = true;
qDebug() << e.toString();