diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-03-21 12:14:26 +0100 |
|---|---|---|
| committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-03-21 14:16:03 +0100 |
| commit | 33552c7bb7547c9492fdde7de9eecc6404a1328a (patch) | |
| tree | d17b90a9ebd772661791517738f81525cdb647e0 | |
| parent | 4d0e80bb4d6b1e50199683e9807027ea2558d094 (diff) | |
| download | qbs-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.cpp | 19 | ||||
| -rw-r--r-- | src/lib/language/moduleloader.h | 5 | ||||
| -rw-r--r-- | src/lib/language/testdata/conditionaldepends.qbs | 5 | ||||
| -rw-r--r-- | src/lib/language/tst_language.cpp | 5 |
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(); |
