diff options
Diffstat (limited to 'src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp')
-rw-r--r-- | src/plugins/qt4projectmanager/qt-maemo/qemuruntimemanager.cpp | 128 |
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 |