Browse Source

BUG: Work-around bug in MSVC 6 command line parsing.

Brad King 18 years ago
parent
commit
865c2bc6d6
2 changed files with 36 additions and 1 deletions
  1. 34 1
      Source/cmLocalGenerator.cxx
  2. 2 0
      Source/cmLocalGenerator.h

+ 34 - 1
Source/cmLocalGenerator.cxx

@@ -1451,6 +1451,39 @@ void cmLocalGenerator::GetTargetFlags(std::string& linkLibs,
     }
 }
 
+std::string cmLocalGenerator::ConvertToLinkReference(std::string const& lib)
+{
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  // Work-ardound MSVC 6 command line bug.  This block is only needed
+  // on windows when we are really using the MSVC 6.0 compiler command
+  // line.
+  if(this->Makefile->IsOn("MSVC60"))
+    {
+    // Search for the last space.
+    std::string::size_type pos = lib.rfind(' ');
+    if(pos != lib.npos)
+      {
+      // Find the slash after the last space, if any.
+      pos = lib.find('/', pos);
+
+      // Convert the portion of the path with a space to a short path.
+      std::string sp;
+      if(cmSystemTools::GetShortPath(lib.substr(0, pos).c_str(), sp))
+        {
+        // Append the rest of the path with no space.
+        sp += lib.substr(pos);
+
+        // Convert to an output path.
+        return this->Convert(sp.c_str(), NONE, SHELL);
+        }
+      }
+    }
+#endif
+
+  // Normal behavior.
+  return this->Convert(lib.c_str(), START_OUTPUT, SHELL);
+}
+
 bool cmLocalGenerator::GetLinkerArgs(std::string& rpath, 
                                      std::string& linkLibs,
                                      cmTarget& tgt,
@@ -1554,7 +1587,7 @@ bool cmLocalGenerator::GetLinkerArgs(std::string& rpath,
     {
     if(li->IsPath)
       {
-      linkLibs += this->Convert(li->Value.c_str(), START_OUTPUT, SHELL);
+      linkLibs += this->ConvertToLinkReference(li->Value);
       }
     else
       {

+ 2 - 0
Source/cmLocalGenerator.h

@@ -327,6 +327,8 @@ protected:
   std::string FindRelativePathTopBinary();
   void SetupPathConversions();
 
+  std::string ConvertToLinkReference(std::string const& lib);
+
   /** Check whether the native build system supports the given
       definition.  Issues a warning.  */
   virtual bool CheckDefinition(std::string const& define) const;