diff options
author | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-04-18 14:26:13 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@qt.io> | 2018-04-19 05:27:07 +0000 |
commit | e6c7198a70502c40516c8708510c2031eeb12180 (patch) | |
tree | a5524e4ac557b82cd32eda9aee32867e3381843d /src/lib | |
parent | 5378c7d4dd7ef920841b01bca3cb75585e7ee5f2 (diff) |
Fix evaluation of qbs.profile in products
For the evaluation of qbs.profile we need a properly loaded qbs module
in prepareProduct. Re-use the code we already had in
multiplexProductItem.
Change-Id: Id3757edd70758f3739d5aaa52e7839ed7fdd8b00
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
Reviewed-by: Joerg Bornemann <joerg.bornemann@qt.io>
Diffstat (limited to 'src/lib')
-rw-r--r-- | src/lib/corelib/language/moduleloader.cpp | 62 | ||||
-rw-r--r-- | src/lib/corelib/language/moduleloader.h | 2 |
2 files changed, 43 insertions, 21 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index 0c2a246d6..7b700a2f0 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -787,30 +787,20 @@ ModuleLoader::MultiplexInfo ModuleLoader::extractMultiplexInfo(Item *productItem return multiplexInfo; } -QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, Item *productItem) +template <typename T, typename F> +T ModuleLoader::callWithTemporaryBaseModule(ProductContext *productContext, const F &func) { // Temporarily attach the qbs module here, in case we need to access one of its properties - // to evaluate properties needed for multiplexing. + // to evaluate properties. const QString &qbsKey = StringConstants::qbsModule(); + Item *productItem = productContext->item; ValuePtr qbsValue = productItem->property(qbsKey); // Retrieve now to restore later. if (qbsValue) qbsValue = qbsValue->clone(); - const Item::Module qbsModule = loadBaseModule(dummyContext, productItem); + const Item::Module qbsModule = loadBaseModule(productContext, productItem); productItem->addModule(qbsModule); - // Overriding the product item properties must be done here already, because multiplexing - // properties might depend on product properties. - const QString &nameKey = StringConstants::nameProperty(); - QString productName = m_evaluator->stringValue(productItem, nameKey); - if (productName.isEmpty()) { - productName = FileInfo::completeBaseName(productItem->file()->filePath()); - productItem->setProperty(nameKey, VariantValue::create(productName)); - } - overrideItemProperties(productItem, StringConstants::productsOverridePrefix() + productName, - m_parameters.overriddenValuesTree()); - - const MultiplexInfo &multiplexInfo = extractMultiplexInfo(productItem, qbsModule.item); - //dump(multiplexInfo); + auto &&result = func(qbsModule); // "Unload" the qbs module again. if (qbsValue) @@ -819,6 +809,32 @@ QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, I productItem->removeProperty(qbsKey); productItem->removeModules(); + return result; +} + +QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, Item *productItem) +{ + QString productName; + dummyContext->item = productItem; + auto extractMultiplexInfoFromProduct + = [this, productItem, &productName](const Item::Module &qbsModule) { + // Overriding the product item properties must be done here already, because multiplexing + // properties might depend on product properties. + const QString &nameKey = StringConstants::nameProperty(); + productName = m_evaluator->stringValue(productItem, nameKey); + if (productName.isEmpty()) { + productName = FileInfo::completeBaseName(productItem->file()->filePath()); + productItem->setProperty(nameKey, VariantValue::create(productName)); + } + overrideItemProperties(productItem, StringConstants::productsOverridePrefix() + productName, + m_parameters.overriddenValuesTree()); + + return extractMultiplexInfo(productItem, qbsModule.item); + }; + const MultiplexInfo multiplexInfo + = callWithTemporaryBaseModule<const MultiplexInfo>(dummyContext, + extractMultiplexInfoFromProduct); + if (multiplexInfo.table.size() > 1) productItem->setProperty(StringConstants::multiplexedProperty(), VariantValue::trueValue()); @@ -848,7 +864,7 @@ QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, I if (multiplexInfo.multiplexedType) item->setProperty(StringConstants::typeProperty(), multiplexInfo.multiplexedType); for (size_t column = 0; column < mprow.size(); ++column) { - Item *qbsItem = moduleInstanceItem(item, qbsKey); + Item *qbsItem = moduleInstanceItem(item, StringConstants::qbsModule()); const QString &propertyName = multiplexInfo.properties.at(column); const VariantValuePtr &mpvalue = mprow.at(column); qbsItem->setProperty(propertyName, mpvalue); @@ -861,7 +877,7 @@ QList<Item *> ModuleLoader::multiplexProductItem(ProductContext *dummyContext, I // Add dependencies to all multiplexed instances. for (const auto &v : multiplexConfigurationIdValues) { Item *dependsItem = Item::create(aggregator->pool(), ItemType::Depends); - dependsItem->setProperty(nameKey, productNameValue); + dependsItem->setProperty(StringConstants::nameProperty(), productNameValue); dependsItem->setProperty(StringConstants::multiplexConfigurationIdProperty(), v); dependsItem->setProperty(StringConstants::profilesProperty(), VariantValue::create(QStringList())); @@ -967,9 +983,13 @@ void ModuleLoader::prepareProduct(ProjectContext *projectContext, Item *productI if (!!qbsItemValue && qbsItemValue->item()->hasProperty(StringConstants::profileProperty())) { qbsItemValue->item()->setProperty(StringConstants::nameProperty(), VariantValue::create(StringConstants::nameProperty())); - productContext.profileName = m_evaluator->stringValue( - qbsItemValue->item(), - StringConstants::profileProperty(), QString()); + auto evaluateQbsProfileProperty = [this](const Item::Module &qbsModule) { + return m_evaluator->stringValue(qbsModule.item, + StringConstants::profileProperty(), QString()); + }; + productContext.profileName + = callWithTemporaryBaseModule<QString>(&productContext, + evaluateQbsProfileProperty); } else { productContext.profileName = m_parameters.topLevelProfile(); } diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index 5d7f20db4..7c090237b 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -291,6 +291,8 @@ private: bool isBaseModule, const QString &filePath, bool *triedToLoad, Item *moduleInstance); Item::Module loadBaseModule(ProductContext *productContext, Item *item); void setupBaseModulePrototype(Item *prototype); + template <typename T, typename F> + T callWithTemporaryBaseModule(ProductContext *productContext, const F &func); void instantiateModule(ProductContext *productContext, Item *exportingProductItem, Item *instanceScope, Item *moduleInstance, Item *modulePrototype, const QualifiedId &moduleName, ProductModuleInfo *productModuleInfo); |