diff --git a/src/plugins/qt4projectmanager/debugginghelperbuildtask.cpp b/src/plugins/qt4projectmanager/debugginghelperbuildtask.cpp index eee1e2224d78d57f55f217565b233225bbf5b84a..ebf417a891e161dc28193bd8229098f16c2f7331 100644 --- a/src/plugins/qt4projectmanager/debugginghelperbuildtask.cpp +++ b/src/plugins/qt4projectmanager/debugginghelperbuildtask.cpp @@ -35,6 +35,8 @@ #include "qmlobservertool.h" #include "qmldebugginglibrary.h" #include <qt4projectmanager/baseqtversion.h> +#include <coreplugin/messagemanager.h> +#include <qt4projectmanager/qt4projectmanagerconstants.h> #include <qt4projectmanager/qtversionmanager.h> #include <qt4projectmanager/qt4projectmanagerconstants.h> #include <projectexplorer/toolchainmanager.h> @@ -49,13 +51,21 @@ using namespace Qt4ProjectManager::Internal; using ProjectExplorer::DebuggingHelperLibrary; DebuggingHelperBuildTask::DebuggingHelperBuildTask(const BaseQtVersion *version, Tools tools) : - m_tools(tools & availableTools(version)) + m_tools(tools & availableTools(version)), + m_invalidQt(false), + m_showErrors(true) { if (!version || !version->isValid()) return; // allow type to be used in queued connections. qRegisterMetaType<DebuggingHelperBuildTask::Tools>("DebuggingHelperBuildTask::Tools"); + // Print result in application ouptut + Core::MessageManager *messageManager = Core::MessageManager::instance(); + connect(this, SIGNAL(logOutput(QString,bool)), + messageManager, SLOT(printToOutputPane(QString,bool)), + Qt::QueuedConnection); + // // Extract all information we need from version, such that we don't depend on the existence // of the version pointer while compiling @@ -63,11 +73,13 @@ DebuggingHelperBuildTask::DebuggingHelperBuildTask(const BaseQtVersion *version, m_qtId = version->uniqueId(); m_qtInstallData = version->versionInfo().value("QT_INSTALL_DATA"); if (m_qtInstallData.isEmpty()) { - m_errorMessage + const QString error = QCoreApplication::translate( "QtVersion", "Cannot determine the installation path for Qt version '%1'." ).arg(version->displayName()); + log(QString(), error); + m_invalidQt = true; return; } @@ -77,10 +89,12 @@ DebuggingHelperBuildTask::DebuggingHelperBuildTask(const BaseQtVersion *version, // TODO: the debugging helper doesn't comply to actual tool chain yet QList<ProjectExplorer::ToolChain *> tcList = ProjectExplorer::ToolChainManager::instance()->findToolChains(version->qtAbis().at(0)); if (tcList.isEmpty()) { - m_errorMessage = - QCoreApplication::translate( + const QString error + = QCoreApplication::translate( "QtVersion", "The Qt Version has no tool chain."); + log(QString(), error); + m_invalidQt = true; return; } ProjectExplorer::ToolChain *tc = tcList.at(0); @@ -92,11 +106,6 @@ DebuggingHelperBuildTask::DebuggingHelperBuildTask(const BaseQtVersion *version, m_qmakeCommand = version->qmakeCommand(); m_makeCommand = tc->makeCommand(); m_mkspec = version->mkspec(); - - // Make sure QtVersion cache is invalidated - connect(this, SIGNAL(finished(int,QString,DebuggingHelperBuildTask::Tools)), - QtVersionManager::instance(), SLOT(updateQtVersion(int)), - Qt::QueuedConnection); } DebuggingHelperBuildTask::~DebuggingHelperBuildTask() @@ -125,28 +134,39 @@ DebuggingHelperBuildTask::Tools DebuggingHelperBuildTask::availableTools(const B return tools; } +void DebuggingHelperBuildTask::showOutputOnError(bool show) +{ + m_showErrors = show; +} + void DebuggingHelperBuildTask::run(QFutureInterface<void> &future) { future.setProgressRange(0, 5); future.setProgressValue(1); - QString output; - bool success = false; - if (m_errorMessage.isEmpty()) // might be already set in constructor - success = buildDebuggingHelper(future, &output); + if (!m_invalidQt) + success = buildDebuggingHelper(future); - if (success) { - emit finished(m_qtId, output, m_tools); + if (!success) { + const QString error + = QCoreApplication::translate( + "QtVersion", + "Build failed!"); + log(QString(), error); } else { - qWarning("%s", qPrintable(m_errorMessage)); - emit finished(m_qtId, m_errorMessage, m_tools); + const QString result + = QCoreApplication::translate( + "QtVersion", + "Build succeeded!"); + log(result, QString()); } + emit finished(m_qtId, m_log, m_tools); deleteLater(); } -bool DebuggingHelperBuildTask::buildDebuggingHelper(QFutureInterface<void> &future, QString *output) +bool DebuggingHelperBuildTask::buildDebuggingHelper(QFutureInterface<void> &future) { Utils::BuildableHelperLibrary::BuildHelperArguments arguments; arguments.makeCommand = m_makeCommand; @@ -156,48 +176,87 @@ bool DebuggingHelperBuildTask::buildDebuggingHelper(QFutureInterface<void> &futu arguments.environment = m_environment; if (m_tools & GdbDebugging) { - arguments.directory = DebuggingHelperLibrary::copy(m_qtInstallData, &m_errorMessage); - if (arguments.directory.isEmpty()) - return false; + QString output, error; + bool success = true; - if (!DebuggingHelperLibrary::build(arguments, output, &m_errorMessage)) + arguments.directory = DebuggingHelperLibrary::copy(m_qtInstallData, &error); + if (arguments.directory.isEmpty() + || !DebuggingHelperLibrary::build(arguments, &output, &error)) + success = false; + log(output, error); + if (!success) return false; } future.setProgressValue(2); if (m_tools & QmlDump) { - arguments.directory = QmlDumpTool::copy(m_qtInstallData, &m_errorMessage); - if (arguments.directory.isEmpty()) - return false; - if (!QmlDumpTool::build(arguments, output, &m_errorMessage)) + QString output, error; + bool success = true; + + arguments.directory = QmlDumpTool::copy(m_qtInstallData, &error); + if (arguments.directory.isEmpty() + || !QmlDumpTool::build(arguments, &output, &error)) + success = false; + log(output, error); + if (!success) return false; } future.setProgressValue(3); QString qmlDebuggingDirectory; if (m_tools & QmlDebugging) { - qmlDebuggingDirectory = QmlDebuggingLibrary::copy(m_qtInstallData, &m_errorMessage); - if (qmlDebuggingDirectory.isEmpty()) - return false; + QString output, error; + + qmlDebuggingDirectory = QmlDebuggingLibrary::copy(m_qtInstallData, &error); + + bool success = true; arguments.directory = qmlDebuggingDirectory; arguments.makeArguments += QLatin1String("all"); // build debug and release - if (!QmlDebuggingLibrary::build(arguments, output, &m_errorMessage)) + if (arguments.directory.isEmpty() + || !QmlDebuggingLibrary::build(arguments, &output, &error)) { + success = false; + } + + log(output, error); + if (!success) { return false; + } arguments.makeArguments.clear(); } future.setProgressValue(4); if (m_tools & QmlObserver) { - arguments.directory = QmlObserverTool::copy(m_qtInstallData, &m_errorMessage); - if (arguments.directory.isEmpty()) - return false; + QString output, error; + bool success = true; + arguments.directory = QmlObserverTool::copy(m_qtInstallData, &error); arguments.qmakeArguments << QLatin1String("INCLUDEPATH+=\"\\\"") + qmlDebuggingDirectory + "include\\\"\""; arguments.qmakeArguments << QLatin1String("LIBS+=-L\"\\\"") + qmlDebuggingDirectory + QLatin1String("\\\"\""); - if (!QmlObserverTool::build(arguments, output, &m_errorMessage)) + if (arguments.directory.isEmpty() + || !QmlObserverTool::build(arguments, &output, &error)) { + success = false; + } + log(output, error); + if (!success) { return false; + } } future.setProgressValue(5); return true; } + +void DebuggingHelperBuildTask::log(const QString &output, const QString &error) +{ + if (output.isEmpty() && error.isEmpty()) + return; + + QString logEntry; + if (!output.isEmpty()) + logEntry.append(output); + if (!error.isEmpty()) + logEntry.append(error); + m_log.append(logEntry); + + emit logOutput(logEntry, m_showErrors && !error.isEmpty()); +} diff --git a/src/plugins/qt4projectmanager/debugginghelperbuildtask.h b/src/plugins/qt4projectmanager/debugginghelperbuildtask.h index 2c91adbb8bce4b20cb4108b0a9bfe8ba99351979..5330e1fc81c72af79242cf75df121664e1f7f424 100644 --- a/src/plugins/qt4projectmanager/debugginghelperbuildtask.h +++ b/src/plugins/qt4projectmanager/debugginghelperbuildtask.h @@ -59,15 +59,19 @@ public: explicit DebuggingHelperBuildTask(const BaseQtVersion *version, Tools tools = AllTools); virtual ~DebuggingHelperBuildTask(); + void showOutputOnError(bool show); void run(QFutureInterface<void> &future); static Tools availableTools(const BaseQtVersion *version); signals: + // used internally + void logOutput(const QString &output, bool bringToForeground); void finished(int qtVersionId, const QString &output, DebuggingHelperBuildTask::Tools tools); private: - bool buildDebuggingHelper(QFutureInterface<void> &future, QString *output); + bool buildDebuggingHelper(QFutureInterface<void> &future); + void log(const QString &output, const QString &error); const Tools m_tools; @@ -78,7 +82,9 @@ private: QString m_makeCommand; QString m_mkspec; Utils::Environment m_environment; - QString m_errorMessage; + QString m_log; + bool m_invalidQt; + bool m_showErrors; }; } //namespace Internal diff --git a/src/plugins/qt4projectmanager/qmakestep.cpp b/src/plugins/qt4projectmanager/qmakestep.cpp index e9e1594d576014c0c14fa156318582dba72bffc6..dc8684cdcddd2aa5f57a582095d63290524bd367 100644 --- a/src/plugins/qt4projectmanager/qmakestep.cpp +++ b/src/plugins/qt4projectmanager/qmakestep.cpp @@ -580,6 +580,9 @@ void QMakeStepConfigWidget::buildQmlDebuggingHelper() this, SLOT(debuggingHelperBuildFinished(int,QString)), Qt::QueuedConnection); + // pop up Application Output on error + buildTask->showOutputOnError(true); + QFuture<void> task = QtConcurrent::run(&DebuggingHelperBuildTask::run, buildTask); const QString taskName = tr("Building helpers"); Core::ICore::instance()->progressManager()->addTask(task, taskName, @@ -598,12 +601,6 @@ void QMakeStepConfigWidget::debuggingHelperBuildFinished(int qtVersionId, const updateEffectiveQMakeCall(); updateQmlDebuggingOption(); } - - - Core::MessageManager *messageManager = Core::ICore::instance()->messageManager(); - messageManager->printToOutputPane(output); - if (!version->hasQmlDebuggingLibrary()) - messageManager->showOutputPane(); } void QMakeStepConfigWidget::updateSummaryLabel() diff --git a/src/plugins/qt4projectmanager/qmldumptool.cpp b/src/plugins/qt4projectmanager/qmldumptool.cpp index a2aef68d49eeffea3deb71024376edb49c0769ff..3fe801588a0d78e07beb242874f5c721ea796e5e 100644 --- a/src/plugins/qt4projectmanager/qmldumptool.cpp +++ b/src/plugins/qt4projectmanager/qmldumptool.cpp @@ -72,7 +72,8 @@ public: , m_failed(false) { qmlDumpBuilds()->insert(version->uniqueId(), this); - + // Don't open General Messages pane with errors + m_buildTask->showOutputOnError(false); connect(m_buildTask, SIGNAL(finished(int,QString,DebuggingHelperBuildTask::Tools)), this, SLOT(finish(int,QString,DebuggingHelperBuildTask::Tools)), Qt::QueuedConnection); diff --git a/src/plugins/qt4projectmanager/qtoptionspage.cpp b/src/plugins/qt4projectmanager/qtoptionspage.cpp index c9851631f6a9b3e326167bf425a42dc3a4815068..dcc0f7d9934f4dbee9f748b68bb66570625a6a04 100644 --- a/src/plugins/qt4projectmanager/qtoptionspage.cpp +++ b/src/plugins/qt4projectmanager/qtoptionspage.cpp @@ -326,6 +326,8 @@ void QtOptionsPageWidget::buildDebuggingHelper(DebuggingHelperBuildTask::Tools t // Run a debugging helper build task in the background. DebuggingHelperBuildTask *buildTask = new DebuggingHelperBuildTask(version, tools); + // Don't open General Messages pane with errors + buildTask->showOutputOnError(false); connect(buildTask, SIGNAL(finished(int,QString,DebuggingHelperBuildTask::Tools)), this, SLOT(debuggingHelperBuildFinished(int,QString,DebuggingHelperBuildTask::Tools)), Qt::QueuedConnection);