diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2013-05-07 11:28:57 +0200 |
---|---|---|
committer | Christian Kandeler <christian.kandeler@digia.com> | 2013-05-22 10:09:42 +0200 |
commit | e2d39d604ac84eb83148fc04c4c8fd72d9fcfc6a (patch) | |
tree | 0182c8c20b6df604f2715e4041f66b288fb26b06 | |
parent | a27f5b50f21c55fd00ed8e3fe9190dde4670c92c (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.cpp | 4 | ||||
-rw-r--r-- | src/lib/language/builtindeclarations.cpp | 6 | ||||
-rw-r--r-- | src/lib/language/language.cpp | 13 | ||||
-rw-r--r-- | src/lib/language/language.h | 3 | ||||
-rw-r--r-- | src/lib/language/moduleloader.cpp | 33 | ||||
-rw-r--r-- | src/lib/language/moduleloader.h | 1 | ||||
-rw-r--r-- | src/lib/language/projectresolver.cpp | 12 | ||||
-rw-r--r-- | src/lib/tools/persistence.cpp | 2 | ||||
-rw-r--r-- | tests/auto/blackbox/testdata/codegen/codegen.qbs | 7 |
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] |