ToolChain: Create toolchains for different languages

Enable creation of toolchains for different languages and wire
up the logic in the ToolChain Options Page.

Change-Id: I9fbd95607d30cc1aa10f73d6532338f07f3e2b4e
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2016-07-12 15:08:53 +02:00
parent c071f68942
commit ce9ca1f0ef
9 changed files with 53 additions and 40 deletions

View File

@@ -88,10 +88,14 @@ static const char messageCapKeyC[] = "ProjectExplorer.CustomToolChain.MessageCap
CustomToolChain::CustomToolChain(Detection d) : CustomToolChain::CustomToolChain(Detection d) :
ToolChain(Constants::CUSTOM_TOOLCHAIN_TYPEID, d), ToolChain(Constants::CUSTOM_TOOLCHAIN_TYPEID, d),
m_outputParser(Gcc) m_outputParser(Gcc)
{ }
CustomToolChain::CustomToolChain(Language l, Detection d) : CustomToolChain(d)
{ {
setLanguage(Language::Cxx); setLanguage(l);
} }
QString CustomToolChain::typeDisplayName() const QString CustomToolChain::typeDisplayName() const
{ {
return Internal::CustomToolChainFactory::tr("Custom"); return Internal::CustomToolChainFactory::tr("Custom");
@@ -434,7 +438,7 @@ CustomToolChainFactory::CustomToolChainFactory()
QSet<ToolChain::Language> CustomToolChainFactory::supportedLanguages() const QSet<ToolChain::Language> CustomToolChainFactory::supportedLanguages() const
{ {
return { ToolChain::Language::Cxx }; return ToolChain::allLanguages();
} }
bool CustomToolChainFactory::canCreate() bool CustomToolChainFactory::canCreate()
@@ -442,9 +446,9 @@ bool CustomToolChainFactory::canCreate()
return true; return true;
} }
ToolChain *CustomToolChainFactory::create() ToolChain *CustomToolChainFactory::create(ToolChain::Language l)
{ {
return new CustomToolChain(ToolChain::ManualDetection); return new CustomToolChain(l, ToolChain::ManualDetection);
} }
// Used by the ToolChainManager to restore user-generated tool chains // Used by the ToolChainManager to restore user-generated tool chains

View File

@@ -122,6 +122,7 @@ protected:
private: private:
explicit CustomToolChain(Detection d); explicit CustomToolChain(Detection d);
explicit CustomToolChain(Language l, Detection d);
Utils::FileName m_compilerCommand; Utils::FileName m_compilerCommand;
Utils::FileName m_makeCommand; Utils::FileName m_makeCommand;
@@ -150,7 +151,7 @@ public:
QSet<ToolChain::Language> supportedLanguages() const override; QSet<ToolChain::Language> supportedLanguages() const override;
bool canCreate() override; bool canCreate() override;
ToolChain *create() override; ToolChain *create(ToolChain::Language l) override;
// Used by the ToolChainManager to restore user-generated tool chains // Used by the ToolChainManager to restore user-generated tool chains
bool canRestore(const QVariantMap &data) override; bool canRestore(const QVariantMap &data) override;

View File

@@ -771,7 +771,7 @@ GccToolChainFactory::GccToolChainFactory()
QSet<ToolChain::Language> GccToolChainFactory::supportedLanguages() const QSet<ToolChain::Language> GccToolChainFactory::supportedLanguages() const
{ {
return { ToolChain::Language::Cxx }; return { ToolChain::Language::Cxx, ToolChain::Language::C };
} }
bool GccToolChainFactory::canCreate() bool GccToolChainFactory::canCreate()
@@ -779,10 +779,10 @@ bool GccToolChainFactory::canCreate()
return true; return true;
} }
ToolChain *GccToolChainFactory::create() ToolChain *GccToolChainFactory::create(ToolChain::Language l)
{ {
ToolChain *tc = createToolChain(false); ToolChain *tc = createToolChain(false);
tc->setLanguage({ ToolChain::Language::Cxx }); tc->setLanguage(l);
return tc; return tc;
} }
@@ -1141,7 +1141,7 @@ ClangToolChainFactory::ClangToolChainFactory()
QSet<ToolChain::Language> ClangToolChainFactory::supportedLanguages() const QSet<ToolChain::Language> ClangToolChainFactory::supportedLanguages() const
{ {
return { ProjectExplorer::ToolChain::Language::Cxx }; return { ProjectExplorer::ToolChain::Language::Cxx, ProjectExplorer::ToolChain::Language::C };
} }
QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) QList<ToolChain *> ClangToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)

View File

@@ -54,7 +54,7 @@ public:
QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override; QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown) override;
bool canCreate() override; bool canCreate() override;
ToolChain *create() override; ToolChain *create(ToolChain::Language l) override;
bool canRestore(const QVariantMap &data) override; bool canRestore(const QVariantMap &data) override;
ToolChain *restore(const QVariantMap &data) override; ToolChain *restore(const QVariantMap &data) override;

View File

@@ -291,8 +291,9 @@ bool ToolChainFactory::canCreate()
return false; return false;
} }
ToolChain *ToolChainFactory::create() ToolChain *ToolChainFactory::create(ToolChain::Language l)
{ {
Q_UNUSED(l);
return nullptr; return nullptr;
} }

View File

@@ -166,7 +166,7 @@ public:
virtual QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown); virtual QList<ToolChain *> autoDetect(const QList<ToolChain *> &alreadyKnown);
virtual bool canCreate(); virtual bool canCreate();
virtual ToolChain *create(); virtual ToolChain *create(ToolChain::Language l);
virtual bool canRestore(const QVariantMap &data); virtual bool canRestore(const QVariantMap &data);
virtual ToolChain *restore(const QVariantMap &data); virtual ToolChain *restore(const QVariantMap &data);

View File

@@ -152,27 +152,20 @@ public:
continue; continue;
if (languages.count() == 1) { if (languages.count() == 1) {
QAction *action = new QAction(addMenu); addMenu->addAction(createAction(factory->displayName(), factory, languages.at(0)));
action->setText(factory->displayName());
connect(action, &QAction::triggered, [this, factory] { createToolChain(factory); });
addMenu->addAction(action);
} else { } else {
Utils::sort(languages, [](ToolChain::Language l1, ToolChain::Language l2) { Utils::sort(languages, [](ToolChain::Language l1, ToolChain::Language l2) {
return ToolChain::languageDisplayName(l1) < ToolChain::languageDisplayName(l2); return ToolChain::languageDisplayName(l1) < ToolChain::languageDisplayName(l2);
}); });
auto subMenu = addMenu->addMenu(factory->displayName()); auto subMenu = addMenu->addMenu(factory->displayName());
foreach (ToolChain::Language l, languages) { foreach (ToolChain::Language l, languages)
auto action = new QAction(subMenu); subMenu->addAction(createAction(ToolChain::languageDisplayName(l), factory, l));
action->setText(ToolChain::languageDisplayName(l));
connect(action, &QAction::triggered, [this, factory] { createToolChain(factory); });
subMenu->addAction(action);
}
} }
} }
m_addButton->setMenu(addMenu); m_addButton->setMenu(addMenu);
m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this); m_cloneButton = new QPushButton(ToolChainOptionsPage::tr("Clone"), this);
connect(m_cloneButton, &QAbstractButton::clicked, [this] { createToolChain(nullptr); }); connect(m_cloneButton, &QAbstractButton::clicked, [this] { cloneToolChain(); });
m_delButton = new QPushButton(ToolChainOptionsPage::tr("Remove"), this); m_delButton = new QPushButton(ToolChainOptionsPage::tr("Remove"), this);
@@ -216,7 +209,8 @@ public:
void toolChainSelectionChanged(); void toolChainSelectionChanged();
void updateState(); void updateState();
void createToolChain(ToolChainFactory *factory); void createToolChain(ToolChainFactory *factory, ToolChain::Language l);
void cloneToolChain();
ToolChainTreeItem *currentTreeItem(); ToolChainTreeItem *currentTreeItem();
void markForRemoval(ToolChainTreeItem *item); void markForRemoval(ToolChainTreeItem *item);
@@ -225,6 +219,12 @@ public:
void removeToolChain(ProjectExplorer::ToolChain *); void removeToolChain(ProjectExplorer::ToolChain *);
StaticTreeItem *parentForToolChain(ToolChain *tc); StaticTreeItem *parentForToolChain(ToolChain *tc);
QAction *createAction(const QString &name, ToolChainFactory *factory, ToolChain::Language l)
{
auto action = new QAction(name, nullptr);
connect(action, &QAction::triggered, [this, factory, l] { createToolChain(factory, l); });
return action;
}
void apply(); void apply();
@@ -374,21 +374,28 @@ void ToolChainOptionsWidget::apply()
} }
} }
void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory) void ToolChainOptionsWidget::createToolChain(ToolChainFactory *factory, ToolChain::Language l)
{ {
ToolChain *tc = nullptr; QTC_ASSERT(factory, return);
QTC_ASSERT(factory->canCreate(), return);
QTC_ASSERT(l != ToolChain::Language::None, return);
if (factory) { ToolChain *tc = factory->create(l);
// Clone. if (!tc)
QTC_CHECK(factory->canCreate()); return;
tc = factory->create();
} else { auto item = insertToolChain(tc, true);
// Copy. m_toAddList.append(item);
ToolChainTreeItem *current = currentTreeItem();
if (!current) m_toolChainView->setCurrentIndex(m_model.indexForItem(item));
return; }
tc = current->toolChain->clone();
} void ToolChainOptionsWidget::cloneToolChain()
{
ToolChainTreeItem *current = currentTreeItem();
if (!current)
return;
ToolChain *tc = current->toolChain->clone();
if (!tc) if (!tc)
return; return;

View File

@@ -185,9 +185,9 @@ bool QnxToolChainFactory::canCreate()
return true; return true;
} }
ToolChain *QnxToolChainFactory::create() ToolChain *QnxToolChainFactory::create(ToolChain::Language l)
{ {
return new QnxToolChain(ToolChain::ManualDetection); return new QnxToolChain(l, ToolChain::ManualDetection);
} }
//--------------------------------------------------------------------------------- //---------------------------------------------------------------------------------

View File

@@ -75,7 +75,7 @@ public:
ProjectExplorer::ToolChain *restore(const QVariantMap &data) override; ProjectExplorer::ToolChain *restore(const QVariantMap &data) override;
bool canCreate() override; bool canCreate() override;
ProjectExplorer::ToolChain *create() override; ProjectExplorer::ToolChain *create(ProjectExplorer::ToolChain::Language l) override;
}; };
//---------------------------------------------------------------------------- //----------------------------------------------------------------------------