From 02fb12d74d36187fa1d0f8cca70f7053104a3057 Mon Sep 17 00:00:00 2001
From: con <qtc-committer@nokia.com>
Date: Thu, 28 May 2009 18:36:52 +0200
Subject: [PATCH] Add toolchain for WinScw, and be able to compile for winscw
 udeb.

---
 src/plugins/projectexplorer/toolchain.h       |  3 +
 .../qt4projectmanager/qt-s60/qt-s60-todo.txt  |  8 +++
 .../qt4projectmanager/qt-s60/qt-s60.pri       | 10 +--
 .../qt4projectmanager/qt-s60/s60devices.cpp   | 17 ++++-
 .../qt4projectmanager/qt-s60/s60devices.h     |  3 +-
 .../qt4projectmanager/qt-s60/s60manager.cpp   | 13 +++-
 .../qt4projectmanager/qt-s60/s60manager.h     | 12 +++-
 .../qt-s60/winscwtoolchain.cpp                | 69 +++++++++++++++++++
 .../qt-s60/winscwtoolchain.h                  | 36 ++++++++++
 .../qt4projectmanager/qtversionmanager.cpp    | 10 +++
 10 files changed, 170 insertions(+), 11 deletions(-)
 create mode 100644 src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.cpp
 create mode 100644 src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.h

diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h
index 8c0b022fffd..89993d821d9 100644
--- a/src/plugins/projectexplorer/toolchain.h
+++ b/src/plugins/projectexplorer/toolchain.h
@@ -73,6 +73,9 @@ public:
         MinGW,
         MSVC,
         WINCE,
+#ifdef QTCREATOR_WITH_S60
+        WINSCW,
+#endif
         OTHER,
         UNKNOWN,
         INVALID
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
index 9db7c47f8b9..ee6481c0664 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60-todo.txt
@@ -1,3 +1,11 @@
 * When the refresh button in the SDK option page is pressed
   the qtoptionspage is not updated to reflect the new versions
   though we update them in S60Manager
+
+* QtVersion:
+    * support the different tool chains
+
+* WINSCW tool chain:
+    * predefined macros
+    * system includes
+    * get rid of hardcoded carbide path
diff --git a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
index 796ef759da3..e6a7fcd181f 100644
--- a/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
+++ b/src/plugins/qt4projectmanager/qt-s60/qt-s60.pri
@@ -2,14 +2,14 @@ SUPPORT_QT_S60 = $$(QTCREATOR_WITH_S60)
 !isEmpty(SUPPORT_QT_S60) {
     message("Adding experimental support for Qt/S60 applications.")
     DEFINES += QTCREATOR_WITH_S60
-
     SOURCES += $$PWD/s60devices.cpp \
         $$PWD/s60devicespreferencepane.cpp \
-        $$PWD/s60manager.cpp
-
+        $$PWD/s60manager.cpp \
+        $$PWD/winscwtoolchain.cpp
     HEADERS += $$PWD/s60devices.h \
         $$PWD/s60devicespreferencepane.h \
-        $$PWD/s60manager.h
-
+        $$PWD/s60manager.h \
+        $$PWD/winscwtoolchain.h
+    FORMS += $$PWD/s60devicespreferencepane.ui
     OTHER_FILES += qt-s60-todo.txt
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
index 98be1f68b6a..853e987f467 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devices.cpp
@@ -129,12 +129,25 @@ QList<S60Devices::Device> S60Devices::devices() const
     return m_devices;
 }
 
-S60Devices::Device S60Devices::deviceForRoot(const QString &epocRoot) const
+S60Devices::Device S60Devices::deviceForId(const QString &id) const
 {
     foreach (const S60Devices::Device &i, m_devices) {
-        if (i.epocRoot == epocRoot) {
+        if (i.id == id) {
             return i;
         }
     }
     return Device();
 }
+
+QString S60Devices::cleanedRootPath(const QString &deviceRoot)
+{
+    QString path = deviceRoot;
+    if (path.size() > 1 && path[1] == QChar(':')) {
+        path = path.mid(2);
+    }
+
+    if (!path.size() || path[path.size()-1] != QChar('\\')) {
+        path += QChar('\\');
+    }
+    return path;
+}
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60devices.h b/src/plugins/qt4projectmanager/qt-s60/s60devices.h
index ae991b4e845..8f4cd2a02a8 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60devices.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60devices.h
@@ -26,8 +26,9 @@ public:
     QString errorString() const;
     QList<Device> devices() const;
     bool detectQtForDevices();
-    Device deviceForRoot(const QString &epocRoot) const;
+    Device deviceForId(const QString &id) const;
 
+    static QString cleanedRootPath(const QString &deviceRoot);
 signals:
     void qtVersionsChanged();
 
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
index f58d69b6f60..283bb76a519 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
@@ -31,21 +31,26 @@
 
 #include "s60devices.h"
 #include "s60devicespreferencepane.h"
-#include "qtversionmanager.h"
+#include "winscwtoolchain.h"
 
 #include <extensionsystem/pluginmanager.h>
 
 using namespace Qt4ProjectManager::Internal;
 
+S60Manager *S60Manager::m_instance = 0;
+
 namespace {
 static const char *S60_AUTODETECTION_SOURCE = "QTS60";
 }
 
+S60Manager *S60Manager::instance() { return m_instance; }
+
 S60Manager::S60Manager(QObject *parent)
         : QObject(parent),
         m_devices(new S60Devices(this)),
         m_devicesPreferencePane(new S60DevicesPreferencePane(m_devices, this))
 {
+    m_instance = this;
     m_devices->detectQtForDevices();
     ExtensionSystem::PluginManager::instance()
             ->addObject(m_devicesPreferencePane);
@@ -105,3 +110,9 @@ void S60Manager::updateQtVersions()
         versionManager->addVersion(version);
     }
 }
+
+ProjectExplorer::ToolChain *S60Manager::createWINSCWToolChain(const Qt4ProjectManager::QtVersion *version) const
+{
+    QString id = version->autodetectionSource().mid(QString(S60_AUTODETECTION_SOURCE).length()+1);
+    return new WINSCWToolChain(m_devices->deviceForId(id));
+}
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.h b/src/plugins/qt4projectmanager/qt-s60/s60manager.h
index c9b4f758846..9e0ca37823b 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.h
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.h
@@ -30,11 +30,15 @@
 #ifndef S60MANAGER_H
 #define S60MANAGER_H
 
+#include "qtversionmanager.h"
+
 #include <extensionsystem/iplugin.h>
+#include <projectexplorer/toolchain.h>
 
 #include <QtCore/QObject>
 
 namespace Qt4ProjectManager {
+
 namespace Internal {
 
 class S60Devices;
@@ -46,16 +50,20 @@ class S60Manager : public QObject
 public:
     S60Manager(QObject *parent = 0);
     ~S60Manager();
+    static S60Manager *instance();
+
+    ProjectExplorer::ToolChain *createWINSCWToolChain(const Qt4ProjectManager::QtVersion *version) const;
 
 private slots:
     void updateQtVersions();
 
 private:
+    static S60Manager *m_instance;
     S60Devices *m_devices;
     S60DevicesPreferencePane *m_devicesPreferencePane;
 };
 
-#endif // S60MANAGER_H
-
 } // namespace Internal
 } // namespace Qt4ProjectManager
+
+#endif // S60MANAGER_H
diff --git a/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.cpp b/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.cpp
new file mode 100644
index 00000000000..b0bad58ac5f
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.cpp
@@ -0,0 +1,69 @@
+#include "winscwtoolchain.h"
+
+using namespace ProjectExplorer;
+using namespace Qt4ProjectManager::Internal;
+
+WINSCWToolChain::WINSCWToolChain(S60Devices::Device device)
+        // TODO get rid of hardcoded carbide path
+    : m_carbidePath(QLatin1String("C:\\Apps\\Nokia\\Carbide.c++ v2.0")),
+    m_deviceId(device.id),
+    m_deviceName(device.name),
+    m_deviceRoot(device.epocRoot)
+{
+
+}
+
+ToolChain::ToolChainType WINSCWToolChain::type() const
+{
+    return ToolChain::WINSCW;
+}
+
+QByteArray WINSCWToolChain::predefinedMacros()
+{
+    // TODO
+    return m_predefinedMacros;
+}
+
+QList<HeaderPath> WINSCWToolChain::systemHeaderPaths()
+{
+    // TODO
+    return m_systemHeaderPaths;
+}
+
+void WINSCWToolChain::addToEnvironment(ProjectExplorer::Environment &env)
+{
+    QStringList symIncludes = QStringList()
+        << "\\MSL\\MSL_C\\MSL_Common\\Include"
+        << "\\MSL\\MSL_C\\MSL_Win32\\Include"
+        << "\\MSL\\MSL_CMSL_X86"
+        << "\\MSL\\MSL_C++\\MSL_Common\\Include"
+        << "\\MSL\\MSL_Extras\\MSL_Common\\Include"
+        << "\\MSL\\MSL_Extras\\MSL_Win32\\Include"
+        << "\\Win32-x86 Support\\Headers\\Win32 SDK";
+    for (int i = 0; i < symIncludes.size(); ++i)
+        symIncludes[i].prepend(QString("%1\\x86Build\\Symbian_Support").arg(m_carbidePath));
+    env.set("MWCSYM2INCLUDES", symIncludes.join(";"));
+    QStringList symLibraries = QStringList()
+        << "\\Win32-x86 Support\\Libraries\\Win32 SDK"
+        << "\\Runtime\\Runtime_x86\\Runtime_Win32\\Libs";
+    for (int i = 0; i < symLibraries.size(); ++i)
+        symLibraries[i].prepend(QString("%1\\x86Build\\Symbian_Support").arg(m_carbidePath));
+    env.set("MWSYM2LIBRARIES", symLibraries.join(";"));
+    env.set("MWSYM2LIBRARYFILES", "MSL_All_MSE_Symbian_D.lib;gdi32.lib;user32.lib;kernel32.lib");
+    env.prependOrSetPath(QString("%1\\x86Build\\Symbian_Tools\\Command_Line_Tools").arg(m_carbidePath)); // compiler
+    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));
+    env.set("EPOCROOT", S60Devices::cleanedRootPath(m_deviceRoot));
+}
+
+QString WINSCWToolChain::makeCommand() const
+{
+    return "make";
+}
+
+bool WINSCWToolChain::equals(ToolChain *other) const
+{
+    return (m_deviceId == static_cast<WINSCWToolChain *>(other)->m_deviceId
+            && m_deviceName == static_cast<WINSCWToolChain *>(other)->m_deviceName);
+}
diff --git a/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.h b/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.h
new file mode 100644
index 00000000000..84f4ab9d722
--- /dev/null
+++ b/src/plugins/qt4projectmanager/qt-s60/winscwtoolchain.h
@@ -0,0 +1,36 @@
+#ifndef WINSCWTOOLCHAIN_H
+#define WINSCWTOOLCHAIN_H
+
+#include "s60devices.h"
+
+#include <projectexplorer/toolchain.h>
+
+namespace Qt4ProjectManager {
+namespace Internal {
+
+class WINSCWToolChain : public ProjectExplorer::ToolChain
+{
+public:
+    WINSCWToolChain(S60Devices::Device device);
+    QByteArray predefinedMacros();
+    QList<ProjectExplorer::HeaderPath> systemHeaderPaths();
+    void addToEnvironment(ProjectExplorer::Environment &env);
+    ProjectExplorer::ToolChain::ToolChainType type() const;
+    QString makeCommand() const;
+
+protected:
+    bool equals(ToolChain *other) const;
+
+private:
+    QString m_carbidePath;
+    QString m_deviceId;
+    QString m_deviceName;
+    QString m_deviceRoot;
+    QByteArray m_predefinedMacros;
+    QList<ProjectExplorer::HeaderPath> m_systemHeaderPaths;
+};
+
+} // namespace Internal
+} // namespace Qt4ProjectManager
+
+#endif // WINSCWTOOLCHAIN_H
diff --git a/src/plugins/qt4projectmanager/qtversionmanager.cpp b/src/plugins/qt4projectmanager/qtversionmanager.cpp
index 75199be531a..9f2ec031ab7 100644
--- a/src/plugins/qt4projectmanager/qtversionmanager.cpp
+++ b/src/plugins/qt4projectmanager/qtversionmanager.cpp
@@ -32,6 +32,10 @@
 #include "qt4projectmanagerconstants.h"
 #include "profilereader.h"
 
+#ifdef QTCREATOR_WITH_S60
+#include "qt-s60/s60manager.h"
+#endif
+
 #include <projectexplorer/debugginghelper.h>
 #include <projectexplorer/projectexplorer.h>
 #include <projectexplorer/cesdkhandler.h>
@@ -913,6 +917,10 @@ void QtVersion::updateToolChain() const
         }
         m_test = ProjectExplorer::ToolChain::createGccToolChain(qmake_cxx);
         //qDebug()<<"GCC ToolChain ("<<qmake_cxx<<")";
+#ifdef QTCREATOR_WITH_S60
+    } else if (t == ProjectExplorer::ToolChain::WINSCW) {
+        m_test = S60Manager::instance()->createWINSCWToolChain(this);
+#endif
     } else {
         qDebug()<<"Could not detect ToolChain for"<<mkspec();
         qDebug()<<"Qt Creator doesn't know about the system includes, nor the systems defines.";
@@ -1007,6 +1015,8 @@ ProjectExplorer::ToolChain::ToolChainType QtVersion::toolchainType() const
         return ProjectExplorer::ToolChain::WINCE;
     else if (spec.contains("linux-icc"))
         return ProjectExplorer::ToolChain::LinuxICC;
+    else if (spec.contains("abld"))
+        return ProjectExplorer::ToolChain::WINSCW;
     else
         return ProjectExplorer::ToolChain::GCC;
 }
-- 
GitLab