aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristian Kandeler <christian.kandeler@qt.io>2017-11-23 16:39:02 +0100
committerJake Petroules <jake.petroules@qt.io>2017-11-23 21:28:25 +0000
commit08ce978733b33c1b1a64e5e1e62dea22cde6148c (patch)
tree975b1b9c1b5c236d571b2efe189f54724362a0b7
parent757dede7866a39f186feb9db4d67bad4a60c2894 (diff)
Fix inadvertant module prototype sharingv1.10.0
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 <jake.petroules@qt.io>
-rw-r--r--src/lib/corelib/language/moduleloader.cpp14
-rw-r--r--src/lib/corelib/language/moduleloader.h1
-rw-r--r--tests/auto/blackbox/testdata/pseudo-multiplexing/pseudo-multiplexing.qbs14
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp8
-rw-r--r--tests/auto/blackbox/tst_blackbox.h1
5 files changed, 33 insertions, 5 deletions
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<Item *> 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<QString, ProductDependencies> 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<QString>("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();