On Thursday 10 September 2015 07:57:11 Oswald Buddenhagen wrote:
> On Sun, Sep 06, 2015 at 11:10:29AM +0200, David Faure wrote:
> > This seems to be a bug in Qt.
> > The code in qtAddModules (qtbase/mkspecs/features/qt_functions.prf )
> > turns "core gui KParts" into "core gui + all the deps from KParts". But 
> > KParts itself is missing.
> > 
> > If I change
> >     # Topological resolution of modules based on their QT.<module>.depends 
> > variable
> >     $$1 = $$resolve_depends($$1, "QT.")
> > to
> >     # Topological resolution of modules based on their QT.<module>.depends 
> > variable
> >     $$1 += $$resolve_depends($$1, "QT.")
> > the problem is solved (note += instead of =).
> > 
> > Oswald, do you confirm that this is the right fix?
> > 
> nope. $$resolve_depends() is not supposed to drop anything, at least if
> the .depends variables are correctly populated.

Ah (if it was documented, at least in the qmake source code, that would help ;)

It definitely drops KParts.

before: core gui KParts
after: KBookmarks KXmlGui KConfigWidgets KWidgetsAddons KTextWidgets SonnetUi 
widgets KConfigGui gui xml dbus KConfigCore KCodecs KAuth KCoreAddons Solid 
KI18n core

I tried debugging into qmake, but I'm getting lost. Can you take over?

Testcase:

# Set $QMAKEPATH to your KF5 install prefix if this is not found.
QT += KParts

-- 
David Faure, fa...@kde.org, http://www.davidfaure.fr
Working on KDE Frameworks 5
diff --git a/mkspecs/features/qt_functions.prf b/mkspecs/features/qt_functions.prf
index a1c4996..35e38ce 100644
--- a/mkspecs/features/qt_functions.prf
+++ b/mkspecs/features/qt_functions.prf
@@ -65,6 +65,7 @@ defineTest(qtHaveModule) {
 
 # qt module, libs variable
 defineTest(qtAddModule) {
+    message(DAVID qtAddModule $${1})
     MODULE_NAME = $$eval(QT.$${1}.name)
     MODULE_INCLUDES = $$eval(QT.$${1}.includes)
     MODULE_LIBS = $$eval(QT.$${1}.libs)
@@ -156,13 +157,22 @@ defineTest(qtAddModule) {
 defineTest(qtAddModules) {
     # qmake variables cannot contain dashes, so normalize the names first
     $$1 = $$replace($$1, -private$, _private)
+message(DAVID before:)
+ for(QTLIB, $$1) {
+    message($${QTLIB})
+ }
     # Topological resolution of modules based on their QT.<module>.depends variable
     $$1 = $$resolve_depends($$1, "QT.")
+message(DAVID after:)
+ for(QTLIB, $$1) {
+    message($${QTLIB})
+ }
     # Finally actually add the modules
     unset(BAD_QT)
     for(QTLIB, $$1) {
         QTLIBNAME = $$eval(QT.$${QTLIB}.name)
         isEmpty(QTLIBNAME) {
+            message(BAD_QT $$QTLIB)
             BAD_QT += $$QTLIB
             next()
         }
diff --git a/qmake/library/qmakebuiltins.cpp b/qmake/library/qmakebuiltins.cpp
index 02d5d5d..c270023 100644
--- a/qmake/library/qmakebuiltins.cpp
+++ b/qmake/library/qmakebuiltins.cpp
@@ -53,6 +53,7 @@
 # include <qjsonobject.h>
 # include <qjsonarray.h>
 #endif
+#include <qdebug.h>
 #ifdef PROEVALUATOR_THREAD_SAFE
 # include <qthreadpool.h>
 #endif
@@ -435,19 +436,24 @@ void QMakeEvaluator::populateDeps(
 {
     foreach (const ProString &item, deps)
         if (!dependencies.contains(item.toKey())) {
+            traceMsg("populateDeps: looking at %s", qPrintable(item.toQString()));
             QSet<ProKey> &dset = dependencies[item.toKey()]; // Always create entry
             ProStringList depends;
             foreach (const ProString &suffix, suffixes)
                 depends += values(ProKey(prefix + item + suffix));
             if (depends.isEmpty()) {
+                traceMsg("populateDeps: inserting into rootSet: %s", qPrintable(item.toQString()));
                 rootSet.insert(first(ProKey(prefix + item + priosfx)).toInt(), item);
             } else {
                 foreach (const ProString &dep, depends) {
                     dset.insert(dep.toKey());
                     dependees[dep.toKey()] << item;
+                    traceMsg("populateDeps: adding %s to dependees for", qPrintable(item.toQString()), dbgKey(dep.toKey()));
                 }
                 populateDeps(depends, prefix, suffixes, priosfx, dependencies, dependees, rootSet);
             }
+        } else {
+            traceMsg("populateDeps: skipping %s", qPrintable(item.toQString()));
         }
 }
 
@@ -984,6 +990,7 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand(
             while (!rootSet.isEmpty()) {
                 QMultiMap<int, ProString>::iterator it = rootSet.begin();
                 const ProString item = *it;
+                traceMsg("(qmake) processing %s", qPrintable(item.toQString(m_tmp1)));
                 rootSet.erase(it);
                 if ((func_t == E_RESOLVE_DEPENDS) || orgList.contains(item))
                     ret.prepend(item);
@@ -994,6 +1001,7 @@ ProStringList QMakeEvaluator::evaluateBuiltinExpand(
                         rootSet.insert(first(ProKey(prefix + dep + priosfx)).toInt(), dep);
                 }
             }
+            traceMsg("(qmake) after: %s", dbgSepStrList(ret));
         }
         break;
     case E_ENUMERATE_VARS: {
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:159: QT := core gui KParts
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: calling built-in $$resolve_depends(QT, QT.)
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: inserting into rootSet: core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at gui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding gui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KParts
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KParts to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KParts to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KParts to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KIOWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KIOWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KIOWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KIOWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KIOWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping KIOWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KBookmarks
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KBookmarks to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KBookmarks to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding widgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding widgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping gui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at xml
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding xml to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KXmlGui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KXmlGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KXmlGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KXmlGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KXmlGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KXmlGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at dbus
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding dbus to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping xml
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KConfigCore
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigCore to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KConfigWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KCodecs
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KCodecs to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KWidgetsAddons
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KWidgetsAddons to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KConfigGui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KConfigGui to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping gui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping xml
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping KConfigCore
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KAuth
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KAuth to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KAuth to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KCoreAddons
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KCoreAddons to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at Solid
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding Solid to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping KXmlGui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KTextWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KTextWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KTextWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KTextWidgets to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at SonnetUi
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding SonnetUi to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: looking at KI18n
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: adding KI18n to dependees for
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: populateDeps: skipping core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KI18n
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing Solid
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KCoreAddons
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KAuth
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KCodecs
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KConfigCore
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing dbus
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing xml
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing gui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KConfigGui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing widgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing SonnetUi
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KTextWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KWidgetsAddons
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KConfigWidgets
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KXmlGui
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) processing KBookmarks
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: (qmake) after: KBookmarks, KXmlGui, KConfigWidgets, KWidgetsAddons, KTextWidgets, SonnetUi, widgets, KConfigGui, gui, xml, dbus, KConfigCore, KCodecs, KAuth, KCoreAddons, Solid, KI18n, core
DEBUG 1: /d/qt/5/kde/qtbase/mkspecs/features/qt_functions.prf:165: QT := KBookmarks KXmlGui KConfigWidgets KWidgetsAddons KTextWidgets SonnetUi widgets KConfigGui gui xml dbus KConfigCore KCodecs KAuth KCoreAddons Solid KI18n core
>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<

Reply via email to