From 08ce978733b33c1b1a64e5e1e62dea22cde6148c Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Thu, 23 Nov 2017 16:39:02 +0100 Subject: Fix inadvertant module prototype sharing A product that is not multiplexed in the sense that additional instances of it are created can still alter prototype values. Take this into account when deciding whether to re-use an existing module prototype. Task-number: QBS-1243 Change-Id: I017fc0dc9d6080d622b030e97796d254d17b3468 Reviewed-by: Jake Petroules --- src/lib/corelib/language/moduleloader.cpp | 14 +++++++++----- src/lib/corelib/language/moduleloader.h | 1 + .../testdata/pseudo-multiplexing/pseudo-multiplexing.qbs | 14 ++++++++++++++ tests/auto/blackbox/tst_blackbox.cpp | 8 ++++++++ tests/auto/blackbox/tst_blackbox.h | 1 + 5 files changed, 33 insertions(+), 5 deletions(-) create mode 100644 tests/auto/blackbox/testdata/pseudo-multiplexing/pseudo-multiplexing.qbs diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp index b8a4571a5..afdb908ea 100644 --- a/src/lib/corelib/language/moduleloader.cpp +++ b/src/lib/corelib/language/moduleloader.cpp @@ -822,10 +822,12 @@ QList ModuleLoader::multiplexProductItem(ProductContext *dummyContext, I item = productItem->clone(); additionalProductItems.append(item); } + const QString multiplexConfigurationId = multiplexInfo.toIdString(row); + const VariantValuePtr multiplexConfigurationIdValue + = VariantValue::create(multiplexConfigurationId); + item->setProperty(QStringLiteral("__multiplexConfigIdForModulePrototypes"), + multiplexConfigurationIdValue); if (multiplexInfo.table.size() > 1 || aggregator) { - const QString multiplexConfigurationId = multiplexInfo.toIdString(row); - const VariantValuePtr multiplexConfigurationIdValue - = VariantValue::create(multiplexConfigurationId); multiplexConfigurationIdValues.push_back(multiplexConfigurationIdValue); item->setProperty(multiplexConfigurationIdKey, multiplexConfigurationIdValue); } @@ -942,6 +944,8 @@ void ModuleLoader::prepareProduct(ProjectContext *projectContext, Item *productI QString(), &profilePropertySet); productContext.multiplexConfigurationId = m_evaluator->stringValue(productItem, QLatin1String("multiplexConfigurationId")); + productContext.multiplexConfigIdForModulePrototypes = m_evaluator->stringValue( + productItem, QStringLiteral("__multiplexConfigIdForModulePrototypes")); QBS_CHECK(profilePropertySet); const auto it = projectContext->result->profileConfigs.constFind(productContext.profileName); if (it == projectContext->result->profileConfigs.constEnd()) { @@ -2551,8 +2555,8 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, const QString qCDebug(lcModuleLoader) << "loadModuleFile" << fullModuleName << "from" << filePath; - const QString keyUniquifier = productContext->multiplexConfigurationId.isEmpty() ? - productContext->profileName : productContext->uniqueName(); + const QString keyUniquifier = productContext->multiplexConfigIdForModulePrototypes.isEmpty() + ? productContext->profileName : productContext->multiplexConfigIdForModulePrototypes; const ModuleItemCache::key_type cacheKey(filePath, keyUniquifier); const ItemCacheValue cacheValue = m_modulePrototypeItemCache.value(cacheKey); if (cacheValue.module) { diff --git a/src/lib/corelib/language/moduleloader.h b/src/lib/corelib/language/moduleloader.h index d9fb5d032..5b672e49c 100644 --- a/src/lib/corelib/language/moduleloader.h +++ b/src/lib/corelib/language/moduleloader.h @@ -164,6 +164,7 @@ private: QString name; QString profileName; QString multiplexConfigurationId; + QString multiplexConfigIdForModulePrototypes; QVariantMap moduleProperties; std::map productModuleDependencies; diff --git a/tests/auto/blackbox/testdata/pseudo-multiplexing/pseudo-multiplexing.qbs b/tests/auto/blackbox/testdata/pseudo-multiplexing/pseudo-multiplexing.qbs new file mode 100644 index 000000000..0639adc8a --- /dev/null +++ b/tests/auto/blackbox/testdata/pseudo-multiplexing/pseudo-multiplexing.qbs @@ -0,0 +1,14 @@ +import qbs + +Project { + Product { + name: "a" + multiplexByQbsProperties: ["architectures"] + Depends { name: "cpp" } + } + Product { + name: "b" + multiplexByQbsProperties: [] + Depends { name: "cpp" } + } +} diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp index 2677b041e..f4092c666 100644 --- a/tests/auto/blackbox/tst_blackbox.cpp +++ b/tests/auto/blackbox/tst_blackbox.cpp @@ -4247,6 +4247,14 @@ void TestBlackbox::propertiesInExportItems() QVERIFY2(m_qbsStderr.isEmpty(), m_qbsStderr.constData()); } +void TestBlackbox::pseudoMultiplexing() +{ + // This is "pseudo-multiplexing" on all platforms that initialize qbs.architectures + // to an array with one element. See QBS-1243. + QDir::setCurrent(testDataDir + "/pseudo-multiplexing"); + QCOMPARE(runQbs(), 0); +} + void TestBlackbox::radAfterIncompleteBuild_data() { QTest::addColumn("projectFileName"); diff --git a/tests/auto/blackbox/tst_blackbox.h b/tests/auto/blackbox/tst_blackbox.h index b31495ad0..3f7215995 100644 --- a/tests/auto/blackbox/tst_blackbox.h +++ b/tests/auto/blackbox/tst_blackbox.h @@ -170,6 +170,7 @@ private slots: void propertyPrecedence(); void properQuoting(); void propertiesInExportItems(); + void pseudoMultiplexing(); void qbsVersion(); void qtBug51237(); void radAfterIncompleteBuild(); -- cgit v1.2.3