220
void ResolvedFileContext::load(PersistentPool &pool)
222
filePath = pool.idLoadString();
223
jsExtensions = pool.idLoadStringList();
224
pool.stream() >> jsImports;
227
void ResolvedFileContext::store(PersistentPool &pool) const
229
pool.storeString(filePath);
230
pool.storeStringList(jsExtensions);
231
pool.stream() << jsImports;
234
bool operator==(const ResolvedFileContext &a, const ResolvedFileContext &b)
240
return a.filePath == b.filePath
241
&& a.jsExtensions == b.jsExtensions
242
&& a.jsImports == b.jsImports;
218
* \class PrepareScript
219
* \brief The \c PrepareScript class represents the JavaScript code found in the "prepare" binding
247
* \class ScriptFunction
248
* \brief The \c ScriptFunction class represents the JavaScript code found in the "prepare" binding
220
249
* of a \c Rule or \c Transformer item in a qbs file.
222
251
* \sa ResolvedTransformer
226
* \variable PrepareScript::script
255
* \variable ScriptFunction::script
227
256
* \brief The actual Javascript code, taken verbatim from the qbs source file.
231
* \variable PrepareScript::location
260
* \variable ScriptFunction::location
232
261
* \brief The exact location of the script in the qbs source file.
233
262
* This is mostly needed for diagnostics.
236
void PrepareScript::load(PersistentPool &pool)
238
pool.stream() >> script;
239
pool.stream() >> location;
242
void PrepareScript::store(PersistentPool &pool) const
244
pool.stream() << script;
245
pool.stream() << location;
265
void ScriptFunction::load(PersistentPool &pool)
271
fileContext = pool.idLoadS<ResolvedFileContext>();
274
void ScriptFunction::store(PersistentPool &pool) const
280
pool.store(fileContext);
283
bool operator==(const ScriptFunction &a, const ScriptFunction &b)
289
return a.sourceCode == b.sourceCode
290
&& a.location == b.location
291
&& *a.fileContext == *b.fileContext;
248
294
void ResolvedModule::load(PersistentPool &pool)
250
296
name = pool.idLoadString();
251
297
moduleDependencies = pool.idLoadStringList();
252
setupBuildEnvironmentScript = pool.idLoadString();
253
setupRunEnvironmentScript = pool.idLoadString();
254
pool.stream() >> jsImports
256
>> setupBuildEnvironmentScript
257
>> setupRunEnvironmentScript;
298
setupBuildEnvironmentScript = pool.idLoadS<ScriptFunction>();
299
setupRunEnvironmentScript = pool.idLoadS<ScriptFunction>();
260
302
void ResolvedModule::store(PersistentPool &pool) const
262
304
pool.storeString(name);
263
305
pool.storeStringList(moduleDependencies);
264
pool.storeString(setupBuildEnvironmentScript);
265
pool.storeString(setupRunEnvironmentScript);
266
pool.stream() << jsImports
268
<< setupBuildEnvironmentScript
269
<< setupRunEnvironmentScript;
306
pool.store(setupBuildEnvironmentScript);
307
pool.store(setupRunEnvironmentScript);
310
bool operator==(const ResolvedModule &m1, const ResolvedModule &m2)
316
return m1.name == m2.name
317
&& m1.moduleDependencies.toSet() == m2.moduleDependencies.toSet()
318
&& *m1.setupBuildEnvironmentScript == *m2.setupBuildEnvironmentScript
319
&& *m1.setupRunEnvironmentScript == *m2.setupRunEnvironmentScript;
322
static bool modulesAreEqual(const ResolvedModuleConstPtr &m1, const ResolvedModuleConstPtr &m2)
272
327
QString Rule::toString() const
495
550
QSet<QString> seenModuleNames;
496
551
QList<const ResolvedModule *> topSortedModules = topSortModules(moduleChildren, rootModules, seenModuleNames);
497
552
foreach (const ResolvedModule *module, topSortedModules) {
498
if ((envType == BuildEnv && module->setupBuildEnvironmentScript.isEmpty()) ||
499
(envType == RunEnv && module->setupBuildEnvironmentScript.isEmpty() && module->setupRunEnvironmentScript.isEmpty()))
553
if ((envType == BuildEnv && module->setupBuildEnvironmentScript->sourceCode.isEmpty()) ||
554
(envType == RunEnv && module->setupBuildEnvironmentScript->sourceCode.isEmpty()
555
&& module->setupRunEnvironmentScript->sourceCode.isEmpty()))
558
ScriptFunctionConstPtr setupScript;
559
if (envType == BuildEnv) {
560
setupScript = module->setupBuildEnvironmentScript;
562
if (!module->setupRunEnvironmentScript)
563
setupScript = module->setupBuildEnvironmentScript;
565
setupScript = module->setupRunEnvironmentScript;
502
568
// handle imports
503
engine->import(module->jsImports, scope, scope);
504
JsExtensions::setupExtensions(module->jsExtensions, scope);
569
engine->import(setupScript->fileContext->jsImports, scope, scope);
570
JsExtensions::setupExtensions(setupScript->fileContext->jsExtensions, scope);
506
572
// expose properties of direct module dependencies
507
573
QScriptValue scriptValue;
519
585
for (QVariantMap::const_iterator it = moduleCfg.constBegin(); it != moduleCfg.constEnd(); ++it)
520
586
scope.setProperty(it.key(), engine->toScriptValue(it.value()));
523
if (envType == BuildEnv) {
524
setupScript = module->setupBuildEnvironmentScript;
526
if (module->setupRunEnvironmentScript.isEmpty()) {
527
setupScript = module->setupBuildEnvironmentScript;
529
setupScript = module->setupRunEnvironmentScript;
533
588
QScriptContext *ctx = engine->currentContext();
534
589
ctx->pushScope(scope);
535
scriptValue = engine->evaluate(setupScript);
590
scriptValue = engine->evaluate(setupScript->sourceCode + QLatin1String("()"));
537
592
if (Q_UNLIKELY(scriptValue.isError() || engine->hasUncaughtException())) {
538
593
QString envTypeStr = (envType == BuildEnv ? "build" : "run");
947
void ResolvedTransformer::load(PersistentPool &pool)
949
module = pool.idLoadS<ResolvedModule>();
950
pool.stream() >> inputs;
951
pool.loadContainerS(outputs);
952
transform = pool.idLoadS<ScriptFunction>();
955
void ResolvedTransformer::store(PersistentPool &pool) const
958
pool.stream() << inputs;
959
pool.storeContainer(outputs);
960
pool.store(transform);
964
template<typename T> QMap<QString, T> listToMap(const QList<T> &list)
966
QMap<QString, T> map;
967
foreach (const T &elem, list)
968
map.insert(keyFromElem(elem), elem);
972
template<typename T> bool listsAreEqual(const QList<T> &l1, const QList<T> &l2)
974
if (l1.count() != l2.count())
976
const QMap<QString, T> map1 = listToMap(l1);
977
const QMap<QString, T> map2 = listToMap(l2);
978
foreach (const QString &key, map1.keys()) {
979
const T value2 = map2.value(key);
982
if (*map1.value(key) != *value2)
988
QString keyFromElem(const SourceArtifactPtr &sa) { return sa->absoluteFilePath; }
989
QString keyFromElem(const ResolvedTransformerConstPtr &t) { return t->transform->sourceCode; }
991
bool operator==(const SourceArtifact &sa1, const SourceArtifact &sa2)
995
if (!!&sa1 != !!&sa2)
997
return sa1.absoluteFilePath == sa2.absoluteFilePath
998
&& sa1.fileTags == sa2.fileTags
999
&& sa1.overrideFileTags == sa2.overrideFileTags
1000
&& sa1.properties->value() == sa2.properties->value();
1003
bool sourceArtifactListsAreEqual(const QList<SourceArtifactPtr> &l1,
1004
const QList<SourceArtifactPtr> &l2)
1006
return listsAreEqual(l1, l2);
1009
bool operator==(const ResolvedTransformer &t1, const ResolvedTransformer &t2)
1011
return modulesAreEqual(t1.module, t2.module)
1012
&& t1.inputs.toSet() == t2.inputs.toSet()
1013
&& sourceArtifactListsAreEqual(t1.outputs, t2.outputs)
1014
&& *t1.transform == *t2.transform;
1017
bool transformerListsAreEqual(const QList<ResolvedTransformerConstPtr> &l1,
1018
const QList<ResolvedTransformerConstPtr> &l2)
1020
return listsAreEqual(l1, l2);
891
1023
} // namespace Internal
892
1024
} // namespace qbs