Commit f5909abe authored by Friedemann Kleint's avatar Friedemann Kleint

Debugging helpers: Fix building

- Report errors correctly.
- Do not pass empty target argument to qmake
- Give 'make' a longer timeout and change timeout checking to
  trigger after last output line was obtained from process
- Make build log dialog non-modal and ensure it pops up on failure
  even if a different Qt version was selected in-between
- Disable Rebuild-button while build is running.
Reviewed-by: default avatarKai Köhne <kai.koehne@nokia.com>
Reviewed-by: default avatarLasse Holmstedt <lasse.holmstedt@nokia.com>
parent f6a1e3b3
......@@ -171,12 +171,79 @@ bool BuildableHelperLibrary::copyFiles(const QString &sourcePath,
return true;
}
QString BuildableHelperLibrary::buildHelper(const QString &helperName, const QString &proFilename,
const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode)
// Helper: Run a build process with merged stdout/stderr
static inline bool runBuildProcessI(QProcess &proc,
const QString &binary,
const QStringList &args,
int timeoutMS,
bool ignoreNonNullExitCode,
QString *output, QString *errorMessage)
{
proc.start(binary, args);
if (!proc.waitForStarted()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Cannot start process: %1").
arg(proc.errorString());
return false;
}
// Read stdout/err and check for timeouts
QByteArray stdOut;
QByteArray stdErr;
if (!SynchronousProcess::readDataFromProcess(proc, timeoutMS, &stdOut, &stdErr, false)) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Timeout after %1s.").
arg(timeoutMS / 1000);
SynchronousProcess::stopProcess(proc);
return false;
}
if (proc.exitStatus() != QProcess::NormalExit) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"The process crashed.");
return false;
}
const QString stdOutS = QString::fromLocal8Bit(stdOut);
if (!ignoreNonNullExitCode && proc.exitCode() != 0) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"The process returned exit code %1:\n%2").
arg(proc.exitCode()).arg(stdOutS);
return false;
}
output->append(stdOutS);
return true;
}
// Run a build process with merged stdout/stderr and qWarn about errors.
static bool runBuildProcess(QProcess &proc,
const QString &binary,
const QStringList &args,
int timeoutMS,
bool ignoreNonNullExitCode,
QString *output, QString *errorMessage)
{
const bool rc = runBuildProcessI(proc, binary, args, timeoutMS, ignoreNonNullExitCode, output, errorMessage);
if (!rc) {
// Fail - reformat error.
QString cmd = binary;
if (!args.isEmpty()) {
cmd += QLatin1Char(' ');
cmd += args.join(QString(QLatin1Char(' ')));
}
*errorMessage =
QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Error running '%1' in %2: %3").
arg(cmd, proc.workingDirectory(), *errorMessage);
qWarning("%s", qPrintable(*errorMessage));
}
return rc;
}
bool BuildableHelperLibrary::buildHelper(const QString &helperName, const QString &proFilename,
const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage)
{
QString output;
const QChar newline = QLatin1Char('\n');
// Setup process
QProcess proc;
......@@ -184,45 +251,43 @@ QString BuildableHelperLibrary::buildHelper(const QString &helperName, const QSt
proc.setWorkingDirectory(directory);
proc.setProcessChannelMode(QProcess::MergedChannels);
output += QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Building helper library '%1' in %2\n").arg(helperName, directory);
output += newline;
output->append(QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Building helper library '%1' in %2\n").arg(helperName, directory));
output->append(newline);
const QString makeFullPath = env.searchInPath(makeCommand);
if (QFileInfo(directory + QLatin1String("/Makefile")).exists()) {
if (!makeFullPath.isEmpty()) {
const QString cleanTarget = QLatin1String("distclean");
output += QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Running %1 %2...\n").arg(makeFullPath, cleanTarget);
proc.start(makeFullPath, QStringList(cleanTarget));
proc.waitForFinished();
output += QString::fromLocal8Bit(proc.readAll());
} else {
output += QCoreApplication::translate("ProjectExplorer::DebuggingHelperLibrary",
"%1 not found in PATH\n").arg(makeCommand);
return output;
if (makeFullPath.isEmpty()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::DebuggingHelperLibrary",
"%1 not found in PATH\n").arg(makeCommand);
return false;
}
const QString cleanTarget = QLatin1String("distclean");
output->append(QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary",
"Running %1 %2...\n").arg(makeFullPath, cleanTarget));
if (!runBuildProcess(proc, makeFullPath, QStringList(cleanTarget), 30000, true, output, errorMessage))
return false;
}
output += newline;
output += QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "Running %1 ...\n").arg(qmakeCommand);
output->append(newline);
output->append(QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "Running %1 ...\n").arg(qmakeCommand));
QStringList makeArgs;
makeArgs << targetMode << QLatin1String("-spec") << (mkspec.isEmpty() ? QString(QLatin1String("default")) : mkspec) << proFilename;
proc.start(qmakeCommand, makeArgs);
proc.waitForFinished();
output += proc.readAll();
output += newline;;
if (!makeFullPath.isEmpty()) {
output += QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "Running %1 ...\n").arg(makeFullPath);
proc.start(makeFullPath, QStringList());
proc.waitForFinished(80000);
output += proc.readAll();
} else {
output += QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "%1 not found in PATH\n").arg(makeCommand);
QStringList qMakeArgs;
if (!targetMode.isEmpty())
qMakeArgs << targetMode;
if (!mkspec.isEmpty())
qMakeArgs << QLatin1String("-spec") << mkspec;
qMakeArgs << proFilename;
if (!runBuildProcess(proc, qmakeCommand, qMakeArgs, 30000, false, output, errorMessage))
return false;
output->append(newline);
if (makeFullPath.isEmpty()) {
*errorMessage = QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "%1 not found in PATH\n").arg(makeCommand);
return false;
}
return output;
output->append(QCoreApplication::translate("ProjectExplorer::BuildableHelperLibrary", "Running %1 ...\n").arg(makeFullPath));
if (!runBuildProcess(proc, makeFullPath, QStringList(), 120000, false, output, errorMessage))
return false;
return true;
}
bool BuildableHelperLibrary::getHelperFileInfoFor(const QStringList &validBinaryFilenames,
......
......@@ -33,10 +33,11 @@ public:
static bool copyFiles(const QString &sourcePath, const QStringList &files,
const QString &targetDirectory, QString *errorMessage);
static QString buildHelper(const QString &helperName, const QString &proFilename,
const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode);
static bool buildHelper(const QString &helperName, const QString &proFilename,
const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage);
static bool getHelperFileInfoFor(const QStringList &validBinaryFilenames,
const QString &directory, QFileInfo* info);
......
......@@ -116,11 +116,12 @@ QString DebuggingHelperLibrary::copy(const QString &qtInstallData,
return QString();
}
QString DebuggingHelperLibrary::build(const QString &directory, const QString &makeCommand,
bool DebuggingHelperLibrary::build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode)
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage)
{
return buildHelper(QCoreApplication::translate("ProjectExplorer::DebuggingHelperLibrary",
"GDB helper"), QLatin1String("gdbmacros.pro"), directory,
makeCommand, qmakeCommand, mkspec, env, targetMode);
makeCommand, qmakeCommand, mkspec, env, targetMode, output, errorMessage);
}
......@@ -47,9 +47,10 @@ public:
static QStringList locationsByInstallData(const QString &qtInstallData);
// Build the helpers and return the output log/errormessage.
static QString build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode);
static bool build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage);
// Copy the source files to a target location and return the chosen target location.
static QString copy(const QString &qtInstallData, QString *errorMessage);
......
......@@ -70,14 +70,19 @@ public:
{
future.setProgressRange(0, 5);
future.setProgressValue(1);
const QString output = m_version.buildDebuggingHelperLibrary(future, true);
const QString qtInstallData = m_version.versionInfo().value("QT_INSTALL_DATA");
QString path = QmlDumpTool::toolByInstallData(qtInstallData);
if (path.isEmpty()) {
qWarning() << "Could not build QML plugin dumping helper for " << m_version.displayName()
<< "\nOutput:\n" << output;
m_failed = true;
QString output;
QString errorMessage;
QString path;
if (m_version.buildDebuggingHelperLibrary(future, true, &output, &errorMessage)) {
const QString qtInstallData = m_version.versionInfo().value("QT_INSTALL_DATA");
path = QmlDumpTool::toolByInstallData(qtInstallData);
if (path.isEmpty())
errorMessage = QString::fromLatin1("Could not build QML plugin dumping helper for %1\nOutput:\n%2").
arg(m_version.displayName(), output);
}
m_failed = path.isEmpty();
if (m_failed) {
qWarning("%s", qPrintable(errorMessage));
} else {
// proceed in gui thread
metaObject()->invokeMethod(this, "finish", Qt::QueuedConnection, Q_ARG(QString, path));
......@@ -222,12 +227,14 @@ QStringList QmlDumpTool::locationsByInstallData(const QString &qtInstallData)
return result;
}
QString QmlDumpTool::build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode)
bool QmlDumpTool::build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage)
{
return buildHelper(QCoreApplication::translate("Qt4ProjectManager::QmlDumpTool", "qmldump"), QLatin1String("qmldump.pro"),
directory, makeCommand, qmakeCommand, mkspec, env, targetMode);
directory, makeCommand, qmakeCommand, mkspec, env, targetMode,
output, errorMessage);
}
QString QmlDumpTool::copy(const QString &qtInstallData, QString *errorMessage)
......
......@@ -53,9 +53,10 @@ public:
static QStringList locationsByInstallData(const QString &qtInstallData);
// Build the helpers and return the output log/errormessage.
static QString build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode);
static bool build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage);
// Copy the source files to a target location and return the chosen target location.
static QString copy(const QString &qtInstallData, QString *errorMessage);
......
......@@ -99,13 +99,15 @@ QStringList QmlObserverTool::locationsByInstallData(const QString &qtInstallData
return result;
}
QString QmlObserverTool::build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode)
bool QmlObserverTool::build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage)
{
return buildHelper(QCoreApplication::translate("Qt4ProjectManager::QmlObserverTool", "QMLObserver"),
QLatin1String("qmlobserver.pro"),
directory, makeCommand, qmakeCommand, mkspec, env, targetMode);
directory, makeCommand, qmakeCommand, mkspec, env, targetMode,
output, errorMessage);
}
static inline bool mkpath(const QString &targetDirectory, QString *errorMessage)
......
......@@ -54,9 +54,10 @@ public:
static QStringList locationsByInstallData(const QString &qtInstallData);
// Build the helpers and return the output log/errormessage.
static QString build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode);
static bool build(const QString &directory, const QString &makeCommand,
const QString &qmakeCommand, const QString &mkspec,
const Utils::Environment &env, const QString &targetMode,
QString *output, QString *errorMessage);
// Copy the source files to a target location and return the chosen target location.
static QString copy(const QString &qtInstallData, QString *errorMessage);
......
......@@ -54,6 +54,8 @@
#include <QtGui/QHelpEvent>
#include <QtGui/QToolTip>
enum ModelRoles { BuildLogRole = Qt::UserRole, BuildRunningRole = Qt::UserRole + 1 };
using namespace Qt4ProjectManager;
using namespace Qt4ProjectManager::Internal;
......@@ -74,8 +76,14 @@ void DebuggingHelperBuildTask::run(QFutureInterface<void> &future)
{
future.setProgressRange(0, 5);
future.setProgressValue(1);
const QString output = m_version->buildDebuggingHelperLibrary(future);
emit finished(m_version->displayName(), output);
QString output;
QString errorMessage;
if (m_version->buildDebuggingHelperLibrary(future, false, &output, &errorMessage)) {
emit finished(m_version->displayName(), output);
} else {
qWarning("%s", qPrintable(errorMessage));
emit finished(m_version->displayName(), errorMessage);
}
deleteLater();
}
......@@ -232,7 +240,7 @@ QtOptionsPageWidget::QtOptionsPageWidget(QWidget *parent, QList<QtVersion *> ver
connect(m_ui->rebuildButton, SIGNAL(clicked()),
this, SLOT(buildDebuggingHelper()));
connect(m_ui->showLogButton, SIGNAL(clicked()),
this, SLOT(showDebuggingBuildLog()));
this, SLOT(slotShowDebuggingBuildLog()));
showEnvironmentPage(0);
updateState();
......@@ -315,7 +323,9 @@ void QtOptionsPageWidget::debuggingHelperBuildFinished(const QString &name, cons
// Update item view
QTreeWidgetItem *item = treeItemForIndex(index);
QTC_ASSERT(item, return)
item->setData(2, Qt::UserRole, output);
item->setData(2, BuildRunningRole, QVariant(false));
item->setData(2, BuildLogRole, output);
QSharedPointerQtVersion qtVersion = m_versions.at(index);
const bool success = qtVersion->hasDebuggingHelper()
&& (!QmlDumpTool::canBuild(qtVersion.data()) || qtVersion->hasQmlDump())
......@@ -325,10 +335,11 @@ void QtOptionsPageWidget::debuggingHelperBuildFinished(const QString &name, cons
// Update bottom control if the selection is still the same
if (index == currentIndex()) {
m_ui->showLogButton->setEnabled(true);
m_ui->rebuildButton->setEnabled(true);
updateDebuggingHelperStateLabel(m_versions.at(index).data());
if (!success)
showDebuggingBuildLog();
}
if (!success)
showDebuggingBuildLog(item);
}
void QtOptionsPageWidget::buildDebuggingHelper()
......@@ -337,7 +348,12 @@ void QtOptionsPageWidget::buildDebuggingHelper()
if (index < 0)
return;
QTreeWidgetItem *item = treeItemForIndex(index);
QTC_ASSERT(item, return);
m_ui->showLogButton->setEnabled(false);
m_ui->rebuildButton->setEnabled(false);
item->setData(2, BuildRunningRole, QVariant(true));
// Run a debugging helper build task in the background.
DebuggingHelperBuildTask *buildTask = new DebuggingHelperBuildTask(m_versions.at(index));
connect(buildTask, SIGNAL(finished(QString,QString)), this, SLOT(debuggingHelperBuildFinished(QString,QString)),
......@@ -348,21 +364,44 @@ void QtOptionsPageWidget::buildDebuggingHelper()
QLatin1String("Qt4ProjectManager::BuildHelpers"));
}
void QtOptionsPageWidget::showDebuggingBuildLog()
// Non-modal dialog
class BuildLogDialog : public QDialog {
public:
explicit BuildLogDialog(QWidget *parent = 0);
void setText(const QString &text);
private:
Ui_ShowBuildLog m_ui;
};
BuildLogDialog::BuildLogDialog(QWidget *parent) : QDialog(parent)
{
QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem();
m_ui.setupUi(this);
setAttribute(Qt::WA_DeleteOnClose, true);
}
int currentItemIndex = indexForTreeItem(currentItem);
void BuildLogDialog::setText(const QString &text)
{
m_ui.log->setPlainText(text); // Show and scroll to bottom
m_ui.log->moveCursor(QTextCursor::End);
m_ui.log->ensureCursorVisible();
}
void QtOptionsPageWidget::slotShowDebuggingBuildLog()
{
if (const QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem())
showDebuggingBuildLog(currentItem);
}
void QtOptionsPageWidget::showDebuggingBuildLog(const QTreeWidgetItem *currentItem)
{
const int currentItemIndex = indexForTreeItem(currentItem);
if (currentItemIndex < 0)
return;
// Show and scroll to bottom
QDialog dlg(this);
Ui_ShowBuildLog ui;
ui.setupUi(&dlg);
ui.log->setPlainText(currentItem->data(2, Qt::UserRole).toString());
ui.log->moveCursor(QTextCursor::End);
ui.log->ensureCursorVisible();
dlg.exec();
BuildLogDialog *dialog = new BuildLogDialog(this);
dialog->setWindowTitle(tr("Debugging Helper Build Log for '%1'").arg(currentItem->text(0)));
dialog->setText(currentItem->data(2, BuildLogRole).toString());
dialog->show();
}
QtOptionsPageWidget::~QtOptionsPageWidget()
......@@ -472,10 +511,11 @@ void QtOptionsPageWidget::updateState()
m_ui->s60SDKPath->setEnabled(s60SDKPathEnabled);
m_ui->gccePath->setEnabled(enabled);
const bool hasLog = enabled && !m_ui->qtdirList->currentItem()->data(2, Qt::UserRole).toString().isEmpty();
const QTreeWidgetItem *currentItem = m_ui->qtdirList->currentItem();
const bool buildRunning = currentItem && currentItem->data(2, BuildRunningRole).toBool();
const bool hasLog = enabled && currentItem && !currentItem->data(2, Qt::UserRole).toString().isEmpty();
m_ui->showLogButton->setEnabled(hasLog);
m_ui->rebuildButton->setEnabled(version && version->isValid());
m_ui->rebuildButton->setEnabled(version && version->isValid() && !buildRunning);
updateDebuggingHelperStateLabel(version);
}
......@@ -638,6 +678,7 @@ void QtOptionsPageWidget::versionChanged(QTreeWidgetItem *item, QTreeWidgetItem
} else {
m_ui->nameEdit->clear();
m_ui->qmakePath->setPath(QString()); // clear()
}
showEnvironmentPage(item);
updateState();
......
......@@ -125,8 +125,11 @@ private slots:
void updateCurrentGcceDirectory();
void msvcVersionChanged();
void buildDebuggingHelper();
void showDebuggingBuildLog();
void slotShowDebuggingBuildLog();
void debuggingHelperBuildFinished(const QString &versionName, const QString &output);
private:
void showDebuggingBuildLog(const QTreeWidgetItem *currentItem);
};
class QtOptionsPage : public Core::IOptionsPage
......
......@@ -1757,66 +1757,70 @@ bool QtVersion::isQt64Bit() const
#endif
}
QString QtVersion::buildDebuggingHelperLibrary(QFutureInterface<void> &future, bool onlyQmlDump)
{
QString qtInstallHeaders = versionInfo().value("QT_INSTALL_HEADERS");
QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
if (qtInstallData.isEmpty())
return QString();
bool QtVersion::buildDebuggingHelperLibrary(QFutureInterface<void> &future,
bool onlyQmlDump,
QString *output, QString *errorMessage)
{
const QString qtInstallData = versionInfo().value("QT_INSTALL_DATA");
if (qtInstallData.isEmpty()) {
*errorMessage =
QCoreApplication::translate("QtVersion",
"Cannot determine the installation path for Qt version '%1'.").
arg(displayName());
return false;
}
Utils::Environment env = Utils::Environment::systemEnvironment();
addToEnvironment(env);
// TODO: the debugging helper doesn't comply to actual tool chain yet
QList<QSharedPointer<ProjectExplorer::ToolChain> > alltc = toolChains();
ProjectExplorer::ToolChain *tc = alltc.isEmpty() ? 0 : alltc.first().data();
if (!tc)
return QCoreApplication::translate("QtVersion", "The Qt Version has no toolchain.");
if (!tc) {
*errorMessage = QCoreApplication::translate("QtVersion", "The Qt Version has no toolchain.");
return false;
}
tc->addToEnvironment(env);
QString output;
const QString target = (tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String(""));
// invalidate cache
m_versionInfoUpToDate = false;
if (!onlyQmlDump) {
QString gdbHelperDirectory = DebuggingHelperLibrary::copy(qtInstallData, &output);
if (!gdbHelperDirectory.isEmpty()) {
output += DebuggingHelperLibrary::build(gdbHelperDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env,
(tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String("")));
}
const QString gdbHelperDirectory = DebuggingHelperLibrary::copy(qtInstallData, errorMessage);
if (gdbHelperDirectory.isEmpty())
return false;
if (!DebuggingHelperLibrary::build(gdbHelperDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env,
target, output, errorMessage))
return false;
future.setProgressValue(2);
if (QmlObserverTool::canBuild(this)) {
QString toolDirectory = QmlObserverTool::copy(qtInstallData, &output);
if (!toolDirectory.isEmpty()) {
output += QmlObserverTool::build(toolDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env,
(tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String("")));
}
const QString toolDirectory = QmlObserverTool::copy(qtInstallData, errorMessage);
if (toolDirectory.isEmpty())
return false;
if (!QmlObserverTool::build(toolDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env, target, output, errorMessage))
return false;
} else {
output += QCoreApplication::translate("Qt4ProjectManager::QtVersion", "Cannot build QMLObserver; Qt version must be 4.7.1 or higher.");
output->append(QCoreApplication::translate("Qt4ProjectManager::QtVersion", "Warning: Cannot build QMLObserver; Qt version must be 4.7.1 or higher."));
}
future.setProgressValue(3);
}
if (QmlDumpTool::canBuild(this)) {
QString toolDirectory = QmlDumpTool::copy(qtInstallData, &output);
if (!toolDirectory.isEmpty()) {
output += QmlDumpTool::build(toolDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env,
(tc->type() == ToolChain::GCC_MAEMO ? QLatin1String("-unix") : QLatin1String("")));
}
const QString qmlDumpToolDirectory = QmlDumpTool::copy(qtInstallData, errorMessage);
if (qmlDumpToolDirectory.isEmpty())
return false;
if (!QmlDumpTool::build(qmlDumpToolDirectory, tc->makeCommand(),
qmakeCommand(), mkspec(), env, target, output, errorMessage))
return false;
} else {
output += QCoreApplication::translate("Qt4ProjectManager::QtVersion", "Cannot build qmldump; Qt version must be 4.7.1 or higher.");
output->append(QCoreApplication::translate("Qt4ProjectManager::QtVersion", "Warning: Cannot build qmldump; Qt version must be 4.7.1 or higher."));
}
future.setProgressValue(4);
// invalidate version before updating version info
m_versionInfoUpToDate = false;
updateVersionInfo();
if (!onlyQmlDump) {
m_hasDebuggingHelper = !debuggingHelperLibrary().isEmpty();
m_hasQmlObserver = !qmlObserverTool().isEmpty();
}
m_hasQmlDump = !qmlDumpTool().isEmpty();
return output;
return true;
}
......@@ -122,7 +122,8 @@ public:
// Builds a debugging library
// returns the output of the commands
QString buildDebuggingHelperLibrary(QFutureInterface<void> &future, bool onlyQmlDump = false);
bool buildDebuggingHelperLibrary(QFutureInterface<void> &future, bool onlyQmlDump,
QString *output, QString *errorMessage);
bool hasExamples() const;
QString examplesPath() const;
......
......@@ -30,7 +30,7 @@
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">