From cd53a562e89d6620013181c03429c6a7755c029a Mon Sep 17 00:00:00 2001
From: Friedemann Kleint <Friedemann.Kleint@nokia.com>
Date: Thu, 18 Feb 2010 10:22:50 +0100
Subject: [PATCH] Symbian: Check for /dev/ttyUSB, fix GCCE toolchain.

Move code to locate gcce from S60Manager to CCE toolchain and make it
handle empty GCCE-root's correctly (locate compiler in path and
warn if none found). Set up environment correctly.
---
 src/plugins/projectexplorer/toolchain.h       |  1 +
 .../qt-s60/gccetoolchain.cpp                  | 47 +++++++++++++++++--
 .../qt4projectmanager/qt-s60/gccetoolchain.h  |  8 +++-
 .../qt4projectmanager/qt-s60/s60manager.cpp   | 10 ++--
 .../symbianutils/symbiandevicemanager.cpp     | 14 +++++-
 5 files changed, 64 insertions(+), 16 deletions(-)

diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h
index ced91fc0685..e14f39ea77d 100644
--- a/src/plugins/projectexplorer/toolchain.h
+++ b/src/plugins/projectexplorer/toolchain.h
@@ -133,6 +133,7 @@ protected:
     virtual bool equals(ToolChain *other) const;
     QByteArray m_predefinedMacros;
     QList<HeaderPath> m_systemHeaderPaths;
+    QString gcc() const { return m_gcc; }
 
 private:
     QString m_gcc;
diff --git a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
index e665beed1c0..49cd22a82d1 100644
--- a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.cpp
@@ -40,17 +40,49 @@ enum { debug = 0 };
 using namespace ProjectExplorer;
 using namespace Qt4ProjectManager::Internal;
 
+// Locate the compiler via path.
+static QString gcceCommand(const QString &dir)
+{
+    ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
+    if (!dir.isEmpty())
+        env.prependOrSetPath(dir + QLatin1String("/bin"));
+    QString gcce = QLatin1String("arm-none-symbianelf-gcc");
+#ifdef Q_OS_WIN
+    gcce += QLatin1String(".exe");
+#endif
+    const QString rc = env.searchInPath(gcce);
+    if (rc.isEmpty()) {
+        const QString msg = QString::fromLatin1("GCCEToolChain: Unable to locate '%1' in '%2' (GCCE root: '%3')")
+                            .arg(gcce, env.value(QLatin1String("PATH")), dir);
+        qWarning("%s", qPrintable(msg));
+        return gcce;
+    }
+    return rc;
+}
+
+// The GccToolChain base class constructor wants to know the gcc command
+GCCEToolChain *GCCEToolChain::create(const S60Devices::Device &device,
+                                     const QString &gcceRoot,
+                                     ProjectExplorer::ToolChain::ToolChainType type)
+{
+    const QString gccCommand = gcceCommand(gcceRoot);
+    const QFileInfo gccCommandFi(gccCommand);
+    const QString binPath = gccCommandFi.isRelative() ? QString() : gccCommandFi.absolutePath();
+    return new GCCEToolChain(device, binPath, gccCommand, type);
+}
+
 GCCEToolChain::GCCEToolChain(const S60Devices::Device &device,
+                             const QString &gcceBinPath,
                              const QString &gcceCommand,
                              ProjectExplorer::ToolChain::ToolChainType type) :
     GccToolChain(gcceCommand),
     m_mixin(device),
     m_type(type),
-    m_gcceCommand(gcceCommand)
+    m_gcceBinPath(gcceBinPath)
 {
     QTC_ASSERT(m_type == ProjectExplorer::ToolChain::GCCE || m_type == ProjectExplorer::ToolChain::GCCE_GNUPOC, return)
     if (debug)
-        qDebug() << "GCCEToolChain on" << m_type << m_mixin.device();
+        qDebug() << "GCCEToolChain on" << m_type << gcceCommand << gcceBinPath << m_mixin.device();
 }
 
 ToolChain::ToolChainType GCCEToolChain::type() const
@@ -89,14 +121,18 @@ QList<HeaderPath> GCCEToolChain::systemHeaderPaths()
 
 void GCCEToolChain::addToEnvironment(ProjectExplorer::Environment &env)
 {
+    if (debug)
+        qDebug() << "GCCEToolChain::addToEnvironment" << m_type << gcc() << m_gcceBinPath<< m_mixin.device();
+
+    if (!m_gcceBinPath.isEmpty())
+        env.prependOrSetPath(m_gcceBinPath);
     switch (m_type) {
     case ProjectExplorer::ToolChain::GCCE:
         m_mixin.addEpocToEnvironment(&env);
-        env.prependOrSetPath(QFileInfo(m_gcceCommand).absolutePath());
     case ProjectExplorer::ToolChain::GCCE_GNUPOC:
+        m_mixin.addGnuPocToEnvironment(&env);
         break;
     default:
-        m_mixin.addGnuPocToEnvironment(&env);
         break;
     }
 }
@@ -112,5 +148,6 @@ bool GCCEToolChain::equals(ToolChain *otherIn) const
                 return false;
     const GCCEToolChain *other = static_cast<const GCCEToolChain *>(otherIn);
     return m_mixin == other->m_mixin
-           && m_gcceCommand == other->m_gcceCommand;
+           && m_gcceBinPath == other->m_gcceBinPath
+           && gcc() == other->gcc();
 }
diff --git a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.h b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.h
index b38e6d1120e..2dc5729020b 100644
--- a/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.h
+++ b/src/plugins/qt4projectmanager/qt-s60/gccetoolchain.h
@@ -39,10 +39,14 @@ namespace Internal {
 
 class GCCEToolChain : public ProjectExplorer::GccToolChain
 {
-public:
     explicit GCCEToolChain(const S60Devices::Device &device,
+                           const QString &gcceBinPath,
                            const QString &gcceCommand,
                            ProjectExplorer::ToolChain::ToolChainType type);
+public:
+    static GCCEToolChain *create(const S60Devices::Device &device,
+                                 const QString &gcceRoot,
+                                 ProjectExplorer::ToolChain::ToolChainType type);
 
     QByteArray predefinedMacros();
     virtual QList<ProjectExplorer::HeaderPath> systemHeaderPaths();
@@ -56,7 +60,7 @@ protected:
 private:
     const S60ToolChainMixin m_mixin;
     const ProjectExplorer::ToolChain::ToolChainType m_type;
-    const QString m_gcceCommand;
+    const QString m_gcceBinPath;
 };
 
 } // namespace Internal
diff --git a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
index 1eb4f43a7de..3a1c86dff0a 100644
--- a/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
+++ b/src/plugins/qt4projectmanager/qt-s60/s60manager.cpp
@@ -47,8 +47,7 @@
 #include <QtGui/QMainWindow>
 
 namespace {
-    const char *GCCE_COMMAND = "arm-none-symbianelf-gcc.exe";
-    const char *S60_AUTODETECTION_SOURCE = "QTS60";
+    const char S60_AUTODETECTION_SOURCE[] = "QTS60";
 }
 
 namespace Qt4ProjectManager {
@@ -220,16 +219,13 @@ ProjectExplorer::ToolChain *S60Manager::createWINSCWToolChain(const Qt4ProjectMa
 ProjectExplorer::ToolChain *S60Manager::createGCCEToolChain(const Qt4ProjectManager::QtVersion *version) const
 {
     Q_ASSERT(version);
-    ProjectExplorer::Environment env = ProjectExplorer::Environment::systemEnvironment();
-    env.prependOrSetPath(version->gcceDirectory()+"/bin");
-    QString gcceCommandPath= env.searchInPath(GCCE_COMMAND);
-    return new GCCEToolChain(deviceForQtVersion(version), gcceCommandPath, ProjectExplorer::ToolChain::GCCE);
+    return GCCEToolChain::create(deviceForQtVersion(version), version->gcceDirectory(), ProjectExplorer::ToolChain::GCCE);
 }
 
 ProjectExplorer::ToolChain *S60Manager::createGCCE_GnuPocToolChain(const Qt4ProjectManager::QtVersion *version) const
 {
     Q_ASSERT(version);
-    return new GCCEToolChain(deviceForQtVersion(version), QLatin1String("arm-none-symbianelf-g++"), ProjectExplorer::ToolChain::GCCE_GNUPOC);
+    return GCCEToolChain::create(deviceForQtVersion(version), version->gcceDirectory(), ProjectExplorer::ToolChain::GCCE_GNUPOC);
 }
 
 ProjectExplorer::ToolChain *S60Manager::createRVCTToolChain(
diff --git a/src/shared/symbianutils/symbiandevicemanager.cpp b/src/shared/symbianutils/symbiandevicemanager.cpp
index 6d6d7cef304..82965141a1d 100644
--- a/src/shared/symbianutils/symbiandevicemanager.cpp
+++ b/src/shared/symbianutils/symbiandevicemanager.cpp
@@ -431,16 +431,26 @@ SymbianDeviceManager::SymbianDeviceList SymbianDeviceManager::blueToothDevices()
     // Bluetooth devices are created on connection. List the existing ones
     // or at least the first one.
     const QString prefix = QLatin1String(linuxBlueToothDeviceRootC);
-    const QString friendlyFormat = QLatin1String("Bluetooth device (%1)");
+    const QString blueToothfriendlyFormat = QLatin1String("Bluetooth device (%1)");
     for (int d = 0; d < 4; d++) {
         QScopedPointer<SymbianDeviceData> device(new SymbianDeviceData);
         device->type = BlueToothCommunication;
         device->portName = prefix + QString::number(d);
         if (d == 0 || QFileInfo(device->portName).exists()) {
-            device->friendlyName = friendlyFormat.arg(device->portName);
+            device->friendlyName = blueToothfriendlyFormat.arg(device->portName);
             rc.push_back(SymbianDevice(device.take()));
         }
     }
+    // New kernel versions support /dev/ttyUSB0, /dev/ttyUSB1. Trk responds
+    // on the latter (usually).
+    const QString ttyUSBDevice = QLatin1String("/dev/ttyUSB1");
+    if (QFileInfo(ttyUSBDevice).exists()) {
+        SymbianDeviceData *device = new SymbianDeviceData;
+        device->type = SerialPortCommunication;
+        device->portName = ttyUSBDevice;
+        device->friendlyName = QString::fromLatin1("USB/Serial device (%1)").arg(device->portName);
+        rc.push_back(SymbianDevice(device));
+    }
 #endif
     return rc;
 }
-- 
GitLab