ToolChain: Make sure all ToolChains have a language set

* Add code to toolchains
* Assert that this is the case in the toolchainmanager

Change-Id: I82452689e83279fd9d1afb3140b0070bef9b6cd8
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2016-07-12 12:20:06 +02:00
parent dbf5f74352
commit 1304b250eb
14 changed files with 53 additions and 27 deletions

View File

@@ -63,10 +63,11 @@ static const char ANDROID_NDK_TC_VERION[] = "Qt4ProjectManager.Android.NDK_TC_VE
QHash<Abi, QList<int> > AndroidToolChainFactory::m_newestVersionForAbi; QHash<Abi, QList<int> > AndroidToolChainFactory::m_newestVersionForAbi;
FileName AndroidToolChainFactory::m_ndkLocation; FileName AndroidToolChainFactory::m_ndkLocation;
AndroidToolChain::AndroidToolChain(const Abi &abi, const QString &ndkToolChainVersion, Detection d) AndroidToolChain::AndroidToolChain(const Abi &abi, const QString &ndkToolChainVersion, Language l, Detection d)
: GccToolChain(Constants::ANDROID_TOOLCHAIN_ID, d), : GccToolChain(Constants::ANDROID_TOOLCHAIN_ID, d),
m_ndkToolChainVersion(ndkToolChainVersion), m_secondaryToolChain(false) m_ndkToolChainVersion(ndkToolChainVersion), m_secondaryToolChain(false)
{ {
setLanguage(l);
setTargetAbi(abi); setTargetAbi(abi);
setDisplayName(QString::fromLatin1("Android GCC (%1-%2)") setDisplayName(QString::fromLatin1("Android GCC (%1-%2)")
.arg(AndroidConfig::displayName(targetAbi())) .arg(AndroidConfig::displayName(targetAbi()))
@@ -392,7 +393,8 @@ AndroidToolChainFactory::autodetectToolChainsForNdk(const FileName &ndkPath,
AndroidToolChain *tc = findToolChain(compilerPath, alreadyKnown); AndroidToolChain *tc = findToolChain(compilerPath, alreadyKnown);
if (!tc) { if (!tc) {
tc = new AndroidToolChain(abi, version, ToolChain::AutoDetection); tc = new AndroidToolChain(abi, version, ToolChain::Language::Cxx,
ToolChain::AutoDetection);
tc->resetToolChain(compilerPath); tc->resetToolChain(compilerPath);
} }
result.append(tc); result.append(tc);

View File

@@ -62,7 +62,8 @@ protected:
DetectedAbisResult detectSupportedAbis() const override; DetectedAbisResult detectSupportedAbis() const override;
private: private:
explicit AndroidToolChain(const ProjectExplorer::Abi &abi, const QString &ndkToolChainVersion, Detection d); explicit AndroidToolChain(const ProjectExplorer::Abi &abi, const QString &ndkToolChainVersion,
Language l, Detection d);
AndroidToolChain(); AndroidToolChain();
AndroidToolChain(const AndroidToolChain &); AndroidToolChain(const AndroidToolChain &);

View File

@@ -355,6 +355,7 @@ void IosConfigurations::setDeveloperPath(const FileName &devPath)
static ClangToolChain *createToolChain(const Platform &platform) static ClangToolChain *createToolChain(const Platform &platform)
{ {
ClangToolChain *toolChain = new ClangToolChain(ToolChain::AutoDetection); ClangToolChain *toolChain = new ClangToolChain(ToolChain::AutoDetection);
toolChain->setLanguage(ToolChain::Language::Cxx);
toolChain->setDisplayName(platform.name); toolChain->setDisplayName(platform.name);
toolChain->setPlatformCodeGenFlags(platform.backendFlags); toolChain->setPlatformCodeGenFlags(platform.backendFlags);
toolChain->setPlatformLinkerFlags(platform.backendFlags); toolChain->setPlatformLinkerFlags(platform.backendFlags);

View File

@@ -42,6 +42,7 @@ namespace ProjectExplorer {
namespace Internal { namespace Internal {
AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId,
const Language &l,
Detection d, Detection d,
const Abi &abi, const Abi &abi,
const QString& vcvarsBat) : ToolChain(typeId, d), const QString& vcvarsBat) : ToolChain(typeId, d),
@@ -53,6 +54,7 @@ AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId,
Q_ASSERT(abi.binaryFormat() == Abi::PEFormat); Q_ASSERT(abi.binaryFormat() == Abi::PEFormat);
Q_ASSERT(abi.osFlavor() != Abi::WindowsMSysFlavor); Q_ASSERT(abi.osFlavor() != Abi::WindowsMSysFlavor);
Q_ASSERT(!m_vcvarsBat.isEmpty()); Q_ASSERT(!m_vcvarsBat.isEmpty());
setLanguage(l);
} }
AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, Detection d) : AbstractMsvcToolChain::AbstractMsvcToolChain(Core::Id typeId, Detection d) :

View File

@@ -38,7 +38,8 @@ namespace Internal {
class PROJECTEXPLORER_EXPORT AbstractMsvcToolChain : public ToolChain class PROJECTEXPLORER_EXPORT AbstractMsvcToolChain : public ToolChain
{ {
public: public:
explicit AbstractMsvcToolChain(Core::Id typeId, Detection d, const Abi &abi, const QString& vcvarsBat); explicit AbstractMsvcToolChain(Core::Id typeId, const Language &l, Detection d,
const Abi &abi, const QString& vcvarsBat);
explicit AbstractMsvcToolChain(Core::Id typeId, Detection d); explicit AbstractMsvcToolChain(Core::Id typeId, Detection d);
Abi targetAbi() const override; Abi targetAbi() const override;

View File

@@ -88,7 +88,9 @@ 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)
{ } {
setLanguage(Language::Cxx);
}
QString CustomToolChain::typeDisplayName() const QString CustomToolChain::typeDisplayName() const
{ {

View File

@@ -776,7 +776,9 @@ bool GccToolChainFactory::canCreate()
ToolChain *GccToolChainFactory::create() ToolChain *GccToolChainFactory::create()
{ {
return createToolChain(false); ToolChain *tc = createToolChain(false);
tc->setLanguage({ ToolChain::Language::Cxx });
return tc;
} }
QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) QList<ToolChain *> GccToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)
@@ -860,6 +862,7 @@ QList<ToolChain *> GccToolChainFactory::autoDetectToolchains(const QString &comp
tc->setTargetAbi(abi); tc->setTargetAbi(abi);
tc->setOriginalTargetTriple(detectedAbis.originalTargetTriple); tc->setOriginalTargetTriple(detectedAbis.originalTargetTriple);
tc->setDisplayName(tc->defaultDisplayName()); // reset displayname tc->setDisplayName(tc->defaultDisplayName()); // reset displayname
tc->setLanguage(ToolChain::Language::Cxx);
result.append(tc.take()); result.append(tc.take());
} }

View File

@@ -328,13 +328,14 @@ Utils::Environment MsvcToolChain::readEnvironmentSetting(Utils::Environment& env
// -------------------------------------------------------------------------- // --------------------------------------------------------------------------
MsvcToolChain::MsvcToolChain(const QString &name, const Abi &abi, MsvcToolChain::MsvcToolChain(const QString &name, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, Detection d) : const QString &varsBat, const QString &varsBatArg, const Language &l,
MsvcToolChain(Constants::MSVC_TOOLCHAIN_TYPEID, name, abi, varsBat, varsBatArg, d) Detection d) :
MsvcToolChain(Constants::MSVC_TOOLCHAIN_TYPEID, name, abi, varsBat, varsBatArg, l, d)
{ } { }
MsvcToolChain::MsvcToolChain(Core::Id typeId, const QString &name, const Abi &abi, MsvcToolChain::MsvcToolChain(Core::Id typeId, const QString &name, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, const QString &varsBat, const QString &varsBatArg, const Language &l,
Detection d) : AbstractMsvcToolChain(typeId, d, abi, varsBat), Detection d) : AbstractMsvcToolChain(typeId, l, d, abi, varsBat),
m_varsBatArg(varsBatArg) m_varsBatArg(varsBatArg)
{ {
Q_ASSERT(!name.isEmpty()); Q_ASSERT(!name.isEmpty());
@@ -342,8 +343,7 @@ MsvcToolChain::MsvcToolChain(Core::Id typeId, const QString &name, const Abi &ab
setDisplayName(name); setDisplayName(name);
} }
MsvcToolChain::MsvcToolChain(Core::Id typeId) MsvcToolChain::MsvcToolChain(Core::Id typeId) : AbstractMsvcToolChain(typeId, ManualDetection)
: AbstractMsvcToolChain(typeId, ManualDetection)
{ } { }
MsvcToolChain::MsvcToolChain() : MsvcToolChain(Constants::MSVC_TOOLCHAIN_TYPEID) MsvcToolChain::MsvcToolChain() : MsvcToolChain(Constants::MSVC_TOOLCHAIN_TYPEID)
@@ -496,18 +496,15 @@ static const char clangClBinary[] = "clang-cl.exe";
ClangClToolChain::ClangClToolChain(const QString &name, const QString &llvmDir, ClangClToolChain::ClangClToolChain(const QString &name, const QString &llvmDir,
const Abi &abi, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, const QString &varsBat, const QString &varsBatArg, const Language &l,
Detection d) Detection d)
: MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID, name, abi, varsBat, varsBatArg, d) : MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID, name, abi, varsBat, varsBatArg, l, d)
, m_llvmDir(llvmDir) , m_llvmDir(llvmDir)
, m_compiler(Utils::FileName::fromString(m_llvmDir + QStringLiteral("/bin/") + QLatin1String(clangClBinary))) , m_compiler(Utils::FileName::fromString(m_llvmDir + QStringLiteral("/bin/") + QLatin1String(clangClBinary)))
{ { }
}
ClangClToolChain::ClangClToolChain() ClangClToolChain::ClangClToolChain() : MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID)
: MsvcToolChain(Constants::CLANG_CL_TOOLCHAIN_TYPEID) { }
{
}
bool ClangClToolChain::isValid() const bool ClangClToolChain::isValid() const
{ {
@@ -632,7 +629,7 @@ static ToolChain *findOrCreateToolChain(const QList<ToolChain *> &alreadyKnown,
&& mtc->varsBatArg() == varsBatArg; && mtc->varsBatArg() == varsBatArg;
}); });
if (!tc) if (!tc)
tc = new MsvcToolChain(name, abi, varsBat, varsBatArg, d); tc = new MsvcToolChain(name, abi, varsBat, varsBatArg, ToolChain::Language::Cxx, d);
return tc; return tc;
} }
@@ -671,6 +668,7 @@ static void detectCppBuildTools(QList<ToolChain *> *list)
e.format, e.wordSize); e.format, e.wordSize);
list->append(new MsvcToolChain(name + QLatin1String(e.postFix), abi, list->append(new MsvcToolChain(name + QLatin1String(e.postFix), abi,
vcVarsBat, QLatin1String(e.varsBatArg), vcVarsBat, QLatin1String(e.varsBatArg),
ToolChain::Language::Cxx,
ToolChain::AutoDetection)); ToolChain::AutoDetection));
} }
} }
@@ -715,7 +713,7 @@ static void detectClangClToolChain(QList<ToolChain *> *list)
+ Abi::toString(targetAbi.osFlavor()).toUpper(); + Abi::toString(targetAbi.osFlavor()).toUpper();
list->append(new ClangClToolChain(name, path, targetAbi, list->append(new ClangClToolChain(name, path, targetAbi,
msvcToolChain->varsBat(), msvcToolChain->varsBatArg(), msvcToolChain->varsBat(), msvcToolChain->varsBatArg(),
ToolChain::AutoDetection)); ToolChain::Language::Cxx, ToolChain::AutoDetection));
} }
QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown)

View File

@@ -55,7 +55,7 @@ public:
explicit MsvcToolChain(const QString &name, const Abi &abi, explicit MsvcToolChain(const QString &name, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, const QString &varsBat, const QString &varsBatArg,
Detection d = ManualDetection); const Language &l, Detection d = ManualDetection);
MsvcToolChain(); MsvcToolChain();
Utils::FileNameList suggestedMkspecList() const override; Utils::FileNameList suggestedMkspecList() const override;
@@ -76,7 +76,7 @@ public:
protected: protected:
explicit MsvcToolChain(Core::Id typeId, const QString &name, const Abi &abi, explicit MsvcToolChain(Core::Id typeId, const QString &name, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, const QString &varsBat, const QString &varsBatArg,
Detection d); const Language &l, Detection d);
explicit MsvcToolChain(Core::Id typeId); explicit MsvcToolChain(Core::Id typeId);
Utils::Environment readEnvironmentSetting(Utils::Environment& env) const override; Utils::Environment readEnvironmentSetting(Utils::Environment& env) const override;
@@ -93,6 +93,7 @@ public:
explicit ClangClToolChain(const QString &name, const QString &llvmDir, explicit ClangClToolChain(const QString &name, const QString &llvmDir,
const Abi &abi, const Abi &abi,
const QString &varsBat, const QString &varsBatArg, const QString &varsBat, const QString &varsBatArg,
const Language &l,
Detection d = ManualDetection); Detection d = ManualDetection);
ClangClToolChain(); ClangClToolChain();

View File

@@ -388,6 +388,7 @@ void ToolChainManager::notifyAboutUpdate(ToolChain *tc)
bool ToolChainManager::registerToolChain(ToolChain *tc) bool ToolChainManager::registerToolChain(ToolChain *tc)
{ {
QTC_ASSERT(tc->language() != ToolChain::Language::None, return false);
QTC_ASSERT(d->m_writer, return false); QTC_ASSERT(d->m_writer, return false);
if (!tc || d->m_toolChains.contains(tc)) if (!tc || d->m_toolChains.contains(tc))
@@ -433,7 +434,10 @@ public:
ToolChain("TestToolChainType", d), ToolChain("TestToolChainType", d),
token(t), token(t),
m_valid(v) m_valid(v)
{ m_toolChains.append(this); } {
m_toolChains.append(this);
setLanguage(ToolChain::Language::Cxx);
}
static QList<TTC *> toolChains(); static QList<TTC *> toolChains();
static bool hasToolChains() { return !m_toolChains.isEmpty(); } static bool hasToolChains() { return !m_toolChains.isEmpty(); }

View File

@@ -236,8 +236,9 @@ WinCEToolChain::WinCEToolChain(const QString &name,
const QString &binPath, const QString &binPath,
const QString &includePath, const QString &includePath,
const QString &libPath, const QString &libPath,
const Language &l,
Detection d) : Detection d) :
AbstractMsvcToolChain(Constants::WINCE_TOOLCHAIN_TYPEID, d, abi, vcvarsBat), AbstractMsvcToolChain(Constants::WINCE_TOOLCHAIN_TYPEID, l, d, abi, vcvarsBat),
m_msvcVer(msvcVer), m_msvcVer(msvcVer),
m_ceVer(ceVer), m_ceVer(ceVer),
m_binPath(binPath), m_binPath(binPath),
@@ -368,7 +369,8 @@ static ToolChain *findOrCreateToolChain(const QList<ToolChain *> &alreadyKnown,
&& cetc->libPath() == libPath; && cetc->libPath() == libPath;
}); });
if (!tc) if (!tc)
tc = new WinCEToolChain(name, abi, vcvarsBat, msvcVer, ceVer, binPath, includePath, libPath, d); tc = new WinCEToolChain(name, abi, vcvarsBat, msvcVer, ceVer, binPath, includePath, libPath,
ProjectExplorer::ToolChain::Language::Cxx, d);
return tc; return tc;
} }

View File

@@ -43,6 +43,7 @@ public:
const QString &binPath, const QString &binPath,
const QString &includePath, const QString &includePath,
const QString &libPath, const QString &libPath,
const Language &l,
Detection d = ManualDetection); Detection d = ManualDetection);
Utils::FileNameList suggestedMkspecList() const override; Utils::FileNameList suggestedMkspecList() const override;

View File

@@ -62,6 +62,13 @@ QnxToolChain::QnxToolChain(ToolChain::Detection d)
: GccToolChain(Constants::QNX_TOOLCHAIN_ID, d) : GccToolChain(Constants::QNX_TOOLCHAIN_ID, d)
{ } { }
QnxToolChain::QnxToolChain(Language l, ToolChain::Detection d)
: QnxToolChain(d)
{
setLanguage(l);
}
QString QnxToolChain::typeDisplayName() const QString QnxToolChain::typeDisplayName() const
{ {
return QnxToolChainFactory::tr("QCC"); return QnxToolChainFactory::tr("QCC");

View File

@@ -35,6 +35,7 @@ class QnxToolChain : public ProjectExplorer::GccToolChain
{ {
public: public:
explicit QnxToolChain(Detection d); explicit QnxToolChain(Detection d);
explicit QnxToolChain(Language l, Detection d);
QString typeDisplayName() const override; QString typeDisplayName() const override;