diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 7beb7fe555c..66caca2b08b 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -42,6 +42,7 @@ #include #include +#include #include #include @@ -920,10 +921,29 @@ ToolChain *GccToolChainFactory::create(Core::Id language) QList GccToolChainFactory::autoDetect(const QList &alreadyKnown) { QList tcs; + QList known = alreadyKnown; tcs.append(autoDetectToolchains("g++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); tcs.append(autoDetectToolchains("gcc", Abi::hostAbi(), Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, alreadyKnown)); + known.append(tcs); + if (HostOsInfo::isLinuxHost()) { + 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); + } + } + } return tcs; } @@ -972,11 +992,12 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp const FileName compilerPath = systemEnvironment.searchInPath(compiler); if (compilerPath.isEmpty()) return result; + const FileName canonicalPath = FileUtils::canonicalPath(compilerPath); - result = Utils::filtered(alreadyKnown, [requiredTypeId, compilerPath](ToolChain *tc) { - return tc->typeId() == requiredTypeId - && tc->compilerCommand() == compilerPath; - }); + result = Utils::filtered(alreadyKnown, [requiredTypeId, canonicalPath](ToolChain *tc) { + return tc->typeId() == requiredTypeId + && FileUtils::canonicalPath(tc->compilerCommand()) == canonicalPath; + }); if (!result.isEmpty()) { for (ToolChain *tc : result) { if (tc->isAutoDetected()) @@ -987,15 +1008,17 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp result = autoDetectToolChain(compilerPath, language, requiredAbi); - const Abi alternateAbi = Abi(requiredAbi.architecture(), requiredAbi.os(), - requiredAbi.osFlavor(), requiredAbi.binaryFormat(), 32); - ToolChain *abiTc = Utils::findOrDefault(result, [&requiredAbi, &alternateAbi](const ToolChain *tc) { - return requiredAbi == tc->targetAbi() - || (requiredAbi.wordWidth() == 64 && tc->targetAbi() == alternateAbi); - }); - if (!abiTc) { - qDeleteAll(result); - result.clear(); + if (!requiredAbi.isNull()) { + const Abi alternateAbi = Abi(requiredAbi.architecture(), requiredAbi.os(), + requiredAbi.osFlavor(), requiredAbi.binaryFormat(), 32); + ToolChain *abiTc = Utils::findOrDefault(result, [&requiredAbi, &alternateAbi](const ToolChain *tc) { + return requiredAbi == tc->targetAbi() + || (requiredAbi.wordWidth() == 64 && tc->targetAbi() == alternateAbi); + }); + if (!abiTc) { + qDeleteAll(result); + result.clear(); + } } return result;