summaryrefslogtreecommitdiff
path: root/src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp')
-rw-r--r--src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp128
1 files changed, 79 insertions, 49 deletions
diff --git a/src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp b/src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp
index b08172cac6..d33e39b162 100644
--- a/src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp
+++ b/src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp
@@ -110,6 +110,10 @@ QemuRuntimeManager::QemuRuntimeManager(QObject *parent)
SLOT(qemuProcessError(QProcess::ProcessError)));
connect(m_qemuProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this,
SLOT(qemuProcessFinished()));
+ connect(m_qemuProcess, SIGNAL(readyReadStandardOutput()), this,
+ SLOT(qemuOutput()));
+ connect(m_qemuProcess, SIGNAL(readyReadStandardError()), this,
+ SLOT(qemuOutput()));
connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)),
this, SLOT(qemuStatusChanged(QemuStatus, QString)));
}
@@ -285,7 +289,7 @@ void QemuRuntimeManager::runConfigurationRemoved(ProjectExplorer::RunConfigurati
void QemuRuntimeManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc)
{
if (rc)
- m_qemuAction->setEnabled(targetUsesRuntimeConfig(rc->target()));
+ m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(rc->target()));
}
void QemuRuntimeManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc)
@@ -321,7 +325,7 @@ void QemuRuntimeManager::environmentChanged()
void QemuRuntimeManager::deviceConfigurationChanged(ProjectExplorer::Target *target)
{
- m_qemuAction->setEnabled(targetUsesRuntimeConfig(target));
+ m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(target));
}
void QemuRuntimeManager::startRuntime()
@@ -330,52 +334,56 @@ void QemuRuntimeManager::startRuntime()
Project *p = ProjectExplorerPlugin::instance()->session()->startupProject();
if (!p)
return;
-
- Qt4Target *qt4Target = qobject_cast<Qt4Target*> (p->activeTarget());
- if (!qt4Target)
- return;
-
- Qt4BuildConfiguration *bc = qt4Target->activeBuildConfiguration();
- if (!bc)
+ QtVersion *version;
+ if (!targetUsesMatchingRuntimeConfig(p->activeTarget(), &version)) {
+ qWarning("Strange: Qemu button was enabled, but target does not match.");
return;
+ }
- QtVersion *version = bc->qtVersion();
- if (version && m_runtimes.contains(version->uniqueId())) {
- m_runningQtId = version->uniqueId();
- const QString root =
- QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
+ m_runningQtId = version->uniqueId();
+ const QString root
+ = QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
+ QLatin1Char('/'));
- const Runtime rt = m_runtimes.value(version->uniqueId());
- QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
+ const Runtime rt = m_runtimes.value(version->uniqueId());
+ QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
#ifdef Q_OS_WIN
- const QLatin1Char colon(';');
- const QLatin1String key("PATH");
- env.insert(key, env.value(key) % colon % root % QLatin1String("bin"));
- env.insert(key, env.value(key) % colon % root % QLatin1String("madlib"));
+ const QLatin1Char colon(';');
+ const QLatin1String key("PATH");
+ env.insert(key, env.value(key) % colon % root % QLatin1String("bin"));
+ env.insert(key, env.value(key) % colon % root % QLatin1String("madlib"));
#elif defined(Q_OS_UNIX)
- const QLatin1String key("LD_LIBRARY_PATH");
- env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath);
-#endif
- m_qemuProcess->setProcessEnvironment(env);
- m_qemuProcess->setWorkingDirectory(rt.m_root);
-
- const QString app = root + (QFileInfo(rt.m_bin).isRelative()
+# if defined(Q_OS_MAC)
+ const QLatin1String key("DYLD_LIBRARY_PATH");
+# else
+ const QLatin1String key("LD_LIBRARY_PATH");
+# endif // MAC
+ env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath);
+#endif // WIN/UNIX
+ m_qemuProcess->setProcessEnvironment(env);
+ m_qemuProcess->setWorkingDirectory(rt.m_root);
+
+ // This is complex because of extreme MADDE weirdness.
+ const bool pathIsRelative = QFileInfo(rt.m_bin).isRelative();
+ const QString app =
+#ifdef Q_OS_WIN
+ root % (pathIsRelative
? QLatin1String("madlib/") % rt.m_bin // Fremantle.
: rt.m_bin) // Haramattan.
-#ifdef Q_OS_WIN
- % QLatin1String(".exe")
+ % QLatin1String(".exe");
+#else
+ pathIsRelative
+ ? root % QLatin1String("madlib/") % rt.m_bin // Fremantle.
+ : rt.m_bin; // Haramattan.
#endif
- ; // keep
- m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args,
- QIODevice::ReadWrite);
- if (!m_qemuProcess->waitForStarted())
- return;
+ m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args,
+ QIODevice::ReadWrite);
+ if (!m_qemuProcess->waitForStarted())
+ return;
- emit qemuProcessStatus(QemuStarting);
- connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime()));
- disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime()));
- }
+ emit qemuProcessStatus(QemuStarting);
+ connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime()));
+ disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime()));
}
void QemuRuntimeManager::terminateRuntime()
@@ -395,14 +403,20 @@ void QemuRuntimeManager::qemuProcessFinished()
{
m_runningQtId = -1;
QemuStatus status = QemuFinished;
+ QString error;
if (!m_userTerminated) {
- status = m_qemuProcess->exitStatus() == QProcess::CrashExit
- ? QemuCrashed : QemuFinished;
+ if (m_qemuProcess->exitStatus() == QProcess::CrashExit) {
+ status = QemuCrashed;
+ error = m_qemuProcess->errorString();
+ } else if (m_qemuProcess->exitCode() != 0) {
+ error = tr("Qemu finished with error: Exit code was %1.")
+ .arg(m_qemuProcess->exitCode());
+ }
}
m_userTerminated = false;
- emit qemuProcessStatus(status);
+ emit qemuProcessStatus(status, error);
}
void QemuRuntimeManager::qemuProcessError(QProcess::ProcessError error)
@@ -427,6 +441,7 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
message = tr("Qemu crashed");
break;
case QemuFinished:
+ message = error;
break;
case QemuUserReason:
message = error;
@@ -440,6 +455,12 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
updateStarterIcon(running);
}
+void QemuRuntimeManager::qemuOutput()
+{
+ qDebug("%s", m_qemuProcess->readAllStandardOutput().data());
+ qDebug("%s", m_qemuProcess->readAllStandardError().data());
+}
+
// -- private
void QemuRuntimeManager::setupRuntimes()
@@ -492,7 +513,7 @@ void QemuRuntimeManager::toggleStarterButton(Target *target)
isRunning = false;
m_qemuAction->setEnabled(m_runtimes.contains(uniqueId)
- && targetUsesRuntimeConfig(target) && !isRunning);
+ && targetUsesMatchingRuntimeConfig(target) && !isRunning);
}
bool QemuRuntimeManager::sessionHasMaemoTarget() const
@@ -505,19 +526,28 @@ bool QemuRuntimeManager::sessionHasMaemoTarget() const
return result;
}
-bool QemuRuntimeManager::targetUsesRuntimeConfig(Target *target)
+bool QemuRuntimeManager::targetUsesMatchingRuntimeConfig(Target *target,
+ QtVersion **qtVersion)
{
if (!target)
return false;
MaemoRunConfiguration *mrc =
qobject_cast<MaemoRunConfiguration *> (target->activeRunConfiguration());
- if (mrc) {
- const MaemoDeviceConfig &config = mrc->deviceConfig();
- if (config.isValid() && config.type == MaemoDeviceConfig::Simulator)
- return true;
- }
- return false;
+ if (!mrc)
+ return false;
+ Qt4BuildConfiguration *bc
+ = qobject_cast<Qt4BuildConfiguration *>(target->activeBuildConfiguration());
+ if (!bc)
+ return false;
+ QtVersion *version = bc->qtVersion();
+ if (!version || !m_runtimes.contains(version->uniqueId()))
+ return false;
+
+ if (qtVersion)
+ *qtVersion = version;
+ const MaemoDeviceConfig &config = mrc->deviceConfig();
+ return config.isValid() && config.type == MaemoDeviceConfig::Simulator;
}
QString QemuRuntimeManager::maddeRoot(const QString &qmake) const