fix $$resolve_depends()
make it a proper topological sort. before, it could not resolve diamonds correctly. Change-Id: I17ffd81020ab36e7e5dbcfd120793ba8d9c6cf18 Reviewed-on: http://codereview.qt.nokia.com/1435 Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com> Reviewed-by: Marius Storm-Olsen <marius.storm-olsen@nokia.com>
This commit is contained in:
parent
0f32f596ea
commit
fe9cb4a508
@ -1802,22 +1802,24 @@ QMakeProject::doProjectExpand(QString func, QStringList args,
|
|||||||
// defined in symbian generator
|
// defined in symbian generator
|
||||||
extern QString generate_test_uid(const QString& target);
|
extern QString generate_test_uid(const QString& target);
|
||||||
|
|
||||||
|
static void
|
||||||
void calculateDeps(QStringList &sortedList, const QString &item, const QString &prefix,
|
populateDeps(const QStringList &deps, const QString &prefix,
|
||||||
QStringList &org, bool resolve, QMap<QString, QStringList> &place)
|
QHash<QString, QSet<QString> > &dependencies, QHash<QString, QStringList> &dependees,
|
||||||
|
QStringList &rootSet, QMap<QString, QStringList> &place)
|
||||||
{
|
{
|
||||||
if (sortedList.contains(item))
|
foreach (const QString &item, deps)
|
||||||
return;
|
if (!dependencies.contains(item)) {
|
||||||
|
QSet<QString> &dset = dependencies[item]; // Always create entry
|
||||||
foreach(QString dep, place.value(prefix + item + ".depends")) {
|
QStringList depends = place.value(prefix + item + ".depends");
|
||||||
calculateDeps(sortedList, dep, prefix, org, resolve, place);
|
if (depends.isEmpty()) {
|
||||||
if (!resolve && org.isEmpty())
|
rootSet << item;
|
||||||
break;
|
} else {
|
||||||
|
foreach (const QString &dep, depends) {
|
||||||
|
dset.insert(dep);
|
||||||
|
dependees[dep] << item;
|
||||||
|
}
|
||||||
|
populateDeps(depends, prefix, dependencies, dependees, rootSet, place);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (resolve || org.contains(item)) {
|
|
||||||
sortedList.prepend(item);
|
|
||||||
org.removeAll(item);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2273,14 +2275,24 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
|
|||||||
fprintf(stderr, "%s:%d: %s(var, prefix) requires one or two arguments.\n",
|
fprintf(stderr, "%s:%d: %s(var, prefix) requires one or two arguments.\n",
|
||||||
parser.file.toLatin1().constData(), parser.line_no, func.toLatin1().constData());
|
parser.file.toLatin1().constData(), parser.line_no, func.toLatin1().constData());
|
||||||
} else {
|
} else {
|
||||||
bool resolve = (func_t == E_RESOLVE_DEPENDS);
|
QHash<QString, QSet<QString> > dependencies;
|
||||||
QString prefix = (args.count() != 2 ? QString() : args[1]);
|
QHash<QString, QStringList> dependees;
|
||||||
QStringList deps = values(args[0], place);
|
QStringList rootSet;
|
||||||
QStringList org = deps;
|
|
||||||
foreach(const QString &item, deps) {
|
QStringList orgList = values(args[0], place);
|
||||||
calculateDeps(ret, item, prefix, org, resolve, place);
|
populateDeps(orgList, (args.count() != 2 ? QString() : args[1]),
|
||||||
if (!resolve && org.isEmpty())
|
dependencies, dependees, rootSet, place);
|
||||||
break;
|
|
||||||
|
for (int i = 0; i < rootSet.size(); ++i) {
|
||||||
|
const QString &item = rootSet.at(i);
|
||||||
|
if ((func_t == E_RESOLVE_DEPENDS) || orgList.contains(item))
|
||||||
|
ret.prepend(item);
|
||||||
|
foreach (const QString &dep, dependees[item]) {
|
||||||
|
QSet<QString> &dset = dependencies[dep];
|
||||||
|
dset.remove(item);
|
||||||
|
if (dset.isEmpty())
|
||||||
|
rootSet << dep;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
break; }
|
break; }
|
||||||
|
Loading…
x
Reference in New Issue
Block a user