summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-11-22 12:40:15 +0100
committerJoerg Bornemann <joerg.bornemann@digia.com>2013-11-22 12:40:15 +0100
commitd888dc98db2d3dd92f2decd1193cd15628ed1816 (patch)
tree87479cd355d36f434eada69c4feb39667befaec3 /src/lib
parent146a9377c2cfb1ba26f6243509a4db40342be927 (diff)
parente81fda6169fae5b4949e7f4ee75d1528b016d5e7 (diff)
downloadqbs-d888dc98db2d3dd92f2decd1193cd15628ed1816.tar.gz
Merge remote-tracking branch 'origin/1.1'
Conflicts: src/lib/language/moduleloader.cpp src/lib/language/tst_language.cpp src/lib/language/tst_language.h Change-Id: Iaaf4e015a234cdd9f51630ad218daec1b83b2a84
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/buildgraph/buildgraphloader.cpp24
-rw-r--r--src/lib/buildgraph/buildgraphloader.h2
-rw-r--r--src/lib/language/artifactproperties.cpp6
-rw-r--r--src/lib/language/artifactproperties.h5
-rw-r--r--src/lib/language/language.cpp9
-rw-r--r--src/lib/language/language.h3
-rw-r--r--src/lib/language/moduleloader.cpp12
-rw-r--r--src/lib/language/testdata/builtinFunctionInSearchPathsProperty.qbs8
-rw-r--r--src/lib/language/testdata/invalidBindingInDisabledItem.qbs8
-rw-r--r--src/lib/language/tst_language.cpp16
-rw-r--r--src/lib/language/tst_language.h1
-rw-r--r--src/lib/use.pri2
-rw-r--r--src/lib/use_installed.pri2
13 files changed, 90 insertions, 8 deletions
diff --git a/src/lib/buildgraph/buildgraphloader.cpp b/src/lib/buildgraph/buildgraphloader.cpp
index 7ebca9703..94ce07f57 100644
--- a/src/lib/buildgraph/buildgraphloader.cpp
+++ b/src/lib/buildgraph/buildgraphloader.cpp
@@ -37,6 +37,7 @@
#include "projectbuilddata.h"
#include "rulesevaluationcontext.h"
#include "transformer.h"
+#include <language/artifactproperties.h>
#include <language/language.h>
#include <language/loader.h>
#include <logging/translator.h>
@@ -430,6 +431,23 @@ bool BuildGraphLoader::checkProductForChanges(const ResolvedProductPtr &restored
// TODO: Check for more stuff.
}
+bool BuildGraphLoader::checkProductForInstallInfoChanges(const ResolvedProductPtr &restoredProduct,
+ const ResolvedProductPtr &newlyResolvedProduct)
+{
+ // These are not requested from rules at build time, but we still need to take
+ // them into account.
+ const QStringList specialProperties = QStringList() << QLatin1String("install")
+ << QLatin1String("installDir") << QLatin1String("installPrefix");
+ foreach (const QString &key, specialProperties) {
+ if (restoredProduct->properties->qbsPropertyValue(key)
+ != newlyResolvedProduct->properties->qbsPropertyValue(key)) {
+ m_logger.qbsDebug() << "Product property 'qbs." << key << "' changed.";
+ return true;
+ }
+ }
+ return false;
+}
+
bool BuildGraphLoader::checkForPropertyChanges(const ResolvedProductPtr &restoredProduct,
const ResolvedProductPtr &newlyResolvedProduct)
{
@@ -437,6 +455,12 @@ bool BuildGraphLoader::checkForPropertyChanges(const ResolvedProductPtr &restore
"product '" << restoredProduct->name << "'.";
if (!restoredProduct->buildData)
return false;
+ if (checkProductForInstallInfoChanges(restoredProduct, newlyResolvedProduct))
+ return true;
+ if (!artifactPropertyListsAreEqual(restoredProduct->artifactProperties,
+ newlyResolvedProduct->artifactProperties)) {
+ return true;
+ }
QSet<TransformerConstPtr> seenTransformers;
foreach (Artifact * const artifact, restoredProduct->buildData->artifacts) {
const TransformerConstPtr transformer = artifact->transformer;
diff --git a/src/lib/buildgraph/buildgraphloader.h b/src/lib/buildgraph/buildgraphloader.h
index 4806daad3..fed032f72 100644
--- a/src/lib/buildgraph/buildgraphloader.h
+++ b/src/lib/buildgraph/buildgraphloader.h
@@ -83,6 +83,8 @@ private:
QList<ResolvedProductPtr> &productsWithChangedFiles);
bool checkProductForChanges(const ResolvedProductPtr &restoredProduct,
const ResolvedProductPtr &newlyResolvedProduct);
+ bool checkProductForInstallInfoChanges(const ResolvedProductPtr &restoredProduct,
+ const ResolvedProductPtr &newlyResolvedProduct);
bool checkForPropertyChanges(const ResolvedProductPtr &restoredProduct,
const ResolvedProductPtr &newlyResolvedProduct);
void onProductRemoved(const ResolvedProductPtr &product, ProjectBuildData *projectBuildData,
diff --git a/src/lib/language/artifactproperties.cpp b/src/lib/language/artifactproperties.cpp
index 61a2e27e8..ea5a36394 100644
--- a/src/lib/language/artifactproperties.cpp
+++ b/src/lib/language/artifactproperties.cpp
@@ -55,5 +55,11 @@ void ArtifactProperties::store(PersistentPool &pool) const
pool.store(m_propertyMap);
}
+bool operator==(const ArtifactProperties &ap1, const ArtifactProperties &ap2)
+{
+ return ap1.fileTagsFilter() == ap2.fileTagsFilter()
+ && ap1.propertyMap()->value() == ap2.propertyMap()->value();
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/language/artifactproperties.h b/src/lib/language/artifactproperties.h
index f28218ae2..8bb7d6225 100644
--- a/src/lib/language/artifactproperties.h
+++ b/src/lib/language/artifactproperties.h
@@ -58,6 +58,11 @@ private:
PropertyMapPtr m_propertyMap;
};
+bool operator==(const ArtifactProperties &ap1, const ArtifactProperties &ap2);
+inline bool operator!=(const ArtifactProperties &ap1, const ArtifactProperties &ap2) {
+ return !(ap1 == ap2);
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp
index 9fd854e3d..39f6b0272 100644
--- a/src/lib/language/language.cpp
+++ b/src/lib/language/language.cpp
@@ -1024,6 +1024,9 @@ template<typename T> bool listsAreEqual(const QList<T> &l1, const QList<T> &l2)
QString keyFromElem(const SourceArtifactPtr &sa) { return sa->absoluteFilePath; }
QString keyFromElem(const ResolvedTransformerConstPtr &t) { return t->transform->sourceCode; }
QString keyFromElem(const RulePtr &r) { return r->toString(); }
+QString keyFromElem(const ArtifactPropertiesPtr &ap) {
+ return ap->fileTagsFilter().toStringList().join(QLatin1String(","));
+}
bool operator==(const SourceArtifact &sa1, const SourceArtifact &sa2)
{
@@ -1106,5 +1109,11 @@ uint qHash(const RuleArtifact::Binding &b)
return qHash(qMakePair(b.code, b.name.join(QLatin1String(","))));
}
+bool artifactPropertyListsAreEqual(const QList<ArtifactPropertiesPtr> &l1,
+ const QList<ArtifactPropertiesPtr> &l2)
+{
+ return listsAreEqual(l1, l2);
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/language/language.h b/src/lib/language/language.h
index f828b7b33..5bbeae7d5 100644
--- a/src/lib/language/language.h
+++ b/src/lib/language/language.h
@@ -448,6 +448,9 @@ private:
QVariantMap m_buildConfiguration;
};
+bool artifactPropertyListsAreEqual(const QList<ArtifactPropertiesPtr> &l1,
+ const QList<ArtifactPropertiesPtr> &l2);
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp
index c26e55d76..e45cd781f 100644
--- a/src/lib/language/moduleloader.cpp
+++ b/src/lib/language/moduleloader.cpp
@@ -208,6 +208,12 @@ void ModuleLoader::handleProject(ModuleLoaderResult *loadResult, Item *item,
projectContext.result = loadResult;
projectContext.localModuleSearchPath = FileInfo::resolvePath(item->file()->dirPath(),
moduleSearchSubDir);
+
+ ProductContext dummyProductContext;
+ dummyProductContext.project = &projectContext;
+ loadBaseModule(&dummyProductContext, item);
+ overrideItemProperties(item, QLatin1String("project"), m_overriddenProperties);
+
projectContext.extraSearchPaths = readExtraSearchPaths(item);
m_reader->pushExtraSearchPaths(projectContext.extraSearchPaths);
projectContext.item = item;
@@ -215,11 +221,6 @@ void ModuleLoader::handleProject(ModuleLoaderResult *loadResult, Item *item,
projectContext.scope = Item::create(m_pool);
projectContext.scope->setProperty(QLatin1String("project"), itemValue);
- ProductContext dummyProductContext;
- dummyProductContext.project = &projectContext;
- loadBaseModule(&dummyProductContext, item);
- overrideItemProperties(item, QLatin1String("project"), m_overriddenProperties);
-
foreach (Item *child, item->children()) {
child->setScope(projectContext.scope);
if (child->typeName() == QLatin1String("Product")) {
@@ -389,6 +390,7 @@ void ModuleLoader::createAdditionalModuleInstancesInProduct(ProductContext *prod
void ModuleLoader::handleGroup(ProductContext *productContext, Item *item)
{
checkCancelation();
+ checkItemCondition(item);
propagateModulesFromProduct(productContext, item);
}
diff --git a/src/lib/language/testdata/builtinFunctionInSearchPathsProperty.qbs b/src/lib/language/testdata/builtinFunctionInSearchPathsProperty.qbs
new file mode 100644
index 000000000..f8f1b4d17
--- /dev/null
+++ b/src/lib/language/testdata/builtinFunctionInSearchPathsProperty.qbs
@@ -0,0 +1,8 @@
+import qbs
+
+Project {
+ qbsSearchPaths: {
+ if (!qbs.getenv("PATH"))
+ throw "getenv doesn't seem to work";
+ }
+}
diff --git a/src/lib/language/testdata/invalidBindingInDisabledItem.qbs b/src/lib/language/testdata/invalidBindingInDisabledItem.qbs
index 68b27592c..e3e03a319 100644
--- a/src/lib/language/testdata/invalidBindingInDisabledItem.qbs
+++ b/src/lib/language/testdata/invalidBindingInDisabledItem.qbs
@@ -2,7 +2,15 @@ import qbs 1.0
Project {
Product {
+ name: "product1"
condition: false
someNonsense: "Bitte stellen Sie die Tassen auf den Tisch."
}
+ Product {
+ name: "product2"
+ Group {
+ condition: false
+ moreNonsense: "Follen. Follen. Hünuntergefollen. Auf dön Töppüch."
+ }
+ }
}
diff --git a/src/lib/language/tst_language.cpp b/src/lib/language/tst_language.cpp
index bb984c3fc..43a6bce7f 100644
--- a/src/lib/language/tst_language.cpp
+++ b/src/lib/language/tst_language.cpp
@@ -191,6 +191,20 @@ void TestLanguage::buildConfigStringListSyntax()
QCOMPARE(exceptionCaught, false);
}
+void TestLanguage::builtinFunctionInSearchPathsProperty()
+{
+ bool exceptionCaught = false;
+ try {
+ SetupProjectParameters parameters = defaultParameters;
+ parameters.setProjectFilePath(testProject("builtinFunctionInSearchPathsProperty.qbs"));
+ QVERIFY(loader->loadProject(parameters));
+ } catch (const ErrorInfo &e) {
+ exceptionCaught = true;
+ qDebug() << e.toString();
+ }
+ QCOMPARE(exceptionCaught, false);
+}
+
void TestLanguage::canonicalArchitecture()
{
bool exceptionCaught = false;
@@ -686,7 +700,7 @@ void TestLanguage::invalidBindingInDisabledItem()
TopLevelProjectPtr project = loader->loadProject(defaultParameters);
QVERIFY(project);
QHash<QString, ResolvedProductPtr> products = productsFromProject(project);
- QCOMPARE(products.count(), 1);
+ QCOMPARE(products.count(), 2);
}
catch (const ErrorInfo &e) {
exceptionCaught = true;
diff --git a/src/lib/language/tst_language.h b/src/lib/language/tst_language.h
index f591a4df1..ccb4af36a 100644
--- a/src/lib/language/tst_language.h
+++ b/src/lib/language/tst_language.h
@@ -68,6 +68,7 @@ private slots:
void baseProperty();
void buildConfigStringListSyntax();
+ void builtinFunctionInSearchPathsProperty();
void canonicalArchitecture();
void conditionalDepends();
void environmentVariable();
diff --git a/src/lib/use.pri b/src/lib/use.pri
index 7ac510712..26442fe76 100644
--- a/src/lib/use.pri
+++ b/src/lib/use.pri
@@ -15,7 +15,7 @@ unix {
macx:QMAKE_LFLAGS += -Wl,-rpath,@loader_path/../lib
}
-CONFIG(shared, static|shared) {
+!CONFIG(static, static|shared) {
QBSCORELIBSUFFIX = $$QBS_VERSION_MAJ
}
diff --git a/src/lib/use_installed.pri b/src/lib/use_installed.pri
index 4f9a4beea..c3b1dd5af 100644
--- a/src/lib/use_installed.pri
+++ b/src/lib/use_installed.pri
@@ -9,7 +9,7 @@ unix {
!disable_rpath:unix:QMAKE_LFLAGS += -Wl,-rpath,$${QBSLIBDIR}
-CONFIG(shared, static|shared) {
+!CONFIG(static, static|shared) {
QBSCORELIBSUFFIX = $$QBS_VERSION_MAJ
}