diff options
| author | Matthias Kretz <kretz@kde.org> | 2007-07-17 14:45:15 +0000 | 
|---|---|---|
| committer | Matthias Kretz <kretz@kde.org> | 2007-07-17 14:45:15 +0000 | 
| commit | febc9bb214c1307a2ff3ce94d52504f72218ac91 (patch) | |
| tree | 9c793b012a015247c7f05446f46b269224255da6 /automoc/kde4automoc.cpp | |
| parent | dd01e68e0fe612b7793887fa26004fd3d9fd9442 (diff) | |
| download | extra-cmake-modules-febc9bb214c1307a2ff3ce94d52504f72218ac91.tar.gz extra-cmake-modules-febc9bb214c1307a2ff3ce94d52504f72218ac91.tar.bz2 | |
if the moc fails kde4automoc returns EXIT_FAILURE and deletes the moc file
and doesn't touch the _automoc.cpp file. This should help with finding
moc-related errors.
svn path=/trunk/KDE/kdelibs/; revision=689073
Diffstat (limited to 'automoc/kde4automoc.cpp')
| -rw-r--r-- | automoc/kde4automoc.cpp | 64 | 
1 files changed, 43 insertions, 21 deletions
| diff --git a/automoc/kde4automoc.cpp b/automoc/kde4automoc.cpp index 2be2ff73..81075dec 100644 --- a/automoc/kde4automoc.cpp +++ b/automoc/kde4automoc.cpp @@ -34,11 +34,11 @@ class AutoMoc  {      public:          AutoMoc(); -        ~AutoMoc(); -        void run(); +        bool run();      private:          void generateMoc(const QString &sourceFile, const QString &mocFileName); +        void waitForProcesses();          void usage(const QString &);          void echoColor(const QString &msg)          { @@ -47,7 +47,7 @@ class AutoMoc              QStringList args(cmakeEchoColorArgs);              args << msg;              cmakeEcho->start("cmake", args, QIODevice::NotOpen); -            processes.enqueue(cmakeEcho); +            processes.enqueue(Process(cmakeEcho, QString()));          }          QString builddir; @@ -57,7 +57,14 @@ class AutoMoc          const bool verbose;          QTextStream cerr;          QTextStream cout; -        QQueue<QProcess *> processes; +        struct Process +        { +            Process(QProcess *a, const QString &b) : qproc(a), mocFilePath(b) {} +            QProcess *qproc; +            QString mocFilePath; +        }; +        QQueue<Process> processes; +        bool failed;  };  void AutoMoc::usage(const QString &path) @@ -69,19 +76,21 @@ void AutoMoc::usage(const QString &path)  int main(int argc, char **argv)  {      QCoreApplication app(argc, argv); -    AutoMoc().run(); +    if (!AutoMoc().run()) { +        return EXIT_FAILURE; +    }      return 0;  }  AutoMoc::AutoMoc() -    : verbose(!QByteArray(getenv("VERBOSE")).isEmpty()), cerr(stderr), cout(stdout) +    : verbose(!QByteArray(getenv("VERBOSE")).isEmpty()), cerr(stderr), cout(stdout), failed(false)  {      const QByteArray colorEnv = getenv("COLOR");      cmakeEchoColorArgs << "-E" << "cmake_echo_color" << QString("--switch=") + colorEnv << "--blue"          << "--bold";  } -void AutoMoc::run() +bool AutoMoc::run()  {      const QStringList args = QCoreApplication::arguments();      Q_ASSERT(args.size() > 0); @@ -211,6 +220,15 @@ void AutoMoc::run()          generateMoc(it.key(), it.value());      } +    // let all remaining moc processes finish +    waitForProcesses(); + +    if (failed) { +        // if any moc process failed we don't want to touch the _automoc.cpp file so that +        // kde4automoc is rerun until the issue is fixed +        return false; +    } +      // source file that includes all remaining moc files      outfile.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Truncate);      QTextStream outStream(&outfile); @@ -224,17 +242,27 @@ void AutoMoc::run()          outStream << "#include \"" << it.value() << "\"\n";      }      outfile.close(); + +    return true;  } -AutoMoc::~AutoMoc() +void AutoMoc::waitForProcesses()  { -    // let all remaining moc processes finish      while (!processes.isEmpty()) { -        QProcess *proc = processes.dequeue(); -        if (!proc->waitForFinished()) { -            cerr << "kde4automoc: process failed: " << proc->errorString() << endl; +        Process proc = processes.dequeue(); +        if (!proc.qproc->waitForFinished()) { +            cerr << "kde4automoc: process failed: " << proc.qproc->errorString() << endl; +            failed = true; +            if (!proc.mocFilePath.isEmpty()) { +                QFile::remove(proc.mocFilePath); +            } +        } else if (proc.qproc->exitCode() != 0) { +            failed = true; +            if (!proc.mocFilePath.isEmpty()) { +                QFile::remove(proc.mocFilePath); +            }          } -        delete proc; +        delete proc.qproc;      }  } @@ -251,13 +279,7 @@ void AutoMoc::generateMoc(const QString &sourceFile, const QString &mocFileName)          // we don't want too many child processes          if (processes.size() > 10) { -            while (!processes.isEmpty()) { -                QProcess *proc = processes.dequeue(); -                if (!proc->waitForFinished()) { -                    cerr << "kde4automoc: process failed: " << proc->errorString() << endl; -                } -                delete proc; -            } +            waitForProcesses();          }          QProcess *mocProc = new QProcess; @@ -266,6 +288,6 @@ void AutoMoc::generateMoc(const QString &sourceFile, const QString &mocFileName)          args << "-o" << mocFilePath << sourceFile;          //qDebug() << "executing: " << mocExe << args;          mocProc->start(mocExe, args, QIODevice::NotOpen); -        processes.enqueue(mocProc); +        processes.enqueue(Process(mocProc, mocFilePath));      }  } | 
