From 131a796f9f0afe10e744f27071f426af26296458 Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Mon, 17 Jul 2017 22:35:06 +0300 Subject: [PATCH] GCC: Detect multiple versions of gcc/g++ on linux Debian/ubuntu systems can have /usr/bin/g++ which is GCC6, /usr/bin/g++-5 and /usr/bin/g++-7. The same applies for cross-compilers. Detect them all. Change-Id: Ia7b403efbfab60b05c4f27a9011d054d52c3aa1a Reviewed-by: Orgad Shaneh --- src/plugins/projectexplorer/gcctoolchain.cpp | 46 +++++++++++++------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 603e473613c..c1a3a88a478 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -44,9 +44,9 @@ #include #include #include - -#include #include +#include +#include #include @@ -66,6 +66,7 @@ static const char compilerPlatformLinkerFlagsKeyC[] = "ProjectExplorer.GccToolCh static const char targetAbiKeyC[] = "ProjectExplorer.GccToolChain.TargetAbi"; static const char originalTargetTripleKeyC[] = "ProjectExplorer.GccToolChain.OriginalTargetTriple"; static const char supportedAbisKeyC[] = "ProjectExplorer.GccToolChain.SupportedAbis"; +static const char binaryRegexp[] = "(?:^|-|\\b)(?:gcc|g\\+\\+)(?:-([\\d.]+))?$"; static const int CACHE_SIZE = 16; @@ -363,10 +364,15 @@ void GccToolChain::setOriginalTargetTriple(const QString &targetTriple) QString GccToolChain::defaultDisplayName() const { + QString type = typeDisplayName(); + const QRegularExpression regexp(binaryRegexp); + const QRegularExpressionMatch match = regexp.match(m_compilerCommand.fileName()); + if (match.hasMatch()) + type += ' ' + match.captured(1); if (!m_targetAbi.isValid()) - return typeDisplayName(); + return type; return QCoreApplication::translate("ProjectExplorer::GccToolChain", - "%1 (%2, %3 %4 in %5)").arg(typeDisplayName(), + "%1 (%2, %3 %4 in %5)").arg(type, ToolChainManager::displayNameOfLanguageId(language()), Abi::toString(m_targetAbi.architecture()), Abi::toString(m_targetAbi.wordWidth()), @@ -928,20 +934,28 @@ QList GccToolChainFactory::autoDetect(const QList &alr Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); known.append(tcs); if (HostOsInfo::isLinuxHost()) { + const QRegularExpression regexp(binaryRegexp); for (const QString &dir : QStringList({ "/usr/bin", "/usr/local/bin" })) { QDir binDir(dir); - for (const QString &entry : binDir.entryList({"*-g++"}, QDir::Files | QDir::Executable)) { - tcs.append(autoDetectToolchains(entry, Abi(), Constants::CXX_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, known)); - known.append(tcs); - } - for (const QString &entry : binDir.entryList({"*-gcc"}, QDir::Files | QDir::Executable)) { - if (entry.endsWith("c89-gcc") || entry.endsWith("c99-gcc")) - continue; - tcs.append(autoDetectToolchains(entry, Abi(), Constants::C_LANGUAGE_ID, - Constants::GCC_TOOLCHAIN_TYPEID, known)); - known.append(tcs); - } + auto gccProbe = [&](const QString &name, Core::Id language) { + for (const QString &entry : binDir.entryList( + {"*-" + name, name + "-*", "*-" + name + "-*"}, + QDir::Files | QDir::Executable)) { + const QString fileName = FileName::fromString(entry).fileName(); + if (fileName == "c89-gcc" || fileName == "c99-gcc") + continue; + const QRegularExpressionMatch match = regexp.match(fileName); + if (!match.hasMatch()) + continue; + const bool isNative = fileName.startsWith(name); + const Abi abi = isNative ? Abi::hostAbi() : Abi(); + tcs.append(autoDetectToolchains(entry, abi, language, + Constants::GCC_TOOLCHAIN_TYPEID, known)); + known.append(tcs); + } + }; + gccProbe("g++", Constants::CXX_LANGUAGE_ID); + gccProbe("gcc", Constants::C_LANGUAGE_ID); } }