aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/lib/corelib/language/moduleloader.cpp5
-rw-r--r--src/lib/corelib/language/modulemerger.cpp13
-rw-r--r--src/lib/corelib/language/modulemerger.h1
-rw-r--r--tests/auto/language/testdata/module-merging-variant-values/module-merging-variant-values.qbs7
-rw-r--r--tests/auto/language/testdata/module-merging-variant-values/modules/m1/m1.qbs6
-rw-r--r--tests/auto/language/testdata/module-merging-variant-values/modules/m2/m2.qbs14
-rw-r--r--tests/auto/language/tst_language.cpp18
-rw-r--r--tests/auto/language/tst_language.h1
8 files changed, 59 insertions, 6 deletions
diff --git a/src/lib/corelib/language/moduleloader.cpp b/src/lib/corelib/language/moduleloader.cpp
index 36bde088f..879acff3d 100644
--- a/src/lib/corelib/language/moduleloader.cpp
+++ b/src/lib/corelib/language/moduleloader.cpp
@@ -3091,11 +3091,6 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, const QString
// Set the name before evaluating any properties. EvaluatorScriptClass reads the module name.
module->setProperty(StringConstants::nameProperty(), VariantValue::create(fullModuleName));
- if (!isBaseModule) {
- // We need the base module for the Module.condition check below.
- loadBaseModule(productContext, module);
- }
-
Item *deepestModuleInstance = findDeepestModuleInstance(moduleInstance);
Item *origDeepestModuleInstancePrototype = deepestModuleInstance->prototype();
deepestModuleInstance->setPrototype(module);
diff --git a/src/lib/corelib/language/modulemerger.cpp b/src/lib/corelib/language/modulemerger.cpp
index 8307c5f0e..053e90d53 100644
--- a/src/lib/corelib/language/modulemerger.cpp
+++ b/src/lib/corelib/language/modulemerger.cpp
@@ -55,6 +55,7 @@ ModuleMerger::ModuleMerger(Logger &logger, Item *root, Item::Module &moduleToMer
, m_rootItem(root)
, m_mergedModule(moduleToMerge)
, m_required(moduleToMerge.required)
+ , m_isBaseModule(moduleToMerge.name.first() == StringConstants::qbsModule())
, m_versionRange(moduleToMerge.versionRange)
{
QBS_CHECK(moduleToMerge.item->type() == ItemType::ModuleInstance);
@@ -226,11 +227,21 @@ void ModuleMerger::insertProperties(Item::PropertyMap *dst, Item *srcItem, Prope
for (Item::PropertyMap::const_iterator it = srcItem->properties().constBegin();
it != srcItem->properties().constEnd(); ++it) {
const ValuePtr &srcVal = it.value();
- if (srcVal->type() != Value::JSSourceValueType)
+ if (srcVal->type() == Value::ItemValueType)
+ continue;
+ if (it.key() == StringConstants::qbsSourceDirPropertyInternal())
continue;
const PropertyDeclaration srcDecl = srcItem->propertyDeclaration(it.key());
if (!srcDecl.isValid() || srcDecl.isScalar() != (type == ScalarProperties))
continue;
+
+ // Scalar variant values could stem from product multiplexing, in which case
+ // the merged qbs module instance needs to get that value.
+ if (srcVal->type() == Value::VariantValueType
+ && (!srcDecl.isScalar() || !m_isBaseModule)) {
+ continue;
+ }
+
ValuePtr &v = (*dst)[it.key()];
if (v && type == ScalarProperties)
continue;
diff --git a/src/lib/corelib/language/modulemerger.h b/src/lib/corelib/language/modulemerger.h
index 12cffd855..3cc3ba08a 100644
--- a/src/lib/corelib/language/modulemerger.h
+++ b/src/lib/corelib/language/modulemerger.h
@@ -78,6 +78,7 @@ private:
Set<const Item *> m_seenInstancesBottomUp;
Set<Item *> m_moduleInstanceContainers;
bool m_required;
+ const bool m_isBaseModule;
VersionRange m_versionRange;
};
diff --git a/tests/auto/language/testdata/module-merging-variant-values/module-merging-variant-values.qbs b/tests/auto/language/testdata/module-merging-variant-values/module-merging-variant-values.qbs
new file mode 100644
index 000000000..e4bf0ad4f
--- /dev/null
+++ b/tests/auto/language/testdata/module-merging-variant-values/module-merging-variant-values.qbs
@@ -0,0 +1,7 @@
+import qbs
+
+Product {
+ multiplexByQbsProperties: ["architectures"]
+ qbs.architectures: ["a1", "a2"]
+ Depends { name: "m2" }
+}
diff --git a/tests/auto/language/testdata/module-merging-variant-values/modules/m1/m1.qbs b/tests/auto/language/testdata/module-merging-variant-values/modules/m1/m1.qbs
new file mode 100644
index 000000000..6fc9c6b86
--- /dev/null
+++ b/tests/auto/language/testdata/module-merging-variant-values/modules/m1/m1.qbs
@@ -0,0 +1,6 @@
+Module {
+ condition: qbs.architecture === "a1" || qbs.architecture === "a2"
+
+ property string arch
+ qbs.architecture: undefined // We do something like this in GenericGCC.qbs
+}
diff --git a/tests/auto/language/testdata/module-merging-variant-values/modules/m2/m2.qbs b/tests/auto/language/testdata/module-merging-variant-values/modules/m2/m2.qbs
new file mode 100644
index 000000000..8361b91d4
--- /dev/null
+++ b/tests/auto/language/testdata/module-merging-variant-values/modules/m2/m2.qbs
@@ -0,0 +1,14 @@
+Module {
+ Depends { name: "m1" }
+ m1.arch: qbs.architecture
+ property string arch: qbs.architecture
+
+ validate: {
+ if (qbs.architecture !== "a1" && qbs.architecture !== "a2")
+ throw "Unexpected arch " + qbs.architecture;
+ if (arch !== qbs.architecture)
+ throw "Oops: " + arch + "/" + qbs.architecture;
+ if (m1.arch !== qbs.architecture)
+ throw "Oops: " + m1.arch + "/" + qbs.architecture;
+ }
+}
diff --git a/tests/auto/language/tst_language.cpp b/tests/auto/language/tst_language.cpp
index ef549da21..f52c6ec9c 100644
--- a/tests/auto/language/tst_language.cpp
+++ b/tests/auto/language/tst_language.cpp
@@ -1489,6 +1489,24 @@ void TestLanguage::jsImportUsedInMultipleScopes()
QVERIFY(!exceptionCaught);
}
+void TestLanguage::moduleMergingVariantValues()
+{
+ bool exceptionCaught = false;
+ try {
+ SetupProjectParameters params = defaultParameters;
+ params.setProjectFilePath
+ (testProject("module-merging-variant-values/module-merging-variant-values.qbs"));
+ params.expandBuildConfiguration();
+ const TopLevelProjectPtr project = loader->loadProject(params);
+ QVERIFY(!!project);
+ QCOMPARE(int(project->products.size()), 2);
+ } catch (const ErrorInfo &e) {
+ exceptionCaught = true;
+ qDebug() << e.toString();
+ }
+ QCOMPARE(exceptionCaught, false);
+}
+
void TestLanguage::modulePrioritizationBySearchPath_data()
{
QTest::addColumn<QStringList>("searchPaths");
diff --git a/tests/auto/language/tst_language.h b/tests/auto/language/tst_language.h
index b125b79a2..aab04ca29 100644
--- a/tests/auto/language/tst_language.h
+++ b/tests/auto/language/tst_language.h
@@ -119,6 +119,7 @@ private slots:
void jsExtensions();
void jsImportUsedInMultipleScopes_data();
void jsImportUsedInMultipleScopes();
+ void moduleMergingVariantValues();
void modulePrioritizationBySearchPath_data();
void modulePrioritizationBySearchPath();
void moduleProperties_data();