Browse Source

NMake: Use UTF-8 with BOM if supported by nmake

Fixes: #21792
Amine Najahi 4 years ago
parent
commit
f3f57cc4ed

+ 5 - 0
Help/release/dev/nmake-utf8.rst

@@ -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.

+ 5 - 0
Source/cmGeneratedFileStream.cxx

@@ -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()

+ 1 - 1
Source/cmGlobalNMakeMakefileGenerator.h

@@ -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.  */

+ 2 - 1
Source/cmMakefileTargetGenerator.cxx

@@ -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";
 

+ 1 - 0
Source/cm_codecvt.cxx

@@ -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

+ 1 - 0
Source/cm_codecvt.hxx

@@ -14,6 +14,7 @@ public:
   {
     None,
     UTF8,
+    UTF8_WITH_BOM,
     ANSI
   };