diff options
Diffstat (limited to 'src/plugins/projectexplorer/msvctoolchain.cpp')
-rw-r--r-- | src/plugins/projectexplorer/msvctoolchain.cpp | 111 |
1 files changed, 64 insertions, 47 deletions
diff --git a/src/plugins/projectexplorer/msvctoolchain.cpp b/src/plugins/projectexplorer/msvctoolchain.cpp index c57cf0e1d6..39d4b6dbcf 100644 --- a/src/plugins/projectexplorer/msvctoolchain.cpp +++ b/src/plugins/projectexplorer/msvctoolchain.cpp @@ -40,7 +40,6 @@ #include <utils/optional.h> #include <utils/qtcassert.h> #include <utils/qtcprocess.h> -#include <utils/synchronousprocess.h> #include <utils/runextensions.h> #include <utils/temporarydirectory.h> #include <utils/pathchooser.h> @@ -104,7 +103,9 @@ const MsvcPlatform platforms[] {MsvcToolChain::arm, "arm", "/bin/arm", "vcvarsarm.bat"}, {MsvcToolChain::x86_arm, "x86_arm", "/bin/x86_arm", "vcvarsx86_arm.bat"}, {MsvcToolChain::amd64_arm, "amd64_arm", "/bin/amd64_arm", "vcvarsamd64_arm.bat"}, - {MsvcToolChain::amd64_x86, "amd64_x86", "/bin/amd64_x86", "vcvarsamd64_x86.bat"}}; + {MsvcToolChain::amd64_x86, "amd64_x86", "/bin/amd64_x86", "vcvarsamd64_x86.bat"}, + {MsvcToolChain::x86_arm64, "x86_arm64", "/bin/x86_arm64", "vcvarsx86_arm64.bat"}, + {MsvcToolChain::amd64_arm64, "amd64_arm64", "/bin/amd64_arm64", "vcvarsamd64_arm64.bat"}}; static QList<const MsvcToolChain *> g_availableMsvcToolchains; @@ -129,12 +130,13 @@ static bool hostSupportsPlatform(MsvcToolChain::Platform platform) switch (Utils::HostOsInfo::hostArchitecture()) { case Utils::HostOsInfo::HostArchitectureAMD64: if (platform == MsvcToolChain::amd64 || platform == MsvcToolChain::amd64_arm - || platform == MsvcToolChain::amd64_x86) + || platform == MsvcToolChain::amd64_x86 || platform == MsvcToolChain::amd64_arm64) return true; Q_FALLTHROUGH(); // all x86 toolchains are also working on an amd64 host case Utils::HostOsInfo::HostArchitectureX86: return platform == MsvcToolChain::x86 || platform == MsvcToolChain::x86_amd64 - || platform == MsvcToolChain::x86_ia64 || platform == MsvcToolChain::x86_arm; + || platform == MsvcToolChain::x86_ia64 || platform == MsvcToolChain::x86_arm + || platform == MsvcToolChain::x86_arm64; case Utils::HostOsInfo::HostArchitectureArm: return platform == MsvcToolChain::arm; case Utils::HostOsInfo::HostArchitectureItanium: @@ -235,35 +237,35 @@ static Utils::optional<VisualStudioInstallation> detectCppBuildTools2017() static QVector<VisualStudioInstallation> detectVisualStudioFromVsWhere(const QString &vswhere) { QVector<VisualStudioInstallation> installations; - Utils::SynchronousProcess vsWhereProcess; + SynchronousProcess vsWhereProcess; vsWhereProcess.setCodec(QTextCodec::codecForName("UTF-8")); const int timeoutS = 5; vsWhereProcess.setTimeoutS(timeoutS); - const CommandLine cmd(vswhere, - {"-products", "*", "-prerelease", "-legacy", "-format", "json", "-utf8"}); - Utils::SynchronousProcessResponse response = vsWhereProcess.runBlocking(cmd); - switch (response.result) { - case Utils::SynchronousProcessResponse::Finished: + vsWhereProcess.setCommand({vswhere, + {"-products", "*", "-prerelease", "-legacy", "-format", "json", "-utf8"}}); + vsWhereProcess.runBlocking(); + switch (vsWhereProcess.result()) { + case QtcProcess::Finished: break; - case Utils::SynchronousProcessResponse::StartFailed: + case QtcProcess::StartFailed: qWarning().noquote() << QDir::toNativeSeparators(vswhere) << "could not be started."; return installations; - case Utils::SynchronousProcessResponse::FinishedError: + case QtcProcess::FinishedError: qWarning().noquote().nospace() << QDir::toNativeSeparators(vswhere) << " finished with exit code " - << response.exitCode << "."; + << vsWhereProcess.exitCode() << "."; return installations; - case Utils::SynchronousProcessResponse::TerminatedAbnormally: + case QtcProcess::TerminatedAbnormally: qWarning().noquote().nospace() - << QDir::toNativeSeparators(vswhere) << " crashed. Exit code: " << response.exitCode; + << QDir::toNativeSeparators(vswhere) << " crashed. Exit code: " << vsWhereProcess.exitCode(); return installations; - case Utils::SynchronousProcessResponse::Hang: + case QtcProcess::Hang: qWarning().noquote() << QDir::toNativeSeparators(vswhere) << "did not finish in" << timeoutS << "seconds."; return installations; } - QByteArray output = response.stdOut().toUtf8(); + QByteArray output = vsWhereProcess.stdOut().toUtf8(); QJsonParseError error; const QJsonDocument doc = QJsonDocument::fromJson(output, &error); if (error.error != QJsonParseError::NoError || doc.isNull()) { @@ -365,6 +367,8 @@ static unsigned char wordWidthForPlatform(MsvcToolChain::Platform platform) case ProjectExplorer::Internal::MsvcToolChain::x86_amd64: case ProjectExplorer::Internal::MsvcToolChain::ia64: case ProjectExplorer::Internal::MsvcToolChain::x86_ia64: + case ProjectExplorer::Internal::MsvcToolChain::amd64_arm64: + case ProjectExplorer::Internal::MsvcToolChain::x86_arm64: return 64; } @@ -382,6 +386,8 @@ static Abi::Architecture archForPlatform(MsvcToolChain::Platform platform) case ProjectExplorer::Internal::MsvcToolChain::arm: case ProjectExplorer::Internal::MsvcToolChain::x86_arm: case ProjectExplorer::Internal::MsvcToolChain::amd64_arm: + case ProjectExplorer::Internal::MsvcToolChain::x86_arm64: + case ProjectExplorer::Internal::MsvcToolChain::amd64_arm64: return Abi::ArmArchitecture; case ProjectExplorer::Internal::MsvcToolChain::ia64: case ProjectExplorer::Internal::MsvcToolChain::x86_ia64: @@ -610,7 +616,7 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList &cxxflags, return predefinedMacros; } Utils::SynchronousProcess cpp; - cpp.setEnvironment(env.toStringList()); + cpp.setEnvironment(env); cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath()); QStringList arguments; const Utils::FilePath binary = env.searchInPath(QLatin1String("cl.exe")); @@ -621,12 +627,13 @@ Macros MsvcToolChain::msvcPredefinedMacros(const QStringList &cxxflags, if (language() == ProjectExplorer::Constants::C_LANGUAGE_ID) arguments << QLatin1String("/TC"); - arguments << toProcess << QLatin1String("/EP") << QDir::toNativeSeparators(saver.fileName()); - SynchronousProcessResponse response = cpp.runBlocking({binary, arguments}); - if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) + arguments << toProcess << QLatin1String("/EP") << saver.filePath().toUserOutput(); + cpp.setCommand({binary, arguments}); + cpp.runBlocking(); + if (cpp.result() != QtcProcess::Finished || cpp.exitCode() != 0) return predefinedMacros; - const QStringList output = Utils::filtered(response.stdOut().split('\n'), + const QStringList output = Utils::filtered(cpp.stdOut().split('\n'), [](const QString &s) { return s.startsWith('V'); }); for (const QString &line : output) predefinedMacros.append(Macro::fromKeyValue(line.mid(1))); @@ -899,6 +906,7 @@ QStringList MsvcToolChain::suggestedMkspecList() const case Abi::WindowsMsvc2019Flavor: return {"win32-msvc", "win32-msvc2019", + "win32-arm64-msvc", "winrt-arm-msvc2019", "winrt-x86-msvc2019", "winrt-x64-msvc2019"}; @@ -1138,8 +1146,8 @@ FilePath MsvcToolChain::makeCommand(const Environment &environment) const FilePath command; if (useJom) { tmp = environment.searchInPath(jom, - {Utils::FilePath::fromString( - QCoreApplication::applicationDirPath())}); + {Core::ICore::libexecPath(), + Core::ICore::libexecPath("jom")}); if (!tmp.isEmpty()) command = tmp; } @@ -1272,10 +1280,10 @@ MsvcToolChainConfigWidget::MsvcToolChainConfigWidget(ToolChain *tc) m_varsBatArchCombo->addItem("arm", MsvcToolChain::arm); m_varsBatArchCombo->addItem("x86_amd64", MsvcToolChain::x86_amd64); m_varsBatArchCombo->addItem("x86_arm", MsvcToolChain::x86_arm); -// m_varsBatArchCombo->addItem("x86_arm64", MsvcToolChain::x86_arm64); + m_varsBatArchCombo->addItem("x86_arm64", MsvcToolChain::x86_arm64); m_varsBatArchCombo->addItem("amd64_x86", MsvcToolChain::amd64_x86); m_varsBatArchCombo->addItem("amd64_arm", MsvcToolChain::amd64_arm); -// m_varsBatArchCombo->addItem("amd64_arm64", MsvcToolChain::amd64_arm64); + m_varsBatArchCombo->addItem("amd64_arm64", MsvcToolChain::amd64_arm64); m_varsBatArchCombo->addItem("ia64", MsvcToolChain::ia64); m_varsBatArchCombo->addItem("x86_ia64", MsvcToolChain::x86_ia64); m_varsBatArgumentsEdit->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); @@ -1496,13 +1504,13 @@ static const MsvcToolChain *findMsvcToolChain(const QString &displayedVarsBat) static QVersionNumber clangClVersion(const QString &clangClPath) { SynchronousProcess clangClProcess; - const SynchronousProcessResponse response - = clangClProcess.runBlocking({clangClPath, {"--version"}}); - if (response.result != SynchronousProcessResponse::Finished || response.exitCode != 0) + clangClProcess.setCommand({clangClPath, {"--version"}}); + clangClProcess.runBlocking(); + if (clangClProcess.result() != QtcProcess::Finished || clangClProcess.exitCode() != 0) return {}; const QRegularExpressionMatch match = QRegularExpression( QStringLiteral("clang version (\\d+(\\.\\d+)+)")) - .match(response.stdOut()); + .match(clangClProcess.stdOut()); if (!match.hasMatch()) return {}; return QVersionNumber::fromString(match.captured(1)); @@ -1715,20 +1723,21 @@ Macros ClangClToolChain::msvcPredefinedMacros(const QStringList &cxxflags, if (!cxxflags.contains("--driver-mode=g++")) return MsvcToolChain::msvcPredefinedMacros(cxxflags, env); - Utils::SynchronousProcess cpp; - cpp.setEnvironment(env.toStringList()); + SynchronousProcess cpp; + cpp.setEnvironment(env); cpp.setWorkingDirectory(Utils::TemporaryDirectory::masterDirectoryPath()); QStringList arguments = cxxflags; arguments.append(gccPredefinedMacrosOptions(language())); arguments.append("-"); - Utils::SynchronousProcessResponse response = cpp.runBlocking({clangPath(), arguments}); - if (response.result != Utils::SynchronousProcessResponse::Finished || response.exitCode != 0) { + cpp.setCommand({compilerCommand(), arguments}); + cpp.runBlocking(); + if (cpp.result() != Utils::QtcProcess::Finished || cpp.exitCode() != 0) { // Show the warning but still parse the output. QTC_CHECK(false && "clang-cl exited with non-zero code."); } - return Macro::toMacros(response.allRawOutput()); + return Macro::toMacros(cpp.allRawOutput()); } Utils::LanguageVersion ClangClToolChain::msvcLanguageVersion(const QStringList &cxxflags, @@ -1825,7 +1834,9 @@ static void detectCppBuildTools2015(QList<ToolChain *> *list) 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}}; + {" (x64_arm)", "amd64_arm", Abi::ArmArchitecture, Abi::PEFormat, 32}, + {" (x86_arm64)", "x86_arm64", Abi::ArmArchitecture, Abi::PEFormat, 64}, + {" (x64_arm64)", "amd64_arm64", Abi::ArmArchitecture, Abi::PEFormat, 64}}; const QString name = "Microsoft Visual C++ Build Tools"; const QString vcVarsBat = windowsProgramFilesDir() + '/' + name + "/vcbuildtools.bat"; @@ -1848,8 +1859,11 @@ static void detectCppBuildTools2015(QList<ToolChain *> *list) } } -QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) +QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown, + const IDevice::Ptr &device) { + Q_UNUSED(device) + QList<ToolChain *> results; // 1) Installed SDKs preferred over standalone Visual studio @@ -1911,6 +1925,8 @@ QList<ToolChain *> MsvcToolChainFactory::autoDetect(const QList<ToolChain *> &al MsvcToolChain::arm, MsvcToolChain::x86_arm, MsvcToolChain::amd64_arm, + MsvcToolChain::x86_arm64, + MsvcToolChain::amd64_arm64, MsvcToolChain::ia64, MsvcToolChain::x86_ia64}; @@ -1950,9 +1966,11 @@ bool ClangClToolChainFactory::canCreate() const return !g_availableMsvcToolchains.isEmpty(); } -QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown) +QList<ToolChain *> ClangClToolChainFactory::autoDetect(const QList<ToolChain *> &alreadyKnown, + const IDevice::Ptr &device) { Q_UNUSED(alreadyKnown) + Q_UNUSED(device) // FIXME: Use it. #ifdef Q_OS_WIN64 const char registryNode[] = "HKEY_LOCAL_MACHINE\\SOFTWARE\\WOW6432Node\\LLVM\\LLVM"; @@ -2019,7 +2037,7 @@ Utils::optional<QString> MsvcToolChain::generateEnvironmentSettings(const Utils: Utils::TempFileSaver saver(Utils::TemporaryDirectory::masterDirectoryPath() + "/XXXXXX.bat"); QByteArray call = "call "; - call += Utils::QtcProcess::quoteArg(batchFile).toLocal8Bit(); + call += ProcessArgs::quoteArg(batchFile).toLocal8Bit(); if (!batchArgs.isEmpty()) { call += ' '; call += batchArgs.toLocal8Bit(); @@ -2043,24 +2061,23 @@ Utils::optional<QString> MsvcToolChain::generateEnvironmentSettings(const Utils: // if Creator is launched within a session set up by setenv.cmd. Utils::Environment runEnv = env; runEnv.unset(QLatin1String("ORIGINALPATH")); - run.setEnvironment(runEnv.toStringList()); + run.setEnvironment(runEnv); run.setTimeoutS(30); Utils::FilePath cmdPath = Utils::FilePath::fromUserInput( QString::fromLocal8Bit(qgetenv("COMSPEC"))); if (cmdPath.isEmpty()) cmdPath = env.searchInPath(QLatin1String("cmd.exe")); // Windows SDK setup scripts require command line switches for environment expansion. - CommandLine cmd(cmdPath, {"/E:ON", "/V:ON", "/c", QDir::toNativeSeparators(saver.fileName())}); + CommandLine cmd(cmdPath, {"/E:ON", "/V:ON", "/c", saver.filePath().toUserOutput()}); if (debug) qDebug() << "readEnvironmentSetting: " << call << cmd.toUserOutput() << " Env: " << runEnv.size(); run.setCodec(QTextCodec::codecForName("UTF-8")); - Utils::SynchronousProcessResponse response = run.runBlocking(cmd); + run.setCommand(cmd); + run.runBlocking(); - if (response.result != Utils::SynchronousProcessResponse::Finished) { - const QString message = !response.stdErr().isEmpty() - ? response.stdErr() - : response.exitMessage(cmdPath.toString(), 10); + if (run.result() != QtcProcess::Finished) { + const QString message = !run.stdErr().isEmpty() ? run.stdErr() : run.exitMessage(); qWarning().noquote() << message; QString command = QDir::toNativeSeparators(batchFile); if (!batchArgs.isEmpty()) @@ -2072,7 +2089,7 @@ Utils::optional<QString> MsvcToolChain::generateEnvironmentSettings(const Utils: } // The SDK/MSVC scripts do not return exit codes != 0. Check on stdout. - const QString stdOut = response.stdOut(); + const QString stdOut = run.stdOut(); // // Now parse the file to get the environment settings |