diff --git a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp index fd2948c458f..64de2dd7074 100644 --- a/src/plugins/projectexplorer/abstractmsvctoolchain.cpp +++ b/src/plugins/projectexplorer/abstractmsvctoolchain.cpp @@ -247,24 +247,46 @@ void AbstractMsvcToolChain::addToEnvironment(Utils::Environment &env) const env = m_resultEnvironment; } +static QString wrappedMakeCommand(const QString &command) +{ + const QString wrapperPath = QDir::currentPath() + "/msvc_make.bat"; + QFile wrapper(wrapperPath); + if (!wrapper.open(QIODevice::WriteOnly)) + return command; + QTextStream stream(&wrapper); + stream << "chcp 65001\n"; + stream << command << " %*"; + + return wrapperPath; +} + QString AbstractMsvcToolChain::makeCommand(const Utils::Environment &environment) const { bool useJom = ProjectExplorerPlugin::projectExplorerSettings().useJom; - const QString jom = QLatin1String("jom.exe"); - const QString nmake = QLatin1String("nmake.exe"); + const QString jom("jom.exe"); + const QString nmake("nmake.exe"); Utils::FileName tmp; + QString command; if (useJom) { tmp = environment.searchInPath(jom, {Utils::FileName::fromString(QCoreApplication::applicationDirPath())}); if (!tmp.isEmpty()) - return tmp.toString(); + command = tmp.toString(); } - tmp = environment.searchInPath(nmake); - if (!tmp.isEmpty()) - return tmp.toString(); - // Nothing found :( - return useJom ? jom : nmake; + if (command.isEmpty()) { + tmp = environment.searchInPath(nmake); + if (!tmp.isEmpty()) + command = tmp.toString(); + } + + if (command.isEmpty()) + command = useJom ? jom : nmake; + + if (environment.hasKey("VSLANG")) + return wrappedMakeCommand(command); + + return command; } Utils::FileName AbstractMsvcToolChain::compilerCommand() const diff --git a/src/plugins/projectexplorer/abstractprocessstep.cpp b/src/plugins/projectexplorer/abstractprocessstep.cpp index 2634cdd4b57..baa79648c14 100644 --- a/src/plugins/projectexplorer/abstractprocessstep.cpp +++ b/src/plugins/projectexplorer/abstractprocessstep.cpp @@ -25,6 +25,7 @@ #include "abstractprocessstep.h" #include "ansifilterparser.h" +#include "buildconfiguration.h" #include "buildstep.h" #include "project.h" #include "task.h" @@ -305,8 +306,11 @@ void AbstractProcessStep::processReadyReadStdOutput() if (!m_process) return; m_process->setReadChannel(QProcess::StandardOutput); + const bool utf8Output = buildConfiguration()->environment().hasKey("VSLANG"); + while (m_process->canReadLine()) { - QString line = QString::fromLocal8Bit(m_process->readLine()); + QString line = utf8Output ? QString::fromUtf8(m_process->readLine()) + : QString::fromLocal8Bit(m_process->readLine()); stdOutput(line); } } diff --git a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp index 3d35900acdb..5f6ddec6ad0 100644 --- a/src/plugins/projectexplorer/kitinformationconfigwidget.cpp +++ b/src/plugins/projectexplorer/kitinformationconfigwidget.cpp @@ -507,8 +507,11 @@ QWidget *KitEnvironmentConfigWidget::buttonWidget() const void KitEnvironmentConfigWidget::initMSVCOutputSwitch(QVBoxLayout *layout) { - m_vslangCheckbox = new QCheckBox(tr("Force English MSVC compiler output (VSLANG=1033)")); + m_vslangCheckbox = new QCheckBox(tr("Force UTF-8 MSVC compiler output")); layout->addWidget(m_vslangCheckbox); + m_vslangCheckbox->setToolTip(tr("Either switches MSVC to English or keeps the language and " + "just forces UTF-8 output (may vary depending on the used MSVC " + "compiler).")); connect(m_vslangCheckbox, &QCheckBox::toggled, this, [this](bool checked) { QList changes = EnvironmentKitInformation::environmentChanges(m_kit);