From cdc54c3be7b906b36fd9ee19cea11ddcba4e688d Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Wed, 10 Jun 2009 18:45:32 +0200
Subject: [PATCH] System includes and defines for gcce tool chain.

---
 .../qt-s60/gccetoolchain.cpp                  | 78 ++++++++++++++++++-
 .../qt4projectmanager/qt-s60/qt-s60-todo.txt  |  5 +-
 2 files changed, 77 insertions(+), 6 deletions(-)

diff --git a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
index 15cf53637c6..dd2704ef8b2 100644
--- a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
@@ -9,6 +9,10 @@
 using namespace ProjectExplorer;
 using namespace Qt4ProjectManager::Internal;
 
+namespace {
+    const char *GCCE_COMMAND = "arm-none-symbianelf-gcc.exe";
+}
+
 GCCEToolChain::GCCEToolChain(S60Devices::Device device)
     : m_deviceId(device.id),
     m_deviceName(device.name),
@@ -24,18 +28,88 @@ ToolChain::ToolChainType GCCEToolChain::type() const
 
 QByteArray GCCEToolChain::predefinedMacros()
 {
-    // TODO
+    if (m_predefinedMacros.isEmpty()) {
+        QStringList arguments;
+        arguments << QLatin1String("-xc++")
+                  << QLatin1String("-E")
+                  << QLatin1String("-dM")
+                  << QLatin1String("-");
+
+        QProcess cpp;
+        ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
+        addToEnvironment(env);
+        cpp.setEnvironment(env.toStringList());
+        cpp.start(QLatin1String(GCCE_COMMAND), arguments);
+        cpp.closeWriteChannel();
+        cpp.waitForFinished();
+        m_predefinedMacros = cpp.readAllStandardOutput();
+    }
     return m_predefinedMacros;
 }
 
 QList<HeaderPath> GCCEToolChain::systemHeaderPaths()
 {
-    // TODO
+    if (m_systemHeaderPaths.isEmpty()) {
+        QStringList arguments;
+        arguments << QLatin1String("-xc++")
+                  << QLatin1String("-E")
+                  << QLatin1String("-v")
+                  << QLatin1String("-");
+
+        QProcess cpp;
+        ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
+        addToEnvironment(env);
+        cpp.setEnvironment(env.toStringList());
+        cpp.setReadChannelMode(QProcess::MergedChannels);
+        cpp.start(QLatin1String(GCCE_COMMAND), arguments);
+        cpp.closeWriteChannel();
+        cpp.waitForFinished();
+
+        QByteArray line;
+        while (cpp.canReadLine()) {
+            line = cpp.readLine();
+            if (line.startsWith("#include"))
+                break;
+        }
+
+        if (! line.isEmpty() && line.startsWith("#include")) {
+            HeaderPath::Kind kind = HeaderPath::UserHeaderPath;
+            while (cpp.canReadLine()) {
+                line = cpp.readLine();
+                if (line.startsWith("#include")) {
+                    kind = HeaderPath::GlobalHeaderPath;
+                } else if (! line.isEmpty() && QChar(line.at(0)).isSpace()) {
+                    HeaderPath::Kind thisHeaderKind = kind;
+
+                    line = line.trimmed();
+                    if (line.endsWith('\n'))
+                        line.chop(1);
+
+                    int index = line.indexOf(" (framework directory)");
+                    if (index != -1) {
+                        line = line.left(index);
+                        thisHeaderKind = HeaderPath::FrameworkHeaderPath;
+                    }
+
+                    m_systemHeaderPaths.append(HeaderPath(QFile::decodeName(line), thisHeaderKind));
+                } else if (line.startsWith("End of search list.")) {
+                    break;
+                } else {
+                    qWarning() << "ignore line:" << line;
+                }
+            }
+        }
+    }
+    m_systemHeaderPaths.append(HeaderPath(QString("%1\\epoc32\\include").arg(m_deviceRoot), HeaderPath::GlobalHeaderPath));
+    m_systemHeaderPaths.append(HeaderPath(QString("%1\\epoc32\\include\\stdapis").arg(m_deviceRoot), HeaderPath::GlobalHeaderPath));
+    m_systemHeaderPaths.append(HeaderPath(QString("%1\\epoc32\\include\\stdapis\\sys").arg(m_deviceRoot), HeaderPath::GlobalHeaderPath));
+    m_systemHeaderPaths.append(HeaderPath(QString("%1\\epoc32\\include\\variant").arg(m_deviceRoot), HeaderPath::GlobalHeaderPath));
     return m_systemHeaderPaths;
 }
 
 void GCCEToolChain::addToEnvironment(ProjectExplorer::Environment &env)
 {
+    // TODO: do we need to set path to gcce?
     env.prependOrSetPath(QString("%1\\epoc32\\tools").arg(m_deviceRoot)); // e.g. make.exe
     env.prependOrSetPath(QString("%1\\epoc32\\gcc\\bin").arg(m_deviceRoot)); // e.g. gcc.exe
     env.set("EPOCDEVICE", QString("%1:%2").arg(m_deviceId, m_deviceName));
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
index c643da4a4f9..60bb6244e7d 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
@@ -19,9 +19,6 @@
     * predefined macros
     * system includes
 
-* GCCE tool chain:
-    * predefined macros
-    * system includes
-
 * Run WINSCW executables
 * Deploy gcce executables
+
-- 
GitLab