Use QUuids to identify tool chains

Save/Restore has been updated to reflect this:

We now save manual as well as auto-detected tool chains into the user
toolChains.xml file.

When loading we load the SDK as well as the user toolChains.xml files.
We then do a autodetection run. All the tool chains restored that are
marked up as auto-detected are then checked again:
 * the tool chain was autodetected again: Throw away the newly auto-
   detected tool chain and reuse the saved one. This makes sure we
   keep the QUuid that is now part of the tool chains id.
 * the tool chain was not autodetected again: Throw away the saved
   tool chain.
 * the tool chain was newly autodetected: Add the new tool chain

We keep the old id around in the legacyId() method. It is used when
loading old .user files only. So there is no need to implement this
method for new tool chains.

Task-number: QTCREATORBUG-6702

Change-Id: Ifc0a216e5351a8a57db03615ba329e355e7d5f59
Reviewed-by: Daniel Teske <daniel.teske@nokia.com>
This commit is contained in:
Tobias Hunger
2011-12-19 12:06:44 +01:00
parent 97496df1bf
commit 52b47364de
20 changed files with 156 additions and 113 deletions

View File

@@ -61,9 +61,7 @@ static const char *const MAEMO_QT_VERSION_KEY = "Qt4ProjectManager.Maemo.QtVersi
MaemoToolChain::MaemoToolChain(bool autodetected) : MaemoToolChain::MaemoToolChain(bool autodetected) :
ProjectExplorer::GccToolChain(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID), autodetected), ProjectExplorer::GccToolChain(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID), autodetected),
m_qtVersionId(-1) m_qtVersionId(-1)
{ { }
updateId();
}
MaemoToolChain::MaemoToolChain(const MaemoToolChain &tc) : MaemoToolChain::MaemoToolChain(const MaemoToolChain &tc) :
ProjectExplorer::GccToolChain(tc), ProjectExplorer::GccToolChain(tc),
@@ -78,11 +76,6 @@ QString MaemoToolChain::typeName() const
return MaemoToolChainFactory::tr("Maemo GCC"); return MaemoToolChainFactory::tr("Maemo GCC");
} }
ProjectExplorer::Abi MaemoToolChain::targetAbi() const
{
return m_targetAbi;
}
Utils::FileName MaemoToolChain::mkspec() const Utils::FileName MaemoToolChain::mkspec() const
{ {
return Utils::FileName(); // always use default return Utils::FileName(); // always use default
@@ -90,7 +83,7 @@ Utils::FileName MaemoToolChain::mkspec() const
bool MaemoToolChain::isValid() const bool MaemoToolChain::isValid() const
{ {
return GccToolChain::isValid() && m_qtVersionId >= 0 && m_targetAbi.isValid(); return GccToolChain::isValid() && m_qtVersionId >= 0 && targetAbi().isValid();
} }
bool MaemoToolChain::canClone() const bool MaemoToolChain::canClone() const
@@ -144,9 +137,9 @@ bool MaemoToolChain::fromMap(const QVariantMap &data)
void MaemoToolChain::setQtVersionId(int id) void MaemoToolChain::setQtVersionId(int id)
{ {
if (id < 0) { if (id < 0) {
m_targetAbi = ProjectExplorer::Abi(); setTargetAbi(ProjectExplorer::Abi());
m_qtVersionId = -1; m_qtVersionId = -1;
updateId(); // Will trigger toolChainUpdated()! toolChainUpdated();
return; return;
} }
@@ -157,9 +150,10 @@ void MaemoToolChain::setQtVersionId(int id)
Q_ASSERT(version->qtAbis().count() == 1); Q_ASSERT(version->qtAbis().count() == 1);
m_qtVersionId = id; m_qtVersionId = id;
m_targetAbi = version->qtAbis().at(0); setTargetAbi(version->qtAbis().at(0));
toolChainUpdated();
updateId(); // Will trigger toolChainUpdated()!
setDisplayName(MaemoToolChainFactory::tr("Maemo GCC for %1").arg(version->displayName())); setDisplayName(MaemoToolChainFactory::tr("Maemo GCC for %1").arg(version->displayName()));
} }
@@ -168,10 +162,11 @@ int MaemoToolChain::qtVersionId() const
return m_qtVersionId; return m_qtVersionId;
} }
void MaemoToolChain::updateId() QString MaemoToolChain::legacyId() const
{ {
setId(QString::fromLatin1("%1:%2.%3").arg(Constants::MAEMO_TOOLCHAIN_ID) return QString::fromLatin1("%1:%2.%3").arg(Constants::MAEMO_TOOLCHAIN_ID)
.arg(m_qtVersionId).arg(debuggerCommand().toString())); .arg(m_qtVersionId)
.arg(debuggerCommand().toString());
} }
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
@@ -241,6 +236,21 @@ QList<ProjectExplorer::ToolChain *> MaemoToolChainFactory::autoDetect()
return createToolChainList(versionList); return createToolChainList(versionList);
} }
bool MaemoToolChainFactory::canRestore(const QVariantMap &data)
{
return idFromMap(data).startsWith(QLatin1String(Constants::MAEMO_TOOLCHAIN_ID) + QLatin1Char(':'));
}
ProjectExplorer::ToolChain *MaemoToolChainFactory::restore(const QVariantMap &data)
{
MaemoToolChain *tc = new MaemoToolChain(false);
if (tc->fromMap(data))
return tc;
delete tc;
return 0;
}
void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &changes) void MaemoToolChainFactory::handleQtVersionChanges(const QList<int> &changes)
{ {
ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance(); ProjectExplorer::ToolChainManager *tcm = ProjectExplorer::ToolChainManager::instance();

View File

@@ -49,7 +49,6 @@ public:
~MaemoToolChain(); ~MaemoToolChain();
QString typeName() const; QString typeName() const;
ProjectExplorer::Abi targetAbi() const;
Utils::FileName mkspec() const; Utils::FileName mkspec() const;
bool isValid() const; bool isValid() const;
@@ -67,15 +66,14 @@ public:
void setQtVersionId(int); void setQtVersionId(int);
int qtVersionId() const; int qtVersionId() const;
private: QString legacyId() const;
void updateId();
private:
explicit MaemoToolChain(bool); explicit MaemoToolChain(bool);
MaemoToolChain(const MaemoToolChain &); MaemoToolChain(const MaemoToolChain &);
int m_qtVersionId; int m_qtVersionId;
mutable QString m_sysroot; mutable QString m_sysroot;
ProjectExplorer::Abi m_targetAbi;
friend class MaemoToolChainFactory; friend class MaemoToolChainFactory;
}; };
@@ -112,6 +110,9 @@ public:
QList<ProjectExplorer::ToolChain *> autoDetect(); QList<ProjectExplorer::ToolChain *> autoDetect();
bool canRestore(const QVariantMap &data);
ProjectExplorer::ToolChain *restore(const QVariantMap &data);
private slots: private slots:
void handleQtVersionChanges(const QList<int> &); void handleQtVersionChanges(const QList<int> &);
QList<ProjectExplorer::ToolChain *> createToolChainList(const QList<int> &); QList<ProjectExplorer::ToolChain *> createToolChainList(const QList<int> &);

View File

@@ -132,7 +132,6 @@ void AbstractMsvcToolChain::setDebuggerCommand(const Utils::FileName &d)
if (m_debuggerCommand == d) if (m_debuggerCommand == d)
return; return;
m_debuggerCommand = d; m_debuggerCommand = d;
updateId();
toolChainUpdated(); toolChainUpdated();
} }

View File

@@ -68,7 +68,6 @@ public:
protected: protected:
virtual Utils::Environment readEnvironmentSetting(Utils::Environment& env) const = 0; virtual Utils::Environment readEnvironmentSetting(Utils::Environment& env) const = 0;
virtual QByteArray msvcPredefinedMacros(const Utils::Environment& env) const; virtual QByteArray msvcPredefinedMacros(const Utils::Environment& env) const;
virtual void updateId() = 0;
bool generateEnvironmentSettings(Utils::Environment &env, bool generateEnvironmentSettings(Utils::Environment &env,
const QString& batchFile, const QString& batchFile,

View File

@@ -43,6 +43,7 @@
#include <coreplugin/variablemanager.h> #include <coreplugin/variablemanager.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h> #include <utils/stringutils.h>
#include <QtCore/QProcess> #include <QtCore/QProcess>
@@ -194,12 +195,13 @@ bool BuildConfiguration::fromMap(const QVariantMap &map)
m_stepLists.append(list); m_stepLists.append(list);
} }
QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString(); const QString id = map.value(QLatin1String(TOOLCHAIN_KEY)).toString();
m_toolChain = ToolChainManager::instance()->findToolChain(id); setToolChain(ToolChainManager::instance()->findToolChain(id)); // Do not validate the tool chain as
// the BC is not completely set up yet!
// TODO: We currently assume there to be at least a clean and build list! // TODO: We currently assume there to be at least a clean and build list!
Q_ASSERT(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_BUILD))); QTC_CHECK(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_BUILD)));
Q_ASSERT(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_CLEAN))); QTC_CHECK(knownStepLists().contains(QLatin1String(ProjectExplorer::Constants::BUILDSTEPS_CLEAN)));
return ProjectConfiguration::fromMap(map); return ProjectConfiguration::fromMap(map);
} }

View File

@@ -308,13 +308,13 @@ QString GccToolChain::defaultDisplayName() const
ProjectExplorer::Abi::toString(m_targetAbi.wordWidth())); ProjectExplorer::Abi::toString(m_targetAbi.wordWidth()));
} }
void GccToolChain::updateId() QString GccToolChain::legacyId() const
{ {
QString i = id(); QString i = id();
i = i.left(i.indexOf(QLatin1Char(':'))); i = i.left(i.indexOf(QLatin1Char(':')));
setId(QString::fromLatin1("%1:%2.%3.%4") return QString::fromLatin1("%1:%2.%3.%4")
.arg(i).arg(m_compilerPath) .arg(i).arg(m_compilerPath)
.arg(m_targetAbi.toString()).arg(m_debuggerCommand.toString())); .arg(m_targetAbi.toString()).arg(m_debuggerCommand.toString());
} }
QString GccToolChain::typeName() const QString GccToolChain::typeName() const
@@ -341,7 +341,6 @@ void GccToolChain::setTargetAbi(const Abi &abi)
updateSupportedAbis(); updateSupportedAbis();
m_targetAbi = abi; m_targetAbi = abi;
updateId();
toolChainUpdated(); toolChainUpdated();
} }
@@ -389,7 +388,6 @@ void GccToolChain::setDebuggerCommand(const Utils::FileName &d)
if (m_debuggerCommand == d) if (m_debuggerCommand == d)
return; return;
m_debuggerCommand = d; m_debuggerCommand = d;
updateId();
toolChainUpdated(); toolChainUpdated();
} }
@@ -469,7 +467,7 @@ void GccToolChain::setCompilerPath(const QString &path)
if (resetDisplayName) if (resetDisplayName)
setDisplayName(defaultDisplayName()); setDisplayName(defaultDisplayName());
} }
updateId(); // Will trigger toolChainUpdated()! toolChainUpdated();
} }
QString GccToolChain::compilerPath() const QString GccToolChain::compilerPath() const
@@ -511,7 +509,6 @@ bool GccToolChain::fromMap(const QVariantMap &data)
m_supportedAbis.append(abi); m_supportedAbis.append(abi);
} }
m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString());
updateId();
return true; return true;
} }

View File

@@ -54,6 +54,8 @@ class LinuxIccToolChainFactory;
class PROJECTEXPLORER_EXPORT GccToolChain : public ToolChain class PROJECTEXPLORER_EXPORT GccToolChain : public ToolChain
{ {
public: public:
QString legacyId() const;
QString typeName() const; QString typeName() const;
Abi targetAbi() const; Abi targetAbi() const;
QString version() const; QString version() const;
@@ -89,8 +91,6 @@ protected:
QString defaultDisplayName() const; QString defaultDisplayName() const;
void updateId();
virtual QList<Abi> detectSupportedAbis() const; virtual QList<Abi> detectSupportedAbis() const;
virtual QString detectVersion() const; virtual QString detectVersion() const;

View File

@@ -288,7 +288,6 @@ MsvcToolChain::MsvcToolChain(const QString &name, const Abi &abi,
{ {
Q_ASSERT(!name.isEmpty()); Q_ASSERT(!name.isEmpty());
updateId();
setDisplayName(name); setDisplayName(name);
} }
@@ -306,7 +305,7 @@ MsvcToolChain *MsvcToolChain::readFromMap(const QVariantMap &data)
return 0; return 0;
} }
void MsvcToolChain::updateId() QString MsvcToolChain::legacyId() const
{ {
const QChar colon = QLatin1Char(':'); const QChar colon = QLatin1Char(':');
QString id = QLatin1String(Constants::MSVC_TOOLCHAIN_ID); QString id = QLatin1String(Constants::MSVC_TOOLCHAIN_ID);
@@ -316,7 +315,7 @@ void MsvcToolChain::updateId()
id += m_varsBatArg; id += m_varsBatArg;
id += colon; id += colon;
id += m_debuggerCommand.toString(); id += m_debuggerCommand.toString();
setId(id); return id;
} }
QString MsvcToolChain::typeName() const QString MsvcToolChain::typeName() const
@@ -356,7 +355,6 @@ bool MsvcToolChain::fromMap(const QVariantMap &data)
m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString());
const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString();
m_abi = Abi(abiString); m_abi = Abi(abiString);
updateId();
return !m_vcvarsBat.isEmpty() && m_abi.isValid(); return !m_vcvarsBat.isEmpty() && m_abi.isValid();
} }

View File

@@ -56,6 +56,7 @@ public:
MsvcToolChain(const QString &name, const Abi &abi, MsvcToolChain(const QString &name, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, bool autodetect = false); const QString &varsBat, const QString &varsBatArg, bool autodetect = false);
QString legacyId() const;
static MsvcToolChain *readFromMap(const QVariantMap &data); static MsvcToolChain *readFromMap(const QVariantMap &data);
@@ -79,7 +80,6 @@ protected:
private: private:
MsvcToolChain(); MsvcToolChain();
void updateId();
QString m_varsBatArg; // Argument QString m_varsBatArg; // Argument
}; };

View File

@@ -38,9 +38,11 @@
#include <utils/environment.h> #include <utils/environment.h>
#include <QtCore/QCoreApplication> #include <QtCore/QCoreApplication>
#include <QtCore/QUuid>
static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id"; static const char ID_KEY[] = "ProjectExplorer.ToolChain.Id";
static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName"; static const char DISPLAY_NAME_KEY[] = "ProjectExplorer.ToolChain.DisplayName";
static const char AUTODETECT_KEY[] = "ProjectExplorer.ToolChain.Autodetect";
namespace ProjectExplorer { namespace ProjectExplorer {
namespace Internal { namespace Internal {
@@ -53,9 +55,22 @@ class ToolChainPrivate
{ {
public: public:
ToolChainPrivate(const QString &id, bool autodetect) : ToolChainPrivate(const QString &id, bool autodetect) :
m_id(id),
m_autodetect(autodetect) m_autodetect(autodetect)
{ Q_ASSERT(!id.isEmpty()); } {
m_id = createId(id);
}
static QString createId(const QString &id)
{
QString newId = id;
QUuid uuid(id.mid(id.indexOf(":") + 1));
if (uuid.isNull()) {
newId = id.left(id.indexOf(':'));
newId.append(QLatin1Char(':') + QUuid::createUuid().toString());
}
return newId;
}
QString m_id; QString m_id;
bool m_autodetect; bool m_autodetect;
@@ -141,7 +156,11 @@ bool ToolChain::operator == (const ToolChain &tc) const
if (this == &tc) if (this == &tc)
return true; return true;
return id() == tc.id(); const QString thisId = id().left(id().indexOf(QLatin1Char(':')));
const QString tcId = tc.id().left(tc.id().indexOf(QLatin1Char(':')));
// We ignore displayname
return thisId == tcId && isAutoDetected() == tc.isAutoDetected();
} }
/*! /*!
@@ -153,25 +172,13 @@ bool ToolChain::operator == (const ToolChain &tc) const
QVariantMap ToolChain::toMap() const QVariantMap ToolChain::toMap() const
{ {
QVariantMap result; QVariantMap result;
if (isAutoDetected())
return result;
result.insert(QLatin1String(ID_KEY), id()); result.insert(QLatin1String(ID_KEY), id());
result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName()); result.insert(QLatin1String(DISPLAY_NAME_KEY), displayName());
result.insert(QLatin1String(AUTODETECT_KEY), isAutoDetected());
return result; return result;
} }
void ToolChain::setId(const QString &id)
{
Q_ASSERT(!id.isEmpty());
if (d->m_id == id)
return;
d->m_id = id;
toolChainUpdated();
}
void ToolChain::toolChainUpdated() void ToolChain::toolChainUpdated()
{ {
ToolChainManager::instance()->notifyAboutUpdate(this); ToolChainManager::instance()->notifyAboutUpdate(this);
@@ -193,9 +200,10 @@ void ToolChain::setAutoDetected(bool autodetect)
bool ToolChain::fromMap(const QVariantMap &data) bool ToolChain::fromMap(const QVariantMap &data)
{ {
Q_ASSERT(!isAutoDetected());
// do not read the id: That is already set anyway.
d->m_displayName = data.value(QLatin1String(DISPLAY_NAME_KEY)).toString(); d->m_displayName = data.value(QLatin1String(DISPLAY_NAME_KEY)).toString();
// make sure we have new style ids:
d->m_id = Internal::ToolChainPrivate::createId(data.value(QLatin1String(ID_KEY)).toString());
d->m_autodetect = data.value(QLatin1String(AUTODETECT_KEY), false).toBool();
return true; return true;
} }

View File

@@ -72,6 +72,8 @@ public:
bool isAutoDetected() const; bool isAutoDetected() const;
QString id() const; QString id() const;
// No need to implement this for new tool chains:
virtual QString legacyId() const { return QString(); }
virtual QString typeName() const = 0; virtual QString typeName() const = 0;
virtual Abi targetAbi() const = 0; virtual Abi targetAbi() const = 0;
@@ -105,8 +107,6 @@ protected:
ToolChain(const QString &id, bool autoDetect); ToolChain(const QString &id, bool autoDetect);
explicit ToolChain(const ToolChain &); explicit ToolChain(const ToolChain &);
void setId(const QString &id);
void toolChainUpdated(); void toolChainUpdated();
// Make sure to call this method when deriving! // Make sure to call this method when deriving!

View File

@@ -110,22 +110,61 @@ ToolChainManager::ToolChainManager(QObject *parent) :
void ToolChainManager::restoreToolChains() void ToolChainManager::restoreToolChains()
{ {
// Restore SDK settings first QList<ToolChain *> tcsToRegister;
QList<ToolChain *> tcsToCheck;
// read all tool chains from SDK
QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName()); QFileInfo systemSettingsFile(Core::ICore::settings(QSettings::SystemScope)->fileName());
restoreToolChains(systemSettingsFile.absolutePath() + QLatin1String(TOOLCHAIN_FILENAME), true); QList<ToolChain *> readTcs =
restoreToolChains(systemSettingsFile.absolutePath() + QLatin1String(TOOLCHAIN_FILENAME));
// make sure we mark these as autodetected!
foreach (ToolChain *tc, readTcs)
tc->setAutoDetected(true);
tcsToRegister = readTcs; // SDK TCs are always considered to be up-to-date, so no need to
// recheck them.
// read all tool chains from user file
readTcs = restoreToolChains(settingsFileName());
foreach (ToolChain *tc, readTcs) {
if (tc->isAutoDetected())
tcsToCheck.append(tc);
else
tcsToRegister.append(tc);
}
readTcs.clear();
// Then auto detect // Then auto detect
QList<ToolChain *> detectedTcs;
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
QList<ToolChainFactory *> factories = pm->getObjects<ToolChainFactory>(); QList<ToolChainFactory *> factories = pm->getObjects<ToolChainFactory>();
// Autodetect tool chains: foreach (ToolChainFactory *f, factories)
foreach (ToolChainFactory *f, factories) { detectedTcs.append(f->autoDetect());
QList<ToolChain *> tcs = f->autoDetect();
foreach (ToolChain *tc, tcs) // Find/update autodetected tool chains:
registerToolChain(tc); ToolChain *toStore = 0;
foreach (ToolChain *currentDetected, detectedTcs) {
toStore = currentDetected;
// Check whether we had this TC stored and prefer the old one with the old id:
for (int i = 0; i < tcsToCheck.count(); ++i) {
if (*(tcsToCheck.at(i)) == *currentDetected) {
toStore = tcsToCheck.at(i);
tcsToCheck.removeAt(i);
delete currentDetected;
break;
}
}
registerToolChain(toStore);
} }
// Then restore user settings // Delete all loaded autodetected tool chains that were not rediscovered:
restoreToolChains(settingsFileName(), false); qDeleteAll(tcsToCheck);
// Store manual tool chains
foreach (ToolChain *tc, tcsToRegister)
registerToolChain(tc);
} }
ToolChainManager::~ToolChainManager() ToolChainManager::~ToolChainManager()
@@ -146,7 +185,7 @@ void ToolChainManager::saveToolChains()
int count = 0; int count = 0;
foreach (ToolChain *tc, d->m_toolChains) { foreach (ToolChain *tc, d->m_toolChains) {
if (!tc->isAutoDetected() && tc->isValid()) { if (tc->isValid()) {
QVariantMap tmp = tc->toMap(); QVariantMap tmp = tc->toMap();
if (tmp.isEmpty()) if (tmp.isEmpty())
continue; continue;
@@ -160,17 +199,19 @@ void ToolChainManager::saveToolChains()
// Do not save default debuggers! Those are set by the SDK! // Do not save default debuggers! Those are set by the SDK!
} }
void ToolChainManager::restoreToolChains(const QString &fileName, bool autoDetected) QList<ToolChain *> ToolChainManager::restoreToolChains(const QString &fileName)
{ {
QList<ToolChain *> result;
PersistentSettingsReader reader; PersistentSettingsReader reader;
if (!reader.load(fileName)) if (!reader.load(fileName))
return; return result;
QVariantMap data = reader.restoreValues(); QVariantMap data = reader.restoreValues();
// Check version: // Check version:
int version = data.value(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 0).toInt(); int version = data.value(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 0).toInt();
if (version < 1) if (version < 1)
return; return result;
// Read default debugger settings (if any) // Read default debugger settings (if any)
int count = data.value(QLatin1String(DEFAULT_DEBUGGER_COUNT_KEY)).toInt(); int count = data.value(QLatin1String(DEFAULT_DEBUGGER_COUNT_KEY)).toInt();
@@ -200,19 +241,18 @@ void ToolChainManager::restoreToolChains(const QString &fileName, bool autoDetec
foreach (ToolChainFactory *f, factories) { foreach (ToolChainFactory *f, factories) {
if (f->canRestore(tcMap)) { if (f->canRestore(tcMap)) {
if (ToolChain *tc = f->restore(tcMap)) { if (ToolChain *tc = f->restore(tcMap)) {
tc->setAutoDetected(autoDetected); result.append(tc);
registerToolChain(tc);
restored = true; restored = true;
break; break;
} }
} }
} }
if (!restored) if (!restored)
qWarning("Warning: Unable to restore manual tool chain '%s' stored in %s.", qWarning("Warning: Unable to restore tool chain '%s' stored in %s.",
qPrintable(ToolChainFactory::idFromMap(tcMap)), qPrintable(ToolChainFactory::idFromMap(tcMap)),
qPrintable(QDir::toNativeSeparators(fileName))); qPrintable(QDir::toNativeSeparators(fileName)));
} }
return result;
} }
QList<ToolChain *> ToolChainManager::toolChains() const QList<ToolChain *> ToolChainManager::toolChains() const
@@ -233,8 +273,11 @@ QList<ToolChain *> ToolChainManager::findToolChains(const Abi &abi) const
ToolChain *ToolChainManager::findToolChain(const QString &id) const ToolChain *ToolChainManager::findToolChain(const QString &id) const
{ {
if (id.isEmpty())
return 0;
foreach (ToolChain *tc, d->m_toolChains) { foreach (ToolChain *tc, d->m_toolChains) {
if (tc->id() == id) if (tc->id() == id || (!tc->legacyId().isEmpty() && tc->legacyId() == id))
return tc; return tc;
} }
return 0; return 0;

View File

@@ -90,7 +90,7 @@ private:
// Make sure the this is only called after all // Make sure the this is only called after all
// Tool chain Factories are registered! // Tool chain Factories are registered!
void restoreToolChains(); void restoreToolChains();
void restoreToolChains(const QString &fileName, bool autoDetected = false); QList<ToolChain *> restoreToolChains(const QString &fileName);
void notifyAboutUpdate(ProjectExplorer::ToolChain *); void notifyAboutUpdate(ProjectExplorer::ToolChain *);

View File

@@ -261,7 +261,6 @@ WinCEToolChain::WinCEToolChain(const QString &name,
Q_ASSERT(!m_includePath.isEmpty()); Q_ASSERT(!m_includePath.isEmpty());
Q_ASSERT(!m_libPath.isEmpty()); Q_ASSERT(!m_libPath.isEmpty());
updateId();
setDisplayName(name); setDisplayName(name);
} }
@@ -279,7 +278,7 @@ WinCEToolChain *WinCEToolChain::readFromMap(const QVariantMap &data)
return 0; return 0;
} }
void WinCEToolChain::updateId() QString WinCEToolChain::legacyId() const
{ {
const QChar colon = QLatin1Char(':'); const QChar colon = QLatin1Char(':');
QString id = QLatin1String(Constants::WINCE_TOOLCHAIN_ID); QString id = QLatin1String(Constants::WINCE_TOOLCHAIN_ID);
@@ -293,7 +292,7 @@ void WinCEToolChain::updateId()
id += m_libPath; id += m_libPath;
id += colon; id += colon;
id += m_debuggerCommand.toString(); id += m_debuggerCommand.toString();
setId(id); return id;
} }
QString WinCEToolChain::typeName() const QString WinCEToolChain::typeName() const
@@ -355,7 +354,6 @@ bool WinCEToolChain::fromMap(const QVariantMap &data)
m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString()); m_debuggerCommand = Utils::FileName::fromString(data.value(QLatin1String(debuggerCommandKeyC)).toString());
const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString(); const QString abiString = data.value(QLatin1String(supportedAbiKeyC)).toString();
m_abi = Abi(abiString); m_abi = Abi(abiString);
updateId();
return isValid(); return isValid();
} }

View File

@@ -57,6 +57,8 @@ public:
const QString &libPath, const QString &libPath,
bool autodetect = false); bool autodetect = false);
QString legacyId() const;
static WinCEToolChain *readFromMap(const QVariantMap &data); static WinCEToolChain *readFromMap(const QVariantMap &data);
QString typeName() const; QString typeName() const;
@@ -79,7 +81,6 @@ protected:
private: private:
WinCEToolChain(); WinCEToolChain();
void updateId();
QString m_msvcVer; QString m_msvcVer;
QString m_ceVer; QString m_ceVer;

View File

@@ -91,19 +91,6 @@ static Utils::Environment baseEnvironment(RvctToolChain *tc)
return result; return result;
} }
static QString toString(const RvctToolChain::ArmVersion &v)
{
switch (v)
{
case RvctToolChain::ARMv5:
return QString::fromAscii("armv5");
case RvctToolChain::ARMv6:
return QString::fromAscii("armv6");
default:
return QString::fromAscii("unknown");
}
}
// ========================================================================== // ==========================================================================
// RvctToolChain // RvctToolChain
// ========================================================================== // ==========================================================================
@@ -284,7 +271,7 @@ void RvctToolChain::setCompilerPath(const QString &path)
m_compilerPath = path; m_compilerPath = path;
m_version.reset(); m_version.reset();
updateId(); // Will trigger toolChainUpdated()! toolChainUpdated();
} }
QString RvctToolChain::compilerPath() const QString RvctToolChain::compilerPath() const
@@ -365,11 +352,11 @@ bool RvctToolChain::fromMap(const QVariantMap &data)
return isValid(); return isValid();
} }
void RvctToolChain::updateId() QString RvctToolChain::legacyId() const
{ {
const QChar dot = QLatin1Char('.'); const QChar dot = QLatin1Char('.');
setId(QLatin1String(Constants::RVCT_TOOLCHAIN_ID) + QLatin1Char(':') return QLatin1String(Constants::RVCT_TOOLCHAIN_ID) + QLatin1Char(':') + m_compilerPath + dot
+ m_compilerPath + dot + toString(m_armVersion) + dot + m_debuggerCommand.toString()); + armVersionString(m_armVersion) + dot + m_debuggerCommand.toString();
} }
QString RvctToolChain::varName(const QString &postFix) const QString RvctToolChain::varName(const QString &postFix) const

View File

@@ -84,6 +84,8 @@ public:
QString typeName() const; QString typeName() const;
ProjectExplorer::Abi targetAbi() const; ProjectExplorer::Abi targetAbi() const;
QString legacyId() const;
bool isValid() const; bool isValid() const;
QByteArray predefinedMacros() const; QByteArray predefinedMacros() const;
@@ -115,7 +117,6 @@ public:
bool fromMap(const QVariantMap &data); bool fromMap(const QVariantMap &data);
private: private:
void updateId();
void setVersion(const RvctVersion &v) const; void setVersion(const RvctVersion &v) const;
explicit RvctToolChain(bool autodetected = false); explicit RvctToolChain(bool autodetected = false);

View File

@@ -147,6 +147,11 @@ ProjectExplorer::Abi WinscwToolChain::targetAbi() const
ProjectExplorer::Abi::ElfFormat, 32); ProjectExplorer::Abi::ElfFormat, 32);
} }
QString WinscwToolChain::legacyId() const
{
return QLatin1String(Constants::WINSCW_TOOLCHAIN_ID) + QLatin1Char(':') + m_compilerPath;
}
bool WinscwToolChain::isValid() const bool WinscwToolChain::isValid() const
{ {
if (m_compilerPath.isEmpty()) if (m_compilerPath.isEmpty())
@@ -286,7 +291,7 @@ void WinscwToolChain::setCompilerPath(const QString &path)
return; return;
m_compilerPath = path; m_compilerPath = path;
updateId(); // Will trigger topolChainUpdated()! toolChainUpdated();
} }
QString WinscwToolChain::compilerPath() const QString WinscwToolChain::compilerPath() const
@@ -294,11 +299,6 @@ QString WinscwToolChain::compilerPath() const
return m_compilerPath; return m_compilerPath;
} }
void WinscwToolChain::updateId()
{
setId(QLatin1String(Constants::WINSCW_TOOLCHAIN_ID) + QLatin1Char(':') + m_compilerPath);
}
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// ToolChainConfigWidget // ToolChainConfigWidget
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------

View File

@@ -54,6 +54,7 @@ public:
QString typeName() const; QString typeName() const;
ProjectExplorer::Abi targetAbi() const; ProjectExplorer::Abi targetAbi() const;
QString legacyId() const;
bool isValid() const; bool isValid() const;
@@ -84,8 +85,6 @@ public:
QString compilerPath() const; QString compilerPath() const;
private: private:
void updateId();
explicit WinscwToolChain(bool); explicit WinscwToolChain(bool);
QStringList m_systemIncludePathes; QStringList m_systemIncludePathes;

View File

@@ -133,7 +133,6 @@ bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool(); m_shadowBuild = map.value(QLatin1String(USE_SHADOW_BUILD_KEY), true).toBool();
m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt(); m_qtVersionId = map.value(QLatin1String(QT_VERSION_ID_KEY)).toInt();
ProjectExplorer::ToolChain *tc = toolChain();
m_qmakeBuildConfiguration = QtSupport::BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt()); m_qmakeBuildConfiguration = QtSupport::BaseQtVersion::QmakeBuildConfigs(map.value(QLatin1String(BUILD_CONFIGURATION_KEY)).toInt());
m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), defaultShadowBuildDirectory()).toString(); m_buildDirectory = map.value(QLatin1String(BUILD_DIRECTORY_KEY), defaultShadowBuildDirectory()).toString();
@@ -160,6 +159,7 @@ bool Qt4BuildConfiguration::fromMap(const QVariantMap &map)
m_lastEmmitedBuildDirectory = buildDirectory(); m_lastEmmitedBuildDirectory = buildDirectory();
ProjectExplorer::ToolChain *tc = toolChain();
if (version && version->isValid()) { if (version && version->isValid()) {
if (tc && !qt4Target()->possibleToolChains(this).contains(tc)) if (tc && !qt4Target()->possibleToolChains(this).contains(tc))
setToolChain(0); setToolChain(0);
@@ -377,7 +377,7 @@ void Qt4BuildConfiguration::setQtVersion(QtSupport::BaseQtVersion *version)
void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc) void Qt4BuildConfiguration::setToolChain(ProjectExplorer::ToolChain *tc)
{ {
if (tc != 0 && !qt4Target()->possibleToolChains(this).contains(tc)) if (tc != 0 && m_qtVersionId > 0 && !qt4Target()->possibleToolChains(this).contains(tc))
return; return;
if (toolChain() == tc) if (toolChain() == tc)