forked from qt-creator/qt-creator
CustomToolChain: Support choosing an error parser
Change-Id: Ida2223d6e3c6577d13aa52827c00e3fa3f44a848 Reviewed-by: Tobias Hunger <tobias.hunger@digia.com>
This commit is contained in:
committed by
Orgad Shaneh
parent
208aeb79ed
commit
debfc1718f
@@ -30,16 +30,21 @@
|
|||||||
#include "customtoolchain.h"
|
#include "customtoolchain.h"
|
||||||
#include "abiwidget.h"
|
#include "abiwidget.h"
|
||||||
#include "gccparser.h"
|
#include "gccparser.h"
|
||||||
|
#include "clangparser.h"
|
||||||
|
#include "linuxiccparser.h"
|
||||||
|
#include "msvcparser.h"
|
||||||
#include "projectexplorerconstants.h"
|
#include "projectexplorerconstants.h"
|
||||||
#include "toolchainmanager.h"
|
#include "toolchainmanager.h"
|
||||||
|
|
||||||
#include <utils/detailswidget.h>
|
#include <utils/detailswidget.h>
|
||||||
#include <utils/environment.h>
|
#include <utils/environment.h>
|
||||||
#include <utils/pathchooser.h>
|
#include <utils/pathchooser.h>
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <QFormLayout>
|
#include <QFormLayout>
|
||||||
#include <QPlainTextEdit>
|
#include <QPlainTextEdit>
|
||||||
#include <QLineEdit>
|
#include <QLineEdit>
|
||||||
|
#include <QComboBox>
|
||||||
|
|
||||||
using namespace Utils;
|
using namespace Utils;
|
||||||
|
|
||||||
@@ -57,13 +62,15 @@ static const char predefinedMacrosKeyC[] = "ProjectExplorer.CustomToolChain.Pred
|
|||||||
static const char headerPathsKeyC[] = "ProjectExplorer.CustomToolChain.HeaderPaths";
|
static const char headerPathsKeyC[] = "ProjectExplorer.CustomToolChain.HeaderPaths";
|
||||||
static const char cxx11FlagsKeyC[] = "ProjectExplorer.CustomToolChain.Cxx11Flags";
|
static const char cxx11FlagsKeyC[] = "ProjectExplorer.CustomToolChain.Cxx11Flags";
|
||||||
static const char mkspecsKeyC[] = "ProjectExplorer.CustomToolChain.Mkspecs";
|
static const char mkspecsKeyC[] = "ProjectExplorer.CustomToolChain.Mkspecs";
|
||||||
|
static const char outputParserKeyC[] = "ProjectExplorer.CustomToolChain.OutputParser";
|
||||||
|
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
// CustomToolChain
|
// CustomToolChain
|
||||||
// --------------------------------------------------------------------------
|
// --------------------------------------------------------------------------
|
||||||
|
|
||||||
CustomToolChain::CustomToolChain(bool autodetect) :
|
CustomToolChain::CustomToolChain(bool autodetect) :
|
||||||
ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect)
|
ToolChain(QLatin1String(Constants::CUSTOM_TOOLCHAIN_ID), autodetect),
|
||||||
|
m_outputParser(Gcc)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
CustomToolChain::CustomToolChain(const QString &id, bool autodetect) :
|
CustomToolChain::CustomToolChain(const QString &id, bool autodetect) :
|
||||||
@@ -188,10 +195,15 @@ QList<FileName> CustomToolChain::suggestedMkspecList() const
|
|||||||
return m_mkspecs;
|
return m_mkspecs;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Customize
|
|
||||||
IOutputParser *CustomToolChain::outputParser() const
|
IOutputParser *CustomToolChain::outputParser() const
|
||||||
{
|
{
|
||||||
return new GccParser;
|
switch (m_outputParser) {
|
||||||
|
case Gcc: return new GccParser;
|
||||||
|
case Clang: return new ClangParser;
|
||||||
|
case LinuxIcc: return new LinuxIccParser;
|
||||||
|
case Msvc: return new MsvcParser;
|
||||||
|
default: return 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
QStringList CustomToolChain::headerPathsList() const
|
QStringList CustomToolChain::headerPathsList() const
|
||||||
@@ -279,6 +291,7 @@ QVariantMap CustomToolChain::toMap() const
|
|||||||
data.insert(QLatin1String(headerPathsKeyC), headerPathsList());
|
data.insert(QLatin1String(headerPathsKeyC), headerPathsList());
|
||||||
data.insert(QLatin1String(cxx11FlagsKeyC), m_cxx11Flags);
|
data.insert(QLatin1String(cxx11FlagsKeyC), m_cxx11Flags);
|
||||||
data.insert(QLatin1String(mkspecsKeyC), mkspecs());
|
data.insert(QLatin1String(mkspecsKeyC), mkspecs());
|
||||||
|
data.insert(QLatin1String(outputParserKeyC), m_outputParser);
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
@@ -295,6 +308,8 @@ bool CustomToolChain::fromMap(const QVariantMap &data)
|
|||||||
setHeaderPaths(data.value(QLatin1String(headerPathsKeyC)).toStringList());
|
setHeaderPaths(data.value(QLatin1String(headerPathsKeyC)).toStringList());
|
||||||
m_cxx11Flags = data.value(QLatin1String(cxx11FlagsKeyC)).toStringList();
|
m_cxx11Flags = data.value(QLatin1String(cxx11FlagsKeyC)).toStringList();
|
||||||
setMkspecs(data.value(QLatin1String(mkspecsKeyC)).toString());
|
setMkspecs(data.value(QLatin1String(mkspecsKeyC)).toString());
|
||||||
|
m_outputParser = (OutputParser)data.value(QLatin1String(outputParserKeyC)).toInt();
|
||||||
|
QTC_ASSERT(m_outputParser >= Gcc && m_outputParser < OutputParserCount, return false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -312,6 +327,27 @@ bool CustomToolChain::operator ==(const ToolChain &other) const
|
|||||||
&& m_systemHeaderPaths == customTc->m_systemHeaderPaths;
|
&& m_systemHeaderPaths == customTc->m_systemHeaderPaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
CustomToolChain::OutputParser CustomToolChain::outputParserType() const
|
||||||
|
{
|
||||||
|
return m_outputParser;
|
||||||
|
}
|
||||||
|
|
||||||
|
void CustomToolChain::setOutputParserType(CustomToolChain::OutputParser parser)
|
||||||
|
{
|
||||||
|
m_outputParser = parser;
|
||||||
|
}
|
||||||
|
|
||||||
|
QString CustomToolChain::parserName(CustomToolChain::OutputParser parser)
|
||||||
|
{
|
||||||
|
switch (parser) {
|
||||||
|
case Gcc: return tr("GCC");
|
||||||
|
case Clang: return tr("Clang");
|
||||||
|
case LinuxIcc: return tr("ICC");
|
||||||
|
case Msvc: return tr("MSVC");
|
||||||
|
default: return QString();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ToolChainConfigWidget *CustomToolChain::configurationWidget()
|
ToolChainConfigWidget *CustomToolChain::configurationWidget()
|
||||||
{
|
{
|
||||||
return new Internal::CustomToolChainConfigWidget(this);
|
return new Internal::CustomToolChainConfigWidget(this);
|
||||||
@@ -419,10 +455,14 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
|
|||||||
m_predefinedDetails(new TextEditDetailsWidget(m_predefinedMacros)),
|
m_predefinedDetails(new TextEditDetailsWidget(m_predefinedMacros)),
|
||||||
m_headerDetails(new TextEditDetailsWidget(m_headerPaths)),
|
m_headerDetails(new TextEditDetailsWidget(m_headerPaths)),
|
||||||
m_cxx11Flags(new QLineEdit),
|
m_cxx11Flags(new QLineEdit),
|
||||||
m_mkspecs(new QLineEdit)
|
m_mkspecs(new QLineEdit),
|
||||||
|
m_errorParserComboBox(new QComboBox)
|
||||||
{
|
{
|
||||||
Q_ASSERT(tc);
|
Q_ASSERT(tc);
|
||||||
|
|
||||||
|
for (int i = 0; i < CustomToolChain::OutputParserCount; ++i)
|
||||||
|
m_errorParserComboBox->addItem(CustomToolChain::parserName((CustomToolChain::OutputParser)i));
|
||||||
|
|
||||||
m_predefinedMacros->setTabChangesFocus(true);
|
m_predefinedMacros->setTabChangesFocus(true);
|
||||||
m_predefinedMacros->setToolTip(tr("Each line defines a macro. Format is MACRO[=VALUE]"));
|
m_predefinedMacros->setToolTip(tr("Each line defines a macro. Format is MACRO[=VALUE]"));
|
||||||
m_headerPaths->setTabChangesFocus(true);
|
m_headerPaths->setTabChangesFocus(true);
|
||||||
@@ -438,6 +478,8 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
|
|||||||
m_mainLayout->addRow(tr("&Header paths:"), m_headerDetails);
|
m_mainLayout->addRow(tr("&Header paths:"), m_headerDetails);
|
||||||
m_mainLayout->addRow(tr("C++11 &flags:"), m_cxx11Flags);
|
m_mainLayout->addRow(tr("C++11 &flags:"), m_cxx11Flags);
|
||||||
m_mainLayout->addRow(tr("&Qt mkspecs:"), m_mkspecs);
|
m_mainLayout->addRow(tr("&Qt mkspecs:"), m_mkspecs);
|
||||||
|
m_mainLayout->addRow(tr("Error Parser:"), m_errorParserComboBox);
|
||||||
|
m_mainLayout->addRow(tr("&Error Parser:"), m_parserLayout);
|
||||||
addErrorLabel();
|
addErrorLabel();
|
||||||
|
|
||||||
setFromToolchain();
|
setFromToolchain();
|
||||||
@@ -447,6 +489,9 @@ CustomToolChainConfigWidget::CustomToolChainConfigWidget(CustomToolChain *tc) :
|
|||||||
connect(m_abiWidget, SIGNAL(abiChanged()), this, SIGNAL(dirty()));
|
connect(m_abiWidget, SIGNAL(abiChanged()), this, SIGNAL(dirty()));
|
||||||
connect(m_predefinedMacros, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
|
connect(m_predefinedMacros, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
|
||||||
connect(m_headerPaths, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
|
connect(m_headerPaths, SIGNAL(textChanged()), this, SLOT(updateSummaries()));
|
||||||
|
connect(m_errorParserComboBox, SIGNAL(currentIndexChanged(int)),
|
||||||
|
this, SLOT(errorParserChanged(int)));
|
||||||
|
errorParserChanged(m_errorParserComboBox->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomToolChainConfigWidget::updateSummaries()
|
void CustomToolChainConfigWidget::updateSummaries()
|
||||||
@@ -457,6 +502,12 @@ void CustomToolChainConfigWidget::updateSummaries()
|
|||||||
m_headerDetails->updateSummaryText();
|
m_headerDetails->updateSummaryText();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CustomToolChainConfigWidget::errorParserChanged(int index)
|
||||||
|
{
|
||||||
|
Q_UNUSED(index);
|
||||||
|
emit dirty();
|
||||||
|
}
|
||||||
|
|
||||||
void CustomToolChainConfigWidget::applyImpl()
|
void CustomToolChainConfigWidget::applyImpl()
|
||||||
{
|
{
|
||||||
if (toolChain()->isAutoDetected())
|
if (toolChain()->isAutoDetected())
|
||||||
@@ -473,6 +524,7 @@ void CustomToolChainConfigWidget::applyImpl()
|
|||||||
tc->setCxx11Flags(m_cxx11Flags->text().split(QLatin1Char(',')));
|
tc->setCxx11Flags(m_cxx11Flags->text().split(QLatin1Char(',')));
|
||||||
tc->setMkspecs(m_mkspecs->text());
|
tc->setMkspecs(m_mkspecs->text());
|
||||||
tc->setDisplayName(displayName); // reset display name
|
tc->setDisplayName(displayName); // reset display name
|
||||||
|
tc->setOutputParserType((CustomToolChain::OutputParser)m_errorParserComboBox->currentIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomToolChainConfigWidget::setFromToolchain()
|
void CustomToolChainConfigWidget::setFromToolchain()
|
||||||
@@ -487,6 +539,7 @@ void CustomToolChainConfigWidget::setFromToolchain()
|
|||||||
m_headerPaths->setPlainText(tc->headerPathsList().join(QLatin1String("\n")));
|
m_headerPaths->setPlainText(tc->headerPathsList().join(QLatin1String("\n")));
|
||||||
m_cxx11Flags->setText(tc->cxx11Flags().join(QLatin1String(",")));
|
m_cxx11Flags->setText(tc->cxx11Flags().join(QLatin1String(",")));
|
||||||
m_mkspecs->setText(tc->mkspecs());
|
m_mkspecs->setText(tc->mkspecs());
|
||||||
|
m_errorParserComboBox->setCurrentIndex(tc->outputParserType());
|
||||||
blockSignals(blocked);
|
blockSignals(blocked);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -500,7 +553,8 @@ bool CustomToolChainConfigWidget::isDirtyImpl() const
|
|||||||
|| m_predefinedDetails->entries() != tc->rawPredefinedMacros()
|
|| m_predefinedDetails->entries() != tc->rawPredefinedMacros()
|
||||||
|| m_headerDetails->entries() != tc->headerPathsList()
|
|| m_headerDetails->entries() != tc->headerPathsList()
|
||||||
|| m_cxx11Flags->text().split(QLatin1Char(',')) != tc->cxx11Flags()
|
|| m_cxx11Flags->text().split(QLatin1Char(',')) != tc->cxx11Flags()
|
||||||
|| m_mkspecs->text() != tc->mkspecs();
|
|| m_mkspecs->text() != tc->mkspecs()
|
||||||
|
|| m_errorParserComboBox->currentIndex() == tc->outputParserType();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CustomToolChainConfigWidget::makeReadOnlyImpl()
|
void CustomToolChainConfigWidget::makeReadOnlyImpl()
|
||||||
|
@@ -42,6 +42,7 @@
|
|||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
class QPlainTextEdit;
|
class QPlainTextEdit;
|
||||||
class QTextEdit;
|
class QTextEdit;
|
||||||
|
class QComboBox;
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
|
||||||
namespace Utils { class PathChooser; }
|
namespace Utils { class PathChooser; }
|
||||||
@@ -57,7 +58,18 @@ namespace Internal { class CustomToolChainFactory; }
|
|||||||
|
|
||||||
class PROJECTEXPLORER_EXPORT CustomToolChain : public ToolChain
|
class PROJECTEXPLORER_EXPORT CustomToolChain : public ToolChain
|
||||||
{
|
{
|
||||||
|
Q_DECLARE_TR_FUNCTIONS(CustomToolChain)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
enum OutputParser
|
||||||
|
{
|
||||||
|
Gcc = 0,
|
||||||
|
Clang = 1,
|
||||||
|
LinuxIcc = 2,
|
||||||
|
Msvc = 3,
|
||||||
|
OutputParserCount
|
||||||
|
};
|
||||||
|
|
||||||
QString type() const;
|
QString type() const;
|
||||||
QString typeDisplayName() const;
|
QString typeDisplayName() const;
|
||||||
Abi targetAbi() const;
|
Abi targetAbi() const;
|
||||||
@@ -98,6 +110,9 @@ public:
|
|||||||
|
|
||||||
ToolChain *clone() const;
|
ToolChain *clone() const;
|
||||||
|
|
||||||
|
OutputParser outputParserType() const;
|
||||||
|
void setOutputParserType(OutputParser parser);
|
||||||
|
static QString parserName(OutputParser parser);
|
||||||
protected:
|
protected:
|
||||||
CustomToolChain(const QString &id, bool autodetect);
|
CustomToolChain(const QString &id, bool autodetect);
|
||||||
CustomToolChain(const CustomToolChain &);
|
CustomToolChain(const CustomToolChain &);
|
||||||
@@ -114,6 +129,7 @@ private:
|
|||||||
QStringList m_cxx11Flags;
|
QStringList m_cxx11Flags;
|
||||||
QList<Utils::FileName> m_mkspecs;
|
QList<Utils::FileName> m_mkspecs;
|
||||||
|
|
||||||
|
OutputParser m_outputParser;
|
||||||
friend class Internal::CustomToolChainFactory;
|
friend class Internal::CustomToolChainFactory;
|
||||||
friend class ToolChainFactory;
|
friend class ToolChainFactory;
|
||||||
};
|
};
|
||||||
@@ -157,6 +173,7 @@ public:
|
|||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void updateSummaries();
|
void updateSummaries();
|
||||||
|
void errorParserChanged(int index);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void applyImpl();
|
void applyImpl();
|
||||||
@@ -175,6 +192,7 @@ protected:
|
|||||||
TextEditDetailsWidget *m_headerDetails;
|
TextEditDetailsWidget *m_headerDetails;
|
||||||
QLineEdit *m_cxx11Flags;
|
QLineEdit *m_cxx11Flags;
|
||||||
QLineEdit *m_mkspecs;
|
QLineEdit *m_mkspecs;
|
||||||
|
QComboBox *m_errorParserComboBox;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Internal
|
} // namespace Internal
|
||||||
|
Reference in New Issue
Block a user