From 941d23a20667ec45dd7bdbe2a321c8e1c2a609bd Mon Sep 17 00:00:00 2001 From: Orgad Shaneh Date: Sun, 19 Jul 2015 10:59:06 +0300 Subject: [PATCH] ProjectExplorer: Avoid execution of g++ on startup Change-Id: I53719f58714b3dd0fcf21d8c7b1deb8d86190408 Reviewed-by: Tobias Hunger --- src/plugins/android/androidtoolchain.cpp | 3 +- src/plugins/android/androidtoolchain.h | 2 +- src/plugins/projectexplorer/gcctoolchain.cpp | 31 ++++++++++--------- .../projectexplorer/gcctoolchainfactories.h | 11 ++++--- src/plugins/projectexplorer/msvctoolchain.cpp | 3 +- src/plugins/projectexplorer/msvctoolchain.h | 2 +- src/plugins/projectexplorer/toolchain.cpp | 3 +- src/plugins/projectexplorer/toolchain.h | 2 +- .../projectexplorer/toolchainmanager.cpp | 2 +- .../projectexplorer/wincetoolchain.cpp | 3 +- src/plugins/projectexplorer/wincetoolchain.h | 2 +- 11 files changed, 36 insertions(+), 28 deletions(-) diff --git a/src/plugins/android/androidtoolchain.cpp b/src/plugins/android/androidtoolchain.cpp index 1749c6f53b3..ab7f362c586 100644 --- a/src/plugins/android/androidtoolchain.cpp +++ b/src/plugins/android/androidtoolchain.cpp @@ -258,8 +258,9 @@ AndroidToolChainFactory::AndroidToolChainFactory() setDisplayName(tr("Android GCC")); } -QList AndroidToolChainFactory::autoDetect() +QList AndroidToolChainFactory::autoDetect(const QList &alreadyKnown) { + Q_UNUSED(alreadyKnown); return createToolChainsForNdk(AndroidConfigurations::currentConfig().ndkLocation()); } diff --git a/src/plugins/android/androidtoolchain.h b/src/plugins/android/androidtoolchain.h index 93d9f45ac85..a17bfb810e0 100644 --- a/src/plugins/android/androidtoolchain.h +++ b/src/plugins/android/androidtoolchain.h @@ -101,7 +101,7 @@ class AndroidToolChainFactory : public ProjectExplorer::ToolChainFactory public: AndroidToolChainFactory(); - QList autoDetect() override; + QList autoDetect(const QList &alreadyKnown) override; bool canRestore(const QVariantMap &data) override; ProjectExplorer::ToolChain *restore(const QVariantMap &data) override; diff --git a/src/plugins/projectexplorer/gcctoolchain.cpp b/src/plugins/projectexplorer/gcctoolchain.cpp index 56db092550f..8e9a32164fd 100644 --- a/src/plugins/projectexplorer/gcctoolchain.cpp +++ b/src/plugins/projectexplorer/gcctoolchain.cpp @@ -774,15 +774,15 @@ ToolChain *GccToolChainFactory::create() return createToolChain(false); } -QList GccToolChainFactory::autoDetect() +QList GccToolChainFactory::autoDetect(const QList &alreadyKnown) { QList tcs; if (HostOsInfo::isMacHost()) { // Old mac compilers needed to support macx-gccXY mkspecs: - tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), Abi::hostAbi())); - tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), Abi::hostAbi())); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.0"), Abi::hostAbi(), alreadyKnown)); + tcs.append(autoDetectToolchains(QLatin1String("g++-4.2"), Abi::hostAbi(), alreadyKnown)); } - tcs.append(autoDetectToolchains(QLatin1String("g++"), Abi::hostAbi())); + tcs.append(autoDetectToolchains(QLatin1String("g++"), Abi::hostAbi(), alreadyKnown)); return tcs; } @@ -809,7 +809,8 @@ GccToolChain *GccToolChainFactory::createToolChain(bool autoDetect) } QList GccToolChainFactory::autoDetectToolchains(const QString &compiler, - const Abi &requiredAbi) + const Abi &requiredAbi, + const QList &alreadyKnown) { QList result; @@ -818,6 +819,9 @@ QList GccToolChainFactory::autoDetectToolchains(const QString &comp if (compilerPath.isEmpty()) return result; + if (Utils::findOrDefault(alreadyKnown, Utils::equal(&ToolChain::compilerCommand, compilerPath))) + return result; + GccToolChain::addCommandPathToEnvironment(compilerPath, systemEnvironment); QByteArray macros = gccPredefinedMacros(compilerPath, gccPredefinedMacrosOptions(), systemEnvironment.toStringList()); @@ -1107,10 +1111,9 @@ ClangToolChainFactory::ClangToolChainFactory() setDisplayName(tr("Clang")); } -QList ClangToolChainFactory::autoDetect() +QList ClangToolChainFactory::autoDetect(const QList &alreadyKnown) { - Abi ha = Abi::hostAbi(); - return autoDetectToolchains(QLatin1String("clang++"), ha); + return autoDetectToolchains(QLatin1String("clang++"), Abi::hostAbi(), alreadyKnown); } bool ClangToolChainFactory::canRestore(const QVariantMap &data) @@ -1186,11 +1189,11 @@ MingwToolChainFactory::MingwToolChainFactory() setDisplayName(tr("MinGW")); } -QList MingwToolChainFactory::autoDetect() +QList MingwToolChainFactory::autoDetect(const QList &alreadyKnown) { - Abi ha = Abi::hostAbi(); - return autoDetectToolchains(QLatin1String("g++"), - Abi(ha.architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, Abi::PEFormat, ha.wordWidth())); + const Abi ha = Abi(Abi::hostAbi().architecture(), Abi::WindowsOS, Abi::WindowsMSysFlavor, + Abi::PEFormat, ha.wordWidth()); + return autoDetectToolchains(QLatin1String("g++"), ha, alreadyKnown); } bool MingwToolChainFactory::canRestore(const QVariantMap &data) @@ -1263,9 +1266,9 @@ LinuxIccToolChainFactory::LinuxIccToolChainFactory() setDisplayName(tr("Linux ICC")); } -QList LinuxIccToolChainFactory::autoDetect() +QList LinuxIccToolChainFactory::autoDetect(const QList &alreadyKnown) { - return autoDetectToolchains(QLatin1String("icpc"), Abi::hostAbi()); + return autoDetectToolchains(QLatin1String("icpc"), Abi::hostAbi(), alreadyKnown); } bool LinuxIccToolChainFactory::canRestore(const QVariantMap &data) diff --git a/src/plugins/projectexplorer/gcctoolchainfactories.h b/src/plugins/projectexplorer/gcctoolchainfactories.h index 8117da6bb73..c0532706520 100644 --- a/src/plugins/projectexplorer/gcctoolchainfactories.h +++ b/src/plugins/projectexplorer/gcctoolchainfactories.h @@ -56,7 +56,7 @@ class GccToolChainFactory : public ToolChainFactory public: GccToolChainFactory(); - QList autoDetect(); + QList autoDetect(const QList &alreadyKnown); bool canCreate(); ToolChain *create(); @@ -67,7 +67,8 @@ public: protected: virtual GccToolChain *createToolChain(bool autoDetect); QList autoDetectToolchains(const QString &compiler, - const Abi &); + const Abi &, + const QList &alreadyKnown); }; // -------------------------------------------------------------------------- @@ -114,7 +115,7 @@ class ClangToolChainFactory : public GccToolChainFactory public: ClangToolChainFactory(); - QList autoDetect(); + QList autoDetect(const QList &alreadyKnown); bool canRestore(const QVariantMap &data); @@ -133,7 +134,7 @@ class MingwToolChainFactory : public GccToolChainFactory public: MingwToolChainFactory(); - QList autoDetect(); + QList autoDetect(const QList &alreadyKnown); bool canRestore(const QVariantMap &data); @@ -152,7 +153,7 @@ class LinuxIccToolChainFactory : public GccToolChainFactory public: LinuxIccToolChainFactory(); - QList autoDetect(); + QList autoDetect(const QList &alreadyKnown); bool canRestore(const QVariantMap &data); diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index a3c139d2beb..08bd7954c21 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -526,8 +526,9 @@ QString MsvcToolChainFactory::vcVarsBatFor(const QString &basePath, MsvcToolChai return vcVarsBatFor(basePath, platformName(platform)); } -QList MsvcToolChainFactory::autoDetect() +QList MsvcToolChainFactory::autoDetect(const QList &alreadyKnown) { + Q_UNUSED(alreadyKnown); QList results; // 1) Installed SDKs preferred over standalone Visual studio diff --git a/src/plugins/projectexplorer/msvctoolchain.h b/src/plugins/projectexplorer/msvctoolchain.h index 8ff032528f5..22dfab5ae92 100644 --- a/src/plugins/projectexplorer/msvctoolchain.h +++ b/src/plugins/projectexplorer/msvctoolchain.h @@ -100,7 +100,7 @@ class MsvcToolChainFactory : public ToolChainFactory public: MsvcToolChainFactory(); - QList autoDetect() override; + QList autoDetect(const QList &alreadyKnown) override; bool canRestore(const QVariantMap &data) override; ToolChain *restore(const QVariantMap &data) override diff --git a/src/plugins/projectexplorer/toolchain.cpp b/src/plugins/projectexplorer/toolchain.cpp index e64fbaeb32e..13fe120300a 100644 --- a/src/plugins/projectexplorer/toolchain.cpp +++ b/src/plugins/projectexplorer/toolchain.cpp @@ -239,8 +239,9 @@ QList ToolChain::validateKit(const Kit *) const Used by the tool chain manager to restore user-generated tool chains. */ -QList ToolChainFactory::autoDetect() +QList ToolChainFactory::autoDetect(const QList &alreadyKnown) { + Q_UNUSED(alreadyKnown); return QList(); } diff --git a/src/plugins/projectexplorer/toolchain.h b/src/plugins/projectexplorer/toolchain.h index 00435adcd3a..d3b3dfa5d5a 100644 --- a/src/plugins/projectexplorer/toolchain.h +++ b/src/plugins/projectexplorer/toolchain.h @@ -181,7 +181,7 @@ class PROJECTEXPLORER_EXPORT ToolChainFactory : public QObject public: QString displayName() const { return m_displayName; } - virtual QList autoDetect(); + virtual QList autoDetect(const QList &alreadyKnown); virtual bool canCreate(); virtual ToolChain *create(); diff --git a/src/plugins/projectexplorer/toolchainmanager.cpp b/src/plugins/projectexplorer/toolchainmanager.cpp index 2b9423322aa..f713de412e5 100644 --- a/src/plugins/projectexplorer/toolchainmanager.cpp +++ b/src/plugins/projectexplorer/toolchainmanager.cpp @@ -219,7 +219,7 @@ void ToolChainManager::restoreToolChains() QList detectedTcs; QList factories = ExtensionSystem::PluginManager::getObjects(); foreach (ToolChainFactory *f, factories) - detectedTcs.append(f->autoDetect()); + detectedTcs.append(f->autoDetect(tcsToCheck)); // Find/update autodetected tool chains: ToolChain *toStore = 0; diff --git a/src/plugins/projectexplorer/wincetoolchain.cpp b/src/plugins/projectexplorer/wincetoolchain.cpp index c85a1a0a453..e83e75947c7 100644 --- a/src/plugins/projectexplorer/wincetoolchain.cpp +++ b/src/plugins/projectexplorer/wincetoolchain.cpp @@ -353,8 +353,9 @@ WinCEToolChainFactory::WinCEToolChainFactory() } -QList WinCEToolChainFactory::autoDetect() +QList WinCEToolChainFactory::autoDetect(const QList &alreadyKnown) { + Q_UNUSED(alreadyKnown); QList results; // 1) Installed WinCEs diff --git a/src/plugins/projectexplorer/wincetoolchain.h b/src/plugins/projectexplorer/wincetoolchain.h index eeef1b47db1..221d4ced45f 100644 --- a/src/plugins/projectexplorer/wincetoolchain.h +++ b/src/plugins/projectexplorer/wincetoolchain.h @@ -107,7 +107,7 @@ class WinCEToolChainFactory : public ToolChainFactory public: WinCEToolChainFactory(); - QList autoDetect() override; + QList autoDetect(const QList &alreadyKnown) override; bool canRestore(const QVariantMap &data) override; ToolChain *restore(const QVariantMap &data) override;