From 5d67a471e06fa7606fcfd8f3a19701f0e6f1975a Mon Sep 17 00:00:00 2001 From: Ivan Donchevskii Date: Mon, 6 Aug 2018 12:28:08 +0200 Subject: [PATCH] ProjectExplorer: Provide more flexibility in compiler paths Let autoDetectToolchains accept compiler path instead of always searching for it in environment. Make environment search into a separate call. Change-Id: Ie692b38bac03955a8f1cb3590beb7a2e9640a448 Reviewed-by: Marco Bubke --- src/plugins/projectexplorer/gcctoolchain.cpp | 50 ++++++++++++------- .../projectexplorer/gcctoolchainfactories.h | 9 ++-- 2 files changed, 37 insertions(+), 22 deletions(-) diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 3f711d1a520..dd5833f6960 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -942,7 +942,8 @@ void GccToolChainFactory::versionProbe(const QString &name, Core::Id language, C continue; const bool isNative = fileName.startsWith(name); const Abi abi = isNative ? Abi::hostAbi() : Abi(); - tcs.append(autoDetectToolchains(entry, abi, language, type, known)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment(entry), abi, language, type, + known)); known.append(tcs); } } @@ -952,10 +953,12 @@ QList GccToolChainFactory::autoDetect(const QList &alr { 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)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("g++"), Abi::hostAbi(), + Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, + alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("gcc"), Abi::hostAbi(), + Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, + alreadyKnown)); known.append(tcs); versionProbe("g++", Constants::CXX_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known); versionProbe("gcc", Constants::C_LANGUAGE_ID, Constants::GCC_TOOLCHAIN_TYPEID, tcs, known, @@ -996,7 +999,13 @@ GccToolChain *GccToolChainFactory::createToolChain(bool autoDetect) return new GccToolChain(autoDetect ? ToolChain::AutoDetection : ToolChain::ManualDetection); } -QList GccToolChainFactory::autoDetectToolchains(const QString &compiler, +Utils::FileName GccToolChainFactory::compilerPathFromEnvironment(const QString &compilerName) +{ + Environment systemEnvironment = Environment::systemEnvironment(); + return systemEnvironment.searchInPath(compilerName); +} + +QList GccToolChainFactory::autoDetectToolchains(const FileName &compilerPath, const Abi &requiredAbi, Core::Id language, const Core::Id requiredTypeId, @@ -1004,11 +1013,8 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp { QList result; - Environment systemEnvironment = Environment::systemEnvironment(); - 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; @@ -1338,10 +1344,13 @@ QList ClangToolChainFactory::autoDetect(const QList &a { QList tcs; QList known = alreadyKnown; - tcs.append(autoDetectToolchains("clang++", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); - tcs.append(autoDetectToolchains("clang", Abi::hostAbi(), Constants::C_LANGUAGE_ID, - Constants::CLANG_TOOLCHAIN_TYPEID, alreadyKnown)); + + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang++"), Abi::hostAbi(), + Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, + alreadyKnown)); + tcs.append(autoDetectToolchains(compilerPathFromEnvironment("clang"), Abi::hostAbi(), + Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, + alreadyKnown)); known.append(tcs); versionProbe("clang++", Constants::CXX_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); versionProbe("clang", Constants::C_LANGUAGE_ID, Constants::CLANG_TOOLCHAIN_TYPEID, tcs, known); @@ -1435,10 +1444,12 @@ QList MingwToolChainFactory::autoDetect(const QList &a { Abi ha = Abi::hostAbi(); ha = Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth()); - QList result = autoDetectToolchains("g++", ha, Constants::CXX_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); - result += autoDetectToolchains("gcc", ha, Constants::C_LANGUAGE_ID, - Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); + QList result = autoDetectToolchains( + compilerPathFromEnvironment("g++"), ha, Constants::CXX_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); + result += autoDetectToolchains( + compilerPathFromEnvironment("gcc"), ha, Constants::C_LANGUAGE_ID, + Constants::MINGW_TOOLCHAIN_TYPEID, alreadyKnown); return result; } @@ -1532,8 +1543,9 @@ QSet LinuxIccToolChainFactory::supportedLanguages() const QList LinuxIccToolChainFactory::autoDetect(const QList &alreadyKnown) { - return autoDetectToolchains("icpc", Abi::hostAbi(), Constants::CXX_LANGUAGE_ID, - Constants::LINUXICC_TOOLCHAIN_TYPEID, alreadyKnown); + return autoDetectToolchains(compilerPathFromEnvironment("icpc"), Abi::hostAbi(), + Constants::CXX_LANGUAGE_ID, Constants::LINUXICC_TOOLCHAIN_TYPEID, + alreadyKnown); } QList LinuxIccToolChainFactory::autoDetect(const FileName &compilerPath, const Core::Id &language) diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index 9cdc982a0c8..54d4f417825 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -69,9 +69,12 @@ protected: QList &tcs, QList &known, const QSet &filteredNames = {}); - QList autoDetectToolchains(const QString &compiler, const Abi &requiredAbi, - Core::Id language, const Core::Id requiredTypeId, - const QList &alreadyKnown); + + Utils::FileName compilerPathFromEnvironment(const QString &compilerName); + + QList autoDetectToolchains( + const Utils::FileName &compilerPath, const Abi &requiredAbi, Core::Id language, + const Core::Id requiredTypeId, const QList &alreadyKnown); QList autoDetectToolChain(const Utils::FileName &compilerPath, const Core::Id language, const Abi &requiredAbi = Abi()); };