Explorar o código

ENH: one more pass at paths with spaces and parens

Bill Hoffman %!s(int64=18) %!d(string=hai) anos
pai
achega
ecbec236b1
Modificáronse 2 ficheiros con 17 adicións e 29 borrados
  1. 9 22
      Source/cmLocalGenerator.cxx
  2. 8 7
      Source/cmLocalUnixMakefileGenerator3.cxx

+ 9 - 22
Source/cmLocalGenerator.cxx

@@ -2066,22 +2066,7 @@ std::string cmLocalGenerator::Convert(const char* source,
     }
   if( output == SHELL)
     {
-    // for shell commands if force unix is on, but this->WindowsShell
-    // is true, then turn off force unix paths for the output path
-    // so that the path is windows style and will work with windows
-    // cmd.exe.
-    bool forceOn =  cmSystemTools::GetForceUnixPaths();
-    if(forceOn && this->WindowsShell)
-      {
-      cmSystemTools::SetForceUnixPaths(false);
-      }
-    result = cmSystemTools::ConvertToOutputPath(result.c_str());
-    if(forceOn && this->WindowsShell)
-      {
-      cmSystemTools::SetForceUnixPaths(true);
-      }
-
-    // For the MSYS shell convert drive letters to posix paths, so
+        // For the MSYS shell convert drive letters to posix paths, so
     // that c:/some/path becomes /c/some/path.  This is needed to
     // avoid problems with the shell path translation.
     if(this->MSYSShell)
@@ -2092,14 +2077,16 @@ std::string cmLocalGenerator::Convert(const char* source,
         result[0] = '/';
         }
       }
-    // if this is unix then we need to escape () in the shell
-#if !defined(WIN32) || defined(CYGWIN)
-    forceOn = true;
-#endif
-    if(forceOn )
+    if(this->WindowsShell)
       {
-      result = cmSystemTools::EscapeForUnixShell(result);
+      std::string::size_type pos = 0;
+      while((pos = result.find('/', pos)) != std::string::npos)
+        {
+        result[pos] = '\\';
+        pos++;
+        }
       }
+    result = this->EscapeForShell(result.c_str(), true, false);
     }
   return result;
 }

+ 8 - 7
Source/cmLocalUnixMakefileGenerator3.cxx

@@ -1776,14 +1776,15 @@ cmLocalUnixMakefileGenerator3
   if (tgt && tgt[0] != '\0')
     {
     std::string tgt2 = this->Convert(tgt,HOME_OUTPUT,MAKEFILE);
-    tgt2 = this->ConvertToMakeTarget(tgt2.c_str()); 
-    bool forceOn =  cmSystemTools::GetForceUnixPaths();
-#if !defined(WIN32) || defined(CYGWIN)
-    forceOn = true;
-#endif 
-    if(forceOn )
+    tgt2 = this->ConvertToMakeTarget(tgt2.c_str());
+    // for make -f foo bar, foo is a file but bar (tgt2) is 
+    // a make target.  make targets should be escaped with "" 
+    // and not \, so if we find a "\ " in the path then remove
+    // the \ and quote the whole string
+    if(tgt2.find("\\ ") != tgt2.npos)
       {
-      tgt2 = cmSystemTools::EscapeForUnixShell(tgt2);
+      cmSystemTools::ReplaceString(tgt2, "\\", "");
+      tgt2 = std::string("\"") + tgt2 + std::string("\"");
       }
     cmd += tgt2;
     }