mirror of
https://github.com/Kitware/CMake.git
synced 2026-05-25 01:28:50 -05:00
Merge topic 'nmake-utf8'
f3f57cc4edNMake: Use UTF-8 with BOM if supported by nmake186c9bff53NMake: Check nmake version for support of UTF-88a4f536be6NMake: Detect nmake version Acked-by: Kitware Robot <kwrobot@kitware.com> Merge-request: !6041
This commit is contained in:
@@ -0,0 +1,5 @@
|
||||
nmake-utf8
|
||||
----------
|
||||
|
||||
* The :generator:`NMake Makefiles` generator now encodes the generated
|
||||
makefiles as UTF-8 with a BOM when using ``nmake`` from VS 9 or above.
|
||||
@@ -42,6 +42,11 @@ cmGeneratedFileStream::cmGeneratedFileStream(std::string const& name,
|
||||
#else
|
||||
static_cast<void>(encoding);
|
||||
#endif
|
||||
if (encoding == codecvt::UTF8_WITH_BOM) {
|
||||
// Write the BOM encoding header into the file
|
||||
char magic[] = { char(0xEF), char(0xBB), char(0xBF) };
|
||||
this->write(magic, 3);
|
||||
}
|
||||
}
|
||||
|
||||
cmGeneratedFileStream::~cmGeneratedFileStream()
|
||||
|
||||
@@ -2,7 +2,10 @@
|
||||
file Copyright.txt or https://cmake.org/licensing for details. */
|
||||
#include "cmGlobalNMakeMakefileGenerator.h"
|
||||
|
||||
#include "cmsys/RegularExpression.hxx"
|
||||
|
||||
#include "cmDocumentationEntry.h"
|
||||
#include "cmDuration.h"
|
||||
#include "cmLocalUnixMakefileGenerator3.h"
|
||||
#include "cmMakefile.h"
|
||||
#include "cmState.h"
|
||||
@@ -34,6 +37,44 @@ void cmGlobalNMakeMakefileGenerator::EnableLanguage(
|
||||
this->cmGlobalUnixMakefileGenerator3::EnableLanguage(l, mf, optional);
|
||||
}
|
||||
|
||||
bool cmGlobalNMakeMakefileGenerator::FindMakeProgram(cmMakefile* mf)
|
||||
{
|
||||
if (!this->cmGlobalGenerator::FindMakeProgram(mf)) {
|
||||
return false;
|
||||
}
|
||||
if (cmProp nmakeCommand = mf->GetDefinition("CMAKE_MAKE_PROGRAM")) {
|
||||
std::vector<std::string> command;
|
||||
command.emplace_back(*nmakeCommand);
|
||||
command.emplace_back("-?");
|
||||
std::string out;
|
||||
std::string err;
|
||||
if (!cmSystemTools::RunSingleCommand(command, &out, &err, nullptr, nullptr,
|
||||
cmSystemTools::OUTPUT_NONE,
|
||||
cmDuration(30))) {
|
||||
mf->IssueMessage(MessageType::FATAL_ERROR,
|
||||
cmStrCat("Running\n '", cmJoin(command, "' '"),
|
||||
"'\n"
|
||||
"failed with:\n ",
|
||||
err));
|
||||
cmSystemTools::SetFatalErrorOccured();
|
||||
return false;
|
||||
}
|
||||
cmsys::RegularExpression regex(
|
||||
"Program Maintenance Utility Version ([1-9][0-9.]+)");
|
||||
if (regex.find(err)) {
|
||||
this->NMakeVersion = regex.match(1);
|
||||
this->CheckNMakeFeatures();
|
||||
}
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
void cmGlobalNMakeMakefileGenerator::CheckNMakeFeatures()
|
||||
{
|
||||
this->NMakeSupportsUTF8 = !cmSystemTools::VersionCompare(
|
||||
cmSystemTools::OP_LESS, this->NMakeVersion.c_str(), "9");
|
||||
}
|
||||
|
||||
void cmGlobalNMakeMakefileGenerator::GetDocumentation(
|
||||
cmDocumentationEntry& entry)
|
||||
{
|
||||
|
||||
@@ -31,7 +31,7 @@ public:
|
||||
/** Get encoding used by generator for makefile files */
|
||||
codecvt::Encoding GetMakefileEncoding() const override
|
||||
{
|
||||
return codecvt::ANSI;
|
||||
return this->NMakeSupportsUTF8 ? codecvt::UTF8_WITH_BOM : codecvt::ANSI;
|
||||
}
|
||||
|
||||
/** Get the documentation entry for this generator. */
|
||||
@@ -55,6 +55,11 @@ protected:
|
||||
void PrintBuildCommandAdvice(std::ostream& os, int jobs) const override;
|
||||
|
||||
private:
|
||||
bool NMakeSupportsUTF8 = false;
|
||||
std::string NMakeVersion;
|
||||
bool FindMakeProgram(cmMakefile* mf) override;
|
||||
void CheckNMakeFeatures();
|
||||
|
||||
void PrintCompilerAdvice(std::ostream& os, std::string const& lang,
|
||||
const char* envVar) const override;
|
||||
};
|
||||
|
||||
@@ -2058,7 +2058,8 @@ std::string cmMakefileTargetGenerator::CreateResponseFile(
|
||||
// Create the response file.
|
||||
std::string responseFileNameFull =
|
||||
cmStrCat(this->TargetBuildDirectoryFull, '/', name);
|
||||
cmGeneratedFileStream responseStream(responseFileNameFull);
|
||||
cmGeneratedFileStream responseStream(
|
||||
responseFileNameFull, false, this->GlobalGenerator->GetMakefileEncoding());
|
||||
responseStream.SetCopyIfDifferent(true);
|
||||
responseStream << options << "\n";
|
||||
|
||||
|
||||
@@ -31,6 +31,7 @@ codecvt::codecvt(Encoding e)
|
||||
// We don't know which ANSI encoding to use for other platforms than
|
||||
// Windows so we don't do any conversion there
|
||||
case codecvt::UTF8:
|
||||
case codecvt::UTF8_WITH_BOM:
|
||||
// Assume internal encoding is UTF-8
|
||||
case codecvt::None:
|
||||
// No encoding
|
||||
|
||||
@@ -14,6 +14,7 @@ public:
|
||||
{
|
||||
None,
|
||||
UTF8,
|
||||
UTF8_WITH_BOM,
|
||||
ANSI
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user