From 26bbc40db925d7823d9cf9db80a4093eba613ad8 Mon Sep 17 00:00:00 2001 From: Oswald Buddenhagen Date: Fri, 25 Jul 2014 19:37:57 +0200 Subject: add priority sorting to $$resolve_depends() all else being equal, items with a higher numerical priority will appear first in the result. Change-Id: I4ee37ff404a53c4152a1e4fc2fc3c23ef525234d Reviewed-by: Joerg Bornemann --- qmake/library/qmakebuiltins.cpp | 29 +++++++++++++--------- qmake/library/qmakeevaluator.h | 6 +++-- .../tools/qmake/testdata/functions/functions.pro | 9 +++++++ 3 files changed, 30 insertions(+), 14 deletions(-) diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp index 46934c83e9..9824b306b9 100644 --- a/qmake/library/qmakebuiltins.cpp +++ b/qmake/library/qmakebuiltins.cpp @@ -437,8 +437,9 @@ QByteArray QMakeEvaluator::getCommandOutput(const QString &args) const void QMakeEvaluator::populateDeps( const ProStringList &deps, const ProString &prefix, const ProStringList &suffixes, + const ProString &priosfx, QHash > &dependencies, ProValueMap &dependees, - ProStringList &rootSet) const + QMultiMap &rootSet) const { foreach (const ProString &item, deps) if (!dependencies.contains(item.toKey())) { @@ -447,13 +448,13 @@ void QMakeEvaluator::populateDeps( foreach (const ProString &suffix, suffixes) depends += values(ProKey(prefix + item + suffix)); if (depends.isEmpty()) { - rootSet << item; + rootSet.insert(first(ProKey(prefix + item + priosfx)).toInt(), item); } else { foreach (const ProString &dep, depends) { dset.insert(dep.toKey()); dependees[dep.toKey()] << item; } - populateDeps(depends, prefix, suffixes, dependencies, dependees, rootSet); + populateDeps(depends, prefix, suffixes, priosfx, dependencies, dependees, rootSet); } } } @@ -974,27 +975,31 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand( break; case E_SORT_DEPENDS: case E_RESOLVE_DEPENDS: - if (args.count() < 1 || args.count() > 3) { - evalError(fL1S("%1(var, [prefix, [suffixes]]) requires one to three arguments.") + if (args.count() < 1 || args.count() > 4) { + evalError(fL1S("%1(var, [prefix, [suffixes, [prio-suffix]]]) requires one to four arguments.") .arg(func.toQString(m_tmp1))); } else { QHash > dependencies; ProValueMap dependees; - ProStringList rootSet; + QMultiMap rootSet; ProStringList orgList = values(args.at(0).toKey()); - populateDeps(orgList, (args.count() < 2 ? ProString() : args.at(1)), + ProString prefix = args.count() < 2 ? ProString() : args.at(1); + ProString priosfx = args.count() < 4 ? ProString(".priority") : args.at(3); + populateDeps(orgList, prefix, args.count() < 3 ? ProStringList(ProString(".depends")) : split_value_list(args.at(2).toQString(m_tmp2)), - dependencies, dependees, rootSet); - for (int i = 0; i < rootSet.size(); ++i) { - const ProString &item = rootSet.at(i); + priosfx, dependencies, dependees, rootSet); + while (!rootSet.isEmpty()) { + QMultiMap::iterator it = rootSet.begin(); + const ProString item = *it; + rootSet.erase(it); if ((func_t == E_RESOLVE_DEPENDS) || orgList.contains(item)) ret.prepend(item); foreach (const ProString &dep, dependees[item.toKey()]) { QSet &dset = dependencies[dep.toKey()]; - dset.remove(rootSet.at(i).toKey()); // *Don't* use 'item' - rootSet may have changed! + dset.remove(item.toKey()); if (dset.isEmpty()) - rootSet << dep; + rootSet.insert(first(ProKey(prefix + dep + priosfx)).toInt(), dep); } } } diff --git a/qmake/library/qmakeevaluator.h b/qmake/library/qmakeevaluator.h index f322a48011..8b2fc3ef06 100644 --- a/qmake/library/qmakeevaluator.h +++ b/qmake/library/qmakeevaluator.h @@ -51,6 +51,7 @@ #include #include +#include #include #include #include @@ -238,8 +239,9 @@ public: void populateDeps( const ProStringList &deps, const ProString &prefix, const ProStringList &suffixes, - QHash > &dependencies, - ProValueMap &dependees, ProStringList &rootSet) const; + const ProString &priosfx, + QHash > &dependencies, ProValueMap &dependees, + QMultiMap &rootSet) const; VisitReturn writeFile(const QString &ctx, const QString &fn, QIODevice::OpenMode mode, const QString &contents); diff --git a/tests/auto/tools/qmake/testdata/functions/functions.pro b/tests/auto/tools/qmake/testdata/functions/functions.pro index 84f97c2022..a0e88300d4 100644 --- a/tests/auto/tools/qmake/testdata/functions/functions.pro +++ b/tests/auto/tools/qmake/testdata/functions/functions.pro @@ -173,3 +173,12 @@ testReplace($$shell_quote($$in), $$out, "shell_quote") testReplace($$reverse($$list(one two three)), three two one, "reverse") testReplace($$cat(textfile), hi '"holla he"' 'hu!') + +MOD.a.depends = +MOD.b.depends = +MOD.b.priority = 1 +MOD.c.depends = a b +testReplace($$resolve_depends($$list(c), "MOD."), c b a) +MOD.a.priority = 1 +MOD.b.priority = 0 +testReplace($$resolve_depends($$list(c), "MOD."), c a b) -- cgit v1.2.3