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

List:       kde-core-devel
Subject:    Re: automoc4 and subdirs
From:       Matthias Kretz <kretz () kde ! org>
Date:       2008-08-03 19:40:50
Message-ID: 200808032140.51232.kretz () kde ! org
[Download RAW message or body]

Both patches break kdelibs/solid/solid/ifaces/. 

Here's an updated patch that first tries the old behaviour and if it can't 
find a header file that way it will look for the header in the subdir.

-- 
________________________________________________________
Matthias Kretz (Germany)                            <><
http://Vir.homelinux.org/
MatthiasKretz@gmx.net, kretz@kde.org,
Matthias.Kretz@urz.uni-heidelberg.de


["automoc.diff" (text/x-patch)]

Index: kde4automoc.cpp
===================================================================
--- kde4automoc.cpp	(revision 839933)
+++ kde4automoc.cpp	(working copy)
@@ -25,6 +25,7 @@
 
 #include <QtCore/QCoreApplication>
 #include <QtCore/QDateTime>
+#include <QtCore/QDir>
 #include <QtCore/QFile>
 #include <QtCore/QFileInfo>
 #include <QtCore/QHash>
@@ -257,7 +258,7 @@
     QHash<QString, QString> includedMocs;    // key = moc source filepath, value = \
                moc output filepath
     QHash<QString, QString> notIncludedMocs; // key = moc source filepath, value = \
moc output filename  
-    QRegExp mocIncludeRegExp(QLatin1String("[\n]\\s*#\\s*include\\s+[\"<](moc_[^ \
\">]+\\.cpp|[^ \">]+\\.moc)[\">]")); +    QRegExp \
mocIncludeRegExp(QLatin1String("[\n]\\s*#\\s*include\\s+[\"<]((?:[^ \">]+/)?moc_[^ \
\">/]+\\.cpp|[^ \">]+\\.moc)[\">]"));  QRegExp \
qObjectRegExp(QLatin1String("[\n]\\s*Q_OBJECT\\b"));  QStringList headerExtensions;
 #ifdef Q_OS_WIN
@@ -354,15 +355,28 @@
                 do { // call this for every moc include in the file
                     const QString currentMoc = mocIncludeRegExp.cap(1);
                     //qDebug() << "found moc include: " << currentMoc << " at offset \
                " << matchOffset;
-                    QString basename = QFileInfo(currentMoc).completeBaseName();
-                    const bool moc_style = currentMoc.startsWith("moc_");
+                    const QFileInfo currentMocInfo(currentMoc);
+                    QString basename = currentMocInfo.completeBaseName();
+                    const bool moc_style = basename.startsWith("moc_");
+
+                    // If the moc include is of the moc_foo.cpp style we expect the \
Q_OBJECT class +                    // declaration in a header file.
+                    // If the moc include is of the foo.moc style we need to look \
for a Q_OBJECT +                    // macro in the current source file, if it \
contains the macro we generate the +                    // moc file from the source \
file, else from the header. +                    //
+                    // TODO: currently any .moc file name will be used if the source \
contains +                    // Q_OBJECT
                     if (moc_style || qObjectRegExp.indexIn(contentsString) < 0) {
                         if (moc_style) {
+                            // basename should be the part of the moc filename used \
for finding the +                            // correct header, so we need to remove \
                the moc_ part
                             basename = basename.right(basename.length() - 4);
                         }
+
                         bool headerFound = false;
                         foreach (const QString &ext, headerExtensions) {
-                            QString sourceFilePath = absPath + basename + ext;
+                            const QString &sourceFilePath = absPath + basename + \
ext;  if (QFile::exists(sourceFilePath)) {
                                 headerFound = true;
                                 includedMocs.insert(sourceFilePath, currentMoc);
@@ -371,11 +385,34 @@
                             }
                         }
                         if (!headerFound) {
+                            // the moc file is in a subdir => look for the header in \
the same subdir +                            if (currentMoc.indexOf('/') != -1) {
+                                const QString &filepath = absPath + \
currentMocInfo.path() + QLatin1Char('/') + basename; +
+                                foreach (const QString &ext, headerExtensions) {
+                                    const QString &sourceFilePath = filepath + ext;
+                                    if (QFile::exists(sourceFilePath)) {
+                                        headerFound = true;
+                                        includedMocs.insert(sourceFilePath, \
currentMoc); +                                        \
notIncludedMocs.remove(sourceFilePath); +                                        \
break; +                                    }
+                                }
+                                if (!headerFound) {
+                                    cerr << "automoc4: The file \"" << absFilename \
<< +                                        "\" includes the moc file \"" << \
currentMoc << "\", but neither \"" << +                                        \
absPath + basename + "{" + headerExtensions.join(",") + "}\" nor \"" << +             \
filepath + "{" + headerExtensions.join(",") + "}" << +                                \
"\" exist." << endl; +                                    ::exit(EXIT_FAILURE);
+                                }
+                            } else {
                                 cerr << "automoc4: The file \"" << absFilename <<
                                     "\" includes the moc file \"" << currentMoc << \
                "\", but \"" <<
                                     absPath + basename + "{" + \
headerExtensions.join(",") + "}" <<  "\" does not exist." << endl;
                                 ::exit(EXIT_FAILURE);
+                            }
                         }
                     } else {
                         includedMocs.insert(absFilename, currentMoc);
@@ -489,7 +526,14 @@
 {
     //qDebug() << Q_FUNC_INFO << sourceFile << mocFileName;
     const QString mocFilePath = builddir + mocFileName;
-    if (generateAll || QFileInfo(mocFilePath).lastModified() <= \
QFileInfo(sourceFile).lastModified()) { +    QFileInfo mocInfo(mocFilePath);
+    if (generateAll || mocInfo.lastModified() <= \
QFileInfo(sourceFile).lastModified()) { +        QDir mocDir = mocInfo.dir();
+        // make sure the directory for the resulting moc file exists
+        if (!mocDir.exists()) {
+            mocDir.mkpath(mocDir.path());
+        }
+
         static bool initialized = false;
         if (!initialized) {
             initialized = true;
Index: Automoc4Version.cmake
===================================================================
--- Automoc4Version.cmake	(revision 839472)
+++ Automoc4Version.cmake	(working copy)
@@ -1,7 +1,7 @@
 # set the current version number
 set(AUTOMOC4_VERSION_MAJOR  "0")
 set(AUTOMOC4_VERSION_MINOR  "9")
-set(AUTOMOC4_VERSION_PATCH "85")
+set(AUTOMOC4_VERSION_PATCH "86")
 
 set(AUTOMOC4_VERSION \
"${AUTOMOC4_VERSION_MAJOR}.${AUTOMOC4_VERSION_MINOR}.${AUTOMOC4_VERSION_PATCH}")  



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

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