aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2013-05-07 11:28:57 +0200
committerChristian Kandeler <christian.kandeler@digia.com>2013-05-22 10:09:42 +0200
commite2d39d604ac84eb83148fc04c4c8fd72d9fcfc6a (patch)
tree0182c8c20b6df604f2715e4041f66b288fb26b06
parenta27f5b50f21c55fd00ed8e3fe9190dde4670c92c (diff)
make project properties available in rules
Blackbox autotest codegen enhanced. Change-Id: Ibeda7204477d06973a4e343d57da757c0bf47899 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
-rw-r--r--src/lib/buildgraph/buildgraph.cpp4
-rw-r--r--src/lib/language/builtindeclarations.cpp6
-rw-r--r--src/lib/language/language.cpp13
-rw-r--r--src/lib/language/language.h3
-rw-r--r--src/lib/language/moduleloader.cpp33
-rw-r--r--src/lib/language/moduleloader.h1
-rw-r--r--src/lib/language/projectresolver.cpp12
-rw-r--r--src/lib/tools/persistence.cpp2
-rw-r--r--tests/auto/blackbox/testdata/codegen/codegen.qbs7
9 files changed, 64 insertions, 17 deletions
diff --git a/src/lib/buildgraph/buildgraph.cpp b/src/lib/buildgraph/buildgraph.cpp
index 11fcdce09..a9ddbf7d8 100644
--- a/src/lib/buildgraph/buildgraph.cpp
+++ b/src/lib/buildgraph/buildgraph.cpp
@@ -193,6 +193,10 @@ void setupScriptEngineForProduct(ScriptEngine *engine, const ResolvedProductCons
projectScriptValue = engine->newObject();
projectScriptValue.setProperty("filePath", product->project->location.fileName);
projectScriptValue.setProperty("path", FileInfo::path(product->project->location.fileName));
+ const QVariantMap &projectProperties = product->project->projectProperties();
+ for (QVariantMap::const_iterator it = projectProperties.begin();
+ it != projectProperties.end(); ++it)
+ projectScriptValue.setProperty(it.key(), engine->toScriptValue(it.value()));
targetObject.setProperty("project", projectScriptValue);
}
diff --git a/src/lib/language/builtindeclarations.cpp b/src/lib/language/builtindeclarations.cpp
index 66f0edc61..4c94d393d 100644
--- a/src/lib/language/builtindeclarations.cpp
+++ b/src/lib/language/builtindeclarations.cpp
@@ -66,8 +66,10 @@ BuiltinDeclarations::BuiltinDeclarations()
m_builtins["Group"] = decls;
QList<PropertyDeclaration> project;
- project += PropertyDeclaration("references", PropertyDeclaration::Variant);
- project += PropertyDeclaration("moduleSearchPaths", PropertyDeclaration::Variant);
+ project += PropertyDeclaration("references", PropertyDeclaration::Variant,
+ PropertyDeclaration::PropertyNotAvailableInConfig);
+ project += PropertyDeclaration("moduleSearchPaths", PropertyDeclaration::Variant,
+ PropertyDeclaration::PropertyNotAvailableInConfig);
m_builtins["Project"] = project;
QList<PropertyDeclaration> product;
diff --git a/src/lib/language/language.cpp b/src/lib/language/language.cpp
index 17b6fd6ea..86962b0eb 100644
--- a/src/lib/language/language.cpp
+++ b/src/lib/language/language.cpp
@@ -588,6 +588,11 @@ void ResolvedProject::setBuildConfiguration(const QVariantMap &config)
m_id = deriveId(config);
}
+void ResolvedProject::setProjectProperties(const QVariantMap &config)
+{
+ m_projectProperties = config;
+}
+
QString ResolvedProject::buildGraphFilePath() const
{
return ProjectBuildData::deriveBuildGraphFilePath(buildDirectory, id());
@@ -642,7 +647,9 @@ void ResolvedProject::load(PersistentPool &pool)
}
products.append(rProduct);
}
- pool.stream() >> usedEnvironment;
+ pool.stream()
+ >> usedEnvironment
+ >> m_projectProperties;
buildData.reset(pool.idLoad<ProjectBuildData>());
}
@@ -657,7 +664,9 @@ void ResolvedProject::store(PersistentPool &pool) const
pool.stream() << products.count();
foreach (const ResolvedProductConstPtr &product, products)
pool.store(product);
- pool.stream() << usedEnvironment;
+ pool.stream()
+ << usedEnvironment
+ << m_projectProperties;
pool.store(buildData.data());
}
diff --git a/src/lib/language/language.h b/src/lib/language/language.h
index 5b4063701..06df36ae5 100644
--- a/src/lib/language/language.h
+++ b/src/lib/language/language.h
@@ -341,6 +341,8 @@ public:
void setBuildConfiguration(const QVariantMap &config);
const QVariantMap &buildConfiguration() const { return m_buildConfiguration; }
+ void setProjectProperties(const QVariantMap &config);
+ const QVariantMap &projectProperties() const { return m_projectProperties; }
QString id() const { return m_id; }
QString buildGraphFilePath() const;
@@ -353,6 +355,7 @@ private:
void store(PersistentPool &pool) const;
QVariantMap m_buildConfiguration;
+ QVariantMap m_projectProperties;
QString m_id;
};
diff --git a/src/lib/language/moduleloader.cpp b/src/lib/language/moduleloader.cpp
index e28ed55ea..339037e6a 100644
--- a/src/lib/language/moduleloader.cpp
+++ b/src/lib/language/moduleloader.cpp
@@ -128,6 +128,10 @@ 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);
+
foreach (Item *child, item->children()) {
child->setScope(projectContext.scope);
if (child->typeName() == QLatin1String("Product"))
@@ -286,18 +290,7 @@ void ModuleLoader::propagateModulesFromProduct(ProductContext *productContext, I
void ModuleLoader::resolveDependencies(DependsContext *dependsContext, Item *item)
{
- const QStringList baseModuleName(QLatin1String("qbs"));
- Item::Module baseModuleDesc;
- baseModuleDesc.name = baseModuleName;
- baseModuleDesc.item = loadModule(dependsContext->product, item, CodeLocation(), QString(),
- baseModuleName);
- if (Q_UNLIKELY(!baseModuleDesc.item))
- throw Error(Tr::tr("Cannot load base qbs module."));
- baseModuleDesc.item->setProperty(QLatin1String("getenv"),
- BuiltinValue::create(BuiltinValue::GetEnvFunction));
- baseModuleDesc.item->setProperty(QLatin1String("getHostOS"),
- BuiltinValue::create(BuiltinValue::GetHostOSFunction));
- item->modules() += baseModuleDesc;
+ loadBaseModule(dependsContext->product, item);
// Resolve all Depends items.
QHash<Item *, ItemModuleList> loadedModules;
@@ -514,6 +507,22 @@ Item *ModuleLoader::loadModuleFile(ProductContext *productContext, bool isBaseMo
return module;
}
+void ModuleLoader::loadBaseModule(ProductContext *productContext, Item *item)
+{
+ const QStringList baseModuleName(QLatin1String("qbs"));
+ Item::Module baseModuleDesc;
+ baseModuleDesc.name = baseModuleName;
+ baseModuleDesc.item = loadModule(productContext, item, CodeLocation(), QString(),
+ baseModuleName);
+ if (Q_UNLIKELY(!baseModuleDesc.item))
+ throw Error(Tr::tr("Cannot load base qbs module."));
+ baseModuleDesc.item->setProperty(QLatin1String("getenv"),
+ BuiltinValue::create(BuiltinValue::GetEnvFunction));
+ baseModuleDesc.item->setProperty(QLatin1String("getHostOS"),
+ BuiltinValue::create(BuiltinValue::GetHostOSFunction));
+ item->modules() += baseModuleDesc;
+}
+
static void collectItemsWithId_impl(Item *item, QList<Item *> *result)
{
if (!item->id().isEmpty())
diff --git a/src/lib/language/moduleloader.h b/src/lib/language/moduleloader.h
index c825efe7f..7e599ada9 100644
--- a/src/lib/language/moduleloader.h
+++ b/src/lib/language/moduleloader.h
@@ -158,6 +158,7 @@ private:
const CodeLocation &dependsItemLocation, const QStringList &moduleName,
const QStringList &extraSearchPaths);
Item *loadModuleFile(ProductContext *productContext, bool isBaseModule, const QString &filePath);
+ void loadBaseModule(ProductContext *productContext, Item *item);
void instantiateModule(ProductContext *productContext, Item *instanceScope, Item *moduleInstance, Item *modulePrototype, const QStringList &moduleName);
void createChildInstances(ProductContext *productContext, Item *instance,
Item *prototype, QHash<Item *, Item *> *prototypeInstanceMap) const;
diff --git a/src/lib/language/projectresolver.cpp b/src/lib/language/projectresolver.cpp
index d90c1f62d..c65e37ab8 100644
--- a/src/lib/language/projectresolver.cpp
+++ b/src/lib/language/projectresolver.cpp
@@ -183,6 +183,18 @@ void ProjectResolver::resolveProject(Item *item)
project->setBuildConfiguration(m_buildConfiguration);
project->buildDirectory = ResolvedProject::deriveBuildDirectory(m_buildRoot, project->id());
+ QVariantMap projectProperties;
+ for (QMap<QString, PropertyDeclaration>::const_iterator it
+ = item->propertyDeclarations().constBegin();
+ it != item->propertyDeclarations().constEnd(); ++it) {
+ if (it.value().flags.testFlag(PropertyDeclaration::PropertyNotAvailableInConfig))
+ continue;
+ const ValueConstPtr v = item->property(it.key());
+ QBS_ASSERT(v && v->type() != Value::ItemValueType, continue);
+ projectProperties.insert(it.key(), m_evaluator->property(item, it.key()).toVariant());
+ }
+ project->setProjectProperties(projectProperties);
+
ItemFuncMap mapping;
mapping["Product"] = &ProjectResolver::resolveProduct;
mapping["FileTagger"] = &ProjectResolver::resolveFileTagger;
diff --git a/src/lib/tools/persistence.cpp b/src/lib/tools/persistence.cpp
index 6d909715a..caab10159 100644
--- a/src/lib/tools/persistence.cpp
+++ b/src/lib/tools/persistence.cpp
@@ -39,7 +39,7 @@
namespace qbs {
namespace Internal {
-static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE0_0_1__37";
+static const char QBS_PERSISTENCE_MAGIC[] = "QBSPERSISTENCE0_0_1__38";
PersistentPool::PersistentPool(const Logger &logger) : m_logger(logger)
{
diff --git a/tests/auto/blackbox/testdata/codegen/codegen.qbs b/tests/auto/blackbox/testdata/codegen/codegen.qbs
index d02fea54f..29a3df8c1 100644
--- a/tests/auto/blackbox/testdata/codegen/codegen.qbs
+++ b/tests/auto/blackbox/testdata/codegen/codegen.qbs
@@ -3,6 +3,7 @@ import qbs.fileinfo as FileInfo
Project {
property string name: 'codegen'
+ property string osSpecificName: name.toUpperCase() + '_' + qbs.targetOS.toUpperCase()
Product {
type: 'application'
@@ -39,6 +40,12 @@ Project {
return str;
}
+ // check whether we can access project properties here
+ var expected = "CODEGEN_" + product.moduleProperty("qbs", "targetOS").toUpperCase();
+ if (project.osSpecificName !== expected)
+ throw "Wrong project property value: " + project.osSpecificName
+ + "\nexpected: " + expected;
+
var code = '$NUMBERTYPE $FUNCTIONNAME($NUMBERTYPE, $STRINGTYPE) { return 0; }';
code = expandMacros(code, product.replacements);
var args = ['echo ' + code + '>' + output.fileName]