diff --git a/doc/reference/items/rule.qdoc b/doc/reference/items/rule.qdoc index a3eab44fb3..4aa0cc010f 100644 --- a/doc/reference/items/rule.qdoc +++ b/doc/reference/items/rule.qdoc @@ -241,7 +241,7 @@ \li undefined \li Script that prepares the commands to transform the inputs to outputs. The code in this script is treated as a function with the signature - \c{function(project, product, inputs, outputs, input, output)}. + \c{function(project, product, rule, inputs, outputs, input, output)}. The argument \c{input} is \c{undefined} if there's more than one input artifact for this rule. Similarly, \c{output} is only defined if there's exactly one output artifact. \row diff --git a/src/lib/corelib/buildgraph/buildgraph.cpp b/src/lib/corelib/buildgraph/buildgraph.cpp index 3761a84d79..db770b979c 100644 --- a/src/lib/corelib/buildgraph/buildgraph.cpp +++ b/src/lib/corelib/buildgraph/buildgraph.cpp @@ -188,6 +188,15 @@ void setupScriptEngineForFile(ScriptEngine *engine, const ResolvedFileContextCon JsExtensions::setupExtensions(fileContext->jsExtensions(), targetObject); } +void setupScriptEngineForRule(ScriptEngine *engine, const RuleConstPtr &rule, QScriptValue targetObject) { + QScriptValue ruleScriptValue = engine->newObject(); + const QVariantMap &propMap = rule->properties; + for (QVariantMap::ConstIterator it = propMap.constBegin(); it != propMap.constEnd(); ++it) { + ruleScriptValue.setProperty(it.key(), engine->toScriptValue(it.value())); + } + targetObject.setProperty(QLatin1String("rule"), ruleScriptValue); +} + void setupScriptEngineForProduct(ScriptEngine *engine, const ResolvedProductConstPtr &product, const ResolvedModuleConstPtr &module, QScriptValue targetObject, PrepareScriptObserver *observer) diff --git a/src/lib/corelib/buildgraph/buildgraph.h b/src/lib/corelib/buildgraph/buildgraph.h index 4c2c4e8e07..6f91468718 100644 --- a/src/lib/corelib/buildgraph/buildgraph.h +++ b/src/lib/corelib/buildgraph/buildgraph.h @@ -76,6 +76,8 @@ void setupScriptEngineForFile(ScriptEngine *engine, const ResolvedFileContextCon void setupScriptEngineForProduct(ScriptEngine *engine, const ResolvedProductConstPtr &product, const ResolvedModuleConstPtr &module, QScriptValue targetObject, PrepareScriptObserver *observer = 0); +void setupScriptEngineForRule(ScriptEngine *engine, const RuleConstPtr &rule, + QScriptValue targetObject); QString relativeArtifactFileName(const Artifact *artifact); // Debugging helpers void doSanityChecks(const ResolvedProjectPtr &project, const Logger &logger); diff --git a/src/lib/corelib/buildgraph/jscommandexecutor.cpp b/src/lib/corelib/buildgraph/jscommandexecutor.cpp index 14b58cf272..c23dc8a4cb 100644 --- a/src/lib/corelib/buildgraph/jscommandexecutor.cpp +++ b/src/lib/corelib/buildgraph/jscommandexecutor.cpp @@ -105,6 +105,7 @@ class JsCommandExecutorThreadObject : public QObject setupScriptEngineForFile(scriptEngine, transformer->rule->prepareScript->fileContext, scope); setupScriptEngineForProduct(scriptEngine, transformer->product(), transformer->rule->module, scope, &observer); + setupScriptEngineForRule(scriptEngine, transformer->rule, scope); transformer->setupInputs(scope); transformer->setupOutputs(scriptEngine, scope); diff --git a/src/lib/corelib/buildgraph/rulesapplicator.cpp b/src/lib/corelib/buildgraph/rulesapplicator.cpp index bebbe3adad..976db4b286 100644 --- a/src/lib/corelib/buildgraph/rulesapplicator.cpp +++ b/src/lib/corelib/buildgraph/rulesapplicator.cpp @@ -91,6 +91,7 @@ void RulesApplicator::applyRule(const RuleConstPtr &rule, const ArtifactSet &inp PrepareScriptObserver observer(engine()); setupScriptEngineForFile(engine(), m_rule->prepareScript->fileContext, scope()); setupScriptEngineForProduct(engine(), m_product, m_rule->module, prepareScriptContext, &observer); + setupScriptEngineForRule(engine(), m_rule, prepareScriptContext); if (m_rule->multiplex) { // apply the rule once for a set of inputs doApply(inputArtifacts, prepareScriptContext); @@ -170,6 +171,7 @@ void RulesApplicator::doApply(const ArtifactSet &inputArtifacts, QScriptValue &p copyProperty(QLatin1String("input"), prepareScriptContext, scope()); copyProperty(QLatin1String("product"), prepareScriptContext, scope()); copyProperty(QLatin1String("project"), prepareScriptContext, scope()); + copyProperty(QLatin1String("rule"), prepareScriptContext, scope()); if (m_rule->isDynamic()) { outputArtifacts = runOutputArtifactsScript(inputArtifacts, ScriptEngine::argumentList(m_rule->outputArtifactsScript->argumentNames, diff --git a/src/lib/corelib/language/language.cpp b/src/lib/corelib/language/language.cpp index b65850f08f..0d35c1a29f 100644 --- a/src/lib/corelib/language/language.cpp +++ b/src/lib/corelib/language/language.cpp @@ -402,6 +402,7 @@ void Rule::load(PersistentPool &pool) prepareScript = pool.idLoadS(); outputArtifactsScript = pool.idLoadS(); module = pool.idLoadS(); + properties = pool.loadVariantMap(); pool.stream() >> inputs >> outputFileTags @@ -421,6 +422,7 @@ void Rule::store(PersistentPool &pool) const pool.store(prepareScript); pool.store(outputArtifactsScript); pool.store(module); + pool.store(properties); pool.stream() << inputs << outputFileTags diff --git a/src/lib/corelib/language/language.h b/src/lib/corelib/language/language.h index 1b3400efbe..874f515235 100644 --- a/src/lib/corelib/language/language.h +++ b/src/lib/corelib/language/language.h @@ -314,6 +314,7 @@ class Rule : public PersistentObject bool multiplex; QList artifacts; // unused, if outputFileTags/outputArtifactsScript is non-empty bool alwaysRun; + QVariantMap properties; // members that we don't need to save int ruleGraphId; diff --git a/src/lib/corelib/language/projectresolver.cpp b/src/lib/corelib/language/projectresolver.cpp index b8b4025bc3..a2554af558 100644 --- a/src/lib/corelib/language/projectresolver.cpp +++ b/src/lib/corelib/language/projectresolver.cpp @@ -728,6 +728,7 @@ void ProjectResolver::resolveRule(Item *item, ProjectContext *projectContext) m_logger.printWarning(error); return; } + rule->properties = evaluateProperties(item); if (m_productContext) m_productContext->product->rules += rule; else