浏览代码

Merge topic 'fix-12189-support-SBCS-in-VS'

b28e7fa VS6: Avoid SBCS test on VS6 (#12189)
df19b9c VS6: Avoid _MBCS define when _SBCS is defined (#12189)
ba89e92 Visual Studio: Allow setting Single Byte Character Set (#12189)
David Cole 13 年之前
父节点
当前提交
f55119e63b

+ 5 - 3
Source/cmLocalVisualStudio6Generator.cxx

@@ -1620,11 +1620,13 @@ void cmLocalVisualStudio6Generator
       flagsDebugRel = this->Makefile->GetSafeDefinition(flagVar.c_str());
       flagsDebugRel += " -DCMAKE_INTDIR=\\\"RelWithDebInfo\\\" ";
       }
-    
-    // if unicode is not found, then add -D_MBCS
+
+    // if _UNICODE and _SBCS are not found, then add -D_MBCS
     std::string defs = this->Makefile->GetDefineFlags();
     if(flags.find("D_UNICODE") == flags.npos &&
-       defs.find("D_UNICODE") == flags.npos) 
+       defs.find("D_UNICODE") == flags.npos &&
+       flags.find("D_SBCS") == flags.npos &&
+       defs.find("D_SBCS") == flags.npos)
       {
       flags += " /D \"_MBCS\"";
       }

+ 4 - 0
Source/cmLocalVisualStudio7Generator.cxx

@@ -774,6 +774,10 @@ void cmLocalVisualStudio7Generator::WriteConfiguration(std::ostream& fout,
     {
     fout << "\t\t\tCharacterSet=\"1\">\n";
     }
+  else if(targetOptions.UsingSBCS())
+    {
+    fout << "\t\t\tCharacterSet=\"0\">\n";
+    }
   else
     {
     fout << "\t\t\tCharacterSet=\"2\">\n";

+ 5 - 0
Source/cmVisualStudio10TargetGenerator.cxx

@@ -394,6 +394,11 @@ void cmVisualStudio10TargetGenerator::WriteProjectConfigurationValues()
       {
       this->WriteString("<CharacterSet>Unicode</CharacterSet>\n", 2);
       }
+    else if (this->Target->GetType() <= cmTarget::MODULE_LIBRARY &&
+       this->ClOptions[*i]->UsingSBCS())
+      {
+      this->WriteString("<CharacterSet>NotSet</CharacterSet>\n", 2);
+      }
     else
       {
       this->WriteString("<CharacterSet>MultiByte</CharacterSet>\n", 2);

+ 14 - 0
Source/cmVisualStudioGeneratorOptions.cxx

@@ -117,6 +117,20 @@ bool cmVisualStudioGeneratorOptions::UsingUnicode()
     }
   return false;
 }
+//----------------------------------------------------------------------------
+bool cmVisualStudioGeneratorOptions::UsingSBCS()
+{
+  // Look for the a _SBCS definition.
+  for(std::vector<std::string>::const_iterator di = this->Defines.begin();
+      di != this->Defines.end(); ++di)
+    {
+    if(*di == "_SBCS")
+      {
+      return true;
+      }
+    }
+  return false;
+}
 
 //----------------------------------------------------------------------------
 void cmVisualStudioGeneratorOptions::Parse(const char* flags)

+ 1 - 0
Source/cmVisualStudioGeneratorOptions.h

@@ -48,6 +48,7 @@ public:
 
   // Check for specific options.
   bool UsingUnicode();
+  bool UsingSBCS();
 
   bool IsDebug();
   // Write options to output.

+ 4 - 0
Tests/CMakeLists.txt

@@ -1338,6 +1338,10 @@ ${CMake_BINARY_DIR}/bin/cmake -DVERSION=master -P ${CMake_SOURCE_DIR}/Utilities/
   endif()
 
   IF(${CMAKE_TEST_GENERATOR} MATCHES "Visual Studio")
+    IF(NOT MSVC60)
+      ADD_TEST_MACRO(SBCS SBCS)
+    ENDIF(NOT MSVC60)
+
     ADD_TEST(VSExternalInclude ${CMAKE_CTEST_COMMAND}
       --build-and-test
       "${CMake_SOURCE_DIR}/Tests/VSExternalInclude"

+ 6 - 0
Tests/SBCS/CMakeLists.txt

@@ -0,0 +1,6 @@
+# a SBCS test case
+project (SBCS)
+
+add_definitions(-D_SBCS)
+
+add_executable (SBCS SBCS.cxx)

+ 22 - 0
Tests/SBCS/SBCS.cxx

@@ -0,0 +1,22 @@
+// Test to verify that _SBCS being defined causes CharacterSet to be set to 0 (Single Byte Character Set)
+
+int main ()
+{
+#ifdef _UNICODE
+  bool UnicodeSet=true;
+#else
+  bool UnicodeSet=false;
+#endif
+
+#ifdef _MBCS
+  bool MBCSSet=true;
+#else
+  bool MBCSSet=false;
+#endif
+
+  // if neither _UNICODE nor _MBCS is set, CharacterSet must be set to SBCS.
+  bool SBCSSet=(!UnicodeSet && !MBCSSet);
+
+  // Reverse boolean to indicate error case correctly
+  return !SBCSSet;
+}