summaryrefslogtreecommitdiff
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
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
-rw-r--r--examples/cocoa-application/CocoaApplication.qbs4
-rw-r--r--examples/cocoa-application/CocoaApplication/AppDelegate.h2
-rw-r--r--examples/cocoa-application/CocoaApplication/AppDelegate.m2
-rw-r--r--share/qbs/modules/cpp/GenericGCC.qbs2
-rw-r--r--src/app/config/configcommandexecutor.cpp6
-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
-rw-r--r--tests/auto/blackbox/tst_blackbox.cpp23
19 files changed, 124 insertions, 13 deletions
diff --git a/examples/cocoa-application/CocoaApplication.qbs b/examples/cocoa-application/CocoaApplication.qbs
index b41ac938e..99ee60d9d 100644
--- a/examples/cocoa-application/CocoaApplication.qbs
+++ b/examples/cocoa-application/CocoaApplication.qbs
@@ -1,6 +1,7 @@
/****************************************************************************
**
** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies).
+** Copyright (C) 2013 Petroules Corporation.
** Contact: http://www.qt-project.org/legal
**
** This file is part of the examples of the Qt Build Suite.
@@ -43,7 +44,7 @@ CppApplication {
type: "applicationbundle"
name: "CocoaApplication"
- cpp.precompiledHeader: "CocoaApplication-Prefix.pch"
+ cpp.precompiledHeader: "CocoaApplication/CocoaApplication-Prefix.pch"
cpp.infoPlistFile: "CocoaApplication/CocoaApplication-Info.plist"
@@ -54,6 +55,7 @@ CppApplication {
files: [
"AppDelegate.h",
"AppDelegate.m",
+ "CocoaApplication-Prefix.pch",
"main.m"
]
}
diff --git a/examples/cocoa-application/CocoaApplication/AppDelegate.h b/examples/cocoa-application/CocoaApplication/AppDelegate.h
index 1b556ce2d..d6757555e 100644
--- a/examples/cocoa-application/CocoaApplication/AppDelegate.h
+++ b/examples/cocoa-application/CocoaApplication/AppDelegate.h
@@ -31,6 +31,6 @@
@interface AppDelegate : NSObject <NSApplicationDelegate>
-@property (assign) IBOutlet NSWindow *window;
+@property (nonatomic, assign) IBOutlet NSWindow *window;
@end
diff --git a/examples/cocoa-application/CocoaApplication/AppDelegate.m b/examples/cocoa-application/CocoaApplication/AppDelegate.m
index 8db0bec8d..0cbf74dd8 100644
--- a/examples/cocoa-application/CocoaApplication/AppDelegate.m
+++ b/examples/cocoa-application/CocoaApplication/AppDelegate.m
@@ -31,6 +31,8 @@
@implementation AppDelegate
+@synthesize window = _window;
+
- (void)dealloc
{
[super dealloc];
diff --git a/share/qbs/modules/cpp/GenericGCC.qbs b/share/qbs/modules/cpp/GenericGCC.qbs
index 9bbb152c5..a1165f9ac 100644
--- a/share/qbs/modules/cpp/GenericGCC.qbs
+++ b/share/qbs/modules/cpp/GenericGCC.qbs
@@ -13,7 +13,7 @@ CppModule {
property string toolchainPrefix
property path toolchainInstallPath
compilerName: 'g++'
- linkerName: "g++"
+ linkerName: compilerName
property string archiverName: 'ar'
property path sysroot: qbs.sysroot
property path platformPath
diff --git a/src/app/config/configcommandexecutor.cpp b/src/app/config/configcommandexecutor.cpp
index 5e31fbeb0..0b9655c5d 100644
--- a/src/app/config/configcommandexecutor.cpp
+++ b/src/app/config/configcommandexecutor.cpp
@@ -117,8 +117,10 @@ void ConfigCommandExecutor::exportSettings(const QString &filename)
}
QTextStream stream(&file);
stream.setCodec("UTF-8");
- foreach (const QString &key, m_settings->allKeys())
- stream << key << ": " << m_settings->value(key).toString() << endl;
+ foreach (const QString &key, m_settings->allKeys()) {
+ stream << key << ": " << m_settings->value(key).toStringList().join(QLatin1String(","))
+ << endl;
+ }
}
void ConfigCommandExecutor::importSettings(const QString &filename)
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
}
diff --git a/tests/auto/blackbox/tst_blackbox.cpp b/tests/auto/blackbox/tst_blackbox.cpp
index bf02d86a8..cc817242c 100644
--- a/tests/auto/blackbox/tst_blackbox.cpp
+++ b/tests/auto/blackbox/tst_blackbox.cpp
@@ -1456,6 +1456,29 @@ void TestBlackbox::installedApp()
+ HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/bin/installedApp"))));
QVERIFY(!addedFile.exists());
+ // Check whether changing install parameters on the product causes re-installation.
+ QFile projectFile("installed_artifact.qbs");
+ QVERIFY(projectFile.open(QIODevice::ReadWrite));
+ QByteArray content = projectFile.readAll();
+ content.replace("qbs.installPrefix: \"/usr\"", "qbs.installPrefix: '/usr/local'");
+ waitForNewTimestamp();
+ projectFile.resize(0);
+ projectFile.write(content);
+ QVERIFY(projectFile.flush());
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("install"))), 0);
+ QVERIFY(QFile::exists(defaultInstallRoot
+ + HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/local/bin/installedApp"))));
+
+ // Check whether changing install parameters on the artifact causes re-installation.
+ content.replace("qbs.installDir: \"bin\"", "qbs.installDir: 'custom'");
+ waitForNewTimestamp();
+ projectFile.resize(0);
+ projectFile.write(content);
+ projectFile.close();
+ QCOMPARE(runQbs(QbsRunParameters(QStringList("install"))), 0);
+ QVERIFY(QFile::exists(defaultInstallRoot
+ + HostOsInfo::appendExecutableSuffix(QLatin1String("/usr/local/custom/installedApp"))));
+
rmDirR(buildDir);
QbsRunParameters params;
params.arguments << "install" << "--no-build";