aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--src/lib/corelib/language/moduleloader.cpp62
-rw-r--r--src/lib/corelib/language/moduleloader.h2
-rw-r--r--tests/auto/api/testdata/local-profiles/local-profiles.qbs7
3 files changed, 47 insertions, 24 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);
diff --git a/tests/auto/api/testdata/local-profiles/local-profiles.qbs b/tests/auto/api/testdata/local-profiles/local-profiles.qbs
index d71b8d8ca..7832cab58 100644
--- a/tests/auto/api/testdata/local-profiles/local-profiles.qbs
+++ b/tests/auto/api/testdata/local-profiles/local-profiles.qbs
@@ -4,13 +4,14 @@ Project {
property string windowsProfile: "windowsProfile"
property bool enableProfiles
property string mingwToolchain: "mingw"
+ property string mingwProfile: "mingwProfile"
Profile {
name: windowsProfile
qbs.targetPlatform: "windows"
}
Profile {
- name: "mingwProfile"
+ name: project.mingwProfile
condition: enableProfiles
baseProfile: project.windowsProfile
qbs.toolchainType: project.mingwToolchain
@@ -22,7 +23,7 @@ Project {
aggregate: false
multiplexByQbsProperties: ["buildVariants"]
qbs.buildVariants: ["debug", "release"]
- qbs.profile: "mingwProfile"
+ qbs.profile: project.mingwProfile
}
DynamicLibrary {
name: "lib"
@@ -40,6 +41,6 @@ Project {
}
multiplexByQbsProperties: ["profiles"]
- qbs.profiles: ["mingwProfile", "clangProfile"]
+ qbs.profiles: [project.mingwProfile, "clangProfile"]
}
}