Add toolchain autodetection based on config file

Add toolchains found in share/qtcreator/Nokia/toolChains.xml as
autodetected.
This commit is contained in:
Tobias Hunger
2011-03-01 16:34:02 +01:00
parent 5daa732e31
commit 9b465749f0
4 changed files with 59 additions and 37 deletions

View File

@@ -145,6 +145,11 @@ void ToolChain::setId(const QString &id)
m_d->m_id = id; m_d->m_id = id;
} }
void ToolChain::setAutoDetected(bool autodetect)
{
m_d->m_autodetect = autodetect;
}
bool ToolChain::fromMap(const QVariantMap &data) bool ToolChain::fromMap(const QVariantMap &data)
{ {
Q_ASSERT(!isAutoDetected()); Q_ASSERT(!isAutoDetected());

View File

@@ -51,10 +51,11 @@ class ToolChainPrivate;
} }
class Abi; class Abi;
class HeaderPath;
class IOutputParser; class IOutputParser;
class ToolChainConfigWidget; class ToolChainConfigWidget;
class ToolChainFactory; class ToolChainFactory;
class HeaderPath; class ToolChainManager;
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
// ToolChain // ToolChain
@@ -109,8 +110,11 @@ protected:
virtual bool fromMap(const QVariantMap &data); virtual bool fromMap(const QVariantMap &data);
private: private:
void setAutoDetected(bool);
Internal::ToolChainPrivate *const m_d; Internal::ToolChainPrivate *const m_d;
friend class ToolChainManager;
friend class ToolChainFactory; friend class ToolChainFactory;
}; };

View File

@@ -47,12 +47,13 @@
static const char *const TOOLCHAIN_DATA_KEY = "ToolChain."; static const char *const TOOLCHAIN_DATA_KEY = "ToolChain.";
static const char *const TOOLCHAIN_COUNT_KEY = "ToolChain.Count"; static const char *const TOOLCHAIN_COUNT_KEY = "ToolChain.Count";
static const char *const TOOLCHAIN_FILE_VERSION_KEY = "Version"; static const char *const TOOLCHAIN_FILE_VERSION_KEY = "Version";
static const char *const TOOLCHAIN_FILENAME = "/toolChains.xml";
static QString settingsFileName() static QString settingsFileName()
{ {
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance(); ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
QFileInfo settingsLocation(pm->settings()->fileName()); QFileInfo settingsLocation(pm->settings()->fileName());
return settingsLocation.absolutePath() + QLatin1String("/toolChains.xml"); return settingsLocation.absolutePath() + QLatin1String(TOOLCHAIN_FILENAME);
} }
namespace ProjectExplorer { namespace ProjectExplorer {
@@ -104,41 +105,9 @@ void ToolChainManager::restoreToolChains()
registerToolChain(tc); registerToolChain(tc);
} }
// Restore user generated ToolChains: restoreToolChains(settingsFileName(), false);
PersistentSettingsReader reader; restoreToolChains(Core::ICore::instance()->resourcePath()
const QString fileName = settingsFileName(); + QLatin1String("/Nokia") + QLatin1String(TOOLCHAIN_FILENAME), true);
if (!reader.load(fileName))
return;
QVariantMap data = reader.restoreValues();
// Check version:
int version = data.value(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 0).toInt();
if (version < 1)
return;
int count = data.value(QLatin1String(TOOLCHAIN_COUNT_KEY), 0).toInt();
for (int i = 0; i < count; ++i) {
const QString key = QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(i);
if (!data.contains(key))
break;
const QVariantMap tcMap = data.value(key).toMap();
bool restored = false;
foreach (ToolChainFactory *f, factories) {
if (f->canRestore(tcMap)) {
if (ToolChain *tc = f->restore(tcMap)) {
registerToolChain(tc);
restored = true;
break;
}
}
}
if (!restored)
qWarning("Warning: Unable to restore manual toolchain '%s' stored in %s.",
qPrintable(ToolChainFactory::idFromMap(tcMap)),
qPrintable(QDir::toNativeSeparators(fileName)));
}
} }
ToolChainManager::~ToolChainManager() ToolChainManager::~ToolChainManager()
@@ -171,6 +140,48 @@ void ToolChainManager::saveToolChains()
writer.save(settingsFileName(), "QtCreatorToolChains"); writer.save(settingsFileName(), "QtCreatorToolChains");
} }
void ToolChainManager::restoreToolChains(const QString &fileName, bool autoDetected)
{
PersistentSettingsReader reader;
if (!reader.load(fileName))
return;
QVariantMap data = reader.restoreValues();
// Check version:
int version = data.value(QLatin1String(TOOLCHAIN_FILE_VERSION_KEY), 0).toInt();
if (version < 1)
return;
ExtensionSystem::PluginManager *pm = ExtensionSystem::PluginManager::instance();
QList<ToolChainFactory *> factories = pm->getObjects<ToolChainFactory>();
int count = data.value(QLatin1String(TOOLCHAIN_COUNT_KEY), 0).toInt();
for (int i = 0; i < count; ++i) {
const QString key = QString::fromLatin1(TOOLCHAIN_DATA_KEY) + QString::number(i);
if (!data.contains(key))
break;
const QVariantMap tcMap = data.value(key).toMap();
bool restored = false;
foreach (ToolChainFactory *f, factories) {
if (f->canRestore(tcMap)) {
if (ToolChain *tc = f->restore(tcMap)) {
tc->setAutoDetected(autoDetected);
registerToolChain(tc);
restored = true;
break;
}
}
}
if (!restored)
qWarning("Warning: Unable to restore manual toolchain '%s' stored in %s.",
qPrintable(ToolChainFactory::idFromMap(tcMap)),
qPrintable(QDir::toNativeSeparators(fileName)));
}
}
QList<ToolChain *> ToolChainManager::toolChains() const QList<ToolChain *> ToolChainManager::toolChains() const
{ {
return m_d->m_toolChains; return m_d->m_toolChains;

View File

@@ -85,6 +85,8 @@ private:
// Make sure the this is only called after all // Make sure the this is only called after all
// ToolChain Factories are registered! // ToolChain Factories are registered!
void restoreToolChains(); void restoreToolChains();
void restoreToolChains(const QString &fileName, bool autoDetected = false);
Internal::ToolChainManagerPrivate *const m_d; Internal::ToolChainManagerPrivate *const m_d;