forked from qt-creator/qt-creator
QtVersion: Add support code for the sdk
This commit is contained in:
@@ -332,6 +332,11 @@ QString BaseQtVersion::autodetectionSource() const
|
|||||||
return m_autodetectionSource;
|
return m_autodetectionSource;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void BaseQtVersion::setAutoDetectionSource(const QString &autodetectionSource)
|
||||||
|
{
|
||||||
|
m_autodetectionSource = autodetectionSource;
|
||||||
|
}
|
||||||
|
|
||||||
QString BaseQtVersion::displayName() const
|
QString BaseQtVersion::displayName() const
|
||||||
{
|
{
|
||||||
return m_displayName;
|
return m_displayName;
|
||||||
|
|||||||
@@ -202,6 +202,7 @@ protected:
|
|||||||
void ensureMkSpecParsed() const;
|
void ensureMkSpecParsed() const;
|
||||||
virtual void parseMkSpec(ProFileEvaluator *) const;
|
virtual void parseMkSpec(ProFileEvaluator *) const;
|
||||||
private:
|
private:
|
||||||
|
void setAutoDetectionSource(const QString &autodetectionSource);
|
||||||
static int getUniqueId();
|
static int getUniqueId();
|
||||||
void ctor(const QString &qmakePath);
|
void ctor(const QString &qmakePath);
|
||||||
void updateSourcePath() const;
|
void updateSourcePath() const;
|
||||||
|
|||||||
@@ -732,6 +732,7 @@ void QtOptionsPageWidget::updateWidgets()
|
|||||||
m_configurationWidget = version->createConfigurationWidget();
|
m_configurationWidget = version->createConfigurationWidget();
|
||||||
if (m_configurationWidget) {
|
if (m_configurationWidget) {
|
||||||
m_versionUi->formLayout->addRow(m_configurationWidget);
|
m_versionUi->formLayout->addRow(m_configurationWidget);
|
||||||
|
m_configurationWidget->setEnabled(!version->isAutodetected());
|
||||||
connect(m_configurationWidget, SIGNAL(changed()),
|
connect(m_configurationWidget, SIGNAL(changed()),
|
||||||
this, SLOT(qtVersionChanged()));
|
this, SLOT(qtVersionChanged()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -73,6 +73,10 @@ using ProjectExplorer::DebuggingHelperLibrary;
|
|||||||
static const char QTVERSION_DATA_KEY[] = "QtVersion.";
|
static const char QTVERSION_DATA_KEY[] = "QtVersion.";
|
||||||
static const char QTVERSION_TYPE_KEY[] = "QtVersion.Type";
|
static const char QTVERSION_TYPE_KEY[] = "QtVersion.Type";
|
||||||
static const char QTVERSION_COUNT_KEY[] = "QtVersion.Count";
|
static const char QTVERSION_COUNT_KEY[] = "QtVersion.Count";
|
||||||
|
static const char OLDQTVERSION_COUNT_KEY[] = "QtVersion.Old.Count";
|
||||||
|
static const char OLDQTVERSION_DATA_KEY[] = "QtVersion.Old.";
|
||||||
|
static const char OLDQTVERSION_SDKSOURCE[] = "QtVersion.Old.SdkSource";
|
||||||
|
static const char OLDQTVERSION_PATH[] = "QtVersion.Old.Path";
|
||||||
static const char QTVERSION_FILE_VERSION_KEY[] = "Version";
|
static const char QTVERSION_FILE_VERSION_KEY[] = "Version";
|
||||||
static const char QTVERSION_FILENAME[] = "/qtversion.xml";
|
static const char QTVERSION_FILENAME[] = "/qtversion.xml";
|
||||||
|
|
||||||
@@ -202,8 +206,146 @@ bool QtVersionManager::restoreQtVersions()
|
|||||||
|
|
||||||
void QtVersionManager::updateFromInstaller()
|
void QtVersionManager::updateFromInstaller()
|
||||||
{
|
{
|
||||||
// TODO implement for the sdk
|
bool debug = true;
|
||||||
|
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
|
||||||
|
QList<QtVersionFactory *> factories = pm->getObjects<QtVersionFactory>();
|
||||||
|
ProjectExplorer::PersistentSettingsReader reader;
|
||||||
|
if (!reader.load(Core::ICore::instance()->resourcePath()
|
||||||
|
+ QLatin1String("/Nokia") + QLatin1String(QTVERSION_FILENAME)))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
QVariantMap data = reader.restoreValues();
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
qDebug()<< "======= Existing qt versions =======";
|
||||||
|
foreach (BaseQtVersion *version, m_versions) {
|
||||||
|
qDebug() << version->qmakeCommand() << "id:"<<version->uniqueId();
|
||||||
|
qDebug() << " autodetection source:"<< version->autodetectionSource();
|
||||||
|
qDebug() << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int oldcount = data.value(QLatin1String(OLDQTVERSION_COUNT_KEY), 0).toInt();
|
||||||
|
for (int i=0; i < oldcount; ++i) {
|
||||||
|
const QString key = QString::fromLatin1(OLDQTVERSION_DATA_KEY) +QString::number(i);
|
||||||
|
if (!data.contains(key))
|
||||||
|
break;
|
||||||
|
QVariantMap map = data.value(key).toMap();
|
||||||
|
QString path = map.value(OLDQTVERSION_PATH).toString();
|
||||||
|
#ifdef Q_OS_WIN
|
||||||
|
path = path.toLower();
|
||||||
|
#endif
|
||||||
|
QString autodetectionSource = map.value(OLDQTVERSION_SDKSOURCE).toString();
|
||||||
|
foreach (BaseQtVersion *v, m_versions) {
|
||||||
|
if (v->qmakeCommand() == path) {
|
||||||
|
if (v->autodetectionSource().isEmpty()) {
|
||||||
|
v->setAutoDetectionSource(autodetectionSource);
|
||||||
|
} else {
|
||||||
|
if (debug)
|
||||||
|
qDebug() << "## Conflicting autodetictonSource for"<<path<<"\n"
|
||||||
|
<<" version retains"<<v->autodetectionSource();
|
||||||
|
}
|
||||||
|
// No break, we want to mark all qt versions matching that path
|
||||||
|
// There's no way for us to decide whether this qt was added
|
||||||
|
// by the user or by the installer, so we treat them all as coming
|
||||||
|
// from the installer. Thus removing/updating them deletes/updates them all
|
||||||
|
// Note: This only applies to versions that are marked via QtVersion.Old
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
qDebug()<< "======= After using OLD QtVersion data to mark versions =======";
|
||||||
|
foreach (BaseQtVersion *version, m_versions) {
|
||||||
|
qDebug() << version->qmakeCommand() << "id:"<<version->uniqueId();
|
||||||
|
qDebug() << " autodetection source:"<< version->autodetectionSource();
|
||||||
|
qDebug() << "";
|
||||||
|
}
|
||||||
|
|
||||||
|
qDebug()<< "======= Adding sdk versions =======";
|
||||||
|
}
|
||||||
|
QStringList sdkVersions;
|
||||||
|
int count = data.value(QLatin1String(QTVERSION_COUNT_KEY), 0).toInt();
|
||||||
|
for (int i = 0; i < count; ++i) {
|
||||||
|
const QString key = QString::fromLatin1(QTVERSION_DATA_KEY) + QString::number(i);
|
||||||
|
if (!data.contains(key))
|
||||||
|
break;
|
||||||
|
|
||||||
|
QVariantMap qtversionMap = data.value(key).toMap();
|
||||||
|
const QString type = qtversionMap.value(QTVERSION_TYPE_KEY).toString();
|
||||||
|
const QString autoDetectionSource = qtversionMap.value(QLatin1String("autodetectionSource")).toString();
|
||||||
|
sdkVersions << autoDetectionSource;
|
||||||
|
int id = -1; // see BaseQtVersion::fromMap()
|
||||||
|
QtVersionFactory *factory = 0;
|
||||||
|
foreach (QtVersionFactory *f, factories) {
|
||||||
|
if (f->canRestore(type)) {
|
||||||
|
factory = f;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!factory) {
|
||||||
|
if (debug)
|
||||||
|
qDebug("Warning: Unable to find factory for type '%s'", qPrintable(type));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// First try to find a existing qt version to update
|
||||||
|
bool restored = false;
|
||||||
|
foreach (BaseQtVersion *v, m_versions) {
|
||||||
|
if (v->autodetectionSource() == autoDetectionSource) {
|
||||||
|
id = v->uniqueId();
|
||||||
|
if (debug)
|
||||||
|
qDebug() << " Qt version found with same autodetection source" << autoDetectionSource << " => Migrating id:" << id;
|
||||||
|
removeVersion(v);
|
||||||
|
qtversionMap[QLatin1String("Id")] = id;
|
||||||
|
|
||||||
|
if (BaseQtVersion *qtv = factory->restore(qtversionMap)) {
|
||||||
|
Q_ASSERT(qtv->isAutodetected());
|
||||||
|
addVersion(qtv);
|
||||||
|
restored = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Create a new qtversion
|
||||||
|
if (!restored) { // didn't replace any existing versions
|
||||||
|
if (debug)
|
||||||
|
qDebug() << " No Qt version found matching" << autoDetectionSource << " => Creating new version";
|
||||||
|
if (BaseQtVersion *qtv = factory->restore(qtversionMap)) {
|
||||||
|
Q_ASSERT(qtv->isAutodetected());
|
||||||
|
addVersion(qtv);
|
||||||
|
restored = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!restored)
|
||||||
|
if (debug)
|
||||||
|
qDebug("Warning: Unable to update qtversion '%s' from sdk installer.",
|
||||||
|
qPrintable(autoDetectionSource));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
qDebug() << "======= Before removing outdated sdk versions =======";
|
||||||
|
foreach (BaseQtVersion *version, m_versions) {
|
||||||
|
qDebug() << version->qmakeCommand() << "id:"<<version->uniqueId();
|
||||||
|
qDebug() << " autodetection source:"<< version->autodetectionSource();
|
||||||
|
qDebug() << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
foreach (BaseQtVersion *qtVersion, QtVersionManager::instance()->versions()) {
|
||||||
|
if (qtVersion->autodetectionSource().startsWith("SDK.")) {
|
||||||
|
if (!sdkVersions.contains(qtVersion->autodetectionSource())) {
|
||||||
|
if (debug)
|
||||||
|
qDebug() << " removing version"<<qtVersion->autodetectionSource();
|
||||||
|
removeVersion(qtVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (debug) {
|
||||||
|
qDebug()<< "======= End result =======";
|
||||||
|
foreach (BaseQtVersion *version, m_versions) {
|
||||||
|
qDebug() << version->qmakeCommand() << "id:"<<version->uniqueId();
|
||||||
|
qDebug() << " autodetection source:"<< version->autodetectionSource();
|
||||||
|
qDebug() << "";
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void QtVersionManager::saveQtVersions()
|
void QtVersionManager::saveQtVersions()
|
||||||
|
|||||||
Reference in New Issue
Block a user