aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@qt.io>2018-04-18 14:26:13 +0200
committerJoerg Bornemann <joerg.bornemann@qt.io>2018-04-19 05:27:07 +0000
commite6c7198a70502c40516c8708510c2031eeb12180 (patch)
treea5524e4ac557b82cd32eda9aee32867e3381843d /src/lib
parent5378c7d4dd7ef920841b01bca3cb75585e7ee5f2 (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.cpp62
-rw-r--r--src/lib/corelib/language/moduleloader.h2
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);