[prev in list] [next in list] [prev in thread] [next in thread] 

List:       kde-devel
Subject:    Re: KF5 with qmake problems
From:       David Faure <faure () kde ! org>
Date:       2015-09-10 7:51:44
Message-ID: 2389132.Y1KDb9zAmv () asterix
[Download RAW message or body]

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, faure@kde.org, http://www.davidfaure.fr
Working on KDE Frameworks 5


["qmake.diff" (qmake.diff)]

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_output.diff" (debug_output.diff)]

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


[Attachment #5 (text/plain)]


>> Visit http://mail.kde.org/mailman/listinfo/kde-devel#unsub to unsubscribe <<


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic