forked from qt-creator/qt-creator
Maemo: Qemu improvements.
Get rid of redundancy, add sanity check, better status reporting.
This commit is contained in:
@@ -110,6 +110,10 @@ QemuRuntimeManager::QemuRuntimeManager(QObject *parent)
|
|||||||
SLOT(qemuProcessError(QProcess::ProcessError)));
|
SLOT(qemuProcessError(QProcess::ProcessError)));
|
||||||
connect(m_qemuProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this,
|
connect(m_qemuProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this,
|
||||||
SLOT(qemuProcessFinished()));
|
SLOT(qemuProcessFinished()));
|
||||||
|
connect(m_qemuProcess, SIGNAL(readyReadStandardOutput()), this,
|
||||||
|
SLOT(qemuOutput()));
|
||||||
|
connect(m_qemuProcess, SIGNAL(readyReadStandardError()), this,
|
||||||
|
SLOT(qemuOutput()));
|
||||||
connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)),
|
connect(this, SIGNAL(qemuProcessStatus(QemuStatus, QString)),
|
||||||
this, SLOT(qemuStatusChanged(QemuStatus, QString)));
|
this, SLOT(qemuStatusChanged(QemuStatus, QString)));
|
||||||
}
|
}
|
||||||
@@ -285,7 +289,7 @@ void QemuRuntimeManager::runConfigurationRemoved(ProjectExplorer::RunConfigurati
|
|||||||
void QemuRuntimeManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc)
|
void QemuRuntimeManager::runConfigurationChanged(ProjectExplorer::RunConfiguration *rc)
|
||||||
{
|
{
|
||||||
if (rc)
|
if (rc)
|
||||||
m_qemuAction->setEnabled(targetUsesRuntimeConfig(rc->target()));
|
m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(rc->target()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QemuRuntimeManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc)
|
void QemuRuntimeManager::buildConfigurationAdded(ProjectExplorer::BuildConfiguration *bc)
|
||||||
@@ -321,7 +325,7 @@ void QemuRuntimeManager::environmentChanged()
|
|||||||
|
|
||||||
void QemuRuntimeManager::deviceConfigurationChanged(ProjectExplorer::Target *target)
|
void QemuRuntimeManager::deviceConfigurationChanged(ProjectExplorer::Target *target)
|
||||||
{
|
{
|
||||||
m_qemuAction->setEnabled(targetUsesRuntimeConfig(target));
|
m_qemuAction->setEnabled(targetUsesMatchingRuntimeConfig(target));
|
||||||
}
|
}
|
||||||
|
|
||||||
void QemuRuntimeManager::startRuntime()
|
void QemuRuntimeManager::startRuntime()
|
||||||
@@ -330,38 +334,33 @@ void QemuRuntimeManager::startRuntime()
|
|||||||
Project *p = ProjectExplorerPlugin::instance()->session()->startupProject();
|
Project *p = ProjectExplorerPlugin::instance()->session()->startupProject();
|
||||||
if (!p)
|
if (!p)
|
||||||
return;
|
return;
|
||||||
|
QtVersion *version;
|
||||||
Qt4Target *qt4Target = qobject_cast<Qt4Target*> (p->activeTarget());
|
if (!targetUsesMatchingRuntimeConfig(p->activeTarget(), &version)) {
|
||||||
if (!qt4Target)
|
qWarning("Strange: Qemu button was enabled, but target does not match.");
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Qt4BuildConfiguration *bc = qt4Target->activeBuildConfiguration();
|
m_runningQtId = version->uniqueId();
|
||||||
if (!bc)
|
const QString root
|
||||||
return;
|
= QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
|
||||||
|
|
||||||
QtVersion *version = bc->qtVersion();
|
|
||||||
if (version && m_runtimes.contains(version->uniqueId())) {
|
|
||||||
m_runningQtId = version->uniqueId();
|
|
||||||
const QString root =
|
|
||||||
QDir::toNativeSeparators(maddeRoot(version->qmakeCommand())
|
|
||||||
+ QLatin1Char('/'));
|
+ QLatin1Char('/'));
|
||||||
const Runtime rt = m_runtimes.value(version->uniqueId());
|
const Runtime rt = m_runtimes.value(version->uniqueId());
|
||||||
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
QProcessEnvironment env = QProcessEnvironment::systemEnvironment();
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
const QLatin1Char colon(';');
|
const QLatin1Char colon(';');
|
||||||
const QLatin1String key("PATH");
|
const QLatin1String key("PATH");
|
||||||
env.insert(key, env.value(key) % colon % root % QLatin1String("bin"));
|
env.insert(key, env.value(key) % colon % root % QLatin1String("bin"));
|
||||||
env.insert(key, env.value(key) % colon % root % QLatin1String("madlib"));
|
env.insert(key, env.value(key) % colon % root % QLatin1String("madlib"));
|
||||||
#elif defined(Q_OS_UNIX)
|
#elif defined(Q_OS_UNIX)
|
||||||
const QLatin1String key("LD_LIBRARY_PATH");
|
const QLatin1String key("LD_LIBRARY_PATH");
|
||||||
env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath);
|
env.insert(key, env.value(key) % QLatin1Char(':') % rt.m_libPath);
|
||||||
#endif
|
#endif
|
||||||
m_qemuProcess->setProcessEnvironment(env);
|
m_qemuProcess->setProcessEnvironment(env);
|
||||||
m_qemuProcess->setWorkingDirectory(rt.m_root);
|
m_qemuProcess->setWorkingDirectory(rt.m_root);
|
||||||
|
|
||||||
// This is complex because of extreme MADDE weirdness.
|
// This is complex because of extreme MADDE weirdness.
|
||||||
const bool pathIsRelative = QFileInfo(rt.m_bin).isRelative();
|
const bool pathIsRelative = QFileInfo(rt.m_bin).isRelative();
|
||||||
const QString app =
|
const QString app =
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
root % (pathIsRelative
|
root % (pathIsRelative
|
||||||
? QLatin1String("madlib/") % rt.m_bin // Fremantle.
|
? QLatin1String("madlib/") % rt.m_bin // Fremantle.
|
||||||
@@ -373,15 +372,14 @@ void QemuRuntimeManager::startRuntime()
|
|||||||
: rt.m_bin; // Haramattan.
|
: rt.m_bin; // Haramattan.
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args,
|
m_qemuProcess->start(app % QLatin1Char(' ') % rt.m_args,
|
||||||
QIODevice::ReadWrite);
|
QIODevice::ReadWrite);
|
||||||
if (!m_qemuProcess->waitForStarted())
|
if (!m_qemuProcess->waitForStarted())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
emit qemuProcessStatus(QemuStarting);
|
emit qemuProcessStatus(QemuStarting);
|
||||||
connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime()));
|
connect(m_qemuAction, SIGNAL(triggered()), this, SLOT(terminateRuntime()));
|
||||||
disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime()));
|
disconnect(m_qemuAction, SIGNAL(triggered()), this, SLOT(startRuntime()));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QemuRuntimeManager::terminateRuntime()
|
void QemuRuntimeManager::terminateRuntime()
|
||||||
@@ -401,14 +399,20 @@ void QemuRuntimeManager::qemuProcessFinished()
|
|||||||
{
|
{
|
||||||
m_runningQtId = -1;
|
m_runningQtId = -1;
|
||||||
QemuStatus status = QemuFinished;
|
QemuStatus status = QemuFinished;
|
||||||
|
QString error;
|
||||||
|
|
||||||
if (!m_userTerminated) {
|
if (!m_userTerminated) {
|
||||||
status = m_qemuProcess->exitStatus() == QProcess::CrashExit
|
if (m_qemuProcess->exitStatus() == QProcess::CrashExit) {
|
||||||
? QemuCrashed : QemuFinished;
|
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;
|
m_userTerminated = false;
|
||||||
emit qemuProcessStatus(status);
|
emit qemuProcessStatus(status, error);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QemuRuntimeManager::qemuProcessError(QProcess::ProcessError error)
|
void QemuRuntimeManager::qemuProcessError(QProcess::ProcessError error)
|
||||||
@@ -433,6 +437,7 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
|
|||||||
message = tr("Qemu crashed");
|
message = tr("Qemu crashed");
|
||||||
break;
|
break;
|
||||||
case QemuFinished:
|
case QemuFinished:
|
||||||
|
message = error;
|
||||||
break;
|
break;
|
||||||
case QemuUserReason:
|
case QemuUserReason:
|
||||||
message = error;
|
message = error;
|
||||||
@@ -446,6 +451,12 @@ void QemuRuntimeManager::qemuStatusChanged(QemuStatus status, const QString &err
|
|||||||
updateStarterIcon(running);
|
updateStarterIcon(running);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QemuRuntimeManager::qemuOutput()
|
||||||
|
{
|
||||||
|
qDebug("%s", m_qemuProcess->readAllStandardOutput().data());
|
||||||
|
qDebug("%s", m_qemuProcess->readAllStandardError().data());
|
||||||
|
}
|
||||||
|
|
||||||
// -- private
|
// -- private
|
||||||
|
|
||||||
void QemuRuntimeManager::setupRuntimes()
|
void QemuRuntimeManager::setupRuntimes()
|
||||||
@@ -498,7 +509,7 @@ void QemuRuntimeManager::toggleStarterButton(Target *target)
|
|||||||
isRunning = false;
|
isRunning = false;
|
||||||
|
|
||||||
m_qemuAction->setEnabled(m_runtimes.contains(uniqueId)
|
m_qemuAction->setEnabled(m_runtimes.contains(uniqueId)
|
||||||
&& targetUsesRuntimeConfig(target) && !isRunning);
|
&& targetUsesMatchingRuntimeConfig(target) && !isRunning);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QemuRuntimeManager::sessionHasMaemoTarget() const
|
bool QemuRuntimeManager::sessionHasMaemoTarget() const
|
||||||
@@ -511,7 +522,8 @@ bool QemuRuntimeManager::sessionHasMaemoTarget() const
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QemuRuntimeManager::targetUsesRuntimeConfig(Target *target)
|
bool QemuRuntimeManager::targetUsesMatchingRuntimeConfig(Target *target,
|
||||||
|
QtVersion **qtVersion)
|
||||||
{
|
{
|
||||||
if (!target)
|
if (!target)
|
||||||
return false;
|
return false;
|
||||||
@@ -528,6 +540,8 @@ bool QemuRuntimeManager::targetUsesRuntimeConfig(Target *target)
|
|||||||
if (!version || !m_runtimes.contains(version->uniqueId()))
|
if (!version || !m_runtimes.contains(version->uniqueId()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
if (qtVersion)
|
||||||
|
*qtVersion = version;
|
||||||
const MaemoDeviceConfig &config = mrc->deviceConfig();
|
const MaemoDeviceConfig &config = mrc->deviceConfig();
|
||||||
return config.isValid() && config.type == MaemoDeviceConfig::Simulator;
|
return config.isValid() && config.type == MaemoDeviceConfig::Simulator;
|
||||||
}
|
}
|
||||||
|
@@ -110,6 +110,7 @@ private slots:
|
|||||||
void qemuProcessFinished();
|
void qemuProcessFinished();
|
||||||
void qemuProcessError(QProcess::ProcessError error);
|
void qemuProcessError(QProcess::ProcessError error);
|
||||||
void qemuStatusChanged(QemuStatus status, const QString &error);
|
void qemuStatusChanged(QemuStatus status, const QString &error);
|
||||||
|
void qemuOutput();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void setupRuntimes();
|
void setupRuntimes();
|
||||||
@@ -117,7 +118,8 @@ private:
|
|||||||
|
|
||||||
void updateStarterIcon(bool running);
|
void updateStarterIcon(bool running);
|
||||||
void toggleStarterButton(ProjectExplorer::Target *target);
|
void toggleStarterButton(ProjectExplorer::Target *target);
|
||||||
bool targetUsesRuntimeConfig(ProjectExplorer::Target *target);
|
bool targetUsesMatchingRuntimeConfig(ProjectExplorer::Target *target,
|
||||||
|
QtVersion **qtVersion = 0);
|
||||||
|
|
||||||
QString maddeRoot(const QString &qmake) const;
|
QString maddeRoot(const QString &qmake) const;
|
||||||
QString targetRoot(const QString &qmake) const;
|
QString targetRoot(const QString &qmake) const;
|
||||||
|
Reference in New Issue
Block a user