summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarius Storm-Olsen <marius.storm-olsen@nokia.com>2010-11-24 11:51:57 -0600
committeraxis <qt-info@nokia.com>2011-04-27 12:05:46 +0200
commitbca5a5d6f6e317151f3dab56f1d804af8d1aa62a (patch)
tree683d2a93b80257df498fe81123ca37858f0252a0
parent00c5f39081fb8de9e0b77de4e21ba0862d4bf695 (diff)
Add resolve_depends(var, prefix) function to qmake
This function calculates the topological order of variables. We will use it to determine which and in what order to link module libraries. The function is not tied to libraries/modules only, but requires the variables to be ordered to have their dependencies in the [prefix]<var>.depends subvariable. Due to the recursive nature of the algorithm it was just much easier to implement it directly in C++ rather than in a qmake-language function.
-rw-r--r--qmake/project.cpp46
-rw-r--r--qmake/project.h1
2 files changed, 46 insertions, 1 deletions
diff --git a/qmake/project.cpp b/qmake/project.cpp
index d4fa786ac5..993c16185e 100644
--- a/qmake/project.cpp
+++ b/qmake/project.cpp
@@ -81,7 +81,7 @@ enum ExpandFunc { E_MEMBER=1, E_FIRST, E_LAST, E_CAT, E_FROMFILE, E_EVAL, E_LIST
E_SPRINTF, E_JOIN, E_SPLIT, E_BASENAME, E_DIRNAME, E_SECTION,
E_FIND, E_SYSTEM, E_UNIQUE, E_QUOTE, E_ESCAPE_EXPAND,
E_UPPER, E_LOWER, E_FILES, E_PROMPT, E_RE_ESCAPE, E_REPLACE,
- E_SIZE, E_GENERATE_UID };
+ E_SIZE, E_GENERATE_UID, E_RESOLVE_DEPENDS };
QMap<QString, ExpandFunc> qmake_expandFunctions()
{
static QMap<QString, ExpandFunc> *qmake_expand_functions = 0;
@@ -114,6 +114,7 @@ QMap<QString, ExpandFunc> qmake_expandFunctions()
qmake_expand_functions->insert("replace", E_REPLACE);
qmake_expand_functions->insert("size", E_SIZE);
qmake_expand_functions->insert("generate_uid", E_GENERATE_UID);
+ qmake_expand_functions->insert("resolve_depends", E_RESOLVE_DEPENDS);
}
return *qmake_expand_functions;
}
@@ -1800,6 +1801,39 @@ QMakeProject::doProjectExpand(QString func, QStringList args,
// defined in symbian generator
extern QString generate_test_uid(const QString& target);
+
+void calculateDeps(QStringList &sortedList, const QString &item, const QString &prefix,
+ QStringList &org, QMap<QString, QStringList> &place)
+{
+ if (sortedList.contains(item))
+ return;
+
+ foreach(QString dep, place.value(prefix + item + ".depends")) {
+ calculateDeps(sortedList, dep, prefix, org, place);
+ if (org.isEmpty())
+ break;
+ }
+
+ if (org.contains(item)) {
+ sortedList += item;
+ org.removeAll(item);
+ }
+}
+
+QStringList
+QMakeProject::resolveDepends(const QStringList &deps, const QString &prefix,
+ QMap<QString, QStringList> &place)
+{
+ QStringList sortedList;
+ QStringList org = deps;
+ foreach(QString item, deps) {
+ calculateDeps(sortedList, item, prefix, org, place);
+ if (org.isEmpty())
+ break;
+ }
+ return sortedList;
+}
+
QStringList
QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
QMap<QString, QStringList> &place)
@@ -2246,6 +2280,16 @@ QMakeProject::doProjectExpand(QString func, QList<QStringList> args_list,
ret += generate_test_uid(args.first());
}
break;
+ case E_RESOLVE_DEPENDS: {
+ if(args.count() < 1 || args.count() > 2) {
+ fprintf(stderr, "%s:%d: resolve_depends(var, prefix) requires one or two arguments.\n",
+ parser.file.toLatin1().constData(), parser.line_no);
+ } else {
+ ret += resolveDepends(args[0].split(QString(Option::field_sep)),
+ (args.count() != 2 ? QString() : args[1]),
+ place);
+ }
+ break; }
default: {
fprintf(stderr, "%s:%d: Unknown replace function: %s\n",
parser.file.toLatin1().constData(), parser.line_no,
diff --git a/qmake/project.h b/qmake/project.h
index 0e6131d3a2..aea18afd52 100644
--- a/qmake/project.h
+++ b/qmake/project.h
@@ -107,6 +107,7 @@ class QMakeProject
QStringList doVariableReplaceExpand(const QString &str, QMap<QString, QStringList> &place, bool *ok=0);
void init(QMakeProperty *, const QMap<QString, QStringList> *);
QStringList &values(const QString &v, QMap<QString, QStringList> &place);
+ QStringList resolveDepends(const QStringList &deps, const QString &prefix, QMap<QString, QStringList> &place);
void validateModes();
public: