From 485315ec67258a6f0bc99811eeddfa553d529989 Mon Sep 17 00:00:00 2001 From: Christiaan Janssen Date: Wed, 5 Jun 2013 10:48:16 +0200 Subject: [PATCH 1/7] QmlProfiler: fix potential crash fixes Ib2ea66bd5694046577a0b5a0e2f611f3ffba0238 Change-Id: Ib7a4e02391513984f1c81a43a5fab490b7f88923 Reviewed-by: Kai Koehne Reviewed-by: Eike Ziller --- src/plugins/qmlprofiler/localqmlprofilerrunner.cpp | 5 +++++ src/plugins/qmlprofiler/localqmlprofilerrunner.h | 1 + src/plugins/qmlprofiler/qmlprofilerengine.cpp | 4 +--- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/plugins/qmlprofiler/localqmlprofilerrunner.cpp b/src/plugins/qmlprofiler/localqmlprofilerrunner.cpp index d6b3dccf970..a7883f506c8 100644 --- a/src/plugins/qmlprofiler/localqmlprofilerrunner.cpp +++ b/src/plugins/qmlprofiler/localqmlprofilerrunner.cpp @@ -41,6 +41,11 @@ LocalQmlProfilerRunner::LocalQmlProfilerRunner(const Configuration &configuratio this, SIGNAL(appendMessage(QString,Utils::OutputFormat))); } +LocalQmlProfilerRunner::~LocalQmlProfilerRunner() +{ + disconnect(); +} + void LocalQmlProfilerRunner::start() { QString arguments = QString::fromLatin1("-qmljsdebugger=port:%1,block").arg(m_configuration.port); diff --git a/src/plugins/qmlprofiler/localqmlprofilerrunner.h b/src/plugins/qmlprofiler/localqmlprofilerrunner.h index 042df146252..26a9b451618 100644 --- a/src/plugins/qmlprofiler/localqmlprofilerrunner.h +++ b/src/plugins/qmlprofiler/localqmlprofilerrunner.h @@ -52,6 +52,7 @@ public: }; explicit LocalQmlProfilerRunner(const Configuration &configuration, QObject *parent = 0); + ~LocalQmlProfilerRunner(); // AbstractQmlProfilerRunner virtual void start(); diff --git a/src/plugins/qmlprofiler/qmlprofilerengine.cpp b/src/plugins/qmlprofiler/qmlprofilerengine.cpp index f5800869f43..6914286dc66 100644 --- a/src/plugins/qmlprofiler/qmlprofilerengine.cpp +++ b/src/plugins/qmlprofiler/qmlprofilerengine.cpp @@ -61,7 +61,7 @@ class QmlProfilerEngine::QmlProfilerEnginePrivate { public: QmlProfilerEnginePrivate(QmlProfilerEngine *qq) : q(qq), m_runner(0) {} - ~QmlProfilerEnginePrivate() { m_runner->disconnect(); delete m_runner; } + ~QmlProfilerEnginePrivate() { delete m_runner; } bool attach(const QString &address, uint port); static AbstractQmlProfilerRunner *createRunner(ProjectExplorer::RunConfiguration *runConfiguration, @@ -153,7 +153,6 @@ bool QmlProfilerEngine::start() QTC_ASSERT(d->m_profilerState, return false); if (d->m_runner) { - d->m_runner->disconnect(); delete d->m_runner; d->m_runner = 0; } @@ -365,7 +364,6 @@ void QmlProfilerEngine::profilerStateChanged() // (a new one will be created at start) d->m_noDebugOutputTimer.stop(); if (d->m_runner) { - d->m_runner->disconnect(); delete d->m_runner; d->m_runner = 0; } From b6e9ebb7e6610c835b2057c4d15c57cc7ade92b6 Mon Sep 17 00:00:00 2001 From: Jonathan Liu Date: Thu, 6 Jun 2013 17:24:37 +1000 Subject: [PATCH 2/7] Remove semi-colon at end of line in project file Having a semi-colon at the end of line results in a parse error when processed with qmake. Change-Id: I9acfe5a7fc5a5db1c802cb70653789cc7edca5e3 Reviewed-by: Oswald Buddenhagen --- src/plugins/plugins.pro | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/plugins.pro b/src/plugins/plugins.pro index 520ef0a7620..8f34a8a3d54 100644 --- a/src/plugins/plugins.pro +++ b/src/plugins/plugins.pro @@ -81,7 +81,7 @@ contains(QT_CONFIG, declarative)|!isEmpty(QT.declarative.name) { } } } else { - warning("QmlProjectManager, QmlProfiler and QmlDesigner plugins have been disabled: The plugins require QtDeclarative"); + warning("QmlProjectManager, QmlProfiler and QmlDesigner plugins have been disabled: The plugins require QtDeclarative") } include (debugger/lldb/guest/qtcreator-lldb.pri) From 8011d0c32b68d68352497a3023ea3fe43cb87ac1 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Tue, 4 Jun 2013 16:42:26 +0200 Subject: [PATCH 3/7] Android: Use '/' in INSTALL_ROOT if sh.exe is in PATH Task-number: QTBUG-31147 Change-Id: Ifdeef2fa96668fdb482fd613eb8766c1ff5e3afd Reviewed-by: Yoann Lopes Reviewed-by: Oswald Buddenhagen --- .../android/androidpackageinstallationstep.cpp | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidpackageinstallationstep.cpp b/src/plugins/android/androidpackageinstallationstep.cpp index 629c857a90e..7b69ac34674 100644 --- a/src/plugins/android/androidpackageinstallationstep.cpp +++ b/src/plugins/android/androidpackageinstallationstep.cpp @@ -31,6 +31,11 @@ #include "androidmanager.h" #include +#include +#include +#include + +#include using namespace Android::Internal; @@ -50,6 +55,14 @@ AndroidPackageInstallationStep::AndroidPackageInstallationStep(ProjectExplorer:: bool AndroidPackageInstallationStep::init() { - setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(AndroidManager::dirPath(target()).toUserOutput())); + ProjectExplorer::BuildConfiguration *bc = buildConfiguration(); + if (!bc) + bc = target()->activeBuildConfiguration(); + QString dirPath = AndroidManager::dirPath(target()).toString(); + if (Utils::HostOsInfo::isWindowsHost()) + if (bc->environment().searchInPath(QLatin1String("sh.exe")).isEmpty()) + dirPath = QDir::toNativeSeparators(dirPath); + setUserArguments(QString::fromLatin1("INSTALL_ROOT=\"%1\" install").arg(dirPath)); + return MakeStep::init(); } From 8127ebe244c9c6a2561e592e2ed550d7b6d67115 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Thu, 6 Jun 2013 17:00:46 +0200 Subject: [PATCH 4/7] Android: Show complete output of ant run Change-Id: I4964e5bf22a715375a7fa080604d16692c956fc2 Reviewed-by: BogDan Vatra --- .../android/androidpackagecreationstep.cpp | 28 ++++++++++++------- .../android/androidpackagecreationstep.h | 1 + 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/plugins/android/androidpackagecreationstep.cpp b/src/plugins/android/androidpackagecreationstep.cpp index 76b29b402a3..5616af1f05c 100644 --- a/src/plugins/android/androidpackagecreationstep.cpp +++ b/src/plugins/android/androidpackagecreationstep.cpp @@ -818,6 +818,10 @@ bool AndroidPackageCreationStep::runCommand(QProcess *buildProc return false; } buildProc->waitForFinished(-1); + + handleProcessOutput(buildProc, false); + handleProcessOutput(buildProc, true); + if (buildProc->error() != QProcess::UnknownError || buildProc->exitCode() != 0) { QString mainMessage = tr("Packaging Error: Command '%1 %2' failed.") @@ -837,13 +841,7 @@ void AndroidPackageCreationStep::handleBuildStdOutOutput() QProcess *const process = qobject_cast(sender()); if (!process) return; - - process->setReadChannel(QProcess::StandardOutput); - while (process->canReadLine()) { - QString line = QString::fromLocal8Bit(process->readLine()); - m_outputParser.stdOutput(line); - emit addOutput(line, BuildStep::NormalOutput, BuildStep::DontAppendNewline); - } + handleProcessOutput(process, false); } void AndroidPackageCreationStep::handleBuildStdErrOutput() @@ -852,11 +850,21 @@ void AndroidPackageCreationStep::handleBuildStdErrOutput() if (!process) return; - process->setReadChannel(QProcess::StandardError); + handleProcessOutput(process, true); +} + +void AndroidPackageCreationStep::handleProcessOutput(QProcess *process, bool stdErr) +{ + process->setReadChannel(stdErr ? QProcess::StandardError : QProcess::StandardOutput); while (process->canReadLine()) { QString line = QString::fromLocal8Bit(process->readLine()); - m_outputParser.stdError(line); - emit addOutput(line, BuildStep::ErrorOutput, BuildStep::DontAppendNewline); + if (stdErr) + m_outputParser.stdError(line); + else + m_outputParser.stdOutput(line); + emit addOutput(line, stdErr ? BuildStep::ErrorOutput + : BuildStep::NormalOutput, + BuildStep::DontAppendNewline); } } diff --git a/src/plugins/android/androidpackagecreationstep.h b/src/plugins/android/androidpackagecreationstep.h index 19c01682937..64c958702c2 100644 --- a/src/plugins/android/androidpackagecreationstep.h +++ b/src/plugins/android/androidpackagecreationstep.h @@ -113,6 +113,7 @@ private: static const Core::Id CreatePackageId; private: + void handleProcessOutput(QProcess *process, bool stdErr); Utils::FileName m_keystorePath; QString m_keystorePasswd; QString m_certificateAlias; From cb6eaa3c2435128392d5ef7bd98e26902d086ece Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Mon, 10 Jun 2013 18:18:38 +0200 Subject: [PATCH 5/7] Android: Set JAVA_HOME in environment and use that environment Change-Id: Ia0f3abad74b7ac423fab621ca22e0f698747c477 Reviewed-by: BogDan Vatra Reviewed-by: Ray Donnelly --- src/plugins/android/androidmanager.cpp | 5 +++++ src/plugins/android/androidpackagecreationstep.cpp | 2 ++ src/plugins/android/androidpackagecreationstep.h | 3 ++- src/plugins/android/androidtoolchain.cpp | 3 +++ 4 files changed, 12 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidmanager.cpp b/src/plugins/android/androidmanager.cpp index ed2fb8d10fe..4761b68db40 100644 --- a/src/plugins/android/androidmanager.cpp +++ b/src/plugins/android/androidmanager.cpp @@ -611,9 +611,14 @@ void AndroidManager::updateTarget(ProjectExplorer::Target *target, const QString { QString androidDir = dirPath(target).toString(); + Utils::Environment env = Utils::Environment::systemEnvironment(); + QString javaHome = AndroidConfigurations::instance().config().openJDKLocation.toString(); + if (!javaHome.isEmpty()) + env.set(QLatin1String("JAVA_HOME"), javaHome); // clean previous build QProcess androidProc; androidProc.setWorkingDirectory(androidDir); + androidProc.setProcessEnvironment(env.toProcessEnvironment()); androidProc.start(AndroidConfigurations::instance().antToolPath().toString(), QStringList() << QLatin1String("clean")); if (!androidProc.waitForFinished(-1)) diff --git a/src/plugins/android/androidpackagecreationstep.cpp b/src/plugins/android/androidpackagecreationstep.cpp index 5616af1f05c..5f80db9cd80 100644 --- a/src/plugins/android/androidpackagecreationstep.cpp +++ b/src/plugins/android/androidpackagecreationstep.cpp @@ -169,6 +169,7 @@ bool AndroidPackageCreationStep::init() m_certificatePasswdForRun = m_certificatePasswd; m_jarSigner = AndroidConfigurations::instance().jarsignerPath(); m_zipAligner = AndroidConfigurations::instance().zipalignPath(); + m_environment = bc->environment(); ProjectExplorer::ToolChain *tc = ProjectExplorer::ToolChainKitInformation::toolChain(target()->kit()); if (tc->type() != QLatin1String(Constants::ANDROID_TOOLCHAIN_TYPE)) @@ -702,6 +703,7 @@ bool AndroidPackageCreationStep::createPackage() emit addOutput(tr("Creating package file ..."), MessageOutput); QProcess *const buildProc = new QProcess; + buildProc->setProcessEnvironment(m_environment.toProcessEnvironment()); connect(buildProc, SIGNAL(readyReadStandardOutput()), this, SLOT(handleBuildStdOutOutput())); diff --git a/src/plugins/android/androidpackagecreationstep.h b/src/plugins/android/androidpackagecreationstep.h index 64c958702c2..bc7336cd2ad 100644 --- a/src/plugins/android/androidpackagecreationstep.h +++ b/src/plugins/android/androidpackagecreationstep.h @@ -35,6 +35,7 @@ #include #include +#include #include @@ -140,10 +141,10 @@ private: QStringList m_qtLibsWithDependencies; QVector m_availableQtLibs; QStringList m_prebundledLibs; - QStringList m_bundledJars; QStringList m_otherBundledFiles; bool m_bundleQt; + Utils::Environment m_environment; }; } // namespace Internal diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 6e3ba77b683..a05cba4a18f 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -115,6 +115,9 @@ void AndroidToolChain::addToEnvironment(Environment &env) const env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_PREFIX"), AndroidConfigurations::toolchainPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLS_PREFIX"), AndroidConfigurations::toolsPrefix(targetAbi().architecture())); env.set(QLatin1String("ANDROID_NDK_TOOLCHAIN_VERSION"), m_ndkToolChainVersion); + QString javaHome = AndroidConfigurations::instance().openJDKPath().toString(); + if (!javaHome.isEmpty() && QFileInfo(javaHome).exists()) + env.set(QLatin1String("JAVA_HOME"), javaHome); } bool AndroidToolChain::operator ==(const ToolChain &tc) const From 115b91a74637515382046b89153b295f3a0cb973 Mon Sep 17 00:00:00 2001 From: Daniel Teske Date: Mon, 10 Jun 2013 18:19:08 +0200 Subject: [PATCH 6/7] Android: Autodetect a value for OpenJDK path First look into the current PATH, secondly into the registry. Change-Id: I3b1d1ebccb1a85c03979ac3d48740c3de5a6df40 Reviewed-by: BogDan Vatra Reviewed-by: Ray Donnelly Reviewed-by: Yoann Lopes Reviewed-by: Eike Ziller Reviewed-by: Daniel Teske --- src/plugins/android/androidconfigurations.cpp | 53 ++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/src/plugins/android/androidconfigurations.cpp b/src/plugins/android/androidconfigurations.cpp index 3b778896a95..dbc7007faac 100644 --- a/src/plugins/android/androidconfigurations.cpp +++ b/src/plugins/android/androidconfigurations.cpp @@ -750,6 +750,7 @@ AndroidConfigurations::AndroidConfigurations(QObject *parent) void AndroidConfigurations::load() { + bool saveSettings = false; QSettings *settings = Core::ICore::instance()->settings(); settings->beginGroup(SettingsGroup); m_config = AndroidConfig(*settings); @@ -758,11 +759,61 @@ void AndroidConfigurations::load() Utils::Environment env = Utils::Environment::systemEnvironment(); QString location = env.searchInPath(QLatin1String("ant")); QFileInfo fi(location); - if (fi.exists() && fi.isExecutable() && !fi.isDir()) + if (fi.exists() && fi.isExecutable() && !fi.isDir()) { m_config.antLocation = Utils::FileName::fromString(location); + saveSettings = true; + } + } + + if (m_config.openJDKLocation.isEmpty()) { + Utils::Environment env = Utils::Environment::systemEnvironment(); + QString location = env.searchInPath(QLatin1String("javac")); + QFileInfo fi(location); + if (fi.exists() && fi.isExecutable() && !fi.isDir()) { + QDir parentDirectory = fi.canonicalPath(); + parentDirectory.cdUp(); // one up from bin + m_config.openJDKLocation = Utils::FileName::fromString(parentDirectory.absolutePath()); + saveSettings = true; + } else if (Utils::HostOsInfo::isWindowsHost()) { + QSettings settings(QLatin1String("HKEY_LOCAL_MACHINE\\SOFTWARE\\Javasoft\\Java Development Kit"), QSettings::NativeFormat); + QStringList allVersions = settings.childGroups(); + QString javaHome; + int major = -1; + int minor = -1; + foreach (const QString &version, allVersions) { + QStringList parts = version.split(QLatin1String(".")); + if (parts.size() != 2) // not interested in 1.7.0_u21 + continue; + bool okMajor, okMinor; + int tmpMajor = parts.at(0).toInt(&okMajor); + int tmpMinor = parts.at(1).toInt(&okMinor); + if (!okMajor || !okMinor) + continue; + if (tmpMajor > major + || (tmpMajor == major + && tmpMinor > minor)) { + settings.beginGroup(version); + QString tmpJavaHome = settings.value(QLatin1String("JavaHome")).toString(); + settings.endGroup(); + if (!QFileInfo(tmpJavaHome).exists()) + continue; + + major = tmpMajor; + minor = tmpMinor; + javaHome = tmpJavaHome; + } + } + if (!javaHome.isEmpty()) { + m_config.openJDKLocation = Utils::FileName::fromString(javaHome); + saveSettings = true; + } + } } settings->endGroup(); + + if (saveSettings) + save(); } AndroidConfigurations *AndroidConfigurations::m_instance = 0; From 3ac771ecbf6058c69cc966b60fc41a524f53eae7 Mon Sep 17 00:00:00 2001 From: Leena Miettinen Date: Fri, 14 Jun 2013 14:58:08 +0200 Subject: [PATCH 7/7] Doc: rename index.html as extending-index.html Remove the \contextpage commands, as they are only used in some of the files. Task-number: QTBUG-31106 Change-Id: Iacbf15a33ab6cb426c2fbfb6fbed03310095f2ba Reviewed-by: Jerome Pasion Reviewed-by: Kai Koehne --- doc/api/coding-style.qdoc | 1 - doc/api/external-tool-spec.qdoc | 1 - doc/api/qtcreator-api.qdoc | 1 - doc/api/qtcreator-dev.qdoc | 2 +- doc/api/qtcreator-documentation.qdoc | 1 - doc/api/qtcreator-ui-text.qdoc | 1 - 6 files changed, 1 insertion(+), 6 deletions(-) diff --git a/doc/api/coding-style.qdoc b/doc/api/coding-style.qdoc index a8afd6a3988..7ea0f6eec31 100644 --- a/doc/api/coding-style.qdoc +++ b/doc/api/coding-style.qdoc @@ -17,7 +17,6 @@ ****************************************************************************/ /*! - \contentspage{index.html}{Qt Creator} \previouspage qtcreator-ui-text.html \page coding-style.html \nextpage qtcreator-api.html diff --git a/doc/api/external-tool-spec.qdoc b/doc/api/external-tool-spec.qdoc index a87456d97d7..6dd114fad45 100644 --- a/doc/api/external-tool-spec.qdoc +++ b/doc/api/external-tool-spec.qdoc @@ -17,7 +17,6 @@ ****************************************************************************/ /*! - \contentspage{index.html}{Qt Creator} \page external-tool-spec.html \nextpage coding-style.html diff --git a/doc/api/qtcreator-api.qdoc b/doc/api/qtcreator-api.qdoc index 8dcd8967bd9..464e791c5b1 100644 --- a/doc/api/qtcreator-api.qdoc +++ b/doc/api/qtcreator-api.qdoc @@ -17,7 +17,6 @@ ****************************************************************************/ /*! - \contentspage{index.html}{Extending Qt Creator Manual} \page qtcreator-api.html \title Qt Creator API Reference diff --git a/doc/api/qtcreator-dev.qdoc b/doc/api/qtcreator-dev.qdoc index 51eb4bac9bd..8a421f35b3c 100644 --- a/doc/api/qtcreator-dev.qdoc +++ b/doc/api/qtcreator-dev.qdoc @@ -17,7 +17,7 @@ ****************************************************************************/ /*! - \page index.html + \page extending-index.html \title Extending Qt Creator Manual Qt Creator is a cross-platform integrated development environment (IDE) diff --git a/doc/api/qtcreator-documentation.qdoc b/doc/api/qtcreator-documentation.qdoc index 90fdcda6b79..d89329e2c2a 100644 --- a/doc/api/qtcreator-documentation.qdoc +++ b/doc/api/qtcreator-documentation.qdoc @@ -17,7 +17,6 @@ ****************************************************************************/ /*! - \contentspage{index.html}{Qt Creator} \previouspage external-tool-spec.html \page qtcreator-documentation.html \nextpage coding-style.html diff --git a/doc/api/qtcreator-ui-text.qdoc b/doc/api/qtcreator-ui-text.qdoc index a352af2bb77..4ca80915171 100644 --- a/doc/api/qtcreator-ui-text.qdoc +++ b/doc/api/qtcreator-ui-text.qdoc @@ -17,7 +17,6 @@ ****************************************************************************/ /*! - \contentspage{index.html}{Qt Creator} \previouspage external-tool-spec.html \page qtcreator-ui-text.html \nextpage coding-style.html