diff options
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(); |