aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--[-rwxr-xr-x]share/qbs/imports/qbs/base/NSISSetup.qbs0
-rw-r--r--[-rwxr-xr-x]share/qbs/modules/nsis/NSISModule.qbs0
-rw-r--r--src/lib/corelib/buildgraph/artifactvisitor.cpp6
-rw-r--r--src/lib/corelib/buildgraph/artifactvisitor.h1
-rw-r--r--src/lib/corelib/language/evaluatorscriptclass.cpp32
-rw-r--r--src/lib/corelib/language/testdata/propertiesblocks.qbs4
-rw-r--r--src/lib/corelib/language/tst_language.cpp73
-rw-r--r--src/library_dirname.pri2
-rw-r--r--[-rwxr-xr-x]tests/auto/blackbox/testdata/nsis/hello.bat0
-rw-r--r--[-rwxr-xr-x]tests/auto/blackbox/testdata/nsis/hello.nsi0
-rw-r--r--[-rwxr-xr-x]tests/auto/blackbox/testdata/nsis/hello.qbs0
11 files changed, 96 insertions, 22 deletions
diff --git a/share/qbs/imports/qbs/base/NSISSetup.qbs b/share/qbs/imports/qbs/base/NSISSetup.qbs
index f52398a2a..f52398a2a 100755..100644
--- a/share/qbs/imports/qbs/base/NSISSetup.qbs
+++ b/share/qbs/imports/qbs/base/NSISSetup.qbs
diff --git a/share/qbs/modules/nsis/NSISModule.qbs b/share/qbs/modules/nsis/NSISModule.qbs
index ad8b84238..ad8b84238 100755..100644
--- a/share/qbs/modules/nsis/NSISModule.qbs
+++ b/share/qbs/modules/nsis/NSISModule.qbs
diff --git a/src/lib/corelib/buildgraph/artifactvisitor.cpp b/src/lib/corelib/buildgraph/artifactvisitor.cpp
index e8f438c9b..ab7858826 100644
--- a/src/lib/corelib/buildgraph/artifactvisitor.cpp
+++ b/src/lib/corelib/buildgraph/artifactvisitor.cpp
@@ -54,6 +54,12 @@ void ArtifactVisitor::visitProject(const ResolvedProjectConstPtr &project)
visitProduct(product);
}
+bool ArtifactVisitor::visit(RuleNode *ruleNode)
+{
+ Q_UNUSED(ruleNode);
+ return false;
+}
+
bool ArtifactVisitor::visit(Artifact *artifact)
{
QBS_CHECK(artifact);
diff --git a/src/lib/corelib/buildgraph/artifactvisitor.h b/src/lib/corelib/buildgraph/artifactvisitor.h
index 2cd67a8f8..79e39c1cc 100644
--- a/src/lib/corelib/buildgraph/artifactvisitor.h
+++ b/src/lib/corelib/buildgraph/artifactvisitor.h
@@ -47,6 +47,7 @@ public:
void visitProduct(const ResolvedProductConstPtr &product);
void visitProject(const ResolvedProjectConstPtr &project);
+ bool visit(RuleNode *ruleNode);
bool visit(Artifact *artifact);
private:
diff --git a/src/lib/corelib/language/evaluatorscriptclass.cpp b/src/lib/corelib/language/evaluatorscriptclass.cpp
index a5f03b81c..8fcd785eb 100644
--- a/src/lib/corelib/language/evaluatorscriptclass.cpp
+++ b/src/lib/corelib/language/evaluatorscriptclass.cpp
@@ -128,9 +128,35 @@ private:
const JSSourceValue::Alternative *alternative = 0;
alternative = &value->alternatives().at(i);
if (!conditionScopeItem) {
- conditionScopeItem = data->item->scope();
- if (!conditionScopeItem)
- conditionScopeItem = data->item;
+ // We have to differentiate between module instances and normal items here.
+ //
+ // The module instance case:
+ // Product {
+ // property bool something: true
+ // Properties {
+ // condition: something
+ // cpp.defines: ["ABC"]
+ // }
+ // }
+ //
+ // data->item points to cpp and the condition's scope chain must contain cpp's
+ // scope, which is the item where cpp is instantiated. The scope chain must not
+ // contain data->item itself.
+ //
+ // The normal item case:
+ // Product {
+ // property bool something: true
+ // property string value: "ABC"
+ // Properties {
+ // condition: something
+ // value: "DEF"
+ // }
+ // }
+ //
+ // data->item points to the product and the condition's scope chain must contain
+ // the product item.
+ conditionScopeItem = data->item->isModuleInstance()
+ ? data->item->scope() : data->item;
conditionScope = data->evaluator->scriptValue(conditionScopeItem);
QBS_ASSERT(conditionScope.isObject(), return);
conditionFileScope = data->evaluator->fileScope(conditionScopeItem->file());
diff --git a/src/lib/corelib/language/testdata/propertiesblocks.qbs b/src/lib/corelib/language/testdata/propertiesblocks.qbs
index d61f0dd86..2480e9e7b 100644
--- a/src/lib/corelib/language/testdata/propertiesblocks.qbs
+++ b/src/lib/corelib/language/testdata/propertiesblocks.qbs
@@ -86,19 +86,23 @@ Project {
Product {
name: "condition_refers_to_product_property"
property string narf: true
+ property string someString: "SOMETHING"
Depends { name: "dummy" }
Properties {
condition: narf
dummy.defines: ["OVERWRITTEN"]
+ someString: "OVERWRITTEN"
}
}
property string zort: true
Product {
name: "condition_refers_to_project_property"
+ property string someString: "SOMETHING"
Depends { name: "dummy" }
Properties {
condition: project.zort
dummy.defines: ["OVERWRITTEN"]
+ someString: "OVERWRITTEN"
}
}
ProductBase {
diff --git a/src/lib/corelib/language/tst_language.cpp b/src/lib/corelib/language/tst_language.cpp
index 422d77a2f..d8c47c90b 100644
--- a/src/lib/corelib/language/tst_language.cpp
+++ b/src/lib/corelib/language/tst_language.cpp
@@ -1128,45 +1128,77 @@ void TestLanguage::propertiesBlocks_data()
{
QTest::addColumn<QString>("propertyName");
QTest::addColumn<QStringList>("expectedValues");
+ QTest::addColumn<QString>("expectedStringValue");
- QTest::newRow("init") << QString() << QStringList();
- QTest::newRow("property_overwrite") << QString("dummy.defines") << QStringList("OVERWRITTEN");
- QTest::newRow("property_overwrite_no_outer") << QString("dummy.defines") << QStringList("OVERWRITTEN");
- QTest::newRow("property_append_to_outer") << QString("dummy.defines") << (QStringList() << QString("ONE") << QString("TWO"));
+ QTest::newRow("init") << QString() << QStringList() << QString();
+ QTest::newRow("property_overwrite")
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString();
+ QTest::newRow("property_overwrite_no_outer")
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString();
+ QTest::newRow("property_append_to_outer")
+ << QString("dummy.defines")
+ << (QStringList() << QString("ONE") << QString("TWO"))
+ << QString();
+
+ QTest::newRow("multiple_exclusive_properties")
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString();
+ QTest::newRow("multiple_exclusive_properties_no_outer")
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString();
+ QTest::newRow("multiple_exclusive_properties_append_to_outer")
+ << QString("dummy.defines")
+ << (QStringList() << QString("ONE") << QString("TWO"))
+ << QString();
- QTest::newRow("multiple_exclusive_properties") << QString("dummy.defines") << QStringList("OVERWRITTEN");
- QTest::newRow("multiple_exclusive_properties_no_outer") << QString("dummy.defines") << QStringList("OVERWRITTEN");
- QTest::newRow("multiple_exclusive_properties_append_to_outer") << QString("dummy.defines") << (QStringList() << QString("ONE") << QString("TWO"));
QTest::newRow("condition_refers_to_product_property")
- << QString("dummy.defines") << QStringList("OVERWRITTEN");
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString("OVERWRITTEN");
QTest::newRow("condition_refers_to_project_property")
- << QString("dummy.defines") << QStringList("OVERWRITTEN");
+ << QString("dummy.defines")
+ << QStringList("OVERWRITTEN")
+ << QString("OVERWRITTEN");
QTest::newRow("ambiguous_properties")
<< QString("dummy.defines")
- << (QStringList() << QString("ONE") << QString("TWO"));
+ << (QStringList() << QString("ONE") << QString("TWO"))
+ << QString();
QTest::newRow("inheritance_overwrite_in_subitem")
<< QString("dummy.defines")
- << (QStringList() << QString("OVERWRITTEN_IN_SUBITEM"));
+ << (QStringList() << QString("OVERWRITTEN_IN_SUBITEM"))
+ << QString();
QTest::newRow("inheritance_retain_base1")
<< QString("dummy.defines")
- << (QStringList() << QString("BASE") << QString("SUB"));
+ << (QStringList() << QString("BASE") << QString("SUB"))
+ << QString();
QTest::newRow("inheritance_retain_base2")
<< QString("dummy.defines")
- << (QStringList() << QString("BASE") << QString("SUB"));
+ << (QStringList() << QString("BASE") << QString("SUB"))
+ << QString();
QTest::newRow("inheritance_retain_base3")
<< QString("dummy.defines")
- << (QStringList() << QString("BASE") << QString("SUB"));
+ << (QStringList() << QString("BASE") << QString("SUB"))
+ << QString();
QTest::newRow("inheritance_condition_in_subitem1")
<< QString("dummy.defines")
- << (QStringList() << QString("SOMETHING") << QString("SUB"));
+ << (QStringList() << QString("SOMETHING") << QString("SUB"))
+ << QString();
QTest::newRow("inheritance_condition_in_subitem2")
<< QString("dummy.defines")
- << (QStringList() << QString("SOMETHING"));
+ << (QStringList() << QString("SOMETHING"))
+ << QString();
QTest::newRow("condition_references_id")
<< QString("dummy.defines")
- << (QStringList() << QString("OVERWRITTEN"));
- QTest::newRow("cleanup") << QString() << QStringList();
+ << (QStringList() << QString("OVERWRITTEN"))
+ << QString();
+ QTest::newRow("cleanup") << QString() << QStringList() << QString();
}
void TestLanguage::propertiesBlocks()
@@ -1174,6 +1206,7 @@ void TestLanguage::propertiesBlocks()
HANDLE_INIT_CLEANUP_DATATAGS("propertiesblocks.qbs");
QFETCH(QString, propertyName);
QFETCH(QStringList, expectedValues);
+ QFETCH(QString, expectedStringValue);
QVERIFY(project);
QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
const QString productName = QString::fromLocal8Bit(QTest::currentDataTag());
@@ -1182,6 +1215,10 @@ void TestLanguage::propertiesBlocks()
QCOMPARE(product->name, productName);
QVariant v = productPropertyValue(product, propertyName);
QCOMPARE(v.toStringList(), expectedValues);
+ if (!expectedStringValue.isEmpty()) {
+ v = productPropertyValue(product, "someString");
+ QCOMPARE(v.toString(), expectedStringValue);
+ }
}
void TestLanguage::fileTags_data()
diff --git a/src/library_dirname.pri b/src/library_dirname.pri
index 1e76f1cac..5d0712d79 100644
--- a/src/library_dirname.pri
+++ b/src/library_dirname.pri
@@ -1 +1 @@
-isEmpty(QBS_QBS_LIBRARY_DIRNAME):QBS_LIBRARY_DIRNAME = lib
+isEmpty(QBS_LIBRARY_DIRNAME):QBS_LIBRARY_DIRNAME = lib
diff --git a/tests/auto/blackbox/testdata/nsis/hello.bat b/tests/auto/blackbox/testdata/nsis/hello.bat
index 3af583cd8..3af583cd8 100755..100644
--- a/tests/auto/blackbox/testdata/nsis/hello.bat
+++ b/tests/auto/blackbox/testdata/nsis/hello.bat
diff --git a/tests/auto/blackbox/testdata/nsis/hello.nsi b/tests/auto/blackbox/testdata/nsis/hello.nsi
index 70b73056a..70b73056a 100755..100644
--- a/tests/auto/blackbox/testdata/nsis/hello.nsi
+++ b/tests/auto/blackbox/testdata/nsis/hello.nsi
diff --git a/tests/auto/blackbox/testdata/nsis/hello.qbs b/tests/auto/blackbox/testdata/nsis/hello.qbs
index b7f3da505..b7f3da505 100755..100644
--- a/tests/auto/blackbox/testdata/nsis/hello.qbs
+++ b/tests/auto/blackbox/testdata/nsis/hello.qbs