diff options
| author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-11-22 12:40:15 +0100 |
|---|---|---|
| committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-11-22 12:40:15 +0100 |
| commit | d888dc98db2d3dd92f2decd1193cd15628ed1816 (patch) | |
| tree | 87479cd355d36f434eada69c4feb39667befaec3 /src/lib | |
| parent | 146a9377c2cfb1ba26f6243509a4db40342be927 (diff) | |
| parent | e81fda6169fae5b4949e7f4ee75d1528b016d5e7 (diff) | |
| download | qbs-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.cpp | 24 | ||||
| -rw-r--r-- | src/lib/buildgraph/buildgraphloader.h | 2 | ||||
| -rw-r--r-- | src/lib/language/artifactproperties.cpp | 6 | ||||
| -rw-r--r-- | src/lib/language/artifactproperties.h | 5 | ||||
| -rw-r--r-- | src/lib/language/language.cpp | 9 | ||||
| -rw-r--r-- | src/lib/language/language.h | 3 | ||||
| -rw-r--r-- | src/lib/language/moduleloader.cpp | 12 | ||||
| -rw-r--r-- | src/lib/language/testdata/builtinFunctionInSearchPathsProperty.qbs | 8 | ||||
| -rw-r--r-- | src/lib/language/testdata/invalidBindingInDisabledItem.qbs | 8 | ||||
| -rw-r--r-- | src/lib/language/tst_language.cpp | 16 | ||||
| -rw-r--r-- | src/lib/language/tst_language.h | 1 | ||||
| -rw-r--r-- | src/lib/use.pri | 2 | ||||
| -rw-r--r-- | src/lib/use_installed.pri | 2 |
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 } |
