diff options
-rw-r--r-- | src/plugins/qnx/blackberryconfiguration.cpp | 342 | ||||
-rw-r--r-- | src/plugins/qnx/blackberryconfiguration.h | 104 | ||||
-rw-r--r-- | src/plugins/qnx/blackberryqtversion.cpp | 123 | ||||
-rw-r--r-- | src/plugins/qnx/blackberryqtversion.h | 6 | ||||
-rw-r--r-- | src/plugins/qnx/blackberrysettingspage.cpp | 68 | ||||
-rw-r--r-- | src/plugins/qnx/blackberrysettingspage.h | 58 | ||||
-rw-r--r-- | src/plugins/qnx/blackberrysettingswidget.cpp | 133 | ||||
-rw-r--r-- | src/plugins/qnx/blackberrysettingswidget.h | 74 | ||||
-rw-r--r-- | src/plugins/qnx/blackberrysettingswidget.ui | 57 | ||||
-rw-r--r-- | src/plugins/qnx/qnx.pro | 13 | ||||
-rw-r--r-- | src/plugins/qnx/qnxabstractqtversion.cpp | 59 | ||||
-rw-r--r-- | src/plugins/qnx/qnxabstractqtversion.h | 5 | ||||
-rw-r--r-- | src/plugins/qnx/qnxconstants.h | 5 | ||||
-rw-r--r-- | src/plugins/qnx/qnxplugin.cpp | 2 | ||||
-rw-r--r-- | src/plugins/qnx/qnxutils.cpp | 142 | ||||
-rw-r--r-- | src/plugins/qnx/qnxutils.h | 10 |
16 files changed, 1051 insertions, 150 deletions
diff --git a/src/plugins/qnx/blackberryconfiguration.cpp b/src/plugins/qnx/blackberryconfiguration.cpp new file mode 100644 index 0000000000..741cbc2a53 --- /dev/null +++ b/src/plugins/qnx/blackberryconfiguration.cpp @@ -0,0 +1,342 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "blackberryconfiguration.h" +#include "blackberryqtversion.h" +#include "qnxutils.h" + +#include <coreplugin/icore.h> + +#include <qtsupport/baseqtversion.h> +#include <qtsupport/qtversionmanager.h> +#include <qtsupport/qtkitinformation.h> + +#include <projectexplorer/projectexplorerconstants.h> +#include <projectexplorer/kitmanager.h> +#include <projectexplorer/kitinformation.h> +#include <projectexplorer/gcctoolchain.h> +#include <projectexplorer/toolchainmanager.h> + +#include <qt4projectmanager/qmakekitinformation.h> + +#include <debugger/debuggerkitinformation.h> + +#include <utils/persistentsettings.h> +#include <utils/hostosinfo.h> + +#include <QFileInfo> +#include <QDir> +#include <QMessageBox> + +namespace Qnx { +namespace Internal { + +namespace { +const QLatin1String SettingsGroup("BlackBerryConfiguration"); +const QLatin1String NDKLocationKey("NDKLocation"); +} + +BlackBerryConfiguration::BlackBerryConfiguration(QObject *parent) + :QObject(parent) +{ + loadSetting(); + connect(Core::ICore::instance(), SIGNAL(saveSettingsRequested()), this, SLOT(saveSetting())); +} + +bool BlackBerryConfiguration::setConfig(const QString &ndkPath) +{ + if (ndkPath.isEmpty()) + return false; + + m_config.ndkPath = ndkPath; + m_config.qnxEnv = QnxUtils::parseEnvironmentFile(QnxUtils::envFilePath(ndkPath)); + + QString ndkTarget = m_config.qnxEnv.value(QLatin1String("QNX_TARGET")); + QString cpuDir = m_config.qnxEnv.value(QLatin1String("CPUVARDIR")); + + QString sep = QString::fromLatin1("%1qnx6").arg(QDir::separator()); + m_config.targetName = ndkTarget.split(sep).first().split(QDir::separator()).last(); + + QString sRootDir = QString::fromLatin1("%1%2%3").arg(ndkTarget, QDir::separator(), cpuDir); + + if (QDir(sRootDir).exists()) + m_config.sysRoot = Utils::FileName::fromString(sRootDir); + + QString qnxHost = m_config.qnxEnv.value(QLatin1String("QNX_HOST")); + Utils::FileName qmakePath = QnxUtils::executableWithExtension(Utils::FileName::fromString(qnxHost + QLatin1String("/usr/bin/qmake"))); + Utils::FileName gccPath = QnxUtils::executableWithExtension(Utils::FileName::fromString(qnxHost + QLatin1String("/usr/bin/qcc"))); + Utils::FileName deviceGdbPath = QnxUtils::executableWithExtension(Utils::FileName::fromString(qnxHost + QLatin1String("/usr/bin/ntoarm-gdb"))); + Utils::FileName simulatorGdbPath = QnxUtils::executableWithExtension(Utils::FileName::fromString(qnxHost + QLatin1String("/usr/bin/ntox86-gdb"))); + + if (!qmakePath.toFileInfo().exists() || !gccPath.toFileInfo().exists() + || !deviceGdbPath.toFileInfo().exists() || !simulatorGdbPath.toFileInfo().exists() ) { + QString errorMessage = tr("The following errors occurred while setting up BB10 Configuration: \n"); + if (!qmakePath.toFileInfo().exists()) + errorMessage += tr("- No Qt version found\n"); + + if (!gccPath.toFileInfo().exists()) + errorMessage += tr("- No GCC compiler found\n"); + + if (!deviceGdbPath.toFileInfo().exists()) + errorMessage += tr("- No Gdb debugger found for BB10 Device\n"); + + if (!simulatorGdbPath.toFileInfo().exists()) + errorMessage += tr("- No Gdb debugger found for BB10 Simulator"); + + QMessageBox::warning(0, tr("Cannot setup BB10 Configuartion"), + errorMessage, QMessageBox::Ok); + return false; + } + + m_config.qmakeBinaryFile = qmakePath; + m_config.gccCompiler = gccPath; + m_config.deviceDebuger = deviceGdbPath; + m_config.simulatorDebuger = simulatorGdbPath; + + return true; +} + +void BlackBerryConfiguration::setupConfiguration(const QString &ndkPath) +{ + if (ndkPath.isEmpty()) + return; + + if (setConfig(ndkPath)) { + QtSupport::BaseQtVersion *qtVersion = createQtVersion(); + ProjectExplorer::GccToolChain *tc = createGccToolChain(); + ProjectExplorer::Kit *deviceKit = createKit(ArmLeV7, qtVersion, tc); + ProjectExplorer::Kit *simulatorKit = createKit(X86, qtVersion, tc); + if (qtVersion && tc && deviceKit && simulatorKit) { + tc->setTargetAbi(qtVersion->qtAbis().first()); + // register + QtSupport::QtVersionManager::instance()->addVersion(qtVersion); + ProjectExplorer::ToolChainManager::instance()->registerToolChain(tc); + ProjectExplorer::KitManager::instance()->registerKit(deviceKit); + ProjectExplorer::KitManager::instance()->registerKit(simulatorKit); + + emit updated(); + } + } +} + +void BlackBerryConfiguration::cleanConfiguration() +{ + QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->qtVersionForQMakeBinary(m_config.qmakeBinaryFile); + if (version) { + foreach (ProjectExplorer::Kit *kit, ProjectExplorer::KitManager::instance()->kits()) { + if (version == QtSupport::QtKitInformation::qtVersion(kit)) + ProjectExplorer::KitManager::instance()->deregisterKit(kit); + } + + QtSupport::QtVersionManager::instance()->removeVersion(version); + } + + foreach (ProjectExplorer::ToolChain* tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { + if (tc->compilerCommand() == m_config.gccCompiler) + ProjectExplorer::ToolChainManager::instance()->deregisterToolChain(tc); + } + + BlackBerryConfig conf; + m_config = conf; + emit updated(); + + clearSetting(); +} + +QtSupport::BaseQtVersion *BlackBerryConfiguration::createQtVersion() +{ + if (m_config.qmakeBinaryFile.isEmpty()) + return 0; + + QString cpuDir = m_config.qnxEnv.value(QLatin1String("CPUVARDIR")); + QtSupport::BaseQtVersion *version = QtSupport::QtVersionManager::instance()->qtVersionForQMakeBinary(m_config.qmakeBinaryFile); + if (version) { + QMessageBox::warning(0, tr("Qt known"), + tr("This Qt version was already registered"), QMessageBox::Ok); + return version; + } + + version = new BlackBerryQtVersion(QnxUtils::cpudirToArch(cpuDir), m_config.qmakeBinaryFile, false, QString(), m_config.ndkPath); + if (!version) { + QMessageBox::warning(0, tr("Qt not valid"), + tr("Unable to add BlackBerry Qt version"), QMessageBox::Ok); + return 0; + } + + version->setDisplayName(QString::fromLatin1("Qt BlackBerry 10 (%1)").arg(m_config.targetName)); + + return version; +} + +ProjectExplorer::GccToolChain *BlackBerryConfiguration::createGccToolChain() +{ + if (m_config.qmakeBinaryFile.isEmpty() || m_config.gccCompiler.isEmpty()) + return 0; + + foreach (ProjectExplorer::ToolChain* tc, ProjectExplorer::ToolChainManager::instance()->toolChains()) { + if (tc->compilerCommand() == m_config.gccCompiler) { + QMessageBox::warning(0, tr("Compiler known"), + tr("This Compiler was already registered"), QMessageBox::Ok); + return dynamic_cast<ProjectExplorer::GccToolChain*>(tc); + } + } + + ProjectExplorer::GccToolChain* tc = new ProjectExplorer::GccToolChain(QLatin1String(ProjectExplorer::Constants::GCC_TOOLCHAIN_ID), false); + tc->setDisplayName(QString::fromLatin1("GCC BlackBerry 10 (%1)").arg(m_config.targetName)); + tc->setCompilerCommand(m_config.gccCompiler); + + return tc; +} + +ProjectExplorer::Kit *BlackBerryConfiguration::createKit(QnxArchitecture arch, QtSupport::BaseQtVersion *qtVersion, ProjectExplorer::GccToolChain *tc) +{ + if (!qtVersion || !tc || m_config.targetName.isEmpty()) + return 0; + + // Check if an identical kit already exists + foreach (ProjectExplorer::Kit *kit, ProjectExplorer::KitManager::instance()->kits()) + { + if (QtSupport::QtKitInformation::qtVersion(kit) == qtVersion && ProjectExplorer::ToolChainKitInformation::toolChain(kit) == tc + && ProjectExplorer::DeviceTypeKitInformation::deviceTypeId(kit) == Constants::QNX_BB_OS_TYPE + && ProjectExplorer::SysRootKitInformation::sysRoot(kit) == m_config.sysRoot) { + if ((arch == X86 && Qt4ProjectManager::QmakeKitInformation::mkspec(kit).toString() == QString::fromLatin1("blackberry-x86-qcc") + && Debugger::DebuggerKitInformation::debuggerCommand(kit) == m_config.simulatorDebuger) + || (arch == ArmLeV7 && Debugger::DebuggerKitInformation::debuggerCommand(kit) == m_config.deviceDebuger)) { + QMessageBox::warning(0, tr("Kit Known"), + tr("This Kit was already registered"), QMessageBox::Ok); + return kit; + } + } + } + + ProjectExplorer::Kit *kit = new ProjectExplorer::Kit; + QtSupport::QtKitInformation::setQtVersion(kit, qtVersion); + ProjectExplorer::ToolChainKitInformation::setToolChain(kit, tc); + if (arch == X86) { + Debugger::DebuggerKitInformation::setDebuggerCommand(kit, m_config.simulatorDebuger); + Qt4ProjectManager::QmakeKitInformation::setMkspec(kit, Utils::FileName::fromString(QString::fromLatin1("blackberry-x86-qcc"))); + // TODO: Check if the name already exists(?) + kit->setDisplayName(tr("BlackBerry 10 (%1) - Simulator").arg(m_config.targetName)); + } else { + Debugger::DebuggerKitInformation::setDebuggerCommand(kit, m_config.deviceDebuger); + kit->setDisplayName(tr("BlackBerry 10 (%1)").arg(m_config.targetName)); + } + + ProjectExplorer::DeviceTypeKitInformation::setDeviceTypeId(kit, Constants::QNX_BB_OS_TYPE); + ProjectExplorer::SysRootKitInformation::setSysRoot(kit, m_config.sysRoot); + + return kit; +} + +void BlackBerryConfiguration::loadSetting() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(SettingsGroup); + setConfig(settings->value(NDKLocationKey).toString()); + settings->endGroup(); +} + +void BlackBerryConfiguration::saveSetting() +{ + if (m_config.ndkPath.isEmpty()) + return; + + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(SettingsGroup); + settings->setValue(NDKLocationKey, m_config.ndkPath); + settings->endGroup(); +} + +void BlackBerryConfiguration::clearSetting() +{ + QSettings *settings = Core::ICore::instance()->settings(); + settings->beginGroup(SettingsGroup); + settings->remove(NDKLocationKey); + settings->endGroup(); +} + +BlackBerryConfiguration &BlackBerryConfiguration::instance() +{ + if (m_instance == 0) + m_instance = new BlackBerryConfiguration(); + return *m_instance; +} + +QString BlackBerryConfiguration::ndkPath() const +{ + return m_config.ndkPath; +} + +QString BlackBerryConfiguration::targetName() const +{ + return m_config.targetName; +} + +BlackBerryConfig BlackBerryConfiguration::config() const +{ + return m_config; +} + +Utils::FileName BlackBerryConfiguration::qmakePath() const +{ + return m_config.qmakeBinaryFile; +} + +Utils::FileName BlackBerryConfiguration::gccPath() const +{ + return m_config.gccCompiler; +} + +Utils::FileName BlackBerryConfiguration::deviceGdbPath() const +{ + return m_config.deviceDebuger; +} + +Utils::FileName BlackBerryConfiguration::simulatorGdbPath() const +{ + return m_config.simulatorDebuger; +} + +Utils::FileName BlackBerryConfiguration::sysRoot() const +{ + return m_config.sysRoot; +} + +// TODO: QnxUtils::parseEnvFile() and qnxEnv() to return Util::Enviroment instead(?) +QMultiMap<QString, QString> BlackBerryConfiguration::qnxEnv() const +{ + return m_config.qnxEnv; +} + +BlackBerryConfiguration* BlackBerryConfiguration::m_instance = 0; + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/blackberryconfiguration.h b/src/plugins/qnx/blackberryconfiguration.h new file mode 100644 index 0000000000..e3935cfbf4 --- /dev/null +++ b/src/plugins/qnx/blackberryconfiguration.h @@ -0,0 +1,104 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef BLACKBERRYCONFIGURATIONS_H +#define BLACKBERRYCONFIGURATIONS_H + +#include <qnxconstants.h> + +#include <utils/environment.h> +#include <utils/fileutils.h> + +#include <qtsupport/baseqtversion.h> + +#include <projectexplorer/kit.h> +#include <projectexplorer/gcctoolchain.h> + +#include <QSettings> +#include <QObject> + +namespace Qnx { +namespace Internal { + +class BlackBerryConfig +{ + QString ndkPath; + QString targetName; + Utils::FileName qmakeBinaryFile; + Utils::FileName gccCompiler; + Utils::FileName deviceDebuger; + Utils::FileName simulatorDebuger; + Utils::FileName sysRoot; + QMultiMap<QString, QString> qnxEnv; + + friend class BlackBerryConfiguration; +}; + +class BlackBerryConfiguration: public QObject +{ + Q_OBJECT +public: + static BlackBerryConfiguration &instance(); + BlackBerryConfig config() const; + Utils::FileName qmakePath() const; + Utils::FileName gccPath() const; + Utils::FileName deviceGdbPath() const; + Utils::FileName simulatorGdbPath() const; + Utils::FileName sysRoot() const; + QMultiMap<QString, QString> qnxEnv() const; + void setupConfiguration(const QString &ndkPath); + QString ndkPath() const; + QString targetName() const; + void loadSetting(); + void clearSetting(); + void cleanConfiguration(); + +public slots: + void saveSetting(); + +private: + BlackBerryConfiguration(QObject *parent = 0); + static BlackBerryConfiguration *m_instance; + BlackBerryConfig m_config; + + bool setConfig(const QString &ndkPath); + QtSupport::BaseQtVersion* createQtVersion(); + ProjectExplorer::GccToolChain* createGccToolChain(); + ProjectExplorer::Kit* createKit(QnxArchitecture arch, QtSupport::BaseQtVersion* qtVersion, ProjectExplorer::GccToolChain* tc); + +signals: + void updated(); +}; + +} // namespace Internal +} // namespace Qnx + +#endif // BLACKBERRYCONFIGURATIONS_H diff --git a/src/plugins/qnx/blackberryqtversion.cpp b/src/plugins/qnx/blackberryqtversion.cpp index 104524b3d7..032641bd7a 100644 --- a/src/plugins/qnx/blackberryqtversion.cpp +++ b/src/plugins/qnx/blackberryqtversion.cpp @@ -31,6 +31,7 @@ #include "blackberryqtversion.h" +#include "qnxutils.h" #include "qnxconstants.h" #include <utils/environment.h> @@ -42,110 +43,18 @@ using namespace Qnx; using namespace Qnx::Internal; -namespace { -QMultiMap<QString, QString> parseEnvironmentFile(const QString &fileName) -{ - QMultiMap<QString, QString> result; - - QFile file(fileName); - if (!file.open(QIODevice::ReadOnly)) - return result; - - QTextStream str(&file); - QMap<QString, QString> fileContent; - while (!str.atEnd()) { - QString line = str.readLine(); - if (!line.contains(QLatin1Char('='))) - continue; - - int equalIndex = line.indexOf(QLatin1Char('=')); - QString var = line.left(equalIndex); - //Remove set in front - if (var.startsWith(QLatin1String("set "))) - var = var.right(var.size() - 4); - - QString value = line.mid(equalIndex + 1); - - if (Utils::HostOsInfo::isWindowsHost()) { - QRegExp systemVarRegExp(QLatin1String("IF NOT DEFINED ([\\w\\d]+)\\s+set " - "([\\w\\d]+)=([\\w\\d]+)")); - if (line.contains(systemVarRegExp)) { - var = systemVarRegExp.cap(2); - Utils::Environment sysEnv = Utils::Environment::systemEnvironment(); - QString sysVar = systemVarRegExp.cap(1); - if (sysEnv.hasKey(sysVar)) - value = sysEnv.value(sysVar); - else - value = systemVarRegExp.cap(3); - } - } - else if (Utils::HostOsInfo::isAnyUnixHost()) { - // to match e.g. "${QNX_HOST_VERSION:=10_0_9_52}" - QRegExp systemVarRegExp(QLatin1String("\\$\\{([\\w\\d]+):=([\\w\\d]+)\\}")); - - if (value.contains(systemVarRegExp)) { - Utils::Environment sysEnv = Utils::Environment::systemEnvironment(); - QString sysVar = systemVarRegExp.cap(1); - if (sysEnv.hasKey(sysVar)) - value = sysEnv.value(sysVar); - else - value = systemVarRegExp.cap(2); - } - } - if (value.startsWith(QLatin1Char('"'))) - value = value.mid(1); - if (value.endsWith(QLatin1Char('"'))) - value = value.left(value.size() - 1); - - fileContent[var] = value; - } - file.close(); - - QMapIterator<QString, QString> it(fileContent); - while (it.hasNext()) { - it.next(); - const QStringList values - = it.value().split(Utils::HostOsInfo::pathListSeparator()); - QString key = it.key(); - foreach (const QString &value, values) { - const QString ownKeyAsWindowsVar = QLatin1Char('%') + key + QLatin1Char('%'); - const QString ownKeyAsUnixVar = QLatin1Char('$') + key; - if (value != ownKeyAsUnixVar && value != ownKeyAsWindowsVar) { // to ignore e.g. PATH=$PATH - QString val = value; - if (val.contains(QLatin1Char('%')) || val.contains(QLatin1Char('$'))) { - QMapIterator<QString, QString> replaceIt(fileContent); - while (replaceIt.hasNext()) { - replaceIt.next(); - const QString replaceKey = replaceIt.key(); - if (replaceKey == key) - continue; - - const QString keyAsWindowsVar = QLatin1Char('%') + replaceKey + QLatin1Char('%'); - const QString keyAsUnixVar = QLatin1Char('$') + replaceKey; - if (val.contains(keyAsWindowsVar)) - val.replace(keyAsWindowsVar, replaceIt.value()); - if (val.contains(keyAsUnixVar)) - val.replace(keyAsUnixVar, replaceIt.value()); - } - } - result.insert(key, val); - } - } - } - - return result; -} -} - BlackBerryQtVersion::BlackBerryQtVersion() : QnxAbstractQtVersion() { } -BlackBerryQtVersion::BlackBerryQtVersion(QnxArchitecture arch, const Utils::FileName &path, bool isAutoDetected, const QString &autoDetectionSource) +BlackBerryQtVersion::BlackBerryQtVersion(QnxArchitecture arch, const Utils::FileName &path, bool isAutoDetected, const QString &autoDetectionSource, const QString &sdkPath) : QnxAbstractQtVersion(arch, path, isAutoDetected, autoDetectionSource) { - setDisplayName(defaultDisplayName(qtVersionString(), path, false)); + if (QnxUtils::isValidNdkPath(sdkPath)) + setSdkPath(sdkPath); + else + setDefaultSdkPath(); } BlackBerryQtVersion::~BlackBerryQtVersion() @@ -174,12 +83,20 @@ QMultiMap<QString, QString> BlackBerryQtVersion::environment() const if (sdkPath().isEmpty()) return QMultiMap<QString, QString>(); - QString envFile; - if (Utils::HostOsInfo::isWindowsHost()) - envFile = sdkPath() + QLatin1String("/bbndk-env.bat"); - else if (Utils::HostOsInfo::isAnyUnixHost()) - envFile = sdkPath() + QLatin1String("/bbndk-env.sh"); - return parseEnvironmentFile(envFile); + return QnxUtils::parseEnvironmentFile(QnxUtils::envFilePath(sdkPath())); +} + +void BlackBerryQtVersion::setDefaultSdkPath() +{ + QHash<QString, QString> info = versionInfo(); + QString qtHostPrefix; + if (info.contains(QLatin1String("QT_HOST_PREFIX"))) + qtHostPrefix = info.value(QLatin1String("QT_HOST_PREFIX")); + else + return; + + if (QnxUtils::isValidNdkPath(qtHostPrefix)) + setSdkPath(qtHostPrefix); } Core::FeatureSet BlackBerryQtVersion::availableFeatures() const diff --git a/src/plugins/qnx/blackberryqtversion.h b/src/plugins/qnx/blackberryqtversion.h index 566d70537d..66291386ac 100644 --- a/src/plugins/qnx/blackberryqtversion.h +++ b/src/plugins/qnx/blackberryqtversion.h @@ -44,8 +44,9 @@ class BlackBerryQtVersion : public QnxAbstractQtVersion public: BlackBerryQtVersion(); BlackBerryQtVersion(QnxArchitecture arch, const Utils::FileName &path, - bool isAutoDetected = false, - const QString &autoDetectionSource = QString()); + bool isAutoDetected = false, + const QString &autoDetectionSource = QString(), + const QString &sdkPath = QString()); BlackBerryQtVersion *clone() const; ~BlackBerryQtVersion(); @@ -61,6 +62,7 @@ public: private: QMultiMap<QString, QString> environment() const; + void setDefaultSdkPath(); }; } // namespace Internal diff --git a/src/plugins/qnx/blackberrysettingspage.cpp b/src/plugins/qnx/blackberrysettingspage.cpp new file mode 100644 index 0000000000..beb3bc14b0 --- /dev/null +++ b/src/plugins/qnx/blackberrysettingspage.cpp @@ -0,0 +1,68 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "blackberrysettingspage.h" +#include "blackberrysettingswidget.h" +#include "qnxconstants.h" + +#include <projectexplorer/projectexplorerconstants.h> + +#include <QCoreApplication> + +namespace Qnx { +namespace Internal { + +BlackBerrySettingsPage::BlackBerrySettingsPage(QObject *parent) : + Core::IOptionsPage(parent) +{ + setId(QLatin1String(Constants::QNX_SETTINGS_ID)); + setDisplayName(tr("BlackBerry")); + setCategory(ProjectExplorer::Constants::PROJECTEXPLORER_SETTINGS_CATEGORY); + setDisplayCategory(QCoreApplication::translate("BlackBerry", + Constants::QNX_SETTINGS_TR_CATEGORY)); +} + +QWidget *BlackBerrySettingsPage::createPage(QWidget *parent) +{ + m_widget = new BlackBerrySettingsWidget(parent); + return m_widget; +} + +void BlackBerrySettingsPage::apply() +{ +} + +void BlackBerrySettingsPage::finish() +{ +} + +} // namespace Internal +} // namespace Qnx diff --git a/src/plugins/qnx/blackberrysettingspage.h b/src/plugins/qnx/blackberrysettingspage.h new file mode 100644 index 0000000000..866334387c --- /dev/null +++ b/src/plugins/qnx/blackberrysettingspage.h @@ -0,0 +1,58 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef BLACKBERRYSETTINGSPAGE_H +#define BLACKBERRYSETTINGSPAGE_H + +#include <coreplugin/dialogs/ioptionspage.h> + +namespace Qnx { +namespace Internal { + +class BlackBerrySettingsWidget; + +class BlackBerrySettingsPage : public Core::IOptionsPage +{ + Q_OBJECT +public: + explicit BlackBerrySettingsPage(QObject *parent = 0); + QWidget *createPage(QWidget *parent); + void apply(); + void finish(); + +private: + BlackBerrySettingsWidget *m_widget; +}; + +} // namespace Internal +} // namespace Qnx + +#endif // BLACKBERRYSETTINGSPAGE_H diff --git a/src/plugins/qnx/blackberrysettingswidget.cpp b/src/plugins/qnx/blackberrysettingswidget.cpp new file mode 100644 index 0000000000..4ab0d9fcfa --- /dev/null +++ b/src/plugins/qnx/blackberrysettingswidget.cpp @@ -0,0 +1,133 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#include "blackberrysettingswidget.h" +#include "ui_blackberrysettingswidget.h" +#include "qnxutils.h" + +#include <utils/pathchooser.h> + +#include <coreplugin/icore.h> + +#include <QMessageBox> + +namespace Qnx { +namespace Internal { + +BlackBerrySettingsWidget::BlackBerrySettingsWidget(QWidget *parent) : + QWidget(parent), + m_ui(new Ui_BlackBerrySettingsWidget) +{ + m_bbConfig = &BlackBerryConfiguration::instance(); + m_ui->setupUi(this); + m_ui->sdkPath->setExpectedKind(Utils::PathChooser::ExistingDirectory); + m_ui->sdkPath->setPath(m_bbConfig->ndkPath()); + + initInfoTable(); + + connect(m_ui->sdkPath, SIGNAL(changed(QString)), this, SLOT(checkSdkPath())); + connect(m_ui->removeButton, SIGNAL(clicked()), this, SLOT(cleanConfiguration())); + connect(m_bbConfig, SIGNAL(updated()), this, SLOT(updateInfoTable())); +} + +void BlackBerrySettingsWidget::checkSdkPath() +{ + if (!m_ui->sdkPath->path().isEmpty() && + QnxUtils::isValidNdkPath(m_ui->sdkPath->path())) + m_bbConfig->setupConfiguration(m_ui->sdkPath->path()); +} + +void BlackBerrySettingsWidget::updateInfoTable() +{ + QMultiMap<QString, QString> env = m_bbConfig->qnxEnv(); + + if (env.isEmpty()) { + // clear + clearInfoTable(); + return; + } + + m_infoModel->clear(); + m_infoModel->setHorizontalHeaderItem(0, new QStandardItem(QString(QLatin1String("Variable")))); + m_infoModel->setHorizontalHeaderItem(1, new QStandardItem(QString(QLatin1String("Value")))); + + m_ui->ndkInfosTableView->horizontalHeader()->setResizeMode(0, QHeaderView::ResizeToContents); + m_ui->ndkInfosTableView->horizontalHeader()->setStretchLastSection(true); + + QMultiMap<QString, QString>::const_iterator it; + QMultiMap<QString, QString>::const_iterator end(env.constEnd()); + for (it = env.constBegin(); it != end; ++it) { + const QString key = it.key(); + const QString value = it.value(); + QList <QStandardItem*> row; + row << new QStandardItem(key) << new QStandardItem(value); + m_infoModel->appendRow(row); + } + + m_infoModel->appendRow( QList<QStandardItem*>() << new QStandardItem(QString(QLatin1String("QMAKE"))) << new QStandardItem(m_bbConfig->qmakePath().toString())); + m_infoModel->appendRow( QList<QStandardItem*>() << new QStandardItem(QString(QLatin1String("COMPILER"))) << new QStandardItem(m_bbConfig->gccPath().toString())); + + m_ui->removeButton->setEnabled(true); +} + +void BlackBerrySettingsWidget::clearInfoTable() +{ + m_infoModel->clear(); + m_ui->sdkPath->setPath(QString()); + m_ui->removeButton->setEnabled(false); +} + +void BlackBerrySettingsWidget::cleanConfiguration() +{ + QMessageBox::StandardButton button = + QMessageBox::question(Core::ICore::mainWindow(), + tr("Clean BlackBerry 10 Configuration"), + tr("Are you sure you want to remove the current BlackBerry configuration?"), + QMessageBox::Yes | QMessageBox::No); + + if (button == QMessageBox::Yes) + m_bbConfig->cleanConfiguration(); +} + +void BlackBerrySettingsWidget::initInfoTable() +{ + m_infoModel = new QStandardItemModel(this); + + m_ui->ndkInfosTableView->setModel(m_infoModel); + m_ui->ndkInfosTableView->verticalHeader()->hide(); + m_ui->ndkInfosTableView->setEditTriggers(QAbstractItemView::NoEditTriggers); + + updateInfoTable(); +} + +} // namespace Internal +} // namespace Qnx + diff --git a/src/plugins/qnx/blackberrysettingswidget.h b/src/plugins/qnx/blackberrysettingswidget.h new file mode 100644 index 0000000000..218ccf102d --- /dev/null +++ b/src/plugins/qnx/blackberrysettingswidget.h @@ -0,0 +1,74 @@ +/************************************************************************** +** +** Copyright (C) 2011 - 2012 Research In Motion +** +** Contact: Research In Motion (blackberry-qt@qnx.com) +** Contact: KDAB (info@kdab.com) +** +** This file is part of Qt Creator. +** +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +****************************************************************************/ + +#ifndef BLACKBERRYSETTINGSWIDGET_H +#define BLACKBERRYSETTINGSWIDGET_H + +#include "blackberryconfiguration.h" + +#include <QWidget> +#include <QStandardItemModel> + + +namespace Qnx { +namespace Internal { + +class Ui_BlackBerrySettingsWidget; + + +class BlackBerrySettingsWidget : public QWidget +{ + Q_OBJECT +public: + explicit BlackBerrySettingsWidget(QWidget *parent = 0); + +signals: + void sdkPathChanged(); + +public slots: + void checkSdkPath(); + void updateInfoTable(); + void clearInfoTable(); + void cleanConfiguration(); + +private: + void initInfoTable(); + QString m_sdkPath; + Ui_BlackBerrySettingsWidget *m_ui; + BlackBerryConfiguration *m_bbConfig; + QStandardItemModel *m_infoModel; + +}; + +} // namespace Internal +} // namespeace Qnx + +#endif // BLACKBERRYSETTINGSWIDGET_H diff --git a/src/plugins/qnx/blackberrysettingswidget.ui b/src/plugins/qnx/blackberrysettingswidget.ui new file mode 100644 index 0000000000..a5e5d3b5d1 --- /dev/null +++ b/src/plugins/qnx/blackberrysettingswidget.ui @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8"?> +<ui version="4.0"> + <class>Qnx::Internal::BlackBerrySettingsWidget</class> + <widget class="QWidget" name="Qnx::Internal::BlackBerrySettingsWidget"> + <property name="geometry"> + <rect> + <x>0</x> + <y>0</y> + <width>794</width> + <height>473</height> + </rect> + </property> + <property name="windowTitle"> + <string>Form</string> + </property> + <layout class="QGridLayout" name="gridLayout"> + <item row="0" column="0"> + <layout class="QHBoxLayout" name="horizontalLayout"> + <item> + <widget class="QLabel" name="label"> + <property name="text"> + <string>BlackBerry NDK Path </string> + </property> + </widget> + </item> + <item> + <widget class="Utils::PathChooser" name="sdkPath" native="true"/> + </item> + </layout> + </item> + <item row="0" column="1"> + <layout class="QVBoxLayout" name="verticalLayout"> + <item> + <widget class="QPushButton" name="removeButton"> + <property name="text"> + <string>Remove</string> + </property> + </widget> + </item> + </layout> + </item> + <item row="1" column="0"> + <widget class="QTableView" name="ndkInfosTableView"/> + </item> + </layout> + </widget> + <customwidgets> + <customwidget> + <class>Utils::PathChooser</class> + <extends>QWidget</extends> + <header location="global">utils/pathchooser.h</header> + <container>1</container> + </customwidget> + </customwidgets> + <resources/> + <connections/> +</ui> diff --git a/src/plugins/qnx/qnx.pro b/src/plugins/qnx/qnx.pro index 7fd2b085d3..37564ba8db 100644 --- a/src/plugins/qnx/qnx.pro +++ b/src/plugins/qnx/qnx.pro @@ -52,7 +52,10 @@ SOURCES += qnxplugin.cpp \ qnxdeviceconfiguration.cpp \ blackberrydeployinformation.cpp \ pathchooserdelegate.cpp \ - blackberryabstractdeploystep.cpp + blackberryabstractdeploystep.cpp \ + blackberrysettingswidget.cpp \ + blackberrysettingspage.cpp \ + blackberryconfiguration.cpp HEADERS += qnxplugin.h\ qnxconstants.h \ @@ -101,7 +104,10 @@ HEADERS += qnxplugin.h\ qnxdeviceconfiguration.h \ blackberrydeployinformation.h \ pathchooserdelegate.h \ - blackberryabstractdeploystep.h + blackberryabstractdeploystep.h \ + blackberrysettingswidget.h \ + blackberrysettingspage.h \ + blackberryconfiguration.h FORMS += \ blackberrydeviceconfigurationwizardsetuppage.ui \ @@ -110,7 +116,8 @@ FORMS += \ blackberrydeployconfigurationwidget.ui \ blackberrydeviceconfigurationwidget.ui \ qnxbaseqtconfigwidget.ui \ - bardescriptorfileimagewizardpage.ui + bardescriptorfileimagewizardpage.ui \ + blackberrysettingswidget.ui RESOURCES += \ qnx.qrc diff --git a/src/plugins/qnx/qnxabstractqtversion.cpp b/src/plugins/qnx/qnxabstractqtversion.cpp index f45adcbb5c..6769a41e0b 100644 --- a/src/plugins/qnx/qnxabstractqtversion.cpp +++ b/src/plugins/qnx/qnxabstractqtversion.cpp @@ -30,9 +30,10 @@ ****************************************************************************/ #include "qnxabstractqtversion.h" - #include "qnxbaseqtconfigwidget.h" +#include "qnxutils.h" + #include <utils/environment.h> #include <utils/hostosinfo.h> @@ -51,7 +52,6 @@ QnxAbstractQtVersion::QnxAbstractQtVersion(QnxArchitecture arch, const Utils::Fi : QtSupport::BaseQtVersion(path, isAutoDetected, autoDetectionSource) , m_arch(arch) { - setDefaultSdkPath(); } QnxArchitecture QnxAbstractQtVersion::architecture() const @@ -69,7 +69,6 @@ QString QnxAbstractQtVersion::archString() const case UnknownArch: return QString(); } - return QString(); } @@ -97,25 +96,24 @@ QList<ProjectExplorer::Abi> QnxAbstractQtVersion::detectQtAbis() const void QnxAbstractQtVersion::addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const { QtSupport::BaseQtVersion::addToEnvironment(k, env); + updateEnvironment(); + QnxUtils::prependQnxMapToEnvironment(m_envMap, env); + env.prependOrSetLibrarySearchPath(versionInfo().value(QLatin1String("QT_INSTALL_LIBS"))); +} - if (!m_environmentUpToDate) - updateEnvironment(); - - QMultiMap<QString, QString>::const_iterator it; - QMultiMap<QString, QString>::const_iterator end(m_envMap.constEnd()); - for (it = m_envMap.constBegin(); it != end; ++it) { - const QString key = it.key(); - const QString value = it.value(); - - if (key == QLatin1String("PATH")) - env.prependOrSetPath(value); - else if (key == QLatin1String("LD_LIBRARY_PATH")) - env.prependOrSetLibrarySearchPath(value); - else - env.set(key, value); +Utils::Environment QnxAbstractQtVersion::qmakeRunEnvironment() const +{ + if (!m_environmentUpToDate && !sdkPath().isEmpty()) + { + // TODO: return Utils::Environment instead(?) + m_envMap = QnxUtils::parseEnvironmentFile(QnxUtils::envFilePath(sdkPath())); + m_environmentUpToDate = true; } - env.prependOrSetLibrarySearchPath(versionInfo().value(QLatin1String("QT_INSTALL_LIBS"))); + Utils::Environment env = Utils::Environment::systemEnvironment(); + QnxUtils::prependQnxMapToEnvironment(m_envMap, env); + + return env; } QString QnxAbstractQtVersion::sdkPath() const @@ -134,8 +132,10 @@ void QnxAbstractQtVersion::setSdkPath(const QString &sdkPath) void QnxAbstractQtVersion::updateEnvironment() const { - m_envMap = environment(); - m_environmentUpToDate = true; + if (!m_environmentUpToDate) { + m_envMap = environment(); + m_environmentUpToDate = true; + } } QString QnxAbstractQtVersion::qnxHost() const @@ -171,20 +171,3 @@ QString QnxAbstractQtVersion::invalidReason() const return QtSupport::BaseQtVersion::invalidReason(); } -void QnxAbstractQtVersion::setDefaultSdkPath() -{ - QHash<QString, QString> info = versionInfo(); - QString qtHostPrefix; - if (info.contains(QLatin1String("QT_HOST_PREFIX"))) - qtHostPrefix = info.value(QLatin1String("QT_HOST_PREFIX")); - else - return; - - QString envFile; - if (Utils::HostOsInfo::isWindowsHost()) - envFile = qtHostPrefix + QLatin1String("/bbndk-env.bat"); - else if (Utils::HostOsInfo::isAnyUnixHost()) - envFile = qtHostPrefix + QLatin1String("/bbndk-env.sh"); - if (QFileInfo(envFile).exists()) - setSdkPath(qtHostPrefix); -} diff --git a/src/plugins/qnx/qnxabstractqtversion.h b/src/plugins/qnx/qnxabstractqtversion.h index b72fd09641..6254f3f01b 100644 --- a/src/plugins/qnx/qnxabstractqtversion.h +++ b/src/plugins/qnx/qnxabstractqtversion.h @@ -63,6 +63,7 @@ public: QList<ProjectExplorer::Abi> detectQtAbis() const; void addToEnvironment(const ProjectExplorer::Kit *k, Utils::Environment &env) const; + Utils::Environment qmakeRunEnvironment() const; QtSupport::QtConfigWidget *createConfigurationWidget() const; @@ -70,17 +71,15 @@ public: QString invalidReason() const; virtual QString sdkDescription() const = 0; - void setDefaultSdkPath(); protected: QString sdkPath() const; + void setSdkPath(const QString &sdkPath); private: void updateEnvironment() const; virtual QMultiMap<QString, QString> environment() const = 0; - void setSdkPath(const QString &sdkPath); - QnxArchitecture m_arch; QString m_sdkPath; diff --git a/src/plugins/qnx/qnxconstants.h b/src/plugins/qnx/qnxconstants.h index 67fb99e3c9..dc6820d959 100644 --- a/src/plugins/qnx/qnxconstants.h +++ b/src/plugins/qnx/qnxconstants.h @@ -32,6 +32,8 @@ #ifndef QNX_QNXCONSTANTS_H #define QNX_QNXCONSTANTS_H +#include <QtGlobal> + namespace Qnx { enum QnxArchitecture { @@ -86,6 +88,9 @@ const char QNX_BB_PLATFORM_NAME[] = "BlackBerry"; const char QNX_DEBUG_EXECUTABLE[] = "pdebug"; +const char QNX_SETTINGS_ID[] = "ZZ.Qnx Configuration"; +const char QNX_SETTINGS_TR_CATEGORY[] = QT_TRANSLATE_NOOP("BlackBerry", "BlackBerry"); + } // namespace Constants } // namespace Qnx diff --git a/src/plugins/qnx/qnxplugin.cpp b/src/plugins/qnx/qnxplugin.cpp index 4867e34635..cd0940e42f 100644 --- a/src/plugins/qnx/qnxplugin.cpp +++ b/src/plugins/qnx/qnxplugin.cpp @@ -46,6 +46,7 @@ #include "qnxrunconfigurationfactory.h" #include "qnxqtversionfactory.h" #include "blackberrywizardextension.h" +#include "blackberrysettingspage.h" #include <QtPlugin> @@ -73,6 +74,7 @@ bool QNXPlugin::initialize(const QStringList &arguments, QString *errorString) addAutoReleasedObject(new BlackBerryRunConfigurationFactory); addAutoReleasedObject(new BlackBerryRunControlFactory); addAutoReleasedObject(new BlackBerryWizardExtension); + addAutoReleasedObject(new BlackBerrySettingsPage); // Handles QNX addAutoReleasedObject(new QnxQtVersionFactory); diff --git a/src/plugins/qnx/qnxutils.cpp b/src/plugins/qnx/qnxutils.cpp index 722e951960..1e118b6e3f 100644 --- a/src/plugins/qnx/qnxutils.cpp +++ b/src/plugins/qnx/qnxutils.cpp @@ -30,9 +30,10 @@ ****************************************************************************/ #include "qnxutils.h" - #include "qnxabstractqtversion.h" +#include <utils/hostosinfo.h> + #include <QDir> using namespace Qnx; @@ -73,3 +74,142 @@ QStringList QnxUtils::searchPaths(QnxAbstractQtVersion *qtVersion) return searchPaths; } + +QMultiMap<QString, QString> QnxUtils::parseEnvironmentFile(const QString &fileName) +{ + QMultiMap<QString, QString> result; + + QFile file(fileName); + if (!file.open(QIODevice::ReadOnly)) + return result; + + QTextStream str(&file); + QMap<QString, QString> fileContent; + while (!str.atEnd()) { + QString line = str.readLine(); + if (!line.contains(QLatin1Char('='))) + continue; + + int equalIndex = line.indexOf(QLatin1Char('=')); + QString var = line.left(equalIndex); + //Remove set in front + if (var.startsWith(QLatin1String("set "))) + var = var.right(var.size() - 4); + + QString value = line.mid(equalIndex + 1); + + if (Utils::HostOsInfo::isWindowsHost()) { + QRegExp systemVarRegExp(QLatin1String("IF NOT DEFINED ([\\w\\d]+)\\s+set ([\\w\\d]+)=([\\w\\d]+)")); + if (line.contains(systemVarRegExp)) { + var = systemVarRegExp.cap(2); + Utils::Environment sysEnv = Utils::Environment::systemEnvironment(); + QString sysVar = systemVarRegExp.cap(1); + if (sysEnv.hasKey(sysVar)) + value = sysEnv.value(sysVar); + else + value = systemVarRegExp.cap(3); + } + } + else if (Utils::HostOsInfo::isAnyUnixHost()) { + QRegExp systemVarRegExp(QLatin1String("\\$\\{([\\w\\d]+):=([\\w\\d]+)\\}")); // to match e.g. "${QNX_HOST_VERSION:=10_0_9_52}" + if (value.contains(systemVarRegExp)) { + Utils::Environment sysEnv = Utils::Environment::systemEnvironment(); + QString sysVar = systemVarRegExp.cap(1); + if (sysEnv.hasKey(sysVar)) + value = sysEnv.value(sysVar); + else + value = systemVarRegExp.cap(2); + } + } + + if (value.startsWith(QLatin1Char('"'))) + value = value.mid(1); + if (value.endsWith(QLatin1Char('"'))) + value = value.left(value.size() - 1); + + fileContent[var] = value; + } + file.close(); + + QMapIterator<QString, QString> it(fileContent); + while (it.hasNext()) { + it.next(); + QStringList values; + if (Utils::HostOsInfo::isWindowsHost()) + values = it.value().split(QLatin1Char(';')); + else if (Utils::HostOsInfo::isAnyUnixHost()) + values = it.value().split(QLatin1Char(':')); + + QString key = it.key(); + foreach (const QString &value, values) { + const QString ownKeyAsWindowsVar = QLatin1Char('%') + key + QLatin1Char('%'); + const QString ownKeyAsUnixVar = QLatin1Char('$') + key; + if (value != ownKeyAsUnixVar && value != ownKeyAsWindowsVar) { // to ignore e.g. PATH=$PATH + QString val = value; + if (val.contains(QLatin1Char('%')) || val.contains(QLatin1Char('$'))) { + QMapIterator<QString, QString> replaceIt(fileContent); + while (replaceIt.hasNext()) { + replaceIt.next(); + const QString replaceKey = replaceIt.key(); + if (replaceKey == key) + continue; + + const QString keyAsWindowsVar = QLatin1Char('%') + replaceKey + QLatin1Char('%'); + const QString keyAsUnixVar = QLatin1Char('$') + replaceKey; + if (val.contains(keyAsWindowsVar)) + val.replace(keyAsWindowsVar, replaceIt.value()); + if (val.contains(keyAsUnixVar)) + val.replace(keyAsUnixVar, replaceIt.value()); + } + } + result.insert(key, val); + } + } + } + + if (!result.contains(QLatin1String("CPUVARDIR"))) + result.insert(QLatin1String("CPUVARDIR"), QLatin1String("armle-v7")); + + return result; +} + +bool QnxUtils::isValidNdkPath(const QString &ndkPath) +{ + return (QFileInfo(envFilePath(ndkPath)).exists()); +} + +QString QnxUtils::envFilePath(const QString &ndkPath) +{ + QString envFile; + if (Utils::HostOsInfo::isWindowsHost()) + envFile = ndkPath + QLatin1String("/bbndk-env.bat"); + else if (Utils::HostOsInfo::isAnyUnixHost()) + envFile = ndkPath + QLatin1String("/bbndk-env.sh"); + + return envFile; +} + +void QnxUtils::prependQnxMapToEnvironment(const QMultiMap<QString, QString> &qnxMap, Utils::Environment &env) +{ + QMultiMap<QString, QString>::const_iterator it; + QMultiMap<QString, QString>::const_iterator end(qnxMap.constEnd()); + for (it = qnxMap.constBegin(); it != end; ++it) { + const QString key = it.key(); + const QString value = it.value(); + + if (key == QLatin1String("PATH")) + env.prependOrSetPath(value); + else if (key == QLatin1String("LD_LIBRARY_PATH")) + env.prependOrSetLibrarySearchPath(value); + else + env.set(key, value); + } +} + +Utils::FileName QnxUtils::executableWithExtension(const Utils::FileName &fileName) +{ + Utils::FileName result = fileName; + if (Utils::HostOsInfo::isWindowsHost()) + result.append(QLatin1String(".exe")); + return result; +} diff --git a/src/plugins/qnx/qnxutils.h b/src/plugins/qnx/qnxutils.h index d67d8d9b8c..58804708e7 100644 --- a/src/plugins/qnx/qnxutils.h +++ b/src/plugins/qnx/qnxutils.h @@ -34,6 +34,11 @@ #include "qnxconstants.h" +#include <utils/environment.h> +#include <utils/qtcassert.h> +#include <utils/fileutils.h> + +#include <QTextStream> #include <QString> namespace Qnx { @@ -47,6 +52,11 @@ public: static QString addQuotes(const QString &string); static Qnx::QnxArchitecture cpudirToArch(const QString &cpuDir); static QStringList searchPaths(QnxAbstractQtVersion *qtVersion); + static QMultiMap<QString, QString> parseEnvironmentFile(const QString &fileName); + static bool isValidNdkPath(const QString & ndkPath); + static QString envFilePath(const QString & ndkPath); + static void prependQnxMapToEnvironment(const QMultiMap<QString, QString> &qnxMap, Utils::Environment &env); + static Utils::FileName executableWithExtension(const Utils::FileName &fileName); }; } // namespace Internal |