Kaynağa Gözat

ENH: Support more preprocessor values in VS6

Previously we rejected all preprocessor definition values containing
spaces for the VS6 IDE generator.  In fact VS6 does support spaces but
not in combination with '"', '$', or ';', and only if we use the sytnax
'-DNAME="value with spaces"' instead of '-D"NAME=value with spaces"'.
Now we support all definition values that do not have one of these
invalid pairs.  See issue #8779.
Brad King 16 yıl önce
ebeveyn
işleme
708d1cf1ee

+ 9 - 2
Source/cmLocalGenerator.cxx

@@ -1994,8 +1994,15 @@ void cmLocalGenerator::AppendDefines(std::string& defines,
       }
       }
     else
     else
       {
       {
-      // Make the definition appear properly on the command line.
-      defines += this->EscapeForShell(di->c_str(), true);
+      // Make the definition appear properly on the command line.  Use
+      // -DNAME="value" instead of -D"NAME=value" to help VS6 parser.
+      std::string::size_type eq = di->find("=");
+      defines += di->substr(0, eq);
+      if(eq != di->npos)
+        {
+        defines += "=";
+        defines += this->EscapeForShell(di->c_str() + eq + 1, true);
+        }
       }
       }
     }
     }
 }
 }

+ 3 - 2
Source/cmLocalVisualStudio6Generator.cxx

@@ -1712,11 +1712,12 @@ cmLocalVisualStudio6Generator
     }
     }
 
 
   // Now do the VS6-specific check.
   // Now do the VS6-specific check.
-  if(define.find_first_of(" ") != define.npos)
+  if(define.find_first_of(" ") != define.npos &&
+     define.find_first_of("\"$;") != define.npos)
     {
     {
     cmOStringStream e;
     cmOStringStream e;
     e << "WARNING: The VS6 IDE does not support preprocessor definition "
     e << "WARNING: The VS6 IDE does not support preprocessor definition "
-      << "values with spaces.\n"
+      << "values with spaces and '\"', '$', or ';'.\n"
       << "CMake is dropping a preprocessor definition: " << define << "\n"
       << "CMake is dropping a preprocessor definition: " << define << "\n"
       << "Consider defining the macro in a (configured) header file.\n";
       << "Consider defining the macro in a (configured) header file.\n";
     cmSystemTools::Message(e.str().c_str());
     cmSystemTools::Message(e.str().c_str());

+ 3 - 2
Source/cmMakefile.cxx

@@ -1216,10 +1216,11 @@ bool cmMakefile::ParseDefineFlag(std::string const& def, bool remove)
     return false;
     return false;
     }
     }
 
 
-  // VS6 IDE does not support definition values with spaces.
+  // VS6 IDE does not support definition values with spaces in
+  // combination with '"', '$', or ';'.
   if((strcmp(this->LocalGenerator->GetGlobalGenerator()->GetName(),
   if((strcmp(this->LocalGenerator->GetGlobalGenerator()->GetName(),
              "Visual Studio 6") == 0) &&
              "Visual Studio 6") == 0) &&
-     (def.find(" ") != def.npos))
+     (def.find(" ") != def.npos && def.find_first_of("\"$;") != def.npos))
     {
     {
     return false;
     return false;
     }
     }

+ 3 - 2
Tests/Preprocess/CMakeLists.txt

@@ -66,8 +66,9 @@ if(NOT BORLAND AND NOT PP_VS70)
 endif(NOT BORLAND AND NOT PP_VS70)
 endif(NOT BORLAND AND NOT PP_VS70)
 
 
 if(NOT PP_VS6)
 if(NOT PP_VS6)
-  # VS 6 IDE: spaces
-  # The project parser unconditionally separates arguments at spaces.
+  # VS 6 IDE: spaces and '"', '$', or ';'
+  # The project parser cannot handle spaces if there are quotes.
+  # Since we test passing in a quoted string, we cannot have spaces.
   set(STRING_EXTRA "${STRING_EXTRA} ")
   set(STRING_EXTRA "${STRING_EXTRA} ")
 
 
   if(NOT PP_BORLAND AND NOT PP_WATCOM)
   if(NOT PP_BORLAND AND NOT PP_WATCOM)