summaryrefslogtreecommitdiff
path: root/src/plugins/projectexplorer/msvctoolchain.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/plugins/projectexplorer/msvctoolchain.cpp')
-rw-r--r--src/plugins/projectexplorer/msvctoolchain.cpp111
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