From 8df85570b31ac4152c1f4def23f306c43d18ac8b Mon Sep 17 00:00:00 2001
From: Roberto Raggi <roberto.raggi@nokia.com>
Date: Thu, 12 Mar 2009 09:56:06 +0100
Subject: [PATCH] Initial work on pkg-config support.

---
 .../genericprojectmanager.pro                 |   3 +-
 .../genericprojectmanager/pkgconfigtool.cpp   | 101 ++++++++++++++++++
 .../genericprojectmanager/pkgconfigtool.h     |  39 +++++++
 3 files changed, 142 insertions(+), 1 deletion(-)
 create mode 100644 src/plugins/genericprojectmanager/pkgconfigtool.cpp
 create mode 100644 src/plugins/genericprojectmanager/pkgconfigtool.h

diff --git a/src/plugins/genericprojectmanager/genericprojectmanager.pro b/src/plugins/genericprojectmanager/genericprojectmanager.pro
index 066816643e2..79ee17ce63a 100644
--- a/src/plugins/genericprojectmanager/genericprojectmanager.pro
+++ b/src/plugins/genericprojectmanager/genericprojectmanager.pro
@@ -7,11 +7,12 @@ HEADERS = genericproject.h \
     genericprojectmanager.h \
     genericprojectconstants.h \
     genericprojectnodes.h \
+    pkgconfigtool.h \
     makestep.h
 SOURCES = genericproject.cpp \
     genericprojectplugin.cpp \
     genericprojectmanager.cpp \
     genericprojectnodes.cpp \
+    pkgconfigtool.cpp \
     makestep.cpp
 RESOURCES += genericproject.qrc
-FORMS += 
diff --git a/src/plugins/genericprojectmanager/pkgconfigtool.cpp b/src/plugins/genericprojectmanager/pkgconfigtool.cpp
new file mode 100644
index 00000000000..eb4c6ad1f52
--- /dev/null
+++ b/src/plugins/genericprojectmanager/pkgconfigtool.cpp
@@ -0,0 +1,101 @@
+
+#include "pkgconfigtool.h"
+#include <QProcess>
+#include <QTextStream>
+#include <QtDebug>
+
+using namespace GenericProjectManager::Internal;
+
+PkgConfigTool::PkgConfigTool()
+{ }
+
+PkgConfigTool::~PkgConfigTool()
+{ }
+
+QList<PkgConfigTool::Package> PkgConfigTool::packages() const
+{
+    if (_packages.isEmpty())
+        packages_helper();
+
+    return _packages;
+}
+
+void PkgConfigTool::packages_helper() const
+{
+    QStringList args;
+    args.append(QLatin1String("--list-all"));
+
+    QProcess pkgconfig;
+    pkgconfig.start(QLatin1String("pkg-config"), args);
+    while (! pkgconfig.waitForFinished()) {
+    }
+
+    QTextStream in(&pkgconfig);
+    forever {
+        const QString line = in.readLine();
+
+        if (line.isNull())
+            break;
+
+        else if (line.isEmpty())
+            continue;
+
+        int i = 0;
+        for (; i != line.length(); ++i) {
+            if (line.at(i).isSpace())
+                break;
+        }
+
+        Package package;
+        package.name = line.left(i).trimmed();
+        package.description = line.mid(i).trimmed();
+
+        QStringList args;
+        args << package.name << QLatin1String("--cflags");
+        pkgconfig.start(QLatin1String("pkg-config"), args);
+
+        while (! pkgconfig.waitForFinished()) {
+        }
+
+        const QString cflags = QString::fromUtf8(pkgconfig.readAll());
+
+        int index = 0;
+        while (index != cflags.size()) {
+            const QChar ch = cflags.at(index);
+
+            if (ch.isSpace()) {
+                do { ++index; }
+                while (index < cflags.size() && cflags.at(index).isSpace());
+            }
+
+            else if (ch == QLatin1Char('-') && index + 1 < cflags.size()) {
+                ++index;
+
+                const QChar opt = cflags.at(index);
+
+                if (opt == QLatin1Char('I')) {
+                    // include paths.
+
+                    int start = ++index;
+                    for (; index < cflags.size(); ++index) {
+                        if (cflags.at(index).isSpace())
+                            break;
+                    }
+
+                    qDebug() << "*** add include path:" << cflags.mid(start, index - start);
+                    package.includePaths.append(cflags.mid(start, index - start));
+                }
+            }
+
+            else {
+                for (; index < cflags.size(); ++index) {
+                    if (cflags.at(index).isSpace())
+                        break;
+                }
+            }
+        }
+
+        _packages.append(package);
+    }
+}
+
diff --git a/src/plugins/genericprojectmanager/pkgconfigtool.h b/src/plugins/genericprojectmanager/pkgconfigtool.h
new file mode 100644
index 00000000000..ac97d3e8eb0
--- /dev/null
+++ b/src/plugins/genericprojectmanager/pkgconfigtool.h
@@ -0,0 +1,39 @@
+#ifndef PKGCONFIGTOOL_H
+#define PKGCONFIGTOOL_H
+
+#include <QObject>
+#include <QStringList>
+
+namespace GenericProjectManager {
+namespace Internal {
+
+class PkgConfigTool: public QObject
+{
+    Q_OBJECT
+
+public:
+    struct Package {
+        QString name;
+        QString description;
+        QStringList includePaths;
+        QStringList defines;
+        QStringList undefines;
+    };
+
+public:
+    PkgConfigTool();
+    virtual ~PkgConfigTool();
+
+    QList<Package> packages() const;
+
+private:
+    void packages_helper() const;
+
+private:
+    mutable QList<Package> _packages;
+};
+
+} // end of namespace Internal
+} // end of namespace GenericProjectManager
+
+#endif // PKGCONFIGTOOL_H
-- 
GitLab