diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index 16633ecc4e2..4709d3197f8 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -545,6 +545,45 @@ static ToolChain *findOrCreateToolChain(const QList &alreadyKnown, return tc; } +// Detect build tools introduced with MSVC2015 +static void detectCppBuildTools(QList *list) +{ + struct Entry { + const char *postFix; + const char *varsBatArg; + Abi::Architecture architecture; + Abi::BinaryFormat format; + unsigned char wordSize; + }; + + const Entry entries[] = { + {" (x86)", "x86", Abi::X86Architecture, Abi::PEFormat, 32}, + {" (x64)", "amd64", Abi::X86Architecture, Abi::PEFormat, 64}, + {" (x86_arm)", "x86_arm", Abi::ArmArchitecture, Abi::PEFormat, 32}, + {" (x64_arm)", "amd64_arm", Abi::ArmArchitecture, Abi::PEFormat, 64} + }; + +#ifdef Q_OS_WIN64 + const char programFilesC[] = "ProgramFiles(x86)"; +#else + const char programFilesC[] = "ProgramFiles"; +#endif + const QString name = QStringLiteral("Microsoft Visual C++ Build Tools"); + const QString vcVarsBat = QFile::decodeName(qgetenv(programFilesC)) + + QLatin1Char('/') + name + QStringLiteral("/vcbuildtools.bat"); + if (!QFileInfo(vcVarsBat).isFile()) + return; + const size_t count = sizeof(entries) / sizeof(entries[0]); + for (size_t i = 0; i < count; ++i) { + const Entry &e = entries[i]; + const Abi abi(e.architecture, Abi::WindowsOS, Abi::WindowsMsvc2015Flavor, + e.format, e.wordSize); + list->append(new MsvcToolChain(name + QLatin1String(e.postFix), abi, + vcVarsBat, QLatin1String(e.varsBatArg), + ToolChain::AutoDetection)); + } +} + QList MsvcToolChainFactory::autoDetect(const QList &alreadyKnown) { QList results; @@ -635,6 +674,8 @@ QList MsvcToolChainFactory::autoDetect(const QList &al } } + detectCppBuildTools(&results); + return results; }