diff --git a/src/tools/qtpromaker/main.cpp b/src/tools/qtpromaker/main.cpp index 4967b60f88f9d25dfd7175e1abf39529dfe5b885..c353b673d496c8f20b46b44c96bea31b19fec234 100644 --- a/src/tools/qtpromaker/main.cpp +++ b/src/tools/qtpromaker/main.cpp @@ -5,6 +5,8 @@ #include <QDirIterator> #include <QFile> #include <QSet> +#include <QMap> +#include <QProcess> #include <QTextStream> #include <QVector> @@ -15,7 +17,7 @@ // Put everything into a single project. static int targetDepth = 0; static bool forceOverWrite = false; -static QString subProjectSeparator = "@"; +static QString subProjectSeparator = "_"; // FIXME: Make file classes configurable on the command line. static const char *defaultExtensions[] = @@ -53,7 +55,7 @@ public: void addFile(const QFileInfo &fi) { - m_files.insert(fi.filePath()); + m_files.insert(fi.filePath(), Dummy()); } bool handleFile(const QFileInfo &fi, const QByteArray &preparedSuffix) @@ -69,15 +71,20 @@ public: if (m_files.isEmpty()) return; ts << '\n' << m_varName << " *="; - foreach (QString s, m_files) - ts << " \\\n " << s; + Files::ConstIterator it = m_files.begin(); + Files::ConstIterator end = m_files.end(); + for ( ; it != end; ++it) + ts << " \\\n " << it.key(); ts << "\n"; } private: + struct Dummy {}; + typedef QMap<QString, Dummy> Files; + QByteArray m_suffixes; QString m_varName; - QSet<QString> m_files; + Files m_files; }; class ProMaker; @@ -100,10 +107,12 @@ public: Extensions extensions() const { return m_extensions; } private: - void handleDir(const QDir &dir); + void handleItem(const QString &item); + void handleDir(const QString &item); + void handleBinary(const QString &item); ProMaker *m_master; - QList<QDir> m_dirs; + QStringList m_items; QVector<FileClass> m_fileClasses; Extensions m_extensions; QString m_outputFileName; @@ -127,7 +136,7 @@ private: void Project::setPaths(const QStringList &paths) { foreach (const QString &path, paths) - m_dirs.append(path); + m_items.append(path); } void Project::setExtensions(const Extensions &extensions) @@ -141,13 +150,73 @@ void Project::setExtensions(const Extensions &extensions) void Project::createFileLists() { - for (int i = 0; i != m_dirs.size(); ++i) - handleDir(m_dirs.at(i)); + for (int i = 0; i != m_items.size(); ++i) + handleItem(m_items.at(i)); +} + +void Project::handleItem(const QString &item) +{ + QFileInfo fi(item); + if (fi.isDir()) + handleDir(item); + else + handleBinary(item); +} + +void Project::handleBinary(const QString &item) +{ + QStringList args; + args.append("--batch-silent"); + args.append("--nx"); + args.append("--quiet"); + args.append("-i"); + args.append("mi"); + args.append("--se=" + item); + args.append("-ex"); + args.append("interpreter-exec mi -file-list-exec-source-files"); + args.append("-ex"); + args.append("quit"); + QProcess proc; + proc.start("gdb", args); + if (!proc.waitForStarted()) { + qDebug() << "COULD NOT START"; + return; + } + if (!proc.waitForFinished()) { + qDebug() << "COULD NOT FINISH"; + return; + } + QByteArray ba = proc.readAllStandardOutput(); + if (ba.isEmpty()) { + qDebug() << "NO OUTPUT"; + return; + } + QString input = QString::fromLatin1(ba, ba.size()); + // ^done,files=[{file="<<C++-namespaces>>",{file=...,fullname=} + // "}] (gdb) + int first = input.indexOf('{'); + input = input.mid(first, input.lastIndexOf('}') - first); + foreach (QString item, input.split("},{")) { + //qDebug() << "ITEM: " << item; + int full = item.indexOf(",fullname=\""); + if (full != -1) + item = item.mid(full + 11); + else + item = item.mid(6); + item.chop(1); + //qDebug() << "ITEM: " << item; + QFileInfo fi(item); + const QByteArray ext = FileClass::prepareSuffix(fi.suffix().toUtf8()); + for (int i = m_fileClasses.size(); --i >= 0; ) { + if (m_fileClasses[i].handleFile(fi, ext)) + break; + } + } } -void Project::handleDir(const QDir &dir) +void Project::handleDir(const QString &item) { - QDirIterator it(dir.path()); + QDirIterator it(item); while (it.hasNext()) { it.next(); const QFileInfo fi = it.fileInfo(); @@ -166,7 +235,7 @@ void Project::handleDir(const QDir &dir) child->setExtensions(extensions()); m_subdirs.append(subName); } else { - m_dirs.append(fi.filePath()); + m_items.append(fi.filePath()); } } else { const QByteArray ext = FileClass::prepareSuffix(fi.suffix().toUtf8()); @@ -213,7 +282,7 @@ void Project::writeProFile() foreach (const FileClass &fc, m_fileClasses) fc.writeProBlock(ts); ts << "\nPATHS *="; - foreach (const QDir &dir, m_dirs) + foreach (const QDir &dir, m_items) ts << " \\\n " << dir.path(); ts << "\n\nDEPENDPATH *= $$PATHS\n"; ts << "\nINCLUDEPATH *= $$PATHS\n";